blob: 38af516ebe22d16a1de32124c21943145dd64d76 [file] [log] [blame]
from collections import defaultdict
from fuzzconfig import FuzzConfig
import interconnect
import nets
import pytrellis
import re
import argparse
from mk_nets import *
def fc_filter_all(a, n):
return True
# TCL claims these are fixed connections; we should treat them as
# inputs/outputs to/from DCC/DCM BELs.
def fc_filter_dcc(a, n):
return bool(not (nets.machxo2.dcc_sig_re.match(a[0]) and nets.machxo2.dcc_sig_re.match(a[1])) and
not (nets.machxo2.dcm_sig_re.match(a[0]) and nets.machxo2.dcm_sig_re.match(a[1])))
# The relevant tiles were inferred from the center_mux experiment.
# Asterisk means "the fuzzer generated connects with non-local prefixes".
jobs = [
# *
{
"netnames" : eclk_out + eclk_cib + eclk_div,
"cfg" : FuzzConfig(job="GLOBAL_ECLK", family="MachXO2", device="LCMXO2-1200HC", ncl="center-mux.ncl",
tiles=["CENTER6:CENTER_EBR_CIB", "CENTER_EBR14:CENTER_EBR",
"CENTER9:CENTER8", "CENTER8:CENTER7", "CENTER7:CENTER6",
"CENTER5:CENTER5", "CENTER4:CENTER4"]),
"prefix" : "1200_",
"overrides" : defaultdict(lambda : str("sink")),
"fc_filter" : fc_filter_all
},
# *
{
"netnames" : eclkbridge,
"cfg" : FuzzConfig(job="GLOBAL_ECLKBRIDGE", family="MachXO2", device="LCMXO2-1200HC", ncl="center-mux.ncl",
tiles=["CENTER6:CENTER_EBR_CIB", "CENTER_EBR14:CENTER_EBR",
"CENTER9:CENTER8", "CENTER8:CENTER7", "CENTER7:CENTER6",
"CENTER5:CENTER5", "CENTER4:CENTER4"]),
"prefix" : "1200_",
"overrides" : { "R6C13_JECSOUT0_ECLKBRIDGECS" : "driver",
"R6C13_JECSOUT1_ECLKBRIDGECS" : "driver",
"R6C13_JSEL0_ECLKBRIDGECS" : "sink",
"R6C13_JSEL1_ECLKBRIDGECS" : "sink" },
"fc_filter" : fc_filter_all
},
{
"netnames" : dcm + dcc,
"cfg" : FuzzConfig(job="GLOBAL_DCM_DCC", family="MachXO2", device="LCMXO2-1200HC", ncl="center-mux.ncl",
tiles=["CENTER6:CENTER_EBR_CIB", "CENTER_EBR14:CENTER_EBR",
"CENTER9:CENTER8", "CENTER8:CENTER7", "CENTER7:CENTER6",
"CENTER5:CENTER5", "CENTER4:CENTER4"]),
"prefix" : "1200_",
"overrides" : defaultdict(lambda : str("sink")),
"fc_filter" : fc_filter_dcc
},
{
"netnames" : hfsn_cib + hfsn_out + global_cib + global_out + pll + clock_pin,
"cfg" : FuzzConfig(job="GLOBAL_HFSN", family="MachXO2", device="LCMXO2-1200HC", ncl="center-mux.ncl",
tiles=["CENTER6:CENTER_EBR_CIB", "CENTER_EBR14:CENTER_EBR",
"CENTER9:CENTER8", "CENTER8:CENTER7", "CENTER7:CENTER6",
"CENTER5:CENTER5", "CENTER4:CENTER4"]),
"prefix" : "1200_",
"overrides" : defaultdict(lambda : str("sink")),
"fc_filter" : fc_filter_all
},
# Thanks to fc_filter_dcc, make sure to manually connect DCC outputs to
# entrance to global network!
{
"netnames" : ["R6C13_VPRX0000", "R6C13_VPRX0100", "R6C13_VPRX0200", "R6C13_VPRX0300",
"R6C13_VPRX0400", "R6C13_VPRX0500", "R6C13_VPRX0600", "R6C13_VPRX0700"],
"cfg" : FuzzConfig(job="GLOBAL_DCC_OUT", family="MachXO2", device="LCMXO2-1200HC", ncl="center-mux.ncl",
tiles=["CENTER6:CENTER_EBR_CIB", "CENTER_EBR14:CENTER_EBR",
"CENTER9:CENTER8", "CENTER8:CENTER7", "CENTER7:CENTER6",
"CENTER5:CENTER5", "CENTER4:CENTER4"]),
"prefix" : "1200_",
"overrides" : defaultdict(lambda : str("sink")),
"fc_filter" : fc_filter_all
},
]
def main(args):
pytrellis.load_database("../../../database")
for job in [jobs[i] for i in args.ids]:
cfg = job["cfg"]
cfg.setup()
interconnect.fuzz_interconnect_with_netnames(config=cfg, netnames=job["netnames"],
netname_filter_union=False,
netdir_override=job["overrides"],
nonlocal_prefix=job["prefix"],
fc_predicate=job["fc_filter"])
# TODO: R6C13_JA0 --> R6C13_JCE0_DCC. But TCL also claims
# R6C13_CLKI0_DCC --> R6C13_CLKO0_DCC (pseudo = 1). Contradiction?
# From talking to Dave: No it's not a contradiction. A
# config bit controls whether JCE0 has any effect.
# Might be fuzzed with something like:
# interconnect.fuzz_interconnect_with_netnames(config=cfg, netnames=["R6C13_CLKI0_DCC", "R6C13_CLKO0_DCC", "R6C13_JCE0_DCC"],
# netname_filter_union=False,
# netdir_override = {
# "R6C13_JCE0_DCC" : "sink",
# })
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Center Mux Routing Fuzzer.")
parser.add_argument(dest="ids", metavar="N", type=int, nargs="*",
default=range(0, len(jobs)), help="Job (indices) to run.")
args = parser.parse_args()
main(args)