aboutsummaryrefslogtreecommitdiffstats
path: root/passes/techmap
diff options
context:
space:
mode:
authorEddie Hung <eddieh@ece.ubc.ca>2019-04-05 17:35:49 -0700
committerEddie Hung <eddieh@ece.ubc.ca>2019-04-05 17:35:49 -0700
commit1d526b7f061fb7e7961fa4d0b318b27cfda469d4 (patch)
treecbe59fad8080ffbeae3a15ee19f95b8900da9e35 /passes/techmap
parent4afcad70e264d58bcbb8cddcffd19673c3570fc6 (diff)
downloadyosys-1d526b7f061fb7e7961fa4d0b318b27cfda469d4.tar.gz
yosys-1d526b7f061fb7e7961fa4d0b318b27cfda469d4.tar.bz2
yosys-1d526b7f061fb7e7961fa4d0b318b27cfda469d4.zip
Call shregmap twice -- once for variable, another for fixed
Diffstat (limited to 'passes/techmap')
-rw-r--r--passes/techmap/shregmap.cc46
1 files changed, 17 insertions, 29 deletions
diff --git a/passes/techmap/shregmap.cc b/passes/techmap/shregmap.cc
index 408e3f8c7..a805ac5a6 100644
--- a/passes/techmap/shregmap.cc
+++ b/passes/techmap/shregmap.cc
@@ -138,11 +138,8 @@ struct ShregmapTechXilinx7 : ShregmapTech
virtual bool analyze(vector<int> &taps, const vector<SigBit> &qbits) override
{
- log("analyze() with %zu taps", taps.size());
- for (auto t : taps) log(" %d", t);
- log("\n");
if (GetSize(taps) == 1)
- return taps[0] >= opts.minlen-1;
+ return taps[0] >= opts.minlen-1 && sigbit_to_shiftx_offset.count(qbits[0]);
if (taps.back() < opts.minlen-1)
return false;
@@ -150,38 +147,31 @@ struct ShregmapTechXilinx7 : ShregmapTech
Cell *shiftx = nullptr;
int group = 0;
for (int i = 0; i < GetSize(taps); ++i) {
+ auto it = sigbit_to_shiftx_offset.find(qbits[i]);
+ if (it == sigbit_to_shiftx_offset.end())
+ return false;
+
// Check taps are sequential
if (i != taps[i])
return false;
// Check taps are not connected to a shift register,
// 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()) {
+ int offset;
+ std::tie(shiftx,offset,group) = it->second;
+ if (offset != i)
return false;
- }
- else {
- int offset;
- std::tie(shiftx,offset,group) = it->second;
- if (offset != i)
- return false;
- }
}
else {
- if (it == sigbit_to_shiftx_offset.end()) {
+ Cell *shiftx_ = std::get<0>(it->second);
+ if (shiftx_ != shiftx)
+ return false;
+ int offset = std::get<1>(it->second);
+ if (offset != i)
+ return false;
+ int group_ = std::get<2>(it->second);
+ if (group_ != group)
return false;
- }
- else {
- Cell *shiftx_ = std::get<0>(it->second);
- if (shiftx_ != shiftx)
- return false;
- int offset = std::get<1>(it->second);
- if (offset != i)
- return false;
- int group_ = std::get<2>(it->second);
- if (group_ != group)
- return false;
- }
}
}
log_assert(shiftx);
@@ -206,9 +196,7 @@ struct ShregmapTechXilinx7 : ShregmapTech
auto bit = tap.second;
auto it = sigbit_to_shiftx_offset.find(bit);
- // If fixed-length, no fixup necessary
- if (it == sigbit_to_shiftx_offset.end())
- return true;
+ log_assert(it != sigbit_to_shiftx_offset.end());
auto newcell = cell->module->addCell(NEW_ID, "$__XILINX_SHREG_");
newcell->setParam("\\DEPTH", cell->getParam("\\DEPTH"));