Add optional 'ignore-loops' flag to nextpnr
authorArnaud Durand <arnaud.durand@unifr.ch>
Fri, 10 Jan 2020 15:06:08 +0000 (16:06 +0100)
committerArnaud Durand <arnaud.durand@unifr.ch>
Fri, 10 Jan 2020 15:07:56 +0000 (16:07 +0100)
litex/build/lattice/trellis.py

index ff6a69e3c2d76575aac6eb23d17bc8d5793ab6f5..47803517611be07d9247acf98c65db72ee92be51 100644 (file)
@@ -113,11 +113,11 @@ nextpnr_ecp5_architectures = {
 _build_template = [
     "yosys -q -l {build_name}.rpt {build_name}.ys",
     "nextpnr-ecp5 --json {build_name}.json --lpf {build_name}.lpf --textcfg {build_name}.config  \
-    --{architecture} --package {package} --speed {speed_grade} {timefailarg}",
+    --{architecture} --package {package} --speed {speed_grade} {timefailarg} {ignoreloops}",
     "ecppack {build_name}.config --svf {build_name}.svf --bit {build_name}.bit"
 ]
 
-def _build_script(source, build_template, build_name, architecture, package, speed_grade, timingstrict):
+def _build_script(source, build_template, build_name, architecture, package, speed_grade, timingstrict, ignoreloops):
     if sys.platform in ("win32", "cygwin"):
         script_ext = ".bat"
         script_contents = "@echo off\nrem Autogenerated by LiteX / git: " + tools.get_litex_git_revision() + "\n\n"
@@ -135,6 +135,7 @@ def _build_script(source, build_template, build_name, architecture, package, spe
             package         = package,
             speed_grade     = speed_grade,
             timefailarg     = "--timing-allow-fail" if not timingstrict else "",
+            ignoreloops     = "--ignore-loops" if ignoreloops else "",
             fail_stmt       = fail_stmt)
 
     script_file = "build_" + build_name + script_ext
@@ -180,6 +181,7 @@ class LatticeTrellisToolchain:
         run            = True,
         nowidelut      = False,
         timingstrict   = False,
+        ignoreloops    = False,
         **kwargs):
 
         # Get default toolchain path (if not specified)
@@ -215,7 +217,7 @@ class LatticeTrellisToolchain:
 
         # Generate build script
         script = _build_script(False, self.build_template, build_name, architecture, package,
-            speed_grade, timingstrict)
+            speed_grade, timingstrict, ignoreloops)
 
         # Run
         if run:
@@ -234,9 +236,12 @@ def trellis_args(parser):
                         help="pass '-nowidelut' to yosys synth_ecp5")
     parser.add_argument("--nextpnr-timingstrict", action="store_true",
                         help="fail if timing not met, i.e., do NOT pass '--timing-allow-fail' to nextpnr")
+    parser.add_argument("--nextpnr-ignoreloops", action="store_true",
+                        help="ignore combinational loops in timing analysis, i.e. pass '--ignore-loops' to nextpnr")
 
 def trellis_argdict(args):
     return {
         "nowidelut":    args.yosys_nowidelut,
         "timingstrict": args.nextpnr_timingstrict,
+        "ignoreloops":  args.nextpnr_ignoreloops,
     }