blob: 9c1930958886cc67435766d9a1dff2f645c0287e [file] [log] [blame]
#!/usr/bin/env python3
import os
from os import path
import shutil
import diamond
from string import Template
import pytrellis
device = "LFE5U-25F"
lut_inputs = ("A", "B", "C", "D")
def run_get_bits(init_bits):
sop_terms = []
for i in range(16):
if init_bits & (1 << i) != 0:
p_terms = []
for j in range(4):
if i & (1 << j) != 0:
p_terms.append(lut_inputs[j])
else:
p_terms.append("~" + lut_inputs[j])
sop_terms.append("({})".format("*".join(p_terms)))
if len(sop_terms) == 0:
lut_func = "0"
else:
lut_func = "+".join(sop_terms)
with open("lut_init_template.ncl", "r") as inf:
with open("work/lut_init.ncl", "w") as ouf:
ouf.write(Template(inf.read()).substitute(lut_func=lut_func))
diamond.run(device, "work/lut_init.ncl")
bs = pytrellis.Bitstream.read_bit("work/lut_init.bit")
chip = bs.deserialise_chip()
tile = chip.tiles["R2C2:PLC2"]
return tile.cram
def main():
pytrellis.load_database("../../../prjtrellis-db")
shutil.rmtree("work", ignore_errors=True)
os.mkdir("work")
baseline = run_get_bits(0)
with open("lut_bits_out.txt", "w") as f:
for i in range(16):
bits = run_get_bits(1 << i)
diff = bits - baseline
assert len(diff) == 1
inv = "!" if diff[0].delta < 0 else ""
print("INIT[{}]\t{}({}, {})".format(i, inv, diff[0].bit, diff[0].frame), file=f)
f.flush()
if __name__ == "__main__":
main()