fuzzers: Add a SEDGA fuzzer

Signed-off-by: David Shah <dave@ds0.me>
diff --git a/fuzzers/105-sedga/empty.ncl b/fuzzers/105-sedga/empty.ncl
new file mode 100644
index 0000000..a8583f8
--- /dev/null
+++ b/fuzzers/105-sedga/empty.ncl
@@ -0,0 +1,12 @@
+::FROM-WRITER;
+design top
+{
+   device
+   {
+      architecture sa5p00;
+      device LFE5U-45F;
+      package CABGA381;
+      performance "8";
+   }
+
+}
diff --git a/fuzzers/105-sedga/fuzzer.py b/fuzzers/105-sedga/fuzzer.py
new file mode 100644
index 0000000..440cf08
--- /dev/null
+++ b/fuzzers/105-sedga/fuzzer.py
@@ -0,0 +1,54 @@
+from fuzzconfig import FuzzConfig
+import nonrouting
+import pytrellis
+import fuzzloops
+import interconnect
+
+cfg = FuzzConfig(job="JTAG", family="ECP5", device="LFE5U-45F", ncl="empty.ncl",
+                                          tiles=["MIB_R71C4:EFB0_PICB0", "MIB_R71C5:EFB1_PICB1", "MIB_R71C6:EFB2_PICB0"])
+
+
+def get_substs(exclk_used="YES", clk_freq="2.4", checkalways="DISABLED"):
+    if clk_freq == "NONE":
+        comment = "//"
+    else:
+        comment = ""
+    if exclk_used == "YES" and clk_freq != "NONE":
+        scomment = ""
+    else:
+        scomment = "//"
+    return dict(comment=comment, scomment=scomment, clk_freq=clk_freq, checkalways=checkalways)
+
+
+def main():
+    pytrellis.load_database("../../database")
+    cfg.setup()
+    empty_bitfile = cfg.build_design(cfg.ncl, {})
+    cfg.ncl = "sed.ncl"
+
+    nonrouting.fuzz_enum_setting(cfg, "SED.CLK_FREQ", ["NONE", "2.4", "4.8", "9.7", "19.4", "38.8", "62.0"],
+                                 lambda x: get_substs(clk_freq=x), empty_bitfile, False)
+    nonrouting.fuzz_enum_setting(cfg, "SED.CHECKALWAYS", ["DISABLED", "ENABLED"],
+                                 lambda x: get_substs(checkalways=x), empty_bitfile, False)
+    nonrouting.fuzz_enum_setting(cfg, "SED.SEDEXCLK_USED", ["YES", "NO"],
+                                 lambda x: get_substs(exclk_used=x), empty_bitfile, False)
+    cfg.ncl = "sed_routing.ncl"
+    interconnect.fuzz_interconnect_with_netnames(
+        cfg,
+        ["R70C4_SEDSTDBY_SED",
+         "R70C4_JSEDENABLE_SED",
+         "R70C4_JSEDSTART_SED",
+         "R70C4_JSEDFRCERR_SED",
+         "R70C4_JSEDEXCLK_SED",
+         "R70C4_JSEDERR_SED",
+         "R70C4_JSEDDONE_SED",
+         "R70C4_JSEDINPROG_SED",
+         "R70C4_JAUTODONE_SED"
+         ],
+        bidir=True
+    )
+
+
+if __name__ == "__main__":
+    main()
+
diff --git a/fuzzers/105-sedga/sed.ncl b/fuzzers/105-sedga/sed.ncl
new file mode 100644
index 0000000..883c5c9
--- /dev/null
+++ b/fuzzers/105-sedga/sed.ncl
@@ -0,0 +1,30 @@
+::FROM-WRITER;
+design top
+{
+   device
+   {
+      architecture sa5p00;
+      device LFE5U-45F;
+      package CABGA381;
+      performance "8";
+   }
+   ${comment} comp SED
+   ${comment} {
+   ${comment}    logical {
+   ${comment}       cellmodel-name SED;
+   ${comment}       program "MODE:SEDGA "
+   ${comment}               "SEDGA:::SED_CLK_FREQ=${clk_freq},CHECKALWAYS=${checkalways}";
+   ${comment}    }
+   ${comment}    site SED;
+   ${comment} }
+
+   ${scomment}  signal q_c
+   ${scomment} {
+   ${scomment}    signal-pins
+   ${scomment}       // drivers
+   ${scomment}       (SED, AUTODONE),
+   ${scomment}       // loads
+   ${scomment}       (SED, SEDEXCLK);
+   ${scomment} }
+
+}
diff --git a/fuzzers/105-sedga/sed_routing.ncl b/fuzzers/105-sedga/sed_routing.ncl
new file mode 100644
index 0000000..11ad1a9
--- /dev/null
+++ b/fuzzers/105-sedga/sed_routing.ncl
@@ -0,0 +1,35 @@
+::FROM-WRITER;
+design top
+{
+   device
+   {
+      architecture sa5p00;
+      device LFE5U-45F;
+      package CABGA381;
+      performance "8";
+   }
+
+   comp SLICE_0
+      [,,,,A0,B0,D0,C0,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,]
+   {
+      logical
+      {
+         cellmodel-name SLICE;
+         program "MODE:LOGIC "
+                 "K0::H0=0 "
+                 "F0:F ";
+         primitive K0 i3_4_lut;
+      }
+      site R2C2A;
+   }
+
+    signal q_c
+   {
+      signal-pins
+         // drivers
+         (SLICE_0, F0),
+         // loads
+         (SLICE_0, A0);
+      ${route}
+   }
+}