| #!/usr/bin/env python3 | |
| # SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) | |
| """List model names from mapfile.csv files.""" | |
| import argparse | |
| import csv | |
| import os | |
| import re | |
| from typing import List | |
| def main() -> None: | |
| def dir_path(path: str) -> str: | |
| """Validate path is a directory for argparse.""" | |
| if os.path.isdir(path): | |
| return path | |
| raise argparse.ArgumentTypeError(f'\'{path}\' is not a valid directory') | |
| def find_archs(start_dir: str, arch: str) -> List[str]: | |
| archs = [] | |
| for item in os.scandir(start_dir): | |
| if not item.is_dir(): | |
| continue | |
| if arch in (item.name, 'all'): | |
| archs.append(item.name) | |
| if len(archs) < 1: | |
| raise IOError(f'Missing architecture directory \'{arch}\'') | |
| return archs | |
| def find_mapfiles(start_dir: str, archs: List[str]) -> List[str]: | |
| result = [] | |
| for arch in archs: | |
| for item in os.scandir(f'{start_dir}/{arch}'): | |
| if item.is_dir(): | |
| continue | |
| if item.name == 'mapfile.csv': | |
| result.append(f'{start_dir}/{arch}/mapfile.csv') | |
| return result | |
| def find_cpuids(mapfiles: List[str], cpuids: str) -> List[str]: | |
| result = [] | |
| for mapfile in mapfiles: | |
| with open(mapfile, encoding='utf-8') as csvfile: | |
| first = False | |
| table = csv.reader(csvfile) | |
| for row in table: | |
| if not first or len(row) == 0 or row[0].startswith('#'): | |
| first = True | |
| continue | |
| # Python regular expressions don't handle xdigit. | |
| regex = row[0].replace('[[:xdigit:]]', '[0-9a-fA-F]') | |
| for cpuid in cpuids.split(','): | |
| if re.match(regex, cpuid): | |
| result.append(row[2]) | |
| return result | |
| ap = argparse.ArgumentParser() | |
| ap.add_argument('arch', help='Architecture name like x86') | |
| ap.add_argument('cpuid', default='all', help='List of cpuids to convert to model names') | |
| ap.add_argument( | |
| 'starting_dir', | |
| type=dir_path, | |
| help='Root of tree containing architecture directories containing json files' | |
| ) | |
| args = ap.parse_args() | |
| archs = find_archs(args.starting_dir, args.arch) | |
| mapfiles = find_mapfiles(args.starting_dir, archs) | |
| models = find_cpuids(mapfiles, args.cpuid) | |
| print(','.join(models)) | |
| if __name__ == '__main__': | |
| main() |