| #!/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() |