import sys
import copy
-license = """/* Generated code, see packets.xml and gen_packet_header.py */
+license = """/* Generated code, see v3d_packet_v21.xml, v3d_packet_v33.xml and gen_pack_header.py */
"""
pack_header = """%(license)s
'=': '',
'>': '',
'#': '',
- 'α': 'alpha',
'&': '',
'*': '',
'"': '',
type = 'bool'
elif self.type == 'float':
type = 'float'
+ elif self.type == 'f187':
+ type = 'float'
elif self.type == 'ufixed':
type = 'float'
elif self.type == 'sfixed':
self.count = count
self.size = 0
self.fields = []
+ self.min_ver = 0
+ self.max_ver = 0
def emit_template_struct(self, dim):
if self.count == 0:
first_byte = field.start // 8
last_byte = field.end // 8
- for b in xrange(first_byte, last_byte + 1):
+ for b in range(first_byte, last_byte + 1):
if not b in bytes:
bytes[b] = self.Byte()
(value, start, end)
elif field.type == "float":
s = "#error %s float value mixed in with other fields" % name
+ elif field.type == "f187":
+ s = "__gen_uint(fui(%s) >> 16, %d, %d)" % \
+ (value, start, end)
elif field.type == "offset":
s = "__gen_offset(%s, %d, %d)" % \
(value, start, end)
convert = "__gen_unpack_uint"
elif field.type == "float":
convert = "__gen_unpack_float"
+ elif field.type == "f187":
+ convert = "__gen_unpack_f187"
elif field.type == "offset":
convert = "__gen_unpack_offset"
elif field.type == 'ufixed':
self.value = int(attrs["value"])
class Parser(object):
- def __init__(self):
+ def __init__(self, ver):
self.parser = xml.parsers.expat.ParserCreate()
self.parser.StartElementHandler = self.start_element
self.parser.EndElementHandler = self.end_element
# Set of enum names we've seen.
self.enums = set()
self.registers = {}
+ self.ver = ver
def gen_prefix(self, name):
if name[0] == "_":
def gen_guard(self):
return self.gen_prefix("PACK_H")
+ def attrs_version_valid(self, attrs):
+ if "min_ver" in attrs and self.ver < attrs["min_ver"]:
+ return False
+
+ if "max_ver" in attrs and self.ver > attrs["max_ver"]:
+ return False
+
+ return True
+
+ def group_enabled(self):
+ if self.group.min_ver != 0 and self.ver < self.group.min_ver:
+ return False
+
+ if self.group.max_ver != 0 and self.ver > self.group.max_ver:
+ return False
+
+ return True
+
def start_element(self, name, attrs):
if name == "vcxml":
- self.platform = "V3D {}".format(attrs["gen"])
- self.ver = attrs["gen"].replace('.', '')
+ self.platform = "V3D {}.{}".format(self.ver[0], self.ver[1])
print(pack_header % {'license': license, 'platform': self.platform, 'guard': self.gen_guard()})
elif name in ("packet", "struct", "register"):
default_field = None
field.values = []
self.group.fields.append(field)
+ if "min_ver" in attrs:
+ self.group.min_ver = attrs["min_ver"]
+ if "max_ver" in attrs:
+ self.group.max_ver = attrs["max_ver"]
+
elif name == "field":
self.group.fields.append(Field(self, attrs))
self.values = []
self.values = []
self.enum = safe_name(attrs["name"])
self.enums.add(attrs["name"])
+ self.enum_enabled = self.attrs_version_valid(attrs)
if "prefix" in attrs:
self.prefix = attrs["prefix"]
else:
self.prefix= None
elif name == "value":
- self.values.append(Value(attrs))
+ if self.attrs_version_valid(attrs):
+ self.values.append(Value(attrs))
def end_element(self, name):
if name == "packet":
elif name == "field":
self.group.fields[-1].values = self.values
elif name == "enum":
- self.emit_enum()
+ if self.enum_enabled:
+ self.emit_enum()
self.enum = None
elif name == "vcxml":
print('#endif /* %s */' % self.gen_guard())
print('')
def emit_packet(self):
+ if not self.group_enabled():
+ return
+
name = self.packet
assert(self.group.fields[0].name == "opcode")
print('')
def emit_register(self):
+ if not self.group_enabled():
+ return
+
name = self.register
if not self.reg_num == None:
print('#define %-33s 0x%04x' %
self.emit_unpack_function(self.register, self.group)
def emit_struct(self):
+ if not self.group_enabled():
+ return
+
name = self.struct
self.emit_header(name)
input_file = sys.argv[1]
-p = Parser()
+p = Parser(sys.argv[2])
p.parse(input_file)