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