| #!/usr/bin/env python3 | |
| import os | |
| from os import path | |
| import shutil | |
| import diamond | |
| from string import Template | |
| import pytrellis | |
| device = "LFE5U-25F" | |
| sink = "R2C2_A0" | |
| # Drivers found using ispTcl | |
| drivers = [ | |
| "R1C2_V02S0501", | |
| "R2C2_H02W0501", | |
| "R2C2_H01E0001", | |
| "R2C3_H02W0701", | |
| "R2C3_H02W0501", | |
| "R2C2_H02W0701", | |
| "R2C2_H02E0501", | |
| "R3C2_V02N0501", | |
| "R1C2_V02S0701", | |
| "R2C2_F5", | |
| "R2C2_H00L0000", | |
| "R2C2_F7", | |
| "R2C2_H02E0701", | |
| "R2C2_V02N0701", | |
| "R2C1_H02E0701", | |
| "R2C3_H01E0001", | |
| "R2C2_V02S0501", | |
| "R3C2_V02N0701", | |
| "R2C2_V02S0701", | |
| "R2C2_V01N0101", | |
| "R2C2_V02N0501", | |
| "R2C1_H02E0501", | |
| "R2C2_H00L0100", | |
| "R2C2_H00R0000" | |
| ] | |
| def run_get_bits(mux_driver): | |
| route = "" | |
| if mux_driver != "": | |
| route = "route\n\t\t\t" + mux_driver + "." + sink + ";" | |
| with open("mux_template.ncl", "r") as inf: | |
| with open("work/mux.ncl", "w") as ouf: | |
| ouf.write(Template(inf.read()).substitute(route=route)) | |
| diamond.run(device, "work/mux.ncl") | |
| bs = pytrellis.Bitstream.read_bit("work/mux.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("") | |
| with open("a0_mux_out.txt", "w") as f: | |
| for d in drivers: | |
| bits = run_get_bits(d) | |
| diff = bits - baseline | |
| diff_str = ["{}F{}B{}".format("!" if b.delta < 0 else "", b.frame, b.bit) for b in diff] | |
| print("{0: <18}{1}".format(d, " ".join(diff_str)), file=f) | |
| f.flush() | |
| if __name__ == "__main__": | |
| main() |