mirror of
https://github.com/YosysHQ/yosys
synced 2025-06-06 06:03:23 +00:00
Add flooring modulo operator
The $div and $mod cells use truncating division semantics (rounding towards 0), as defined by e.g. Verilog. Another rounding mode, flooring (rounding towards negative infinity), can be used in e.g. VHDL. The new $modfloor cell provides this flooring modulo (also known as "remainder" in several languages, but this name is ambiguous). This commit also fixes the handling of $mod in opt_expr, which was previously optimized as if it was $modfloor.
This commit is contained in:
parent
0d99522b3c
commit
17163cf43a
23 changed files with 280 additions and 37 deletions
|
@ -948,7 +948,7 @@ namespace {
|
|||
return;
|
||||
}
|
||||
|
||||
if (cell->type.in(ID($add), ID($sub), ID($mul), ID($div), ID($mod), ID($pow))) {
|
||||
if (cell->type.in(ID($add), ID($sub), ID($mul), ID($div), ID($mod), ID($modfloor), ID($pow))) {
|
||||
param_bool(ID::A_SIGNED);
|
||||
param_bool(ID::B_SIGNED);
|
||||
port(ID::A, param(ID::A_WIDTH));
|
||||
|
@ -1949,6 +1949,7 @@ DEF_METHOD(Sub, max(sig_a.size(), sig_b.size()), ID($sub))
|
|||
DEF_METHOD(Mul, max(sig_a.size(), sig_b.size()), ID($mul))
|
||||
DEF_METHOD(Div, max(sig_a.size(), sig_b.size()), ID($div))
|
||||
DEF_METHOD(Mod, max(sig_a.size(), sig_b.size()), ID($mod))
|
||||
DEF_METHOD(ModFloor, max(sig_a.size(), sig_b.size()), ID($modfloor))
|
||||
DEF_METHOD(LogicAnd, 1, ID($logic_and))
|
||||
DEF_METHOD(LogicOr, 1, ID($logic_or))
|
||||
#undef DEF_METHOD
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue