3
0
Fork 0
mirror of https://github.com/YosysHQ/yosys synced 2025-04-27 19:05:52 +00:00
yosys/passes/pmgen/peepopt_muxadd.pmg
2024-08-30 04:45:01 -07:00

42 lines
905 B
Text

pattern muxadd
//
// Transforms add->mux into mux->add:
// y = s ? (a + b) : a ===> y = a + (s ? b : 0)
//
state <SigSpec> 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 <SigSpec> port(mux, \A) === SigSpec({Const(State::S0, GetSize(add_y)-GetSize(add_a)), add_a})
index <SigSpec> 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