1*61046927SAndroid Build Coastguard WorkerCopyRight = ''' 2*61046927SAndroid Build Coastguard Worker/* 3*61046927SAndroid Build Coastguard Worker * Copyright 2015-2019 Advanced Micro Devices, Inc. 4*61046927SAndroid Build Coastguard Worker * 5*61046927SAndroid Build Coastguard Worker * SPDX-License-Identifier: MIT 6*61046927SAndroid Build Coastguard Worker */ 7*61046927SAndroid Build Coastguard Worker''' 8*61046927SAndroid Build Coastguard Worker 9*61046927SAndroid Build Coastguard Workerfrom collections import defaultdict 10*61046927SAndroid Build Coastguard Workerimport functools 11*61046927SAndroid Build Coastguard Workerimport itertools 12*61046927SAndroid Build Coastguard Workerimport json 13*61046927SAndroid Build Coastguard Workerimport os.path 14*61046927SAndroid Build Coastguard Workerimport re 15*61046927SAndroid Build Coastguard Workerimport sys 16*61046927SAndroid Build Coastguard Worker 17*61046927SAndroid Build Coastguard WorkerAMD_REGISTERS = os.path.abspath(os.path.join(os.path.dirname(sys.argv[0]), "../registers")) 18*61046927SAndroid Build Coastguard Workersys.path.append(AMD_REGISTERS) 19*61046927SAndroid Build Coastguard Worker 20*61046927SAndroid Build Coastguard Workerfrom regdb import Object, RegisterDatabase 21*61046927SAndroid Build Coastguard Worker 22*61046927SAndroid Build Coastguard Worker 23*61046927SAndroid Build Coastguard Workerdef string_to_chars(string): 24*61046927SAndroid Build Coastguard Worker return "'" + "', '".join(string) + "', '\\0'," 25*61046927SAndroid Build Coastguard Worker 26*61046927SAndroid Build Coastguard Worker 27*61046927SAndroid Build Coastguard Workerclass StringTable: 28*61046927SAndroid Build Coastguard Worker """ 29*61046927SAndroid Build Coastguard Worker A class for collecting multiple strings in a single larger string that is 30*61046927SAndroid Build Coastguard Worker used by indexing (to avoid relocations in the resulting binary) 31*61046927SAndroid Build Coastguard Worker """ 32*61046927SAndroid Build Coastguard Worker def __init__(self): 33*61046927SAndroid Build Coastguard Worker self.table = [] 34*61046927SAndroid Build Coastguard Worker self.length = 0 35*61046927SAndroid Build Coastguard Worker 36*61046927SAndroid Build Coastguard Worker def add(self, string): 37*61046927SAndroid Build Coastguard Worker # We might get lucky with string being a suffix of a previously added string 38*61046927SAndroid Build Coastguard Worker for te in self.table: 39*61046927SAndroid Build Coastguard Worker if te[0].endswith(string): 40*61046927SAndroid Build Coastguard Worker idx = te[1] + len(te[0]) - len(string) 41*61046927SAndroid Build Coastguard Worker te[2].add(idx) 42*61046927SAndroid Build Coastguard Worker return idx 43*61046927SAndroid Build Coastguard Worker 44*61046927SAndroid Build Coastguard Worker idx = self.length 45*61046927SAndroid Build Coastguard Worker self.table.append((string, idx, set((idx,)))) 46*61046927SAndroid Build Coastguard Worker self.length += len(string) + 1 47*61046927SAndroid Build Coastguard Worker 48*61046927SAndroid Build Coastguard Worker return idx 49*61046927SAndroid Build Coastguard Worker 50*61046927SAndroid Build Coastguard Worker def emit(self, filp, name, static=True): 51*61046927SAndroid Build Coastguard Worker """ 52*61046927SAndroid Build Coastguard Worker Write 53*61046927SAndroid Build Coastguard Worker [static] const char name[] = "..."; 54*61046927SAndroid Build Coastguard Worker to filp. 55*61046927SAndroid Build Coastguard Worker """ 56*61046927SAndroid Build Coastguard Worker fragments = [ 57*61046927SAndroid Build Coastguard Worker '%s /* %s (%s) */' % ( 58*61046927SAndroid Build Coastguard Worker string_to_chars(te[0].encode('unicode_escape').decode()), 59*61046927SAndroid Build Coastguard Worker te[0].encode('unicode_escape').decode(), 60*61046927SAndroid Build Coastguard Worker ', '.join(str(idx) for idx in sorted(te[2])) 61*61046927SAndroid Build Coastguard Worker ) 62*61046927SAndroid Build Coastguard Worker for te in self.table 63*61046927SAndroid Build Coastguard Worker ] 64*61046927SAndroid Build Coastguard Worker filp.write('%sconst char %s[] = {\n%s\n};\n' % ( 65*61046927SAndroid Build Coastguard Worker 'static ' if static else '', 66*61046927SAndroid Build Coastguard Worker name, 67*61046927SAndroid Build Coastguard Worker '\n'.join('\t' + fragment for fragment in fragments) 68*61046927SAndroid Build Coastguard Worker )) 69*61046927SAndroid Build Coastguard Worker 70*61046927SAndroid Build Coastguard Workerclass IntTable: 71*61046927SAndroid Build Coastguard Worker """ 72*61046927SAndroid Build Coastguard Worker A class for collecting multiple arrays of integers in a single big array 73*61046927SAndroid Build Coastguard Worker that is used by indexing (to avoid relocations in the resulting binary) 74*61046927SAndroid Build Coastguard Worker """ 75*61046927SAndroid Build Coastguard Worker def __init__(self, typename): 76*61046927SAndroid Build Coastguard Worker self.typename = typename 77*61046927SAndroid Build Coastguard Worker self.table = [] 78*61046927SAndroid Build Coastguard Worker self.idxs = set() 79*61046927SAndroid Build Coastguard Worker 80*61046927SAndroid Build Coastguard Worker def add(self, array): 81*61046927SAndroid Build Coastguard Worker # We might get lucky and find the array somewhere in the existing data 82*61046927SAndroid Build Coastguard Worker try: 83*61046927SAndroid Build Coastguard Worker idx = 0 84*61046927SAndroid Build Coastguard Worker while True: 85*61046927SAndroid Build Coastguard Worker idx = self.table.index(array[0], idx, len(self.table) - len(array) + 1) 86*61046927SAndroid Build Coastguard Worker 87*61046927SAndroid Build Coastguard Worker for i in range(1, len(array)): 88*61046927SAndroid Build Coastguard Worker if array[i] != self.table[idx + i]: 89*61046927SAndroid Build Coastguard Worker break 90*61046927SAndroid Build Coastguard Worker else: 91*61046927SAndroid Build Coastguard Worker self.idxs.add(idx) 92*61046927SAndroid Build Coastguard Worker return idx 93*61046927SAndroid Build Coastguard Worker 94*61046927SAndroid Build Coastguard Worker idx += 1 95*61046927SAndroid Build Coastguard Worker except ValueError: 96*61046927SAndroid Build Coastguard Worker pass 97*61046927SAndroid Build Coastguard Worker 98*61046927SAndroid Build Coastguard Worker idx = len(self.table) 99*61046927SAndroid Build Coastguard Worker self.table += array 100*61046927SAndroid Build Coastguard Worker self.idxs.add(idx) 101*61046927SAndroid Build Coastguard Worker return idx 102*61046927SAndroid Build Coastguard Worker 103*61046927SAndroid Build Coastguard Worker def emit(self, filp, name, static=True): 104*61046927SAndroid Build Coastguard Worker """ 105*61046927SAndroid Build Coastguard Worker Write 106*61046927SAndroid Build Coastguard Worker [static] const typename name[] = { ... }; 107*61046927SAndroid Build Coastguard Worker to filp. 108*61046927SAndroid Build Coastguard Worker """ 109*61046927SAndroid Build Coastguard Worker idxs = sorted(self.idxs) + [len(self.table)] 110*61046927SAndroid Build Coastguard Worker 111*61046927SAndroid Build Coastguard Worker fragments = [ 112*61046927SAndroid Build Coastguard Worker ('\t/* %s */ %s' % ( 113*61046927SAndroid Build Coastguard Worker idxs[i], 114*61046927SAndroid Build Coastguard Worker ' '.join((str(elt) + ',') for elt in self.table[idxs[i]:idxs[i+1]]) 115*61046927SAndroid Build Coastguard Worker )) 116*61046927SAndroid Build Coastguard Worker for i in range(len(idxs) - 1) 117*61046927SAndroid Build Coastguard Worker ] 118*61046927SAndroid Build Coastguard Worker 119*61046927SAndroid Build Coastguard Worker filp.write('%sconst %s %s[] = {\n%s\n};\n' % ( 120*61046927SAndroid Build Coastguard Worker 'static ' if static else '', 121*61046927SAndroid Build Coastguard Worker self.typename, name, 122*61046927SAndroid Build Coastguard Worker '\n'.join(fragments) 123*61046927SAndroid Build Coastguard Worker )) 124*61046927SAndroid Build Coastguard Worker 125*61046927SAndroid Build Coastguard Workerclass Field: 126*61046927SAndroid Build Coastguard Worker def __init__(self, name, bits): 127*61046927SAndroid Build Coastguard Worker self.name = name 128*61046927SAndroid Build Coastguard Worker self.bits = bits # [first, last] 129*61046927SAndroid Build Coastguard Worker self.values = [] # [(name, value), ...] 130*61046927SAndroid Build Coastguard Worker 131*61046927SAndroid Build Coastguard Worker def format(self, string_table, idx_table): 132*61046927SAndroid Build Coastguard Worker mask = ((1 << (self.bits[1] - self.bits[0] + 1)) - 1) << self.bits[0] 133*61046927SAndroid Build Coastguard Worker if len(self.values): 134*61046927SAndroid Build Coastguard Worker values_offsets = [] 135*61046927SAndroid Build Coastguard Worker for value in self.values: 136*61046927SAndroid Build Coastguard Worker while value[1] >= len(values_offsets): 137*61046927SAndroid Build Coastguard Worker values_offsets.append(-1) 138*61046927SAndroid Build Coastguard Worker values_offsets[value[1]] = string_table.add(value[0]) 139*61046927SAndroid Build Coastguard Worker return '{{{0}, 0x{mask:X}, {1}, {2}}}'.format( 140*61046927SAndroid Build Coastguard Worker string_table.add(self.name), 141*61046927SAndroid Build Coastguard Worker len(values_offsets), idx_table.add(values_offsets), 142*61046927SAndroid Build Coastguard Worker **locals() 143*61046927SAndroid Build Coastguard Worker ) 144*61046927SAndroid Build Coastguard Worker else: 145*61046927SAndroid Build Coastguard Worker return '{{{0}, 0x{mask:X}}}'.format(string_table.add(self.name), **locals()) 146*61046927SAndroid Build Coastguard Worker 147*61046927SAndroid Build Coastguard Worker def __eq__(self, other): 148*61046927SAndroid Build Coastguard Worker return (self.name == other.name and 149*61046927SAndroid Build Coastguard Worker self.bits[0] == other.bits[0] and self.bits[1] == other.bits[1] and 150*61046927SAndroid Build Coastguard Worker len(self.values) == len(other.values) and 151*61046927SAndroid Build Coastguard Worker all(a[0] == b[0] and a[1] == b[1] for a, b, in zip(self.values, other.values))) 152*61046927SAndroid Build Coastguard Worker 153*61046927SAndroid Build Coastguard Worker def __ne__(self, other): 154*61046927SAndroid Build Coastguard Worker return not (self == other) 155*61046927SAndroid Build Coastguard Worker 156*61046927SAndroid Build Coastguard Worker 157*61046927SAndroid Build Coastguard Workerclass FieldTable: 158*61046927SAndroid Build Coastguard Worker """ 159*61046927SAndroid Build Coastguard Worker A class for collecting multiple arrays of register fields in a single big 160*61046927SAndroid Build Coastguard Worker array that is used by indexing (to avoid relocations in the resulting binary) 161*61046927SAndroid Build Coastguard Worker """ 162*61046927SAndroid Build Coastguard Worker def __init__(self): 163*61046927SAndroid Build Coastguard Worker self.table = [] 164*61046927SAndroid Build Coastguard Worker self.idxs = set() 165*61046927SAndroid Build Coastguard Worker self.name_to_idx = defaultdict(lambda: []) 166*61046927SAndroid Build Coastguard Worker 167*61046927SAndroid Build Coastguard Worker def add(self, array): 168*61046927SAndroid Build Coastguard Worker """ 169*61046927SAndroid Build Coastguard Worker Add an array of Field objects, and return the index of where to find 170*61046927SAndroid Build Coastguard Worker the array in the table. 171*61046927SAndroid Build Coastguard Worker """ 172*61046927SAndroid Build Coastguard Worker # Check if we can find the array in the table already 173*61046927SAndroid Build Coastguard Worker for base_idx in self.name_to_idx.get(array[0].name, []): 174*61046927SAndroid Build Coastguard Worker if base_idx + len(array) > len(self.table): 175*61046927SAndroid Build Coastguard Worker continue 176*61046927SAndroid Build Coastguard Worker 177*61046927SAndroid Build Coastguard Worker for i, a in enumerate(array): 178*61046927SAndroid Build Coastguard Worker b = self.table[base_idx + i] 179*61046927SAndroid Build Coastguard Worker if a != b: 180*61046927SAndroid Build Coastguard Worker break 181*61046927SAndroid Build Coastguard Worker else: 182*61046927SAndroid Build Coastguard Worker return base_idx 183*61046927SAndroid Build Coastguard Worker 184*61046927SAndroid Build Coastguard Worker base_idx = len(self.table) 185*61046927SAndroid Build Coastguard Worker self.idxs.add(base_idx) 186*61046927SAndroid Build Coastguard Worker 187*61046927SAndroid Build Coastguard Worker for field in array: 188*61046927SAndroid Build Coastguard Worker self.name_to_idx[field.name].append(len(self.table)) 189*61046927SAndroid Build Coastguard Worker self.table.append(field) 190*61046927SAndroid Build Coastguard Worker 191*61046927SAndroid Build Coastguard Worker return base_idx 192*61046927SAndroid Build Coastguard Worker 193*61046927SAndroid Build Coastguard Worker def emit(self, filp, string_table, idx_table): 194*61046927SAndroid Build Coastguard Worker """ 195*61046927SAndroid Build Coastguard Worker Write 196*61046927SAndroid Build Coastguard Worker static const struct si_field sid_fields_table[] = { ... }; 197*61046927SAndroid Build Coastguard Worker to filp. 198*61046927SAndroid Build Coastguard Worker """ 199*61046927SAndroid Build Coastguard Worker idxs = sorted(self.idxs) + [len(self.table)] 200*61046927SAndroid Build Coastguard Worker 201*61046927SAndroid Build Coastguard Worker filp.write('static const struct si_field sid_fields_table[] = {\n') 202*61046927SAndroid Build Coastguard Worker 203*61046927SAndroid Build Coastguard Worker for start, end in zip(idxs, idxs[1:]): 204*61046927SAndroid Build Coastguard Worker filp.write('\t/* %s */\n' % (start)) 205*61046927SAndroid Build Coastguard Worker for field in self.table[start:end]: 206*61046927SAndroid Build Coastguard Worker filp.write('\t%s,\n' % (field.format(string_table, idx_table))) 207*61046927SAndroid Build Coastguard Worker 208*61046927SAndroid Build Coastguard Worker filp.write('};\n') 209*61046927SAndroid Build Coastguard Worker 210*61046927SAndroid Build Coastguard Worker 211*61046927SAndroid Build Coastguard Workerdef parse_packet3(filp): 212*61046927SAndroid Build Coastguard Worker """ 213*61046927SAndroid Build Coastguard Worker Parse PKT3 commands from the given header file. 214*61046927SAndroid Build Coastguard Worker """ 215*61046927SAndroid Build Coastguard Worker packets = [] 216*61046927SAndroid Build Coastguard Worker for line in filp: 217*61046927SAndroid Build Coastguard Worker if not line.startswith('#define '): 218*61046927SAndroid Build Coastguard Worker continue 219*61046927SAndroid Build Coastguard Worker 220*61046927SAndroid Build Coastguard Worker line = line[8:].strip() 221*61046927SAndroid Build Coastguard Worker 222*61046927SAndroid Build Coastguard Worker if line.startswith('PKT3_') and line.find('0x') != -1 and line.find('(') == -1: 223*61046927SAndroid Build Coastguard Worker packets.append(line.split()[0]) 224*61046927SAndroid Build Coastguard Worker return packets 225*61046927SAndroid Build Coastguard Worker 226*61046927SAndroid Build Coastguard Worker 227*61046927SAndroid Build Coastguard Workerclass TableWriter(object): 228*61046927SAndroid Build Coastguard Worker def __init__(self): 229*61046927SAndroid Build Coastguard Worker self.__strings = StringTable() 230*61046927SAndroid Build Coastguard Worker self.__strings_offsets = IntTable('int') 231*61046927SAndroid Build Coastguard Worker self.__fields = FieldTable() 232*61046927SAndroid Build Coastguard Worker 233*61046927SAndroid Build Coastguard Worker def write(self, regdb, packets, file=sys.stdout): 234*61046927SAndroid Build Coastguard Worker def out(*args): 235*61046927SAndroid Build Coastguard Worker print(*args, file=file) 236*61046927SAndroid Build Coastguard Worker 237*61046927SAndroid Build Coastguard Worker out('/* This file is autogenerated by sid_tables.py from sid.h. Do not edit directly. */') 238*61046927SAndroid Build Coastguard Worker out() 239*61046927SAndroid Build Coastguard Worker out(CopyRight.strip()) 240*61046927SAndroid Build Coastguard Worker out(''' 241*61046927SAndroid Build Coastguard Worker#ifndef SID_TABLES_H 242*61046927SAndroid Build Coastguard Worker#define SID_TABLES_H 243*61046927SAndroid Build Coastguard Worker 244*61046927SAndroid Build Coastguard Workerstruct si_field { 245*61046927SAndroid Build Coastguard Worker unsigned name_offset; 246*61046927SAndroid Build Coastguard Worker unsigned mask; 247*61046927SAndroid Build Coastguard Worker unsigned num_values; 248*61046927SAndroid Build Coastguard Worker unsigned values_offset; /* offset into sid_strings_offsets */ 249*61046927SAndroid Build Coastguard Worker}; 250*61046927SAndroid Build Coastguard Worker 251*61046927SAndroid Build Coastguard Workerstruct si_reg { 252*61046927SAndroid Build Coastguard Worker unsigned name_offset; 253*61046927SAndroid Build Coastguard Worker unsigned offset; 254*61046927SAndroid Build Coastguard Worker unsigned num_fields; 255*61046927SAndroid Build Coastguard Worker unsigned fields_offset; 256*61046927SAndroid Build Coastguard Worker}; 257*61046927SAndroid Build Coastguard Worker 258*61046927SAndroid Build Coastguard Workerstruct si_packet3 { 259*61046927SAndroid Build Coastguard Worker unsigned name_offset; 260*61046927SAndroid Build Coastguard Worker unsigned op; 261*61046927SAndroid Build Coastguard Worker}; 262*61046927SAndroid Build Coastguard Worker''') 263*61046927SAndroid Build Coastguard Worker 264*61046927SAndroid Build Coastguard Worker out('static const struct si_packet3 packet3_table[] = {') 265*61046927SAndroid Build Coastguard Worker for pkt in packets: 266*61046927SAndroid Build Coastguard Worker out('\t{%s, %s},' % (self.__strings.add(pkt[5:]), pkt)) 267*61046927SAndroid Build Coastguard Worker out('};') 268*61046927SAndroid Build Coastguard Worker out() 269*61046927SAndroid Build Coastguard Worker 270*61046927SAndroid Build Coastguard Worker regmaps_by_chip = defaultdict(list) 271*61046927SAndroid Build Coastguard Worker 272*61046927SAndroid Build Coastguard Worker for regmap in regdb.register_mappings(): 273*61046927SAndroid Build Coastguard Worker for chip in regmap.chips: 274*61046927SAndroid Build Coastguard Worker regmaps_by_chip[chip].append(regmap) 275*61046927SAndroid Build Coastguard Worker 276*61046927SAndroid Build Coastguard Worker regtypes = {} 277*61046927SAndroid Build Coastguard Worker 278*61046927SAndroid Build Coastguard Worker # Sorted iteration over chips for deterministic builds 279*61046927SAndroid Build Coastguard Worker for chip in sorted(regmaps_by_chip.keys()): 280*61046927SAndroid Build Coastguard Worker regmaps = regmaps_by_chip[chip] 281*61046927SAndroid Build Coastguard Worker regmaps.sort(key=lambda regmap: (regmap.map.to, regmap.map.at)) 282*61046927SAndroid Build Coastguard Worker 283*61046927SAndroid Build Coastguard Worker out('static const struct si_reg {chip}_reg_table[] = {{'.format(**locals())) 284*61046927SAndroid Build Coastguard Worker 285*61046927SAndroid Build Coastguard Worker for regmap in regmaps: 286*61046927SAndroid Build Coastguard Worker if hasattr(regmap, 'type_ref'): 287*61046927SAndroid Build Coastguard Worker if not regmap.type_ref in regtypes: 288*61046927SAndroid Build Coastguard Worker regtype = regdb.register_type(regmap.type_ref) 289*61046927SAndroid Build Coastguard Worker fields = [] 290*61046927SAndroid Build Coastguard Worker for dbfield in regtype.fields: 291*61046927SAndroid Build Coastguard Worker field = Field(dbfield.name, dbfield.bits) 292*61046927SAndroid Build Coastguard Worker if hasattr(dbfield, 'enum_ref'): 293*61046927SAndroid Build Coastguard Worker enum = regdb.enum(dbfield.enum_ref) 294*61046927SAndroid Build Coastguard Worker for entry in enum.entries: 295*61046927SAndroid Build Coastguard Worker field.values.append((entry.name, entry.value)) 296*61046927SAndroid Build Coastguard Worker fields.append(field) 297*61046927SAndroid Build Coastguard Worker 298*61046927SAndroid Build Coastguard Worker num_fields = len(regtype.fields) 299*61046927SAndroid Build Coastguard Worker fields_offset = self.__fields.add(fields) 300*61046927SAndroid Build Coastguard Worker regtypes[regmap.type_ref] = (num_fields, fields_offset) 301*61046927SAndroid Build Coastguard Worker else: 302*61046927SAndroid Build Coastguard Worker num_fields, fields_offset = regtypes[regmap.type_ref] 303*61046927SAndroid Build Coastguard Worker 304*61046927SAndroid Build Coastguard Worker print('\t{{{0}, {regmap.map.at}, {num_fields}, {fields_offset}}},' 305*61046927SAndroid Build Coastguard Worker .format(self.__strings.add(regmap.name), **locals())) 306*61046927SAndroid Build Coastguard Worker else: 307*61046927SAndroid Build Coastguard Worker print('\t{{{0}, {regmap.map.at}}},' 308*61046927SAndroid Build Coastguard Worker .format(self.__strings.add(regmap.name), **locals())) 309*61046927SAndroid Build Coastguard Worker 310*61046927SAndroid Build Coastguard Worker out('};\n') 311*61046927SAndroid Build Coastguard Worker 312*61046927SAndroid Build Coastguard Worker self.__fields.emit(file, self.__strings, self.__strings_offsets) 313*61046927SAndroid Build Coastguard Worker 314*61046927SAndroid Build Coastguard Worker out() 315*61046927SAndroid Build Coastguard Worker 316*61046927SAndroid Build Coastguard Worker self.__strings.emit(file, "sid_strings") 317*61046927SAndroid Build Coastguard Worker 318*61046927SAndroid Build Coastguard Worker out() 319*61046927SAndroid Build Coastguard Worker 320*61046927SAndroid Build Coastguard Worker self.__strings_offsets.emit(file, "sid_strings_offsets") 321*61046927SAndroid Build Coastguard Worker 322*61046927SAndroid Build Coastguard Worker out() 323*61046927SAndroid Build Coastguard Worker out('#endif') 324*61046927SAndroid Build Coastguard Worker 325*61046927SAndroid Build Coastguard Worker 326*61046927SAndroid Build Coastguard Workerdef main(): 327*61046927SAndroid Build Coastguard Worker # Parse PKT3 types 328*61046927SAndroid Build Coastguard Worker with open(sys.argv[1], 'r') as filp: 329*61046927SAndroid Build Coastguard Worker packets = parse_packet3(filp) 330*61046927SAndroid Build Coastguard Worker 331*61046927SAndroid Build Coastguard Worker # Register database parse 332*61046927SAndroid Build Coastguard Worker regdb = None 333*61046927SAndroid Build Coastguard Worker for filename in sys.argv[2:]: 334*61046927SAndroid Build Coastguard Worker with open(filename, 'r') as filp: 335*61046927SAndroid Build Coastguard Worker try: 336*61046927SAndroid Build Coastguard Worker db = RegisterDatabase.from_json(json.load(filp)) 337*61046927SAndroid Build Coastguard Worker if regdb is None: 338*61046927SAndroid Build Coastguard Worker regdb = db 339*61046927SAndroid Build Coastguard Worker else: 340*61046927SAndroid Build Coastguard Worker regdb.update(db) 341*61046927SAndroid Build Coastguard Worker except json.JSONDecodeError as e: 342*61046927SAndroid Build Coastguard Worker print('Error reading {}'.format(sys.argv[1]), file=sys.stderr) 343*61046927SAndroid Build Coastguard Worker raise 344*61046927SAndroid Build Coastguard Worker 345*61046927SAndroid Build Coastguard Worker # The ac_debug code only distinguishes by gfx_level 346*61046927SAndroid Build Coastguard Worker regdb.merge_chips(['gfx8', 'fiji', 'stoney'], 'gfx8') 347*61046927SAndroid Build Coastguard Worker 348*61046927SAndroid Build Coastguard Worker # Write it all out 349*61046927SAndroid Build Coastguard Worker w = TableWriter() 350*61046927SAndroid Build Coastguard Worker w.write(regdb, packets) 351*61046927SAndroid Build Coastguard Worker 352*61046927SAndroid Build Coastguard Workerif __name__ == '__main__': 353*61046927SAndroid Build Coastguard Worker main() 354*61046927SAndroid Build Coastguard Worker 355*61046927SAndroid Build Coastguard Worker# kate: space-indent on; indent-width 4; replace-tabs on; 356