pattern muxadd // // Transforms add->mux into mux->add: // y = s ? (a + b) : a ===> y = a + (s ? b : 0) // state add_y add_a add_b match add select add->type == $add endmatch code add_y add_a add_b add_y = port(add, \Y); add_a = port(add, \A); add_b = port(add, \B); branch; std::swap(add_a, add_b); endcode match mux select mux->type == $mux index port(mux, \A) === SigSpec({Const(State::S0, GetSize(add_y)-GetSize(add_a)), add_a}) index port(mux, \B) === add_y endmatch code SigSpec mux_y = port(mux, \Y); SigSpec mid = module->addWire(NEW_ID, GetSize(add_b)); mux->setPort(\A, Const(State::S0, GetSize(add_b))); mux->setPort(\B, add_b); mux->setPort(\Y, mid); add->setPort(\B, mid); add->setPort(\Y, mux_y); log("muxadd pattern in %s: mux=%s, add=%s\n", log_id(module), log_id(mux), log_id(add)); mux->fixup_parameters(); accept; endcode