diff options
author | Jannis Harder <me@jix.one> | 2022-10-24 16:25:33 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-10-24 16:25:33 +0200 |
commit | 408fc60c95f88671e0d6c5624a10e147334edb4e (patch) | |
tree | b07daa89e730a8d8b76152d1b3a6174229452257 /kernel/calc.cc | |
parent | 3a37597e9f3cbcd69a28663933074c24d5c03feb (diff) | |
parent | c77b7343d0412a009436a57764d907e2ae332da2 (diff) | |
download | yosys-408fc60c95f88671e0d6c5624a10e147334edb4e.tar.gz yosys-408fc60c95f88671e0d6c5624a10e147334edb4e.tar.bz2 yosys-408fc60c95f88671e0d6c5624a10e147334edb4e.zip |
Merge pull request #3526 from jix/mux-simlib-eval
Consistent $mux undef handling
Diffstat (limited to 'kernel/calc.cc')
-rw-r--r-- | kernel/calc.cc | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/kernel/calc.cc b/kernel/calc.cc index 0865db526..32e8a49fe 100644 --- a/kernel/calc.cc +++ b/kernel/calc.cc @@ -609,6 +609,36 @@ RTLIL::Const RTLIL::const_neg(const RTLIL::Const &arg1, const RTLIL::Const&, boo return RTLIL::const_sub(zero, arg1_ext, true, signed1, result_len); } +RTLIL::Const RTLIL::const_mux(const RTLIL::Const &arg1, const RTLIL::Const &arg2, const RTLIL::Const &arg3) +{ + log_assert(arg2.size() == arg1.size()); + if (arg3[0] == State::S0) + return arg1; + else if (arg3[0] == State::S1) + return arg2; + + RTLIL::Const ret = arg1; + for (int i = 0; i < ret.size(); i++) + if (ret[i] != arg2[i]) + ret[i] = State::Sx; + return ret; +} + +RTLIL::Const RTLIL::const_pmux(const RTLIL::Const &arg1, const RTLIL::Const &arg2, const RTLIL::Const &arg3) +{ + if (arg3.is_fully_zero()) + return arg1; + + if (!arg3.is_onehot()) + return RTLIL::Const(State::Sx, arg1.size()); + + for (int i = 0; i < arg3.size(); i++) + if (arg3[i] == State::S1) + return RTLIL::Const(std::vector<RTLIL::State>(arg2.bits.begin() + i*arg1.bits.size(), arg2.bits.begin() + (i+1)*arg1.bits.size())); + + log_abort(); // unreachable +} + RTLIL::Const RTLIL::const_bmux(const RTLIL::Const &arg1, const RTLIL::Const &arg2) { std::vector<RTLIL::State> t = arg1.bits; |