diff options
author | Clifford Wolf <clifford@clifford.at> | 2013-12-27 13:50:08 +0100 |
---|---|---|
committer | Clifford Wolf <clifford@clifford.at> | 2013-12-27 13:50:08 +0100 |
commit | ecc30255ba70910777a4586f5bd6abc818073293 (patch) | |
tree | 35eb7e1b849d1da91c5ab5e2ffd4251aeb8a213d /kernel | |
parent | 11ffa7867794ee5bda2742830bda64976ad4f549 (diff) | |
download | yosys-ecc30255ba70910777a4586f5bd6abc818073293.tar.gz yosys-ecc30255ba70910777a4586f5bd6abc818073293.tar.bz2 yosys-ecc30255ba70910777a4586f5bd6abc818073293.zip |
Added proper === and !== support in constant expressions
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/calc.cc | 29 | ||||
-rw-r--r-- | kernel/rtlil.h | 2 |
2 files changed, 31 insertions, 0 deletions
diff --git a/kernel/calc.cc b/kernel/calc.cc index 61025104d..fc978c11a 100644 --- a/kernel/calc.cc +++ b/kernel/calc.cc @@ -386,6 +386,35 @@ RTLIL::Const RTLIL::const_ne(const RTLIL::Const &arg1, const RTLIL::Const &arg2, return result; } +RTLIL::Const RTLIL::const_eqx(const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len) +{ + RTLIL::Const arg1_ext = arg1; + RTLIL::Const arg2_ext = arg2; + RTLIL::Const result(RTLIL::State::S0, result_len); + + int width = std::max(arg1_ext.bits.size(), arg2_ext.bits.size()); + extend_u0(arg1_ext, width, signed1 && signed2); + extend_u0(arg2_ext, width, signed1 && signed2); + + for (size_t i = 0; i < arg1_ext.bits.size(); i++) { + if (arg1_ext.bits.at(i) != arg2_ext.bits.at(i)) + return result; + } + + result.bits.front() = RTLIL::State::S1; + return result; +} + +RTLIL::Const RTLIL::const_nex(const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len) +{ + RTLIL::Const result = RTLIL::const_eqx(arg1, arg2, signed1, signed2, result_len); + if (result.bits.front() == RTLIL::State::S0) + result.bits.front() = RTLIL::State::S1; + else if (result.bits.front() == RTLIL::State::S1) + result.bits.front() = RTLIL::State::S0; + return result; +} + RTLIL::Const RTLIL::const_ge(const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len) { int undef_bit_pos = -1; diff --git a/kernel/rtlil.h b/kernel/rtlil.h index fbdab53eb..91dd9d44c 100644 --- a/kernel/rtlil.h +++ b/kernel/rtlil.h @@ -174,6 +174,8 @@ namespace RTLIL RTLIL::Const const_le (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len); RTLIL::Const const_eq (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len); RTLIL::Const const_ne (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len); + RTLIL::Const const_eqx (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len); + RTLIL::Const const_nex (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len); RTLIL::Const const_ge (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len); RTLIL::Const const_gt (const RTLIL::Const &arg1, const RTLIL::Const &arg2, bool signed1, bool signed2, int result_len); |