File: get_platform.py

package info (click to toggle)
amdsmi 7.2.0-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 7,428 kB
  • sloc: cpp: 42,484; python: 22,906; ansic: 12,578; sh: 762; makefile: 20
file content (99 lines) | stat: -rw-r--r-- 3,314 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
import re
import argparse

def get_platforms(file_name):
  # removing the new line characters
  with open(file_name) as f:
      lines = [line.rstrip() for line in f]
  
  platform_map = {}
  platform_lines = ""
  function_line = ""
  for line in lines:
      if "@platform" in line:
          platform_lines += line.replace("*","").lstrip()
      if platform_lines =="":
          continue
      l = line.lstrip()
      if len(l) == 0:
          continue
      if l[0] == '*' or l[0]== '#' or (len(l)>1 and l[0] == '/' and l[1] == '*'):
          if function_line != "":
              func = ' '.join(function_line.split())
              platforms = re.findall(r"\{(.*?)\}", platform_lines)
              for p in platforms:
                  if p not in platform_map:
                      platform_map[p]=[func]
                  else:
                      platform_map[p].append(func)
              platform_lines = ""
          function_line = ""
          continue
      function_line += line  + " " 
  return platform_map

# string in list1 but not in list2
def diff(list1, list2):
    result = []
    for l1 in list1:
        if l1 not in list2:
            result.append(l1)
    return result

def common(list1, list2):
    result = []
    for l1 in list1:
        if l1 in list2:
            result.append(l1)
    return result

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='amdsmi platform classifier')
    parser.add_argument('--platforms', default=False, action='store_true', help='list supported platforms')
    parser.add_argument('--list', default="", metavar="platform" , help='List function in a platform')
    parser.add_argument('--diff' , default=None, metavar="platform", nargs=2, help='Find the APIs in platform1 but not in platform2')
    parser.add_argument('--common' , default=None, metavar="platform", nargs=2, help='Find the common APIs of two platforms')

    file_name="../include/amd_smi/amdsmi.h"
    args = parser.parse_args()
    platform_map=get_platforms(file_name)
    if args.platforms:
        for p in platform_map:
            print (p)
        exit(0)

    if args.list:
        if args.list not in platform_map:
            print("Unknown platform ", args.list)
            exit(1)
        for f in platform_map[args.list]:
            print (f)
        exit(0)
        
    if args.diff != None:
        if args.diff[0] not in platform_map or args.diff[1] not in platform_map:
            print("Unknown platforms ", args.diff)
            exit(1)
        platforms0 = platform_map[args.diff[0]]
        platforms1 = platform_map[args.diff[1]]
        result = diff(platforms0, platforms1)
        print("APIs in", args.diff[0], "but not in", args.diff[1])
        for f in result:
            print(f)
        exit(0)
        
        
    if args.common != None:
        if args.common[0] not in platform_map or args.common[1] not in platform_map:
            print("Unknown platforms ", args.common)
            exit(1)
        platforms0 = platform_map[args.common[0]]
        platforms1 = platform_map[args.common[1]]
        result = common(platforms0, platforms1)
        print("APIs in both ", args.common[0], "and", args.common[1])
        for f in result:
            print(f)
        exit(0)
        
    parser.print_help()