aboutsummaryrefslogtreecommitdiffstats
path: root/passes
diff options
context:
space:
mode:
authorClifford Wolf <clifford@clifford.at>2017-08-06 13:27:18 +0200
committerClifford Wolf <clifford@clifford.at>2017-08-06 13:27:18 +0200
commitc4a7958f70be956130119bbb3c682df8e0953b9c (patch)
tree4c9a1fb3555eb086aaca2366ffd49d30099756e9 /passes
parent48b2b376d0c2bf1f8e32b2f201923783c65108f0 (diff)
downloadyosys-c4a7958f70be956130119bbb3c682df8e0953b9c.tar.gz
yosys-c4a7958f70be956130119bbb3c682df8e0953b9c.tar.bz2
yosys-c4a7958f70be956130119bbb3c682df8e0953b9c.zip
Add handling of constant reset signals to opt_rmdff
Diffstat (limited to 'passes')
-rw-r--r--passes/opt/opt_rmdff.cc24
1 files changed, 23 insertions, 1 deletions
diff --git a/passes/opt/opt_rmdff.cc b/passes/opt/opt_rmdff.cc
index 0eefd6a86..80217464c 100644
--- a/passes/opt/opt_rmdff.cc
+++ b/passes/opt/opt_rmdff.cc
@@ -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: