Using $pmux info in fsm_extract to optimize transition ctrl_in patterns
authorClifford Wolf <clifford@clifford.at>
Sat, 30 Aug 2014 12:34:49 +0000 (14:34 +0200)
committerClifford Wolf <clifford@clifford.at>
Sat, 30 Aug 2014 12:34:49 +0000 (14:34 +0200)
passes/fsm/fsm_extract.cc

index d1d73db6dd729e81189f408335a68ff5c36d9c6f..451f00fcb2a680b57a0a787625f72fb4cca036d1 100644 (file)
@@ -144,6 +144,16 @@ undef_bit_in_next_state:
                tr.ctrl_in = sig2const(ce, ctrl_in, RTLIL::State::Sa, dont_care);
                tr.ctrl_out = sig2const(ce, ctrl_out, RTLIL::State::Sx);
 
+               std::map<RTLIL::SigBit, int> ctrl_in_bit_indices;
+               for (int i = 0; i < SIZE(ctrl_in); i++)
+                       ctrl_in_bit_indices[ctrl_in[i]] = i;
+
+               for (auto &it : ctrl_in_bit_indices)
+                       if (tr.ctrl_in.bits.at(it.second) == RTLIL::S1 && exclusive_ctrls.count(it.first) != 0)
+                               for (auto &dc_bit : exclusive_ctrls.at(it.first))
+                                       if (ctrl_in_bit_indices.count(dc_bit))
+                                               tr.ctrl_in.bits.at(ctrl_in_bit_indices.at(dc_bit)) = RTLIL::State::Sa;
+
                RTLIL::Const log_state_in = RTLIL::Const(RTLIL::State::Sx, fsm_data.state_bits);
                if (state_in >= 0)
                        log_state_in = fsm_data.state_table.at(state_in);