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