diff options
author | Jannis Harder <me@jix.one> | 2022-10-21 15:41:20 +0200 |
---|---|---|
committer | Jannis Harder <me@jix.one> | 2022-10-24 12:03:01 +0200 |
commit | c77b7343d0412a009436a57764d907e2ae332da2 (patch) | |
tree | 3213d3d6940c16b58b369034bfc2cbf875967f10 /passes/opt | |
parent | 4f4cff00800dec70796d4d5ec70c73eef837f948 (diff) | |
download | yosys-c77b7343d0412a009436a57764d907e2ae332da2.tar.gz yosys-c77b7343d0412a009436a57764d907e2ae332da2.tar.bz2 yosys-c77b7343d0412a009436a57764d907e2ae332da2.zip |
Consistent $mux undef handling
* Change simlib's $mux cell to use the ternary operator as $_MUX_
already does
* Stop opt_expr -keepdc from changing S=x to S=0
* Change const eval of $mux and $pmux to match the updated simlib
(fixes sim)
* The sat behavior of $mux already matches the updated simlib
The verilog frontend uses $mux for the ternary operators and this
changes all interpreations of the $mux cell (that I found) to match the
verilog simulation behavior for the ternary operator. For 'if' and
'case' expressions the frontend may also use $mux but uses $eqx if the
verilog simulation behavior is requested with the '-ifx' option.
For $pmux there is a remaining mismatch between the sat behavior and the
simlib behavior. Resolving this requires more discussion, as the $pmux
cell does not directly correspond to a specific verilog construct.
Diffstat (limited to 'passes/opt')
-rw-r--r-- | passes/opt/opt_expr.cc | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/passes/opt/opt_expr.cc b/passes/opt/opt_expr.cc index be0cd470b..9cc0170dc 100644 --- a/passes/opt/opt_expr.cc +++ b/passes/opt/opt_expr.cc @@ -1494,7 +1494,7 @@ skip_identity: RTLIL::SigSpec input = assign_map(cell->getPort(ID::S)); RTLIL::SigSpec inA = assign_map(cell->getPort(ID::A)); RTLIL::SigSpec inB = assign_map(cell->getPort(ID::B)); - if (input.is_fully_const()) + if (input.is_fully_const() && (!keepdc || input.is_fully_def())) ACTION_DO(ID::Y, input.as_bool() ? cell->getPort(ID::B) : cell->getPort(ID::A)); else if (inA == inB) ACTION_DO(ID::Y, cell->getPort(ID::A)); |