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