From d83f03107a17b5a507ff8854fa4bb4c1e85cc5bf Mon Sep 17 00:00:00 2001 From: Frank Barchard Date: Tue, 12 May 2026 17:28:24 -0700 Subject: [PATCH] Use immutabledict for global constants in python scripts PiperOrigin-RevId: 914562268 --- tools/generate-vbinary-test.py | 8 ++++++-- tools/generate-vunary-test.py | 14 +++++++++----- tools/update-microkernels.py | 13 +++++++++---- tools/xnncommon.py | 23 ++++++++++++++--------- 4 files changed, 38 insertions(+), 20 deletions(-) diff --git a/tools/generate-vbinary-test.py b/tools/generate-vbinary-test.py index 842d9461f7d..95317a6c646 100755 --- a/tools/generate-vbinary-test.py +++ b/tools/generate-vbinary-test.py @@ -11,6 +11,10 @@ import re import sys import yaml +try: + from immutabledict import immutabledict +except ImportError: + immutabledict = dict sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) import xngen @@ -44,7 +48,7 @@ ) parser.set_defaults(defines=list()) -OP_TYPES = { +OP_TYPES = immutabledict({ "vadd": "Add", "vaddc": "Add", "vcopysign": "CopySign", @@ -71,7 +75,7 @@ "vprelu": "Prelu", "vpreluc": "Prelu", "vrpreluc": "RPrelu", -} +}) BINOP_TEST_TEMPLATE = """ #define XNN_UKERNEL(arch_flags, ukernel, batch_tile, vector_tile, datatype, params_type, init_params) diff --git a/tools/generate-vunary-test.py b/tools/generate-vunary-test.py index 23bdbb57cb6..3dceaa57a92 100755 --- a/tools/generate-vunary-test.py +++ b/tools/generate-vunary-test.py @@ -8,9 +8,13 @@ import math import os import sys -import types from typing import NamedTuple +try: + from immutabledict import immutabledict +except ImportError: + immutabledict = dict + sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) import xngen import xnncommon @@ -41,7 +45,7 @@ class SpecialValues(NamedTuple): expected_outputs: str tolerance_ulp: int -OP_TYPES = { +OP_TYPES = immutabledict({ "vabs": "Abs", "vapproxgelu": "ApproxGELU", "vclamp": "Clamp", @@ -63,11 +67,11 @@ class SpecialValues(NamedTuple): "vsqr": "Square", "vsqrt": "SquareRoot", "vtanh": "TanH", -} +}) PARAMS_TYPES = ["Clamp", "ELU", "LeakyReLU"] -SPECIAL_VALUES_BY_OP_TYPE_F32 = types.MappingProxyType({ +SPECIAL_VALUES_BY_OP_TYPE_F32 = immutabledict({ "SquareRoot": SpecialValues( num_elements=4, inputs="{0.0f, -0.0f, 1.0f, -1.0f}", @@ -127,7 +131,7 @@ class SpecialValues(NamedTuple): }) -SPECIAL_VALUES_BY_OP_TYPE_F16 = types.MappingProxyType({ +SPECIAL_VALUES_BY_OP_TYPE_F16 = immutabledict({ "Log": SpecialValues( num_elements=4, inputs="{1.0f, -1.0f, 0.0f, -0.0f}", diff --git a/tools/update-microkernels.py b/tools/update-microkernels.py index 6fcae478c0f..6ad02b4010a 100755 --- a/tools/update-microkernels.py +++ b/tools/update-microkernels.py @@ -10,6 +10,11 @@ import os import re import sys +try: + from immutabledict import immutabledict +except ImportError: + immutabledict = dict + parser = argparse.ArgumentParser( description='Utility for re-generating microkernel lists' @@ -81,12 +86,12 @@ 'wasmsimd', }) -_ISA_MAP = { +_ISA_MAP = immutabledict({ 'wasmblendvps': 'wasmrelaxedsimd', 'wasmpshufb': 'wasmrelaxedsimd', 'wasmsdot': 'wasmrelaxedsimd', 'wasmusdot': 'wasmrelaxedsimd', -} +}) _ARCH_LIST = frozenset({ 'aarch32', @@ -101,12 +106,12 @@ r'\bxnn_(?:[a-z0-9]+(?:_[a-z0-9]+)*)_ukernel(?:_[a-z0-9]+)*__(?:[a-z0-9]+(?:_[a-z0-9]+)*)\b' ) -_VERIFICATION_IGNORE_SUBDIRS = { +_VERIFICATION_IGNORE_SUBDIRS = frozenset({ os.path.join('src', 'qs8-requantization'), os.path.join('src', 'qu8-requantization'), os.path.join('src', 'reference'), os.path.join('src', 'xnnpack', 'simd'), -} +}) def overwrite_if_changed(filepath, content): diff --git a/tools/xnncommon.py b/tools/xnncommon.py index 922c6207175..dcd12da0d22 100644 --- a/tools/xnncommon.py +++ b/tools/xnncommon.py @@ -6,6 +6,11 @@ import codecs import os +try: + from immutabledict import immutabledict +except ImportError: + immutabledict = dict + def _indent(text): @@ -23,7 +28,7 @@ def _remove_duplicate_newlines(text): return "\n".join(filtered_lines) -_ARCH_TO_MACRO_MAP = { +_ARCH_TO_MACRO_MAP = immutabledict({ "aarch32": "XNN_ARCH_ARM", "aarch64": "XNN_ARCH_ARM64", "x86-32": "XNN_ARCH_X86", @@ -38,11 +43,11 @@ def _remove_duplicate_newlines(text): "wasmsimd32": "XNN_ARCH_WASMSIMD", "wasmrelaxedsimd32": "XNN_ARCH_WASMRELAXEDSIMD", "wasmrelaxedsimdfp16": "XNN_ARCH_WASMRELAXEDSIMDFP16", -} +}) # Mapping from ISA extension to macro guarding build-time enabled/disabled # status for the ISA. Only ISAs that can be enabled/disabled have an entry. -_ISA_TO_MACRO_MAP = { +_ISA_TO_MACRO_MAP = immutabledict({ "fp16arith": "XNN_ENABLE_ARM_FP16_SCALAR", "neonfp16arith": "XNN_ENABLE_ARM_FP16_VECTOR", "neonbf16": "XNN_ENABLE_ARM_BF16", @@ -75,9 +80,9 @@ def _remove_duplicate_newlines(text): "avx512fp16": "XNN_ENABLE_AVX512FP16", "avx512bf16": "XNN_ENABLE_AVX512BF16", "hvx": "XNN_ENABLE_HVX", -} +}) -_ISA_TO_ARCH_MAP = { +_ISA_TO_ARCH_MAP = immutabledict({ "armsimd32": ["aarch32"], "fp16arith": ["aarch32", "aarch64"], "neon": ["aarch32", "aarch64"], @@ -124,9 +129,9 @@ def _remove_duplicate_newlines(text): "wasmsdot": ["wasmrelaxedsimd"], "wasmusdot": ["wasmrelaxedsimd"], "wasmblendvps": ["wasmrelaxedsimd"], -} +}) -_ISA_TO_ARCH_FLAGS_MAP = { +_ISA_TO_ARCH_FLAGS_MAP = immutabledict({ "armsimd32": "xnn_arch_arm_v6", "fp16arith": "xnn_arch_arm_fp16_arith", "neon": "xnn_arch_arm_neon", @@ -168,7 +173,7 @@ def _remove_duplicate_newlines(text): "wasmsdot": "xnn_arch_wasm_sdot", "wasmusdot": "xnn_arch_wasm_usdot", "wasmblendvps": "xnn_arch_wasm_blendvps", -} +}) def isa_hierarchy_map(): @@ -268,7 +273,7 @@ def postprocess_test_case(test_case, arch, isa, assembly=False): "hvx", ] -_ISA_HIERARCHY_MAP = {isa: v for v, isa in enumerate(_ISA_HIERARCHY)} +_ISA_HIERARCHY_MAP = immutabledict({isa: v for v, isa in enumerate(_ISA_HIERARCHY)}) def overwrite_if_changed(filepath, content):