return name
+def prefixed_upper_name(prefix, name):
+ if prefix:
+ name = prefix + "_" + name
+ return safe_name(name).upper()
+
def num_from_str(num_str):
if num_str.lower().startswith('0x'):
return int(num_str, base=16)
self.end = self.start + int(attrs["size"]) - 1
self.type = attrs["type"]
+ if self.type == 'bool' and self.start != self.end:
+ print("#error Field {} has bool type but more than one bit of size".format(self.name));
+
if "prefix" in attrs:
self.prefix = safe_name(attrs["prefix"]).upper()
else:
type = 'uint32_t'
elif self.type in self.parser.structs:
type = 'struct ' + self.parser.gen_prefix(safe_name(self.type))
+ elif self.type in self.parser.enums:
+ type = 'enum ' + self.parser.gen_prefix(safe_name(self.type))
elif self.type == 'mbo':
return
else:
print("#error unhandled type: %s" % self.type)
+ type = "uint32_t"
print(" %-36s %s%s;" % (type, self.name, dim))
- if len(self.values) > 0 and self.default == None:
- if self.prefix:
- prefix = self.prefix + "_"
- else:
- prefix = ""
-
for value in self.values:
- print("#define %-40s %d" % ((prefix + value.name).replace("__", "_"),
- value.value))
+ name = prefixed_upper_name(self.prefix, value.name)
+ print("#define %-40s %d" % (name, value.value))
def overlaps(self, field):
return self != field and max(self.start, field.start) <= min(self.end, field.end)
field_byte_start = (field.start // 8) * 8
start -= field_byte_start
end -= field_byte_start
+ extra_shift = 0
if field.type == "mbo":
s = "__gen_mbo(%d, %d)" % \
(start, end)
elif field.type == "address":
+ extra_shift = (31 - (end - start)) // 8 * 8
s = "__gen_address_offset(&values->%s)" % byte.address.name
elif field.type == "uint":
s = "__gen_uint(values->%s, %d, %d)" % \
(name, start, end)
+ elif field.type in self.parser.enums:
+ s = "__gen_uint(values->%s, %d, %d)" % \
+ (name, start, end)
elif field.type == "int":
s = "__gen_sint(values->%s, %d, %d)" % \
(name, start, end)
s = None
if not s == None:
- if byte_start - field_byte_start != 0:
- s = "%s >> %d" % (s, byte_start - field_byte_start)
+ shift = byte_start - field_byte_start + extra_shift
+ if shift:
+ s = "%s >> %d" % (s, shift)
if field == byte.fields[-1]:
print("%s %s;" % (prefix, s))
convert = "__gen_unpack_address"
elif field.type == "uint":
convert = "__gen_unpack_uint"
+ elif field.type in self.parser.enums:
+ convert = "__gen_unpack_uint"
elif field.type == "int":
convert = "__gen_unpack_sint"
elif field.type == "bool":
args.append(str(field.fractional_size))
convert = "__gen_unpack_sfixed"
else:
- print("/* unhandled field %s, type %s */\n" % (name, field.type))
+ print("/* unhandled field %s, type %s */\n" % (field.name, field.type))
s = None
print(" values->%s = %s(%s);" % \
class Value(object):
def __init__(self, attrs):
- self.name = safe_name(attrs["name"]).upper()
+ self.name = attrs["name"]
self.value = int(attrs["value"])
class Parser(object):
self.packet = None
self.struct = None
self.structs = {}
+ # Set of enum names we've seen.
+ self.enums = set()
self.registers = {}
def gen_prefix(self, name):
def start_element(self, name, attrs):
if name == "vcxml":
- self.platform = "V3D {}".format(attrs["ver"])
- self.ver = attrs["ver"].replace('.', '')
+ self.platform = "V3D {}".format(attrs["gen"])
+ self.ver = attrs["gen"].replace('.', '')
print(pack_header % {'license': license, 'platform': self.platform, 'guard': self.gen_guard()})
elif name in ("packet", "struct", "register"):
default_field = None
elif name == "enum":
self.values = []
self.enum = safe_name(attrs["name"])
+ self.enums.add(attrs["name"])
if "prefix" in attrs:
- self.prefix = safe_name(attrs["prefix"])
+ self.prefix = attrs["prefix"]
else:
self.prefix= None
elif name == "value":
print("}\n#endif\n")
- def emit_packet(self):
- name = self.packet
-
- assert(self.group.fields[0].name == "opcode")
- print('#define %-33s %6d' %
- (name + "_opcode", self.group.fields[0].default))
-
+ def emit_header(self, name):
default_fields = []
for field in self.group.fields:
if not type(field) is Field:
continue
default_fields.append(" .%-35s = %6d" % (field.name, field.default))
- if default_fields:
- print('#define %-40s\\' % (name + '_header'))
- print(", \\\n".join(default_fields))
- print('')
+ print('#define %-40s\\' % (name + '_header'))
+ print(", \\\n".join(default_fields))
+ print('')
+
+ def emit_packet(self):
+ name = self.packet
+ assert(self.group.fields[0].name == "opcode")
+ print('#define %-33s %6d' %
+ (name + "_opcode", self.group.fields[0].default))
+
+ self.emit_header(name)
self.emit_template_struct(self.packet, self.group)
self.emit_pack_function(self.packet, self.group)
self.emit_unpack_function(self.packet, self.group)
def emit_struct(self):
name = self.struct
- # Emit an empty header define so that we can use the CL pack functions
- # with structs.
- print('#define ' + name + '_header')
+ self.emit_header(name)
self.emit_template_struct(self.struct, self.group)
self.emit_pack_function(self.struct, self.group)
self.emit_unpack_function(self.struct, self.group)
print('')
def emit_enum(self):
- print('/* enum %s */' % self.gen_prefix(self.enum))
+ print('enum %s {' % self.gen_prefix(self.enum))
for value in self.values:
+ name = value.name
if self.prefix:
- name = self.prefix + "_" + value.name
- else:
- name = value.name
- print('#define %-36s %6d' % (name.upper(), value.value))
- print('')
+ name = self.prefix + "_" + name
+ name = safe_name(name).upper()
+ print(' % -36s = %6d,' % (name, value.value))
+ print('};\n')
def parse(self, filename):
file = open(filename, "rb")