| #!/usr/bin/env python | |
| import re | |
| import sys | |
| # maybe https://github.com/fukatani/Pyverilog-1 | |
| txt = open(sys.argv[1], 'r').read() | |
| modname = None | |
| params = [] | |
| ios = [] | |
| for l in txt.split('\n'): | |
| l = l.strip() | |
| # module RAMB18E1 ( | |
| m = re.match(r'module (.*) ', l) | |
| if m: | |
| modname = m.group(1) | |
| continue | |
| # input CLKARDCLK, | |
| # input [13:0] ADDRARDADDR, | |
| # output [1:0] DOPBDOP | |
| m = re.match(r'(input|output)( \[([0-9]*):([0:9]*)\] | )([a-zA-Z0-9_ ,]+)', l) | |
| if m: | |
| names = m.group(5) | |
| aio = m.group(1) | |
| for name in names.split(','): | |
| name = name.strip() | |
| if not name: | |
| continue | |
| wout = None | |
| width = m.group(2).strip() | |
| if width: | |
| mw = re.match(r'\[([0-9]*):([0:9]*)\]', width) | |
| wl = int(mw.group(1)) | |
| wr = int(mw.group(2)) | |
| wout = (wl, wr) | |
| ios.append((name, aio, wout)) | |
| continue | |
| # output DPO, SPO, | |
| # input D, WCLK, WE, | |
| m = re.match(r'(input|output)(.*)', l) | |
| if m: | |
| aio = m.group(1) | |
| wout = None | |
| for name in m.group(2).split(','): | |
| name = name.strip() | |
| if not name: | |
| continue | |
| ios.append((name, aio, wout)) | |
| # parameter SIM_DEVICE = "VIRTEX6"; | |
| m = re.match(r'parameter([ ])([a-zA-Z0-9_]+) = (.+);', l) | |
| if m: | |
| #aio = m.group(1) | |
| name = m.group(2) | |
| defval = m.group(3) | |
| wout = None | |
| params.append((name, wout, defval)) | |
| # input A0, A1, A2, A3, A4, A5, D, WCLK, WE; | |
| modinst = modname | |
| print '''\ | |
| module my_%s (input clk, input [7:0] din, output [7:0] dout); | |
| parameter LOC = ""; | |
| ''' % modname | |
| print ' (* LOC=LOC, KEEP, DONT_TOUCH *)' | |
| print ' %s #(' % modname | |
| for pi, p in enumerate(params): | |
| name, wout, defval = p | |
| comma = ',' if pi != len(params) - 1 else '' | |
| print ' .%s(%s)%s' % (name, defval, comma) | |
| print ' ) %s (' % modinst | |
| DII_N = 8 | |
| DOI_N = 8 | |
| dii = 0 | |
| doi = 0 | |
| for ioi, io in enumerate(ios): | |
| name, aio, wout = io | |
| comma = ',' if ioi != len(ios) - 1 else ');' | |
| if aio == 'input': | |
| if wout: | |
| n = int(abs(wout[1] - wout[0]) + 1) | |
| if dii + n >= DII_N: | |
| dii = 0 | |
| wire = 'din[%d:%d]' % (dii + n, dii) | |
| dii = (dii + n) % DII_N | |
| else: | |
| wire = 'din[%d]' % dii | |
| dii = (dii + 1) % DII_N | |
| else: | |
| if wout: | |
| n = int(abs(wout[1] - wout[0]) + 1) | |
| wire = 'dout[%d:%d]' % (doi + n, doi) | |
| doi = doi + n | |
| else: | |
| wire = 'dout[%d]' % doi | |
| doi += 1 | |
| print ' .%s(%s)%s' % (name, wire, comma) | |
| print 'endmodule' | |