aboutsummaryrefslogtreecommitdiffstats
path: root/passes/opt
diff options
context:
space:
mode:
authorClifford Wolf <clifford@clifford.at>2019-04-19 23:37:11 +0200
committerClifford Wolf <clifford@clifford.at>2019-04-20 00:38:25 +0200
commit0070184ea9dea56d1dfd8268035bc01a3e340add (patch)
treea8b2ba3cead45bb3b16a308d48b82032c90b7937 /passes/opt
parent4c831d72ef2d3a9f9b91d6fa27e09800ae09e869 (diff)
downloadyosys-0070184ea9dea56d1dfd8268035bc01a3e340add.tar.gz
yosys-0070184ea9dea56d1dfd8268035bc01a3e340add.tar.bz2
yosys-0070184ea9dea56d1dfd8268035bc01a3e340add.zip
Improvements in pmux2shiftx
Signed-off-by: Clifford Wolf <clifford@clifford.at>
Diffstat (limited to 'passes/opt')
-rw-r--r--passes/opt/pmux2shiftx.cc19
1 files changed, 6 insertions, 13 deletions
diff --git a/passes/opt/pmux2shiftx.cc b/passes/opt/pmux2shiftx.cc
index daa73b0b8..d0f41cb07 100644
--- a/passes/opt/pmux2shiftx.cc
+++ b/passes/opt/pmux2shiftx.cc
@@ -149,6 +149,7 @@ struct Pmux2ShiftxPass : public Pass {
dict<SigSpec, pool<int>> seldb;
+ SigSpec B = cell->getPort("\\B");
SigSpec S = sigmap(cell->getPort("\\S"));
for (int i = 0; i < GetSize(S); i++)
{
@@ -168,15 +169,6 @@ struct Pmux2ShiftxPass : public Pass {
SigSpec updated_S = cell->getPort("\\S");
SigSpec updated_B = cell->getPort("\\B");
- #if 1
- for (auto &it : seldb) {
- string msg = stringf("seldb: %s ->", log_signal(it.first));
- for (int i : it.second)
- msg += stringf(" %d(%s)", i, log_signal(eqdb.at(S[i]).second));
- log(" %s\n", msg.c_str());
- }
- #endif
-
while (!seldb.empty())
{
// pick the largest entry in seldb
@@ -319,7 +311,8 @@ struct Pmux2ShiftxPass : public Pass {
min_choice = std::min(min_choice, new_c.as_int());
max_choice = std::max(max_choice, new_c.as_int());
- log(" %s -> %s -> %s\n", log_signal(old_c), log_signal(new_c_before_xor), log_signal(new_c));
+ log(" %3d: %s -> %s -> %s: %s\n", it.second, log_signal(old_c), log_signal(new_c_before_xor),
+ log_signal(new_c), log_signal(B.extract(it.second*width, width)));
}
int range_density = 100*GetSize(choices) / (max_choice-min_choice+1);
@@ -338,9 +331,9 @@ struct Pmux2ShiftxPass : public Pass {
Const offset(State::S0, GetSize(sig));
if (absolute_density < non_offset_percentage && range_density >= offset_percentage)
{
- log(" using offset method.\n");
-
offset = Const(min_choice, GetSize(sig));
+ log(" offset: %s\n", log_signal(offset));
+
min_choice -= offset.as_int();
max_choice -= offset.as_int();
@@ -377,7 +370,7 @@ struct Pmux2ShiftxPass : public Pass {
for (auto &it : perm_choices) {
int position = it.first.as_int()*extwidth;
int data_index = it.second;
- data.replace(position, cell->getPort("\\B").extract(data_index*width, width));
+ data.replace(position, B.extract(data_index*width, width));
updated_S[data_index] = State::S0;
updated_B.replace(data_index*width, SigSpec(State::Sx, width));
}