diff options
author | whitequark <whitequark@whitequark.org> | 2019-12-04 11:59:36 +0000 |
---|---|---|
committer | whitequark <whitequark@whitequark.org> | 2019-12-04 11:59:36 +0000 |
commit | e97e33d00df9d702643a82152aa1becc611ef823 (patch) | |
tree | d6a56f374db5ee9dda0fb6af63cc7dd932106c65 /kernel | |
parent | ec4c9267b384030b487e66a77e4cc4ef600e876f (diff) | |
download | yosys-e97e33d00df9d702643a82152aa1becc611ef823.tar.gz yosys-e97e33d00df9d702643a82152aa1becc611ef823.tar.bz2 yosys-e97e33d00df9d702643a82152aa1becc611ef823.zip |
kernel: require \B_SIGNED=0 on $shl, $sshl, $shr, $sshr.
Before this commit, these cells would accept any \B_SIGNED and in
case of \B_SIGNED=1, would still treat the \B input as unsigned.
Also fix the Verilog frontend to never emit such constructs.
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/rtlil.cc | 24 |
1 files changed, 21 insertions, 3 deletions
diff --git a/kernel/rtlil.cc b/kernel/rtlil.cc index bd2fd91a3..7c73f94c8 100644 --- a/kernel/rtlil.cc +++ b/kernel/rtlil.cc @@ -783,6 +783,14 @@ namespace { return v; } + int param_bool(RTLIL::IdString name, bool expected) + { + int v = param_bool(name); + if (v != expected) + error(__LINE__); + return v; + } + void param_bits(RTLIL::IdString name, int width) { param(name); @@ -869,13 +877,23 @@ namespace { return; } - if (cell->type.in(ID($shl), ID($shr), ID($sshl), ID($sshr), ID($shift), ID($shiftx))) { + if (cell->type.in(ID($shl), ID($shr), ID($sshl), ID($sshr))) { + param_bool(ID(A_SIGNED)); + param_bool(ID(B_SIGNED), /*expected=*/false); + port(ID::A, param(ID(A_WIDTH))); + port(ID::B, param(ID(B_WIDTH))); + port(ID::Y, param(ID(Y_WIDTH))); + check_expected(/*check_matched_sign=*/false); + return; + } + + if (cell->type.in(ID($shift), ID($shiftx))) { param_bool(ID(A_SIGNED)); param_bool(ID(B_SIGNED)); port(ID::A, param(ID(A_WIDTH))); port(ID::B, param(ID(B_WIDTH))); port(ID::Y, param(ID(Y_WIDTH))); - check_expected(false); + check_expected(/*check_matched_sign=*/false); return; } @@ -957,7 +975,7 @@ namespace { port(ID::A, param(ID(A_WIDTH))); port(ID::B, param(ID(B_WIDTH))); port(ID::Y, param(ID(Y_WIDTH))); - check_expected(false); + check_expected(/*check_matched_sign=*/false); return; } |