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