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()