diff --git a/passes/techmap/alumacc.cc b/passes/techmap/alumacc.cc index d89a6fbec1c..040569745a0 100644 --- a/passes/techmap/alumacc.cc +++ b/passes/techmap/alumacc.cc @@ -405,11 +405,6 @@ struct AlumaccWorker RTLIL::SigSpec B = sigmap(cell->getPort(ID::B)); RTLIL::SigSpec Y = sigmap(cell->getPort(ID::Y)); - if (B < A && GetSize(B)) { - cmp_less = !cmp_less; - std::swap(A, B); - } - alunode_t *n = nullptr; for (auto node : sig_alu[RTLIL::SigSig(A, B)]) @@ -418,6 +413,16 @@ struct AlumaccWorker break; } + if (n == nullptr) { + for (auto node : sig_alu[RTLIL::SigSig(B, A)]) + if (node->invert_b && node->c == State::S1) { + n = node; + cmp_less = !cmp_less; + std::swap(A, B); + break; + } + } + if (n == nullptr) { n = new alunode_t; n->a = A; @@ -445,9 +450,6 @@ struct AlumaccWorker RTLIL::SigSpec B = sigmap(cell->getPort(ID::B)); RTLIL::SigSpec Y = sigmap(cell->getPort(ID::Y)); - if (B < A && GetSize(B)) - std::swap(A, B); - alunode_t *n = nullptr; for (auto node : sig_alu[RTLIL::SigSig(A, B)]) @@ -456,6 +458,14 @@ struct AlumaccWorker break; } + if (n == nullptr) { + for (auto node : sig_alu[RTLIL::SigSig(B, A)]) + if (node->invert_b && node->c == State::S1) { + n = node; + break; + } + } + if (n != nullptr) { log(" creating $alu model for %s (%s): merged with %s.\n", log_id(cell), log_id(cell->type), log_id(n->cells.front())); n->cells.push_back(cell);