Path: blob/21.2-virgl/src/amd/registers/canonicalize.py
7236 views
#1# Copyright 2019 Advanced Micro Devices, Inc.2#3# Permission is hereby granted, free of charge, to any person obtaining a4# copy of this software and associated documentation files (the "Software"),5# to deal in the Software without restriction, including without limitation6# on the rights to use, copy, modify, merge, publish, distribute, sub7# license, and/or sell copies of the Software, and to permit persons to whom8# the Software is furnished to do so, subject to the following conditions:9#10# The above copyright notice and this permission notice (including the next11# paragraph) shall be included in all copies or substantial portions of the12# Software.13#14# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR15# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,16# FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL17# THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,18# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR19# OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE20# USE OR OTHER DEALINGS IN THE SOFTWARE.21#22"""23Helper script that was used during the generation of the JSON data.2425usage: python3 canonicalize.py FILE2627Reads the register database from FILE, performs canonicalization28(de-duplication of enums and register types, implicitly sorting JSON by name)29and attempts to deduce missing register types.3031Notes about deduced register types as well as the output JSON are printed on32stdout.33"""3435from __future__ import absolute_import, division, print_function, unicode_literals3637from collections import defaultdict38import json39import re40import sys4142from regdb import RegisterDatabase, deduplicate_enums, deduplicate_register_types4344RE_number = re.compile('[0-9]+')4546def deduce_missing_register_types(regdb):47"""48This is a heuristic for filling in missing register types based on49sequentially named registers.50"""51buckets = defaultdict(list)52for regmap in regdb.register_mappings():53buckets[RE_number.sub('0', regmap.name)].append(regmap)5455for bucket in buckets.values():56if len(bucket) <= 1:57continue5859regtypenames = set(60regmap.type_ref for regmap in bucket if hasattr(regmap, 'type_ref')61)62if len(regtypenames) == 1:63regtypename = regtypenames.pop()64for regmap in bucket:65if not hasattr(regmap, 'type_ref'):66print('Deducing {0} -> {1}'.format(regmap.name, regtypename), file=sys.stderr)67regmap.type_ref = regtypename686970def json_canonicalize(filp, chips = None):71regdb = RegisterDatabase.from_json(json.load(filp))7273if chips is not None:74for regmap in regdb.register_mappings():75assert not hasattr(regmap, 'chips')76regmap.chips = [chips]7778deduplicate_enums(regdb)79deduplicate_register_types(regdb)80deduce_missing_register_types(regdb)81regdb.garbage_collect()8283return regdb.encode_json_pretty()848586def main():87print(json_canonicalize(open(sys.argv[1], 'r'), sys.argv[2]))8889if __name__ == '__main__':90main()9192# kate: space-indent on; indent-width 4; replace-tabs on;939495