xref: /aosp_15_r20/external/mesa3d/src/amd/registers/canonicalize.py (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker#
2*61046927SAndroid Build Coastguard Worker# Copyright 2019 Advanced Micro Devices, Inc.
3*61046927SAndroid Build Coastguard Worker#
4*61046927SAndroid Build Coastguard Worker# SPDX-License-Identifier: MIT
5*61046927SAndroid Build Coastguard Worker#
6*61046927SAndroid Build Coastguard Worker"""
7*61046927SAndroid Build Coastguard WorkerHelper script that was used during the generation of the JSON data.
8*61046927SAndroid Build Coastguard Worker
9*61046927SAndroid Build Coastguard Worker  usage: python3 canonicalize.py FILE
10*61046927SAndroid Build Coastguard Worker
11*61046927SAndroid Build Coastguard WorkerReads the register database from FILE, performs canonicalization
12*61046927SAndroid Build Coastguard Worker(de-duplication of enums and register types, implicitly sorting JSON by name)
13*61046927SAndroid Build Coastguard Workerand attempts to deduce missing register types.
14*61046927SAndroid Build Coastguard Worker
15*61046927SAndroid Build Coastguard WorkerNotes about deduced register types as well as the output JSON are printed on
16*61046927SAndroid Build Coastguard Workerstdout.
17*61046927SAndroid Build Coastguard Worker"""
18*61046927SAndroid Build Coastguard Worker
19*61046927SAndroid Build Coastguard Workerfrom collections import defaultdict
20*61046927SAndroid Build Coastguard Workerimport json
21*61046927SAndroid Build Coastguard Workerimport re
22*61046927SAndroid Build Coastguard Workerimport sys
23*61046927SAndroid Build Coastguard Worker
24*61046927SAndroid Build Coastguard Workerfrom regdb import RegisterDatabase, deduplicate_enums, deduplicate_register_types
25*61046927SAndroid Build Coastguard Worker
26*61046927SAndroid Build Coastguard WorkerRE_number = re.compile('[0-9]+')
27*61046927SAndroid Build Coastguard Worker
28*61046927SAndroid Build Coastguard Workerdef deduce_missing_register_types(regdb):
29*61046927SAndroid Build Coastguard Worker    """
30*61046927SAndroid Build Coastguard Worker    This is a heuristic for filling in missing register types based on
31*61046927SAndroid Build Coastguard Worker    sequentially named registers.
32*61046927SAndroid Build Coastguard Worker    """
33*61046927SAndroid Build Coastguard Worker    buckets = defaultdict(list)
34*61046927SAndroid Build Coastguard Worker    for regmap in regdb.register_mappings():
35*61046927SAndroid Build Coastguard Worker        buckets[RE_number.sub('0', regmap.name)].append(regmap)
36*61046927SAndroid Build Coastguard Worker
37*61046927SAndroid Build Coastguard Worker    for bucket in buckets.values():
38*61046927SAndroid Build Coastguard Worker        if len(bucket) <= 1:
39*61046927SAndroid Build Coastguard Worker            continue
40*61046927SAndroid Build Coastguard Worker
41*61046927SAndroid Build Coastguard Worker        regtypenames = set(
42*61046927SAndroid Build Coastguard Worker            regmap.type_ref for regmap in bucket if hasattr(regmap, 'type_ref')
43*61046927SAndroid Build Coastguard Worker        )
44*61046927SAndroid Build Coastguard Worker        if len(regtypenames) == 1:
45*61046927SAndroid Build Coastguard Worker            regtypename = regtypenames.pop()
46*61046927SAndroid Build Coastguard Worker            for regmap in bucket:
47*61046927SAndroid Build Coastguard Worker                if not hasattr(regmap, 'type_ref'):
48*61046927SAndroid Build Coastguard Worker                    print('Deducing {0} -> {1}'.format(regmap.name, regtypename), file=sys.stderr)
49*61046927SAndroid Build Coastguard Worker                regmap.type_ref = regtypename
50*61046927SAndroid Build Coastguard Worker
51*61046927SAndroid Build Coastguard Worker
52*61046927SAndroid Build Coastguard Workerdef json_canonicalize(filp, chips = None):
53*61046927SAndroid Build Coastguard Worker    regdb = RegisterDatabase.from_json(json.load(filp))
54*61046927SAndroid Build Coastguard Worker
55*61046927SAndroid Build Coastguard Worker    if chips is not None:
56*61046927SAndroid Build Coastguard Worker        for regmap in regdb.register_mappings():
57*61046927SAndroid Build Coastguard Worker            assert not hasattr(regmap, 'chips')
58*61046927SAndroid Build Coastguard Worker            regmap.chips = [chips]
59*61046927SAndroid Build Coastguard Worker
60*61046927SAndroid Build Coastguard Worker    deduplicate_enums(regdb)
61*61046927SAndroid Build Coastguard Worker    deduplicate_register_types(regdb)
62*61046927SAndroid Build Coastguard Worker    deduce_missing_register_types(regdb)
63*61046927SAndroid Build Coastguard Worker    regdb.garbage_collect()
64*61046927SAndroid Build Coastguard Worker
65*61046927SAndroid Build Coastguard Worker    return regdb.encode_json_pretty()
66*61046927SAndroid Build Coastguard Worker
67*61046927SAndroid Build Coastguard Worker
68*61046927SAndroid Build Coastguard Workerdef main():
69*61046927SAndroid Build Coastguard Worker    print(json_canonicalize(open(sys.argv[1], 'r'), sys.argv[2]))
70*61046927SAndroid Build Coastguard Worker
71*61046927SAndroid Build Coastguard Workerif __name__ == '__main__':
72*61046927SAndroid Build Coastguard Worker    main()
73*61046927SAndroid Build Coastguard Worker
74*61046927SAndroid Build Coastguard Worker# kate: space-indent on; indent-width 4; replace-tabs on;
75