From 0804eccfecfbc004239524195cf17b3c761a7d62 Mon Sep 17 00:00:00 2001 From: Cary R Date: Fri, 29 Aug 2008 10:52:09 -0700 Subject: [PATCH] Evaluate constant real EQ and NE constructs. This patch adds code to evaluate constant == and != with real values. --- eval_tree.cc | 79 ++++++++++++++++++++++++++++++++++++++++++---------- netlist.h | 1 + 2 files changed, 65 insertions(+), 15 deletions(-) diff --git a/eval_tree.cc b/eval_tree.cc index 99e408a60..057ed003c 100644 --- a/eval_tree.cc +++ b/eval_tree.cc @@ -340,19 +340,15 @@ NetEConst* NetEBComp::eval_leeq_real_(NetExpr*le, NetExpr*ri, bool eq_flag) switch (le->expr_type()) { case IVL_VT_REAL: rtmp = dynamic_cast (le); - if (rtmp == 0) - return 0; - + if (rtmp == 0) return 0; lv = rtmp->value().as_double(); break; case IVL_VT_LOGIC: case IVL_VT_BOOL: vtmp = dynamic_cast (le); - if (vtmp == 0) - return 0; - - lv = vtmp->value().as_long(); + if (vtmp == 0) return 0; + lv = vtmp->value().as_double(); break; default: @@ -361,23 +357,18 @@ NetEConst* NetEBComp::eval_leeq_real_(NetExpr*le, NetExpr*ri, bool eq_flag) assert(0); } - switch (ri->expr_type()) { case IVL_VT_REAL: rtmp = dynamic_cast (ri); - if (rtmp == 0) - return 0; - + if (rtmp == 0) return 0; rv = rtmp->value().as_double(); break; case IVL_VT_LOGIC: case IVL_VT_BOOL: vtmp = dynamic_cast (ri); - if (vtmp == 0) - return 0; - - rv = vtmp->value().as_long(); + if (vtmp == 0) return 0; + rv = vtmp->value().as_double(); break; default: @@ -563,8 +554,66 @@ NetEConst* NetEBComp::eval_gteq_() } } +NetEConst* NetEBComp::eval_eqeq_real_(NetExpr*le, NetExpr*ri, bool ne_flag) +{ + NetEConst*vtmp; + NetECReal*rtmp; + double lv, rv; + + switch (le->expr_type()) { + case IVL_VT_REAL: + rtmp = dynamic_cast (le); + if (rtmp == 0) return 0; + lv = rtmp->value().as_double(); + break; + + case IVL_VT_LOGIC: + case IVL_VT_BOOL: + vtmp = dynamic_cast (le); + if (vtmp == 0) return 0; + lv = vtmp->value().as_double(); + break; + + default: + cerr << get_fileline() << ": internal error: " + << "Unexpected expression type? " << le->expr_type() << endl; + assert(0); + } + + switch (ri->expr_type()) { + case IVL_VT_REAL: + rtmp = dynamic_cast (ri); + if (rtmp == 0) return 0; + rv = rtmp->value().as_double(); + break; + + case IVL_VT_LOGIC: + case IVL_VT_BOOL: + vtmp = dynamic_cast (ri); + if (vtmp == 0) return 0; + rv = vtmp->value().as_double(); + break; + + default: + cerr << get_fileline() << ": internal error: " + << "Unexpected expression type? " << ri->expr_type() << endl; + assert(0); + } + + verinum result((lv == rv ^ ne_flag) ? verinum::V1 : verinum::V0, 1); + vtmp = new NetEConst(result); + vtmp->set_line(*this); + + return vtmp; +} + NetEConst* NetEBComp::eval_eqeq_(bool ne_flag) { + if (right_->expr_type() == IVL_VT_REAL) + return eval_eqeq_real_(right_, left_, ne_flag); + if (left_->expr_type() == IVL_VT_REAL) + return eval_eqeq_real_(right_, left_, ne_flag); + NetEConst*l = dynamic_cast(left_); if (l == 0) return 0; NetEConst*r = dynamic_cast(right_); diff --git a/netlist.h b/netlist.h index e86b3936c..ebeb07683 100644 --- a/netlist.h +++ b/netlist.h @@ -3206,6 +3206,7 @@ class NetEBComp : public NetEBinary { NetEConst* must_be_leeq_(NetExpr*le, const verinum&rv, bool eq_flag); NetEConst*eval_eqeq_(bool ne_flag); + NetEConst*eval_eqeq_real_(NetExpr*le, NetExpr*ri, bool ne_flag); NetEConst*eval_less_(); NetEConst*eval_leeq_(); NetEConst*eval_leeq_real_(NetExpr*le, NetExpr*ri, bool eq_flag);