Be mindful that sigmap(wire) could have dupes when checking \init
authorEddie Hung <eddie@fpgeh.com>
Wed, 2 Oct 2019 23:08:46 +0000 (16:08 -0700)
committerEddie Hung <eddie@fpgeh.com>
Wed, 2 Oct 2019 23:08:46 +0000 (16:08 -0700)
passes/sat/sat.cc

index 430bba1e82cec5139afaacb4182723b99f8edb28..93a4f225ef8d984a90f8e9019e7d2c042c1cc599 100644 (file)
@@ -265,15 +265,18 @@ struct SatHelper
                                RTLIL::SigSpec rhs = it.second->attributes.at("\\init");
                                log_assert(lhs.size() == rhs.size());
 
+                               dict<RTLIL::SigBit,SigBit> seen_init;
                                RTLIL::SigSpec removed_bits;
                                for (int i = 0; i < lhs.size(); i++) {
                                        RTLIL::SigSpec bit = lhs.extract(i, 1);
-                                       if (rhs[i] == State::Sx || !satgen.initial_state.check_all(bit)) {
+                                       if (rhs[i] == State::Sx || !satgen.initial_state.check_all(bit) || seen_init.at(bit, rhs[i]) != rhs[i]) {
                                                removed_bits.append(bit);
                                                lhs.remove(i, 1);
                                                rhs.remove(i, 1);
                                                i--;
                                        }
+                                       else
+                                               seen_init[bit] = rhs[i];
                                }
 
                                if (removed_bits.size())