xref: /aosp_15_r20/external/mesa3d/src/amd/common/sid_tables.py (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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