| pattern muldiv |
| |
| state <SigSpec> t x y |
| |
| match mul |
| select mul->type == $mul |
| select GetSize(port(mul, \A)) + GetSize(port(mul, \B)) <= GetSize(port(mul, \Y)) |
| endmatch |
| |
| code t x y |
| t = port(mul, \Y); |
| x = port(mul, \A); |
| y = port(mul, \B); |
| branch; |
| std::swap(x, y); |
| endcode |
| |
| match div |
| select div->type.in($div) |
| index <SigSpec> port(div, \A) === t |
| index <SigSpec> port(div, \B) === x |
| endmatch |
| |
| code |
| SigSpec div_y = port(div, \Y); |
| SigSpec val_y = y; |
| |
| if (GetSize(div_y) != GetSize(val_y)) |
| val_y.extend_u0(GetSize(div_y), param(div, \A_SIGNED).as_bool()); |
| |
| did_something = true; |
| log("muldiv pattern in %s: mul=%s, div=%s\n", log_id(module), log_id(mul), log_id(div)); |
| module->connect(div_y, val_y); |
| autoremove(div); |
| accept; |
| endcode |