aboutsummaryrefslogtreecommitdiffstats
path: root/passes
diff options
context:
space:
mode:
authorClifford Wolf <clifford@clifford.at>2016-04-21 19:47:25 +0200
committerClifford Wolf <clifford@clifford.at>2016-04-21 19:47:25 +0200
commit1565d1af69f552b790aa43fd6be194ee59ab76f3 (patch)
tree190d0c98d1bf91eeeeb052fe0406e4a760103206 /passes
parent5a09fa45535ffceae90359be727d2ff6e0ac2c58 (diff)
downloadyosys-1565d1af69f552b790aa43fd6be194ee59ab76f3.tar.gz
yosys-1565d1af69f552b790aa43fd6be194ee59ab76f3.tar.bz2
yosys-1565d1af69f552b790aa43fd6be194ee59ab76f3.zip
Fixed performance bug in "share" pass
Diffstat (limited to 'passes')
-rw-r--r--passes/opt/share.cc53
1 files changed, 51 insertions, 2 deletions
diff --git a/passes/opt/share.cc b/passes/opt/share.cc
index 1d9b1006e..7927c5397 100644
--- a/passes/opt/share.cc
+++ b/passes/opt/share.cc
@@ -793,10 +793,59 @@ struct ShareWorker
return true;
}
- void optimize_activation_patterns(pool<ssc_pair_t> & /* patterns */)
+ void optimize_activation_patterns(pool<ssc_pair_t> &patterns)
{
// TODO: Remove patterns that are contained in other patterns
- // TODO: Consolidate pairs of patterns that only differ in the value for one signal bit
+
+ dict<SigSpec, pool<Const>> db;
+ bool did_something = false;
+
+ for (auto const &p : patterns)
+ {
+ auto &sig = p.first;
+ auto &val = p.second;
+ int len = GetSize(sig);
+
+ for (int i = 0; i < len; i++)
+ {
+ auto otherval = val;
+
+ if (otherval.bits[i] == State::S0)
+ otherval.bits[i] = State::S1;
+ else if (otherval.bits[i] == State::S1)
+ otherval.bits[i] = State::S0;
+ else
+ continue;
+
+ if (db[sig].count(otherval))
+ {
+ auto newsig = sig;
+ newsig.remove(i);
+
+ auto newval = val;
+ newval.bits.erase(newval.bits.begin() + i);
+
+ db[newsig].insert(newval);
+ db[sig].erase(otherval);
+
+ did_something = true;
+ goto next_pattern;
+ }
+ }
+
+ db[sig].insert(val);
+ next_pattern:;
+ }
+
+ if (!did_something)
+ return;
+
+ patterns.clear();
+ for (auto &it : db)
+ for (auto &val : it.second)
+ patterns.insert(make_pair(it.first, val));
+
+ optimize_activation_patterns(patterns);
}
const pool<ssc_pair_t> &find_cell_activation_patterns(RTLIL::Cell *cell, const char *indent)