| from fuzzconfig import FuzzConfig | |
| import nonrouting | |
| import nets | |
| import pytrellis | |
| import re | |
| import fuzzloops | |
| jobs = [ | |
| # 45k | |
| { | |
| "cfg": FuzzConfig(job="BANKREF0", family="ECP5", device="LFE5U-45F", ncl="empty.ncl", | |
| tiles=["MIB_R0C3:BANKREF0"]), | |
| "side": "T", | |
| "pin": "A6" | |
| }, | |
| { | |
| "cfg": FuzzConfig(job="BANKREF1", family="ECP5", device="LFE5U-45F", ncl="empty.ncl", | |
| tiles=["MIB_R0C87:BANKREF1"]), | |
| "side": "T", | |
| "pin": "A19" | |
| }, | |
| { | |
| "cfg": FuzzConfig(job="BANKREF2", family="ECP5", device="LFE5U-45F", ncl="empty.ncl", | |
| tiles=["MIB_R10C90:BANKREF2"]), | |
| "side": "R", | |
| "pin": "C18" | |
| }, | |
| { | |
| "cfg": FuzzConfig(job="BANKREF3", family="ECP5", device="LFE5U-45F", ncl="empty.ncl", | |
| tiles=["MIB_R71C89:BANKREF3"]), | |
| "side": "R", | |
| "pin": "N17" | |
| }, | |
| { | |
| "cfg": FuzzConfig(job="BANKREF6", family="ECP5", device="LFE5U-45F", ncl="empty.ncl", | |
| tiles=["MIB_R71C1:BANKREF6"]), | |
| "side": "L", | |
| "pin": "N3" | |
| }, | |
| { | |
| "cfg": FuzzConfig(job="BANKREF7", family="ECP5", device="LFE5U-45F", ncl="empty.ncl", | |
| tiles=["MIB_R10C0:BANKREF7"]), | |
| "side": "L", | |
| "pin": "F4" | |
| }, | |
| { | |
| "cfg": FuzzConfig(job="BANKREF8", family="ECP5", device="LFE5U-45F", ncl="empty.ncl", | |
| tiles=["MIB_R71C3:BANKREF8"]), | |
| "side": "B", | |
| "pin": "R1" | |
| }, | |
| # 25k | |
| { | |
| "cfg": FuzzConfig(job="BANKREF7A", family="ECP5", device="LFE5U-25F", ncl="empty_25k.ncl", | |
| tiles=["MIB_R1C0:BANKREF7A"]), | |
| "side": "L", | |
| "pin": "A4" | |
| }, | |
| { | |
| "cfg": FuzzConfig(job="BANKREF2A", family="ECP5", device="LFE5U-25F", ncl="empty_25k.ncl", | |
| tiles=["MIB_R1C72:BANKREF2A"]), | |
| "side": "R", | |
| "pin": "J19" | |
| }, | |
| # 85k | |
| { | |
| "cfg": FuzzConfig(job="BANKREF4", family="ECP5", device="LFE5U-85F", ncl="empty_85k.ncl", | |
| tiles=["MIB_R95C123:BANKREF4"]), | |
| "side": "B", | |
| "pin": "AJ29" | |
| }, | |
| ] | |
| def main(): | |
| pytrellis.load_database("../../../database") | |
| for job in jobs: | |
| cfg = job["cfg"] | |
| side = job["side"] | |
| pin = job["pin"] | |
| cfg.setup() | |
| empty_bitfile = cfg.build_design(cfg.ncl, {}) | |
| cfg.ncl = "pio.v" | |
| def get_substs(iomode, extracfg=None): | |
| if iomode == "NONE": | |
| iodir, type = "NONE", "" | |
| else: | |
| iodir, type = iomode.split("_", 1) | |
| substs = { | |
| "dir": iodir, | |
| "io_type": type, | |
| "loc": pin, | |
| "extra_attrs": "" | |
| } | |
| if extracfg is not None: | |
| substs["extra_attrs"] = '(* {}="{}" *)'.format(extracfg[0], extracfg[1]) | |
| return substs | |
| vcco_opts = { | |
| "1V2": "OUTPUT_LVCMOS12", | |
| "1V5": "OUTPUT_LVCMOS15", | |
| "1V8": "OUTPUT_LVCMOS18", | |
| "2V5": "OUTPUT_LVCMOS25", | |
| "3V3": "OUTPUT_LVCMOS33", | |
| "NONE": "INPUT_LVCMOS12", | |
| } | |
| nonrouting.fuzz_enum_setting(cfg, "BANK.VCCIO", list(sorted(vcco_opts.keys())), | |
| lambda x: get_substs(iomode=vcco_opts[x]), | |
| empty_bitfile) | |
| if side in ('L', 'R'): | |
| nonrouting.fuzz_enum_setting(cfg, "BANK.DIFF_REF", ["OFF", "ON"], | |
| lambda x: get_substs( | |
| iomode="INPUT_LVCMOS33D" if x == "ON" else "INPUT_LVCMOS33"), | |
| empty_bitfile) | |
| nonrouting.fuzz_enum_setting(cfg, "BANK.LVDSO", ["OFF", "ON"], | |
| lambda x: get_substs( | |
| iomode="OUTPUT_LVDS" if x == "ON" else "OUTPUT_LVCMOS25D"), | |
| empty_bitfile) | |
| nonrouting.fuzz_enum_setting(cfg, "BANK.VREF", ["OFF", "ON"], | |
| lambda x: get_substs( | |
| iomode="INPUT_SSTL15_II" if x == "ON" else "INPUT_LVDS"), | |
| empty_bitfile) | |
| if __name__ == "__main__": | |
| main() |