| #!/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() |