Merge pull request #1465 from YosysHQ/dave/ice40_timing_sim
[yosys.git] / passes / equiv / equiv_opt.cc
index 4ab5b1a3ee65622e55bb0ac45d865e9fede29eb3..c7e6d71a62e2a69a9794cc6f3056e2403fbd0dd0 100644 (file)
@@ -33,7 +33,7 @@ struct EquivOptPass:public ScriptPass
                log("    equiv_opt [options] [command]\n");
                log("\n");
                log("This command uses temporal induction to check circuit equivalence before and\n");
-                log("after an optimization pass.\n");
+               log("after an optimization pass.\n");
                log("\n");
                log("    -run <from_label>:<to_label>\n");
                log("        only run the commands between the labels (see below). an empty\n");
@@ -50,6 +50,9 @@ struct EquivOptPass:public ScriptPass
                log("    -multiclock\n");
                log("        run clk2fflogic before equivalence checking.\n");
                log("\n");
+               log("    -async2sync\n");
+               log("        run async2sync before equivalence checking.\n");
+               log("\n");
                log("    -undef\n");
                log("        enable modelling of undef states during equiv_induct.\n");
                log("\n");
@@ -59,7 +62,7 @@ struct EquivOptPass:public ScriptPass
        }
 
        std::string command, techmap_opts;
-       bool assert, undef, multiclock;
+       bool assert, undef, multiclock, async2sync;
 
        void clear_flags() YS_OVERRIDE
        {
@@ -68,6 +71,7 @@ struct EquivOptPass:public ScriptPass
                assert = false;
                undef = false;
                multiclock = false;
+               async2sync = false;
        }
 
        void execute(std::vector < std::string > args, RTLIL::Design * design) YS_OVERRIDE
@@ -101,6 +105,10 @@ struct EquivOptPass:public ScriptPass
                                multiclock = true;
                                continue;
                        }
+                       if (args[argidx] == "-async2sync") {
+                               async2sync = true;
+                               continue;
+                       }
                        break;
                }
 
@@ -120,6 +128,9 @@ struct EquivOptPass:public ScriptPass
                if (!design->full_selection())
                        log_cmd_error("This command only operates on fully selected designs!\n");
 
+               if (async2sync && multiclock)
+                       log_cmd_error("The '-async2sync' and '-multiclock' options are mutually exclusive!\n");
+
                log_header(design, "Executing EQUIV_OPT pass.\n");
                log_push();
 
@@ -157,8 +168,8 @@ struct EquivOptPass:public ScriptPass
                if (check_label("prove")) {
                        if (multiclock || help_mode)
                                run("clk2fflogic", "(only with -multiclock)");
-                       if (!multiclock || help_mode)
-                               run("async2sync", "(only without -multiclock)");
+                       if (async2sync || help_mode)
+                               run("async2sync", " (only with -async2sync)");
                        run("equiv_make gold gate equiv");
                        if (help_mode)
                                run("equiv_induct [-undef] equiv");