3
0
Fork 0
mirror of https://github.com/YosysHQ/yosys synced 2025-04-13 04:28:18 +00:00

Fix shregmap to correctly recognise non chain users; cleanup

This commit is contained in:
Eddie Hung 2019-03-18 16:12:19 -07:00
parent b94db54664
commit ed32119d13

View file

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