Fix shregmap to correctly recognise non chain users; cleanup
authorEddie Hung <eddieh@ece.ubc.ca>
Mon, 18 Mar 2019 23:12:19 +0000 (16:12 -0700)
committerEddie Hung <eddieh@ece.ubc.ca>
Mon, 18 Mar 2019 23:12:19 +0000 (16:12 -0700)
passes/techmap/shregmap.cc

index f3153b400ae7ae18bbd3829d30919f2827099a05..d95cadde5d30f272e8535e652d8bdd96f3aebe97 100644 (file)
@@ -120,7 +120,7 @@ struct ShregmapTechXilinx7 : ShregmapTech
                        return;
                if (cell->type == "$shiftx" && port == "\\A")
                        return;
-               it->second = std::make_pair(nullptr, 0);
+               sigbit_to_shiftx_offset.erase(it);
        }
 
        virtual bool analyze(vector<int> &taps, const vector<SigBit> &qbits) override
@@ -140,11 +140,11 @@ struct ShregmapTechXilinx7 : ShregmapTech
                        // or sequential to the same shift register
                        auto it = sigbit_to_shiftx_offset.find(qbits[i]);
                        if (i == 0) {
-                               if (it != sigbit_to_shiftx_offset.end()) {
+                               if (it == sigbit_to_shiftx_offset.end()) {
+                                       return false;
+                               }
+                               else {
                                        shiftx = it->second.first;
-                                       // NULL indicates there are non-shiftx users
-                                       if (shiftx == nullptr)
-                                               return false;
                                        int offset = it->second.second;
                                        if (offset != i)
                                                return false;
@@ -152,8 +152,7 @@ struct ShregmapTechXilinx7 : ShregmapTech
                        }
                        else {
                                if (it == sigbit_to_shiftx_offset.end()) {
-                                       if (shiftx != nullptr)
-                                               return false;
+                                       return false;
                                }
                                else {
                                        if (shiftx != it->second.first)
@@ -164,18 +163,17 @@ struct ShregmapTechXilinx7 : ShregmapTech
                                }
                        }
                }
+               log_assert(shiftx);
 
-               if (shiftx) {
-                       // Cannot implement variable-length shift registers
-                       // greater than 128 since Q31 cannot be output onto
-                       // fabric
-                       if (GetSize(taps) > 128)
-                               return false;
+               // Cannot implement variable-length shift registers
+               // greater than 128 since Q31 cannot be output onto
+               // fabric
+               if (GetSize(taps) > 128)
+                       return false;
 
-                       // Only map if $shiftx exclusively covers the shift register
-                       if (GetSize(taps) != shiftx->getParam("\\A_WIDTH").as_int())
-                               return false;
-               }
+               // Only map if $shiftx exclusively covers the shift register
+               if (GetSize(taps) != shiftx->getParam("\\A_WIDTH").as_int())
+                       return false;
 
                return true;
        }