blob: eccd0eaf8c14954522db4fbb008145174be85175 [file] [log] [blame]
#!/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'