-'''
-
- print 'static const struct si_packet3 packet3_table[] = {'
- for pkt in packets:
- print '\t{%s, %s},' % (strings.add(pkt[5:]), pkt)
- print '};'
- print
-
- print 'static const struct si_field sid_fields_table[] = {'
-
- fields_idx = 0
- for reg in regs:
- if len(reg.fields) and reg.own_fields:
- print '\t/* %s */' % (fields_idx)
-
- reg.fields_idx = fields_idx
-
- for field in reg.fields:
- if len(field.values):
- values_offsets = []
- for value in field.values:
- while value[1] >= len(values_offsets):
- values_offsets.append(-1)
- values_offsets[value[1]] = strings.add(strip_prefix(value[0]))
- print '\t{%s, %s(~0u), %s, %s},' % (
- strings.add(field.name), field.s_name,
- len(values_offsets), strings_offsets.add(values_offsets))
+''')
+
+ out('static const struct si_packet3 packet3_table[] = {')
+ for pkt in packets:
+ out('\t{%s, %s},' % (self.__strings.add(pkt[5:]), pkt))
+ out('};')
+ out()
+
+ regmaps_by_chip = defaultdict(list)
+
+ for regmap in regdb.register_mappings():
+ for chip in regmap.chips:
+ regmaps_by_chip[chip].append(regmap)
+
+ regtypes = {}
+
+ # Sorted iteration over chips for deterministic builds
+ for chip in sorted(regmaps_by_chip.keys()):
+ regmaps = regmaps_by_chip[chip]
+ regmaps.sort(key=lambda regmap: (regmap.map.to, regmap.map.at))
+
+ out('static const struct si_reg {chip}_reg_table[] = {{'.format(**locals()))
+
+ for regmap in regmaps:
+ if hasattr(regmap, 'type_ref'):
+ if not regmap.type_ref in regtypes:
+ regtype = regdb.register_type(regmap.type_ref)
+ fields = []
+ for dbfield in regtype.fields:
+ field = Field(dbfield.name, dbfield.bits)
+ if hasattr(dbfield, 'enum_ref'):
+ enum = regdb.enum(dbfield.enum_ref)
+ for entry in enum.entries:
+ field.values.append((entry.name, entry.value))
+ fields.append(field)
+
+ num_fields = len(regtype.fields)
+ fields_offset = self.__fields.add(fields)
+ regtypes[regmap.type_ref] = (num_fields, fields_offset)
+ else:
+ num_fields, fields_offset = regtypes[regmap.type_ref]
+
+ print('\t{{{0}, {regmap.map.at}, {num_fields}, {fields_offset}}},'
+ .format(self.__strings.add(regmap.name), **locals()))