blob: 491c6f628bcc758dc9c6c4ff1fe050deea528ff5 [file] [log] [blame] [edit]
import re
def parse_pcf(f, pin_map, icecube2_hacks=False):
pcf_data = {}
for i, oline in enumerate(f):
line = oline
if icecube2_hacks and not re.search(" # ICE_(GB_)?IO", line):
continue
line = re.sub(r"#.*", "", line.strip()).split()
if "--warn-no-port" in line:
line.remove("--warn-no-port")
if len(line) and line[0] == "set_io":
p = line[1]
if icecube2_hacks:
p = p.lower()
p = re.sub(r"_ibuf$", "", p)
p = re.sub(r"_obuft$", "", p)
p = re.sub(r"_obuf$", "", p)
p = re.sub(r"_gb_io$", "", p)
p = re.sub(r"_pad(_[0-9]+|)$", r"\1", p)
if not re.match(r"[a-zA-Z_][a-zA-Z0-9_]*(\[[0-9]*\])?$", p):
p = "\\%s " % p
if len(line) > 3:
pinloc = tuple([int(s) for s in line[2:]])
else:
pinloc = (line[2], )
for loc in pinloc:
if loc not in pin_map:
raise SyntaxError(
"""\
Pin name {} doesn't exist!
Line: {}
{}""".format(loc, i, oline)
)
pcf_data[p] = (pin_map[loc], oline.strip())
return pcf_data