| #!/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' |
| |