| """Transforms the XML module definitions parsed from the PDF into a verilog representation""" | |
| from lxml import etree | |
| from datetime import datetime | |
| def format_port(name, width, type, **kwargs): | |
| wstr = '' if int(width) == 1 else '[%s:0]\t' % width | |
| return '\t%s\t%s%s;\n' % (type, wstr, name) | |
| def format_attrib(name, type, default, **kwargs): | |
| if type == 'STRING': | |
| default = '"%s"' % default # need to ensure strings are quoted | |
| return '\tparameter %s = %s;\n' % (name, default) | |
| def process(infile, outfile): | |
| tree = etree.parse(infile) | |
| root = tree.getroot() | |
| with open(outfile, "w") as output: | |
| output.write( | |
| '// Automatically generated from %s on %s\n\n' % | |
| (infile, datetime.now().isoformat()) | |
| ) | |
| for module in root.getchildren(): | |
| ports = module.xpath('port') | |
| attrs = module.xpath('attribute') | |
| output.write( | |
| 'module %s (%s);\n' % ( | |
| module.attrib['name'], | |
| ', '.join([port.attrib['name'] for port in ports]) | |
| ) | |
| ) | |
| for port in ports: | |
| output.write(format_port(**dict(port.attrib))) | |
| if len(attrs): | |
| output.write('\n') | |
| for attr in attrs: | |
| output.write(format_attrib(**dict(attr.attrib))) | |
| output.write('endmodule\n\n') | |
| if __name__ == '__main__': | |
| import argparse | |
| parser = argparse.ArgumentParser() | |
| parser.add_argument('--input', '-i', nargs='?', default='cells_xtra.xml') | |
| parser.add_argument('--output', '-o', nargs='?', default='cells_xtra.v') | |
| args = parser.parse_args() | |
| process(args.input, args.output) |