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:
parent
b94db54664
commit
ed32119d13
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue