mirror of
https://github.com/YosysHQ/yosys
synced 2025-04-23 17:15:33 +00:00
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.
This commit is contained in:
parent
4f4cff0080
commit
c77b7343d0
5 changed files with 38 additions and 15 deletions
|
@ -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));
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue