Add "wreduce -keepdc", fixes #1016
authorClifford Wolf <clifford@clifford.at>
Mon, 20 May 2019 13:36:13 +0000 (15:36 +0200)
committerClifford Wolf <clifford@clifford.at>
Mon, 20 May 2019 13:36:13 +0000 (15:36 +0200)
Signed-off-by: Clifford Wolf <clifford@clifford.at>
passes/opt/wreduce.cc
techlibs/common/prep.cc

index 58c6e4b4b42c8437df9dff63860ffaac86819ff5..1fbc4108264618c0f5aa288e1cec6ee970afbad8 100644 (file)
@@ -29,6 +29,7 @@ PRIVATE_NAMESPACE_BEGIN
 struct WreduceConfig
 {
        pool<IdString> supported_cell_types;
+       bool keepdc = false;
 
        WreduceConfig()
        {
@@ -82,7 +83,7 @@ struct WreduceWorker
 
                        SigBit ref = sig_a[i];
                        for (int k = 0; k < GetSize(sig_s); k++) {
-                               if (ref != Sx && sig_b[k*GetSize(sig_a) + i] != Sx && ref != sig_b[k*GetSize(sig_a) + i])
+                               if ((config->keepdc || (ref != Sx && sig_b[k*GetSize(sig_a) + i] != Sx)) && ref != sig_b[k*GetSize(sig_a) + i])
                                        goto no_match_ab;
                                if (sig_b[k*GetSize(sig_a) + i] != Sx)
                                        ref = sig_b[k*GetSize(sig_a) + i];
@@ -495,6 +496,9 @@ struct WreducePass : public Pass {
                log("        Do not change the width of memory address ports. Use this options in\n");
                log("        flows that use the 'memory_memx' pass.\n");
                log("\n");
+               log("    -keepdc\n");
+               log("        Do not optimize explicit don't-care values.\n");
+               log("\n");
        }
        void execute(std::vector<std::string> args, Design *design) YS_OVERRIDE
        {
@@ -509,6 +513,10 @@ struct WreducePass : public Pass {
                                opt_memx = true;
                                continue;
                        }
+                       if (args[argidx] == "-keepdc") {
+                               config.keepdc = true;
+                               continue;
+                       }
                        break;
                }
                extra_args(args, argidx, design);
index 86fb4d6c6abd86a8da022ab1c6d85a5fafe736df..cdd21c3b328a675070333b58f20a39acc6f66a25 100644 (file)
@@ -195,9 +195,11 @@ struct PrepPass : public ScriptPass
                        run(nokeepdc ? "opt" : "opt -keepdc");
                        if (!ifxmode) {
                                if (help_mode)
-                                       run("wreduce [-memx]");
-                               else
+                                       run("wreduce -keepdc [-memx]");
+                               else if (nokeepdc)
                                        run(memxmode ? "wreduce -memx" : "wreduce");
+                               else
+                                       run(memxmode ? "wreduce -keepdc -memx" : "wreduce -keepdc");
                        }
                        if (!nomemmode) {
                                run(string("memory_dff") + (help_mode ? " [-nordff]" : nordff ? " -nordff" : ""));