diff options
author | Clifford Wolf <clifford@clifford.at> | 2017-01-31 10:15:04 +0100 |
---|---|---|
committer | Clifford Wolf <clifford@clifford.at> | 2017-01-31 10:15:04 +0100 |
commit | 7481ba4750b5c65c9dc2c64ae29027f328f25bfe (patch) | |
tree | 0c3aabbfcf22238a10077f8f8121a1bdc36a87c0 | |
parent | 18ea65ef04889e5016f007d3a034c8c49709cdb6 (diff) | |
download | yosys-7481ba4750b5c65c9dc2c64ae29027f328f25bfe.tar.gz yosys-7481ba4750b5c65c9dc2c64ae29027f328f25bfe.tar.bz2 yosys-7481ba4750b5c65c9dc2c64ae29027f328f25bfe.zip |
Improve opt_rmdff support for $dlatch cells
-rw-r--r-- | passes/opt/opt_rmdff.cc | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/passes/opt/opt_rmdff.cc b/passes/opt/opt_rmdff.cc index 922f086f1..00094738c 100644 --- a/passes/opt/opt_rmdff.cc +++ b/passes/opt/opt_rmdff.cc @@ -41,9 +41,27 @@ void remove_init_attr(SigSpec sig) bool handle_dlatch(RTLIL::Module *mod, RTLIL::Cell *dlatch) { - SigSpec sig_e = dlatch->getPort("\\EN"); + SigSpec sig_e; + State on_state, off_state; + + if (dlatch->type == "$dlatch") { + sig_e = assign_map(dlatch->getPort("\\EN")); + on_state = dlatch->getParam("\\EN_POLARITY").as_bool() ? State::S1 : State::S0; + off_state = dlatch->getParam("\\EN_POLARITY").as_bool() ? State::S0 : State::S1; + } else + if (dlatch->type == "$_DLATCH_P_") { + sig_e = assign_map(dlatch->getPort("\\E")); + on_state = State::S1; + off_state = State::S0; + } else + if (dlatch->type == "$_DLATCH_N_") { + sig_e = assign_map(dlatch->getPort("\\E")); + on_state = State::S0; + off_state = State::S1; + } else + log_abort(); - if (sig_e == State::S0) + if (sig_e == off_state) { RTLIL::Const val_init; for (auto bit : dff_init_map(dlatch->getPort("\\Q"))) @@ -52,7 +70,7 @@ bool handle_dlatch(RTLIL::Module *mod, RTLIL::Cell *dlatch) goto delete_dlatch; } - if (sig_e == State::S1) + if (sig_e == on_state) { mod->connect(dlatch->getPort("\\Q"), dlatch->getPort("\\D")); goto delete_dlatch; @@ -268,7 +286,7 @@ struct OptRmdffPass : public Pass { "$ff", "$dff", "$adff")) dff_list.push_back(cell->name); - if (cell->type == "$dlatch") + if (cell->type.in("$dlatch", "$_DLATCH_P_", "$_DLATCH_N_")) dlatch_list.push_back(cell->name); } |