|
| 1 | +""" |
| 2 | +Copyright (c) 2025 Silicon Laboratories Inc. |
| 3 | +
|
| 4 | +SPDX-License-Identifier: Apache-2.0 |
| 5 | +""" |
| 6 | +import argparse |
| 7 | +import re |
| 8 | +import datetime |
| 9 | +from pathlib import Path |
| 10 | + |
| 11 | +devices = { |
| 12 | + "xg21": { |
| 13 | + "bits": "platform/Device/SiliconLabs/EFR32MG21/Include/efr32mg21_acmp.h", |
| 14 | + }, |
| 15 | + "xg23": { |
| 16 | + "bits": "platform/Device/SiliconLabs/EFR32FG23/Include/efr32fg23_acmp.h", |
| 17 | + }, |
| 18 | + "xg24": { |
| 19 | + "bits": "platform/Device/SiliconLabs/EFR32MG24/Include/efr32mg24_acmp.h", |
| 20 | + }, |
| 21 | + "xg27": { |
| 22 | + "bits": "platform/Device/SiliconLabs/EFR32BG27/Include/efr32bg27_acmp.h", |
| 23 | + }, |
| 24 | + "xg29": { |
| 25 | + "bits": "platform/Device/SiliconLabs/EFR32MG29/Include/efr32mg29_acmp.h", |
| 26 | + }, |
| 27 | +} |
| 28 | + |
| 29 | +if __name__ == "__main__": |
| 30 | + parser = argparse.ArgumentParser(description="Generate headers for Comparator for Series 2 " |
| 31 | + "devices. The headers are used from DeviceTree, and represent " |
| 32 | + "every ACMP input selection as a DT compatible macro.") |
| 33 | + parser.add_argument("--out", "-o", type=Path, default=Path(__file__).parent / "out", |
| 34 | + help="Output directory. Defaults to the directory ./out/ relative to the " |
| 35 | + "script. Set to $ZEPHYR_BASE/include/zephyr/dt-bindings/comparator/ " |
| 36 | + "to directly generate output into the expected location within the Zephyr " |
| 37 | + "main tree.") |
| 38 | + parser.add_argument("--sdk", "-s", type=Path, default=Path(__file__).parent.parent / "simplicity_sdk", |
| 39 | + help="Path to Simplicity SDK to extract data from. Defaults to the directory " |
| 40 | + "../simplicity_sdk relative to the script.") |
| 41 | + args = parser.parse_args() |
| 42 | + |
| 43 | + args.out.mkdir(exist_ok=True) |
| 44 | + |
| 45 | + defines = {} |
| 46 | + for device, data_sources in devices.items(): |
| 47 | + bits_file = (args.sdk / data_sources["bits"]).resolve() |
| 48 | + with bits_file.open() as f: |
| 49 | + for line in f: |
| 50 | + |
| 51 | + if m := re.match(r"#define (_ACMP_INPUTCTRL_POSSEL_(?!SHIFT)(?!MASK)(?!DEFAULT).*)\s+(\dx[\dABCDEF]+)", line): |
| 52 | + input_value = hex(int(m.group(2),16)) |
| 53 | + input_name = f"#define ACMP_INPUT_{m.group(1).split('_')[-1]}" |
| 54 | + # Detect any input definition collisions |
| 55 | + if (input_value in defines): |
| 56 | + if ( input_name == defines[input_value] ): |
| 57 | + print(f"Inputs {input_name} and {defines[input_value]} share the same value {input_value}.") |
| 58 | + defines.update({input_value : f"{input_name} {input_value}"}) |
| 59 | + |
| 60 | + if m := re.match(r"#define (_ACMP_INPUTCTRL_NEGSEL_(?!SHIFT)(?!MASK)(?!DEFAULT).*)\s+(\dx[\dABCDEF]+)", line): |
| 61 | + input_value = hex(int(m.group(2),16)) |
| 62 | + input_name = f"#define ACMP_INPUT_{m.group(1).split('_')[-1]}" |
| 63 | + # Detect any input definition collisions |
| 64 | + if (input_value in defines): |
| 65 | + if ( input_name == defines[input_value] ): |
| 66 | + print(f"Inputs {input_name} and {defines[input_value]} share the same value {input_value}.") |
| 67 | + defines.update({input_value : f"{input_name} {input_value}"}) |
| 68 | + |
| 69 | + # Sort defines by key |
| 70 | + defines = dict(sorted(defines.items())) |
| 71 | + |
| 72 | + file = [ |
| 73 | + "/*", |
| 74 | + f" * Copyright (c) {datetime.date.today().year} Silicon Laboratories Inc.", |
| 75 | + " *", |
| 76 | + " * SPDX-License-Identifier: Apache-2.0", |
| 77 | + " *", |
| 78 | + f" * This file was generated by the script {Path(__file__).name} in the hal_silabs module.", |
| 79 | + " * Do not manually edit.", |
| 80 | + " */", |
| 81 | + "", |
| 82 | + f"#ifndef ZEPHYR_INCLUDE_DT_BINDINGS_COMPARATOR_SILABS_ACMP_H_", |
| 83 | + f"#define ZEPHYR_INCLUDE_DT_BINDINGS_COMPARATOR_SILABS_ACMP_H_", |
| 84 | + "", |
| 85 | + f"/* ACMP Input Aliases */", |
| 86 | + f"#define ACMP_INPUT_VDACOUT0 ACMP_INPUT_VDAC0OUT0", |
| 87 | + f"#define ACMP_INPUT_VDACOUT1 ACMP_INPUT_VDAC0OUT1", |
| 88 | + "", |
| 89 | + f"/* ACMP Input Definitions */", |
| 90 | + ] + list(defines.values()) + [ |
| 91 | + "", |
| 92 | + f"#endif /* ZEPHYR_INCLUDE_DT_BINDINGS_COMPARATOR_SILABS_ACMP_H_ */", |
| 93 | + "", |
| 94 | + ] |
| 95 | + |
| 96 | + outfile = args.out / f"silabs-acmp.h" |
| 97 | + outfile.write_text("\n".join(file)) |
0 commit comments