diff options
| author | Jeff Epler <jepler@gmail.com> | 2020-08-26 11:13:18 -0500 |
|---|---|---|
| committer | Jeff Epler <jepler@gmail.com> | 2020-08-26 11:29:55 -0500 |
| commit | 5422dd682ca107ae27c57c7d3fa240baa354bc87 (patch) | |
| tree | f84d5433d1091e02afa17873ae14b63ca0579c38 | |
| parent | 575516072038d470210e1944cbdaaf6868116f39 (diff) | |
shared_bindings_matrix: Run in parallel
.. this makes it take a fraction of the time, at least on systems
with a lot of CPU threads. Even on my old laptop with a 2-core CPU
it reduces the time from 55s to 27s.
| -rw-r--r-- | docs/shared_bindings_matrix.py | 57 |
1 files changed, 32 insertions, 25 deletions
diff --git a/docs/shared_bindings_matrix.py b/docs/shared_bindings_matrix.py index 7b96c14f2..3523b8ec6 100644 --- a/docs/shared_bindings_matrix.py +++ b/docs/shared_bindings_matrix.py @@ -28,6 +28,7 @@ import re import subprocess import sys +from concurrent.futures import ThreadPoolExecutor SUPPORTED_PORTS = ['atmel-samd', 'esp32s2', 'litex', 'mimxrt10xx', 'nrf', 'stm'] @@ -131,38 +132,44 @@ def lookup_setting(settings, key, default=''): key = value[2:-1] return value +def all_ports_all_boards(ports=SUPPORTED_PORTS): + for port in ports: + + port_dir = get_circuitpython_root_dir() / "ports" / port + for entry in (port_dir / "boards").iterdir(): + if not entry.is_dir(): + continue + yield (port, entry) + def support_matrix_by_board(use_branded_name=True): """ Compiles a list of the available core modules available for each board. """ base = build_module_map() - boards = dict() - for port in SUPPORTED_PORTS: - + def support_matrix(arg): + port, entry = arg port_dir = get_circuitpython_root_dir() / "ports" / port - for entry in (port_dir / "boards").iterdir(): - if not entry.is_dir(): - continue - board_modules = [] - board_name = entry.name - - settings = get_settings_from_makefile(str(port_dir), entry.name) - - if use_branded_name: - with open(entry / "mpconfigboard.h") as get_name: - board_contents = get_name.read() - board_name_re = re.search(r"(?<=MICROPY_HW_BOARD_NAME)\s+(.+)", - board_contents) - if board_name_re: - board_name = board_name_re.group(1).strip('"') - - board_modules = [] - for module in base: - key = f'CIRCUITPY_{module.upper()}' - if int(lookup_setting(settings, key, '0')): - board_modules.append(base[module]['name']) - boards[board_name] = sorted(board_modules) + settings = get_settings_from_makefile(str(port_dir), entry.name) + + if use_branded_name: + with open(entry / "mpconfigboard.h") as get_name: + board_contents = get_name.read() + board_name_re = re.search(r"(?<=MICROPY_HW_BOARD_NAME)\s+(.+)", + board_contents) + if board_name_re: + board_name = board_name_re.group(1).strip('"') + + board_modules = [] + for module in base: + key = f'CIRCUITPY_{module.upper()}' + if int(lookup_setting(settings, key, '0')): + board_modules.append(base[module]['name']) + + return (board_name, sorted(board_modules)) + + executor = ThreadPoolExecutor(max_workers=os.cpu_count()) + boards = dict(sorted(executor.map(support_matrix, all_ports_all_boards()))) #print(json.dumps(boards, indent=2)) return boards |
