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