Add handling of constant reset signals to opt_rmdff
authorClifford Wolf <clifford@clifford.at>
Sun, 6 Aug 2017 11:27:18 +0000 (13:27 +0200)
committerClifford Wolf <clifford@clifford.at>
Sun, 6 Aug 2017 11:27:18 +0000 (13:27 +0200)
passes/opt/opt_rmdff.cc

index 0eefd6a86cf71b9a129ec7e9e86912fbe8c9a142..80217464c0edbc76191bbefce783730688ba001b 100644 (file)
@@ -186,7 +186,7 @@ bool handle_dff(RTLIL::Module *mod, RTLIL::Cell *dff)
                goto delete_dff;
        }
 
-       if (sig_d == sig_q && (!sig_r.size() || !has_init || val_init == val_rv)) {
+       if (sig_d == sig_q && (sig_r.empty() || !has_init || val_init == val_rv)) {
                if (sig_r.size())
                        mod->connect(sig_q, val_rv);
                if (has_init)
@@ -194,6 +194,28 @@ bool handle_dff(RTLIL::Module *mod, RTLIL::Cell *dff)
                goto delete_dff;
        }
 
+       if (!sig_r.empty() && sig_r.is_fully_const())
+       {
+               if (sig_r == val_rp || sig_r.is_fully_undef()) {
+                       mod->connect(sig_q, val_rv);
+                       goto delete_dff;
+               }
+
+               log("Removing unused reset from %s (%s) from module %s.\n", log_id(dff), log_id(dff->type), log_id(mod));
+
+               if (dff->type == "$adff") {
+                       dff->type = "$dff";
+                       dff->unsetPort("\\ARST");
+                       dff->unsetParam("\\ARST_POLARITY");
+                       dff->unsetParam("\\ARST_VALUE");
+                       return true;
+               }
+
+               log_assert(dff->type.substr(0,6) == "$_DFF_");
+               dff->type = stringf("$_DFF_%c_", + dff->type[6]);
+               dff->unsetPort("\\R");
+       }
+
        return false;
 
 delete_dff: