mirror of
https://github.com/YosysHQ/yosys
synced 2025-04-15 13:28:59 +00:00
opt_expr: Fix shift/shiftx optimizations
This commit is contained in:
parent
fd56d1f79e
commit
1e67c3a3c2
|
@ -986,7 +986,7 @@ skip_fine_alu:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cell->type.in(ID($shiftx), ID($shift))) {
|
if (cell->type.in(ID($shiftx), ID($shift)) && (cell->type == ID($shiftx) || !cell->getParam(ID::A_SIGNED).as_bool())) {
|
||||||
SigSpec sig_a = assign_map(cell->getPort(ID::A));
|
SigSpec sig_a = assign_map(cell->getPort(ID::A));
|
||||||
int width;
|
int width;
|
||||||
bool trim_x = cell->type == ID($shiftx) || !keepdc;
|
bool trim_x = cell->type == ID($shiftx) || !keepdc;
|
||||||
|
@ -1233,7 +1233,7 @@ skip_fine_alu:
|
||||||
goto next_cell;
|
goto next_cell;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cell->type.in(ID($shl), ID($shr), ID($sshl), ID($sshr), ID($shift), ID($shiftx)) && assign_map(cell->getPort(ID::B)).is_fully_const())
|
if (cell->type.in(ID($shl), ID($shr), ID($sshl), ID($sshr), ID($shift), ID($shiftx)) && (keepdc ? assign_map(cell->getPort(ID::B)).is_fully_def() : assign_map(cell->getPort(ID::B)).is_fully_const()))
|
||||||
{
|
{
|
||||||
bool sign_ext = cell->type == ID($sshr) && cell->getParam(ID::A_SIGNED).as_bool();
|
bool sign_ext = cell->type == ID($sshr) && cell->getParam(ID::A_SIGNED).as_bool();
|
||||||
int shift_bits = assign_map(cell->getPort(ID::B)).as_int(cell->type.in(ID($shift), ID($shiftx)) && cell->getParam(ID::B_SIGNED).as_bool());
|
int shift_bits = assign_map(cell->getPort(ID::B)).as_int(cell->type.in(ID($shift), ID($shiftx)) && cell->getParam(ID::B_SIGNED).as_bool());
|
||||||
|
@ -1244,7 +1244,7 @@ skip_fine_alu:
|
||||||
RTLIL::SigSpec sig_a = assign_map(cell->getPort(ID::A));
|
RTLIL::SigSpec sig_a = assign_map(cell->getPort(ID::A));
|
||||||
RTLIL::SigSpec sig_y(cell->type == ID($shiftx) ? RTLIL::State::Sx : RTLIL::State::S0, cell->getParam(ID::Y_WIDTH).as_int());
|
RTLIL::SigSpec sig_y(cell->type == ID($shiftx) ? RTLIL::State::Sx : RTLIL::State::S0, cell->getParam(ID::Y_WIDTH).as_int());
|
||||||
|
|
||||||
if (GetSize(sig_a) < GetSize(sig_y))
|
if (cell->type != ID($shiftx) && GetSize(sig_a) < GetSize(sig_y))
|
||||||
sig_a.extend_u0(GetSize(sig_y), cell->getParam(ID::A_SIGNED).as_bool());
|
sig_a.extend_u0(GetSize(sig_y), cell->getParam(ID::A_SIGNED).as_bool());
|
||||||
|
|
||||||
for (int i = 0; i < GetSize(sig_y); i++) {
|
for (int i = 0; i < GetSize(sig_y); i++) {
|
||||||
|
|
Loading…
Reference in a new issue