Imported Upstream version 16.04
[deb_dpdk.git] / tools / cpu_layout.py
1 #! /usr/bin/python
2 #
3 #   BSD LICENSE
4 #
5 #   Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
6 #   All rights reserved.
7 #
8 #   Redistribution and use in source and binary forms, with or without
9 #   modification, are permitted provided that the following conditions
10 #   are met:
11 #
12 #     * Redistributions of source code must retain the above copyright
13 #       notice, this list of conditions and the following disclaimer.
14 #     * Redistributions in binary form must reproduce the above copyright
15 #       notice, this list of conditions and the following disclaimer in
16 #       the documentation and/or other materials provided with the
17 #       distribution.
18 #     * Neither the name of Intel Corporation nor the names of its
19 #       contributors may be used to endorse or promote products derived
20 #       from this software without specific prior written permission.
21 #
22 #   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23 #   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24 #   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
25 #   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
26 #   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
27 #   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
28 #   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29 #   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30 #   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31 #   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
32 #   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 #
34
35 import sys
36
37 sockets = []
38 cores = []
39 core_map = {}
40
41 fd=open("/proc/cpuinfo")
42 lines = fd.readlines()
43 fd.close()
44
45 core_details = []
46 core_lines = {}
47 for line in lines:
48         if len(line.strip()) != 0:
49                 name, value = line.split(":", 1)
50                 core_lines[name.strip()] = value.strip()
51         else:
52                 core_details.append(core_lines)
53                 core_lines = {}
54
55 for core in core_details:
56         for field in ["processor", "core id", "physical id"]:
57                 if field not in core:
58                         print "Error getting '%s' value from /proc/cpuinfo" % field
59                         sys.exit(1)
60                 core[field] = int(core[field])
61
62         if core["core id"] not in cores:
63                 cores.append(core["core id"])
64         if core["physical id"] not in sockets:
65                 sockets.append(core["physical id"])
66         key = (core["physical id"], core["core id"])
67         if key not in core_map:
68                 core_map[key] = []
69         core_map[key].append(core["processor"])
70
71 print "============================================================"
72 print "Core and Socket Information (as reported by '/proc/cpuinfo')"
73 print "============================================================\n"
74 print "cores = ",cores
75 print "sockets = ", sockets
76 print ""
77
78 max_processor_len = len(str(len(cores) * len(sockets) * 2 - 1))
79 max_core_map_len = max_processor_len * 2 + len('[, ]') + len('Socket ')
80 max_core_id_len = len(str(max(cores)))
81
82 print " ".ljust(max_core_id_len + len('Core ')),
83 for s in sockets:
84         print "Socket %s" % str(s).ljust(max_core_map_len - len('Socket ')),
85 print ""
86 print " ".ljust(max_core_id_len + len('Core ')),
87 for s in sockets:
88         print "--------".ljust(max_core_map_len),
89 print ""
90
91 for c in cores:
92         print "Core %s" % str(c).ljust(max_core_id_len),
93         for s in sockets:
94                 print str(core_map[(s,c)]).ljust(max_core_map_len),
95         print ""