Factor out some common eval_tree code.
The eval_tree() function is identical in most of the NetEBinary and NetEUnary sub-classes.
This commit is contained in:
parent
afd23d13d5
commit
f3a51fdfd1
265
eval_tree.cc
265
eval_tree.cc
|
|
@ -77,8 +77,28 @@ static bool get_real_arguments(const NetExpr*le, const NetExpr*re,
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NetExpr* NetEBinary::eval_tree()
|
||||||
|
{
|
||||||
|
eval_expr(left_);
|
||||||
|
eval_expr(right_);
|
||||||
|
|
||||||
|
NetExpr*res = eval_arguments_(left_, right_);
|
||||||
|
if (res != 0) {
|
||||||
|
res->set_line(*this);
|
||||||
|
if (debug_eval_tree) {
|
||||||
|
cerr << get_fileline() << ": debug: Evaluated";
|
||||||
|
if (left_->expr_type() == IVL_VT_REAL ||
|
||||||
|
right_->expr_type() == IVL_VT_REAL)
|
||||||
|
cerr << " (real)";
|
||||||
|
cerr << ": " << *this << " --> " << *res << endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
NetExpr* NetEBinary::eval_arguments_(const NetExpr*, const NetExpr*) const
|
NetExpr* NetEBinary::eval_arguments_(const NetExpr*, const NetExpr*) const
|
||||||
{
|
{
|
||||||
|
// this method should be overridden in all sub-classes
|
||||||
ivl_assert(*this, 0);
|
ivl_assert(*this, 0);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -106,12 +126,6 @@ NetECReal* NetEBAdd::eval_tree_real_(const NetExpr*l, const NetExpr*r) const
|
||||||
|
|
||||||
NetECReal*res = new NetECReal( verireal(res_val) );
|
NetECReal*res = new NetECReal( verireal(res_val) );
|
||||||
ivl_assert(*this, res);
|
ivl_assert(*this, res);
|
||||||
res->set_line(*this);
|
|
||||||
|
|
||||||
if (debug_eval_tree)
|
|
||||||
cerr << get_fileline() << ": debug: Evaluated (real): " << *this
|
|
||||||
<< " --> " << *res << endl;
|
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -122,8 +136,17 @@ NetExpr* NetEBAdd::eval_tree()
|
||||||
|
|
||||||
// First try to elaborate the expression completely.
|
// First try to elaborate the expression completely.
|
||||||
NetExpr*res = eval_arguments_(left_,right_);
|
NetExpr*res = eval_arguments_(left_,right_);
|
||||||
if (res != 0)
|
if (res != 0) {
|
||||||
|
res->set_line(*this);
|
||||||
|
if (debug_eval_tree) {
|
||||||
|
cerr << get_fileline() << ": debug: Evaluated";
|
||||||
|
if (left_->expr_type() == IVL_VT_REAL ||
|
||||||
|
right_->expr_type() == IVL_VT_REAL)
|
||||||
|
cerr << " (real)";
|
||||||
|
cerr << ": " << *this << " --> " << *res << endl;
|
||||||
|
}
|
||||||
return res;
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
// If the expression type is real, then do not attempt the
|
// If the expression type is real, then do not attempt the
|
||||||
// following alternative processing.
|
// following alternative processing.
|
||||||
|
|
@ -213,12 +236,6 @@ NetExpr* NetEBAdd::eval_arguments_(const NetExpr*l, const NetExpr*r) const
|
||||||
|
|
||||||
NetEConst *res = new NetEConst(val);
|
NetEConst *res = new NetEConst(val);
|
||||||
ivl_assert(*this, res);
|
ivl_assert(*this, res);
|
||||||
res->set_line(*this);
|
|
||||||
|
|
||||||
if (debug_eval_tree)
|
|
||||||
cerr << get_fileline() << ": debug: Evaluated: " << *this
|
|
||||||
<< " --> " << *res << endl;
|
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -227,14 +244,6 @@ NetExpr* NetEBAdd::eval_arguments_(const NetExpr*l, const NetExpr*r) const
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
NetEConst* NetEBBits::eval_tree()
|
|
||||||
{
|
|
||||||
eval_expr(left_);
|
|
||||||
eval_expr(right_);
|
|
||||||
|
|
||||||
return eval_arguments_(left_, right_);
|
|
||||||
}
|
|
||||||
|
|
||||||
NetEConst* NetEBBits::eval_arguments_(const NetExpr*l, const NetExpr*r) const
|
NetEConst* NetEBBits::eval_arguments_(const NetExpr*l, const NetExpr*r) const
|
||||||
{
|
{
|
||||||
const NetEConst*lc = dynamic_cast<const NetEConst*>(l);
|
const NetEConst*lc = dynamic_cast<const NetEConst*>(l);
|
||||||
|
|
@ -246,12 +255,16 @@ NetEConst* NetEBBits::eval_arguments_(const NetExpr*l, const NetExpr*r) const
|
||||||
known to be 0. */
|
known to be 0. */
|
||||||
if ((op() == '&') && (lc->value() == verinum(0))) {
|
if ((op() == '&') && (lc->value() == verinum(0))) {
|
||||||
verinum res (verinum::V0, expr_width());
|
verinum res (verinum::V0, expr_width());
|
||||||
return new NetEConst(res);
|
NetEConst*tmp = new NetEConst(res);
|
||||||
|
ivl_assert(*this, tmp);
|
||||||
|
return tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((op() == '&') && (rc->value() == verinum(0))) {
|
if ((op() == '&') && (rc->value() == verinum(0))) {
|
||||||
verinum res (verinum::V0, expr_width());
|
verinum res (verinum::V0, expr_width());
|
||||||
return new NetEConst(res);
|
NetEConst*tmp = new NetEConst(res);
|
||||||
|
ivl_assert(*this, tmp);
|
||||||
|
return tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
verinum lval = lc->value();
|
verinum lval = lc->value();
|
||||||
|
|
@ -293,12 +306,6 @@ NetEConst* NetEBBits::eval_arguments_(const NetExpr*l, const NetExpr*r) const
|
||||||
|
|
||||||
NetEConst*tmp = new NetEConst(res);
|
NetEConst*tmp = new NetEConst(res);
|
||||||
ivl_assert(*this, tmp);
|
ivl_assert(*this, tmp);
|
||||||
tmp->set_line(*this);
|
|
||||||
|
|
||||||
if (debug_eval_tree)
|
|
||||||
cerr << get_fileline() << ": debug: Evaluated: " << *this
|
|
||||||
<< " --> " << *tmp << endl;
|
|
||||||
|
|
||||||
return tmp;
|
return tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -747,26 +754,6 @@ NetEConst* NetEBComp::eval_arguments_(const NetExpr*l, const NetExpr*r) const
|
||||||
break;
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
NetEConst* NetEBComp::eval_tree()
|
|
||||||
{
|
|
||||||
eval_expr(left_);
|
|
||||||
eval_expr(right_);
|
|
||||||
|
|
||||||
NetEConst*res = eval_arguments_(left_, right_);
|
|
||||||
if (res == 0) return 0;
|
|
||||||
res->set_line(*this);
|
|
||||||
|
|
||||||
if (debug_eval_tree) {
|
|
||||||
cerr << get_fileline() << ": debug: Evaluated";
|
|
||||||
if (left_->expr_type() == IVL_VT_REAL ||
|
|
||||||
right_->expr_type() == IVL_VT_REAL)
|
|
||||||
cerr << " (real)";
|
|
||||||
cerr << ": " << *this << " --> " << *res << endl;
|
|
||||||
}
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -793,27 +780,9 @@ NetExpr* NetEBDiv::eval_tree_real_(const NetExpr*l, const NetExpr*r) const
|
||||||
}
|
}
|
||||||
NetECReal*res = new NetECReal( verireal(res_val) );
|
NetECReal*res = new NetECReal( verireal(res_val) );
|
||||||
ivl_assert(*this, res);
|
ivl_assert(*this, res);
|
||||||
res->set_line(*this);
|
|
||||||
|
|
||||||
if (debug_eval_tree)
|
|
||||||
cerr << get_fileline() << ": debug: Evaluated (real): " << *this
|
|
||||||
<< " --> " << *res << endl;
|
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* The NetEBDiv operator includes the / and % operators. First evaluate
|
|
||||||
* the sub-expressions, then perform the required operation.
|
|
||||||
*/
|
|
||||||
NetExpr* NetEBDiv::eval_tree()
|
|
||||||
{
|
|
||||||
eval_expr(left_);
|
|
||||||
eval_expr(right_);
|
|
||||||
|
|
||||||
return eval_arguments_(left_, right_);
|
|
||||||
}
|
|
||||||
|
|
||||||
NetExpr* NetEBDiv::eval_arguments_(const NetExpr*l, const NetExpr*r) const
|
NetExpr* NetEBDiv::eval_arguments_(const NetExpr*l, const NetExpr*r) const
|
||||||
{
|
{
|
||||||
if (expr_type() == IVL_VT_REAL) return eval_tree_real_(l,r);
|
if (expr_type() == IVL_VT_REAL) return eval_tree_real_(l,r);
|
||||||
|
|
@ -844,12 +813,6 @@ NetExpr* NetEBDiv::eval_arguments_(const NetExpr*l, const NetExpr*r) const
|
||||||
}
|
}
|
||||||
NetExpr*tmp = new NetEConst(val);
|
NetExpr*tmp = new NetEConst(val);
|
||||||
ivl_assert(*this, tmp);
|
ivl_assert(*this, tmp);
|
||||||
tmp->set_line(*this);
|
|
||||||
|
|
||||||
if (debug_eval_tree)
|
|
||||||
cerr << get_fileline() << ": debug: Evaluated: " << *this
|
|
||||||
<< " --> " << *tmp << endl;
|
|
||||||
|
|
||||||
return tmp;
|
return tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -883,23 +846,9 @@ NetEConst* NetEBLogic::eval_tree_real_(const NetExpr*l, const NetExpr*r) const
|
||||||
|
|
||||||
NetEConst*tmp = new NetEConst(verinum(res, 1));
|
NetEConst*tmp = new NetEConst(verinum(res, 1));
|
||||||
ivl_assert(*this, tmp);
|
ivl_assert(*this, tmp);
|
||||||
tmp->set_line(*this);
|
|
||||||
|
|
||||||
if (debug_eval_tree)
|
|
||||||
cerr << get_fileline() << ": debug: Evaluated (real): " << *this
|
|
||||||
<< " --> " << *tmp << endl;
|
|
||||||
|
|
||||||
return tmp;
|
return tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
NetEConst* NetEBLogic::eval_tree()
|
|
||||||
{
|
|
||||||
eval_expr(left_);
|
|
||||||
eval_expr(right_);
|
|
||||||
|
|
||||||
return eval_arguments_(left_, right_);
|
|
||||||
}
|
|
||||||
|
|
||||||
NetEConst* NetEBLogic::eval_arguments_(const NetExpr*l, const NetExpr*r) const
|
NetEConst* NetEBLogic::eval_arguments_(const NetExpr*l, const NetExpr*r) const
|
||||||
{
|
{
|
||||||
if (l->expr_type() == IVL_VT_REAL || r->expr_type() == IVL_VT_REAL)
|
if (l->expr_type() == IVL_VT_REAL || r->expr_type() == IVL_VT_REAL)
|
||||||
|
|
@ -963,12 +912,6 @@ NetEConst* NetEBLogic::eval_arguments_(const NetExpr*l, const NetExpr*r) const
|
||||||
|
|
||||||
NetEConst*tmp = new NetEConst(verinum(res, 1));
|
NetEConst*tmp = new NetEConst(verinum(res, 1));
|
||||||
ivl_assert(*this, tmp);
|
ivl_assert(*this, tmp);
|
||||||
tmp->set_line(*this);
|
|
||||||
|
|
||||||
if (debug_eval_tree)
|
|
||||||
cerr << get_fileline() << ": debug: Evaluated: " << *this
|
|
||||||
<< " --> " << *tmp << endl;
|
|
||||||
|
|
||||||
return tmp;
|
return tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -994,23 +937,9 @@ NetExpr* NetEBMinMax::eval_tree_real_(const NetExpr*l, const NetExpr*r) const
|
||||||
|
|
||||||
NetECReal*res = new NetECReal( verireal(res_val) );
|
NetECReal*res = new NetECReal( verireal(res_val) );
|
||||||
ivl_assert(*this, res);
|
ivl_assert(*this, res);
|
||||||
res->set_line(*this);
|
|
||||||
|
|
||||||
if (debug_eval_tree)
|
|
||||||
cerr << get_fileline() << ": debug: Evaluated (real): " << *this
|
|
||||||
<< " --> " << *res << endl;
|
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
NetExpr* NetEBMinMax::eval_tree()
|
|
||||||
{
|
|
||||||
eval_expr(left_);
|
|
||||||
eval_expr(right_);
|
|
||||||
|
|
||||||
return eval_arguments_(left_, right_);
|
|
||||||
}
|
|
||||||
|
|
||||||
NetExpr* NetEBMinMax::eval_arguments_(const NetExpr*l, const NetExpr*r) const
|
NetExpr* NetEBMinMax::eval_arguments_(const NetExpr*l, const NetExpr*r) const
|
||||||
{
|
{
|
||||||
if (expr_type() == IVL_VT_REAL) return eval_tree_real_(l,r);
|
if (expr_type() == IVL_VT_REAL) return eval_tree_real_(l,r);
|
||||||
|
|
@ -1045,12 +974,6 @@ NetExpr* NetEBMinMax::eval_arguments_(const NetExpr*l, const NetExpr*r) const
|
||||||
}
|
}
|
||||||
NetEConst*res = new NetEConst(res_val);
|
NetEConst*res = new NetEConst(res_val);
|
||||||
ivl_assert(*this, res);
|
ivl_assert(*this, res);
|
||||||
res->set_line(*this);
|
|
||||||
|
|
||||||
if (debug_eval_tree)
|
|
||||||
cerr << get_fileline() << ": debug: Evaluated: " << *this
|
|
||||||
<< " --> " << *res << endl;
|
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1064,23 +987,9 @@ NetExpr* NetEBMult::eval_tree_real_(const NetExpr*l, const NetExpr*r) const
|
||||||
|
|
||||||
NetECReal*res = new NetECReal( verireal(lval * rval) );
|
NetECReal*res = new NetECReal( verireal(lval * rval) );
|
||||||
ivl_assert(*this, res);
|
ivl_assert(*this, res);
|
||||||
res->set_line(*this);
|
|
||||||
|
|
||||||
if (debug_eval_tree)
|
|
||||||
cerr << get_fileline() << ": debug: Evaluated (real): " << *this
|
|
||||||
<< " --> " << *res << endl;
|
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
NetExpr* NetEBMult::eval_tree()
|
|
||||||
{
|
|
||||||
eval_expr(left_);
|
|
||||||
eval_expr(right_);
|
|
||||||
|
|
||||||
return eval_arguments_(left_, right_);
|
|
||||||
}
|
|
||||||
|
|
||||||
NetExpr* NetEBMult::eval_arguments_(const NetExpr*l, const NetExpr*r) const
|
NetExpr* NetEBMult::eval_arguments_(const NetExpr*l, const NetExpr*r) const
|
||||||
{
|
{
|
||||||
if (expr_type() == IVL_VT_REAL) return eval_tree_real_(l,r);
|
if (expr_type() == IVL_VT_REAL) return eval_tree_real_(l,r);
|
||||||
|
|
@ -1101,12 +1010,6 @@ NetExpr* NetEBMult::eval_arguments_(const NetExpr*l, const NetExpr*r) const
|
||||||
verinum val(lval * rval, wid);
|
verinum val(lval * rval, wid);
|
||||||
NetEConst*tmp = new NetEConst(val);
|
NetEConst*tmp = new NetEConst(val);
|
||||||
ivl_assert(*this, tmp);
|
ivl_assert(*this, tmp);
|
||||||
tmp->set_line(*this);
|
|
||||||
|
|
||||||
if (debug_eval_tree)
|
|
||||||
cerr << get_fileline() << ": debug: Evaluated: " << *this
|
|
||||||
<< " --> " << *tmp << endl;
|
|
||||||
|
|
||||||
return tmp;
|
return tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1120,23 +1023,9 @@ NetExpr* NetEBPow::eval_tree_real_(const NetExpr*l, const NetExpr*r) const
|
||||||
|
|
||||||
NetECReal*res = new NetECReal( verireal( pow(lval,rval) ) );
|
NetECReal*res = new NetECReal( verireal( pow(lval,rval) ) );
|
||||||
ivl_assert(*this, res);
|
ivl_assert(*this, res);
|
||||||
res->set_line(*this);
|
|
||||||
|
|
||||||
if (debug_eval_tree)
|
|
||||||
cerr << get_fileline() << ": debug: Evaluated (real): " << *this
|
|
||||||
<< " --> " << *res << endl;
|
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
NetExpr* NetEBPow::eval_tree()
|
|
||||||
{
|
|
||||||
eval_expr(left_);
|
|
||||||
eval_expr(right_);
|
|
||||||
|
|
||||||
return eval_arguments_(left_, right_);
|
|
||||||
}
|
|
||||||
|
|
||||||
NetExpr* NetEBPow::eval_arguments_(const NetExpr*l, const NetExpr*r) const
|
NetExpr* NetEBPow::eval_arguments_(const NetExpr*l, const NetExpr*r) const
|
||||||
{
|
{
|
||||||
if (expr_type() == IVL_VT_REAL) return eval_tree_real_(l,r);
|
if (expr_type() == IVL_VT_REAL) return eval_tree_real_(l,r);
|
||||||
|
|
@ -1156,27 +1045,9 @@ NetExpr* NetEBPow::eval_arguments_(const NetExpr*l, const NetExpr*r) const
|
||||||
verinum val(pow(lval, rval), wid);
|
verinum val(pow(lval, rval), wid);
|
||||||
NetEConst*res = new NetEConst(val);
|
NetEConst*res = new NetEConst(val);
|
||||||
ivl_assert(*this, res);
|
ivl_assert(*this, res);
|
||||||
res->set_line(*this);
|
|
||||||
|
|
||||||
if (debug_eval_tree)
|
|
||||||
cerr << get_fileline() << ": debug: Evaluated: " << *this
|
|
||||||
<< " --> " << *res << endl;
|
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Evaluate the shift operator if possible. For this to work, both
|
|
||||||
* operands must be constant.
|
|
||||||
*/
|
|
||||||
NetEConst* NetEBShift::eval_tree()
|
|
||||||
{
|
|
||||||
eval_expr(left_);
|
|
||||||
eval_expr(right_);
|
|
||||||
|
|
||||||
return eval_arguments_(left_,right_);
|
|
||||||
}
|
|
||||||
|
|
||||||
NetEConst* NetEBShift::eval_arguments_(const NetExpr*l, const NetExpr*r) const
|
NetEConst* NetEBShift::eval_arguments_(const NetExpr*l, const NetExpr*r) const
|
||||||
{
|
{
|
||||||
const NetEConst*le = dynamic_cast<const NetEConst*>(l);
|
const NetEConst*le = dynamic_cast<const NetEConst*>(l);
|
||||||
|
|
@ -1213,12 +1084,7 @@ NetEConst* NetEBShift::eval_arguments_(const NetExpr*l, const NetExpr*r) const
|
||||||
}
|
}
|
||||||
val.has_sign(has_sign());
|
val.has_sign(has_sign());
|
||||||
res = new NetEConst(val);
|
res = new NetEConst(val);
|
||||||
res->set_line(*this);
|
ivl_assert(*this, res);
|
||||||
|
|
||||||
if (debug_eval_tree)
|
|
||||||
cerr << get_fileline() << ": debug: Evaluated: " << *this
|
|
||||||
<< " --> " << *res << endl;
|
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1507,6 +1373,22 @@ NetExpr*NetETernary::blended_arguments_(const NetExpr*te, const NetExpr*fe) cons
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NetExpr* NetEUnary::eval_tree()
|
||||||
|
{
|
||||||
|
eval_expr(expr_);
|
||||||
|
NetExpr*res = eval_arguments_(expr_);
|
||||||
|
if (res != 0) {
|
||||||
|
res->set_line(*this);
|
||||||
|
if (debug_eval_tree) {
|
||||||
|
cerr << get_fileline() << ": debug: Evaluated";
|
||||||
|
if (expr_->expr_type() == IVL_VT_REAL)
|
||||||
|
cerr << " (real)";
|
||||||
|
cerr << ": " << *this << " --> " << *res << endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
NetExpr* NetEUnary::eval_tree_real_(const NetExpr*ex) const
|
NetExpr* NetEUnary::eval_tree_real_(const NetExpr*ex) const
|
||||||
{
|
{
|
||||||
const NetECReal*val= dynamic_cast<const NetECReal*> (ex);
|
const NetECReal*val= dynamic_cast<const NetECReal*> (ex);
|
||||||
|
|
@ -1530,21 +1412,9 @@ NetExpr* NetEUnary::eval_tree_real_(const NetExpr*ex) const
|
||||||
}
|
}
|
||||||
NetECReal *res = new NetECReal( verireal(res_val) );
|
NetECReal *res = new NetECReal( verireal(res_val) );
|
||||||
ivl_assert(*this, res);
|
ivl_assert(*this, res);
|
||||||
res->set_line(*this);
|
|
||||||
|
|
||||||
if (debug_eval_tree)
|
|
||||||
cerr << get_fileline() << ": debug: Evaluated (real): " << *this
|
|
||||||
<< " --> " << *res << endl;
|
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
NetExpr* NetEUnary::eval_tree()
|
|
||||||
{
|
|
||||||
eval_expr(expr_);
|
|
||||||
return eval_arguments_(expr_);
|
|
||||||
}
|
|
||||||
|
|
||||||
NetExpr* NetEUnary::eval_arguments_(const NetExpr*ex) const
|
NetExpr* NetEUnary::eval_arguments_(const NetExpr*ex) const
|
||||||
{
|
{
|
||||||
if (expr_type() == IVL_VT_REAL) return eval_tree_real_(ex);
|
if (expr_type() == IVL_VT_REAL) return eval_tree_real_(ex);
|
||||||
|
|
@ -1608,21 +1478,10 @@ NetExpr* NetEUnary::eval_arguments_(const NetExpr*ex) const
|
||||||
|
|
||||||
NetEConst *res = new NetEConst(val);
|
NetEConst *res = new NetEConst(val);
|
||||||
ivl_assert(*this, res);
|
ivl_assert(*this, res);
|
||||||
res->set_line(*this);
|
|
||||||
|
|
||||||
if (debug_eval_tree)
|
|
||||||
cerr << get_fileline() << ": debug: Evaluated: " << *this
|
|
||||||
<< " --> " << *res << endl;
|
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
NetExpr* NetEUBits::eval_tree()
|
|
||||||
{
|
|
||||||
return NetEUnary::eval_tree();
|
|
||||||
}
|
|
||||||
|
|
||||||
NetEConst* NetEUReduce::eval_tree_real_(const NetExpr*ex) const
|
NetEConst* NetEUReduce::eval_tree_real_(const NetExpr*ex) const
|
||||||
{
|
{
|
||||||
ivl_assert(*this, op_ == '!');
|
ivl_assert(*this, op_ == '!');
|
||||||
|
|
@ -1635,21 +1494,9 @@ NetEConst* NetEUReduce::eval_tree_real_(const NetExpr*ex) const
|
||||||
|
|
||||||
NetEConst*tmp = new NetEConst(verinum(res, 1));
|
NetEConst*tmp = new NetEConst(verinum(res, 1));
|
||||||
ivl_assert(*this, tmp);
|
ivl_assert(*this, tmp);
|
||||||
tmp->set_line(*this);
|
|
||||||
|
|
||||||
if (debug_eval_tree)
|
|
||||||
cerr << get_fileline() << ": debug: Evaluated (real): " << *this
|
|
||||||
<< " --> " << *tmp << endl;
|
|
||||||
|
|
||||||
return tmp;
|
return tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
NetEConst* NetEUReduce::eval_tree()
|
|
||||||
{
|
|
||||||
eval_expr(expr_);
|
|
||||||
return eval_arguments_(expr_);
|
|
||||||
}
|
|
||||||
|
|
||||||
NetEConst* NetEUReduce::eval_arguments_(const NetExpr*ex) const
|
NetEConst* NetEUReduce::eval_arguments_(const NetExpr*ex) const
|
||||||
{
|
{
|
||||||
if (expr_type() == IVL_VT_REAL) return eval_tree_real_(ex);
|
if (expr_type() == IVL_VT_REAL) return eval_tree_real_(ex);
|
||||||
|
|
@ -1738,12 +1585,6 @@ NetEConst* NetEUReduce::eval_arguments_(const NetExpr*ex) const
|
||||||
|
|
||||||
NetEConst*tmp = new NetEConst(verinum(res, 1));
|
NetEConst*tmp = new NetEConst(verinum(res, 1));
|
||||||
ivl_assert(*this, tmp);
|
ivl_assert(*this, tmp);
|
||||||
tmp->set_line(*this);
|
|
||||||
|
|
||||||
if (debug_eval_tree)
|
|
||||||
cerr << get_fileline() << ": debug: Evaluated: " << *this
|
|
||||||
<< " --> " << *tmp << endl;
|
|
||||||
|
|
||||||
return tmp;
|
return tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -280,6 +280,16 @@ NetExpr* NetEBinary::evaluate_function(const LineInfo&loc,
|
||||||
}
|
}
|
||||||
|
|
||||||
NetExpr*res = eval_arguments_(lval, rval);
|
NetExpr*res = eval_arguments_(lval, rval);
|
||||||
|
if (res != 0) {
|
||||||
|
res->set_line(*this);
|
||||||
|
if (debug_eval_tree) {
|
||||||
|
cerr << get_fileline() << ": debug: Evaluated";
|
||||||
|
if (lval->expr_type() == IVL_VT_REAL ||
|
||||||
|
rval->expr_type() == IVL_VT_REAL)
|
||||||
|
cerr << " (real)";
|
||||||
|
cerr << ": " << *this << " --> " << *res << endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
delete lval;
|
delete lval;
|
||||||
delete rval;
|
delete rval;
|
||||||
return res;
|
return res;
|
||||||
|
|
@ -387,6 +397,15 @@ NetExpr* NetEUnary::evaluate_function(const LineInfo&loc,
|
||||||
if (val == 0) return 0;
|
if (val == 0) return 0;
|
||||||
|
|
||||||
NetExpr*res = eval_arguments_(val);
|
NetExpr*res = eval_arguments_(val);
|
||||||
|
if (res != 0) {
|
||||||
|
res->set_line(*this);
|
||||||
|
if (debug_eval_tree) {
|
||||||
|
cerr << get_fileline() << ": debug: Evaluated";
|
||||||
|
if (val->expr_type() == IVL_VT_REAL)
|
||||||
|
cerr << " (real)";
|
||||||
|
cerr << ": " << *this << " --> " << *res << endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
delete val;
|
delete val;
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
12
netlist.h
12
netlist.h
|
|
@ -3529,6 +3529,7 @@ class NetEBinary : public NetExpr {
|
||||||
virtual bool has_width() const;
|
virtual bool has_width() const;
|
||||||
|
|
||||||
virtual NetEBinary* dup_expr() const;
|
virtual NetEBinary* dup_expr() const;
|
||||||
|
virtual NetExpr* eval_tree();
|
||||||
virtual NetExpr* evaluate_function(const LineInfo&loc,
|
virtual NetExpr* evaluate_function(const LineInfo&loc,
|
||||||
std::map<perm_string,NetExpr*>&ctx) const;
|
std::map<perm_string,NetExpr*>&ctx) const;
|
||||||
virtual NexusSet* nex_input(bool rem_out = true);
|
virtual NexusSet* nex_input(bool rem_out = true);
|
||||||
|
|
@ -3582,7 +3583,6 @@ class NetEBDiv : public NetEBinary {
|
||||||
virtual ivl_variable_type_t expr_type() const;
|
virtual ivl_variable_type_t expr_type() const;
|
||||||
|
|
||||||
virtual NetEBDiv* dup_expr() const;
|
virtual NetEBDiv* dup_expr() const;
|
||||||
virtual NetExpr* eval_tree();
|
|
||||||
virtual NetNet* synthesize(Design*, NetScope*scope, NetExpr*root);
|
virtual NetNet* synthesize(Design*, NetScope*scope, NetExpr*root);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
@ -3611,7 +3611,6 @@ class NetEBBits : public NetEBinary {
|
||||||
~NetEBBits();
|
~NetEBBits();
|
||||||
|
|
||||||
virtual NetEBBits* dup_expr() const;
|
virtual NetEBBits* dup_expr() const;
|
||||||
virtual NetEConst* eval_tree();
|
|
||||||
virtual NetNet* synthesize(Design*, NetScope*scope, NetExpr*root);
|
virtual NetNet* synthesize(Design*, NetScope*scope, NetExpr*root);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
@ -3642,7 +3641,6 @@ class NetEBComp : public NetEBinary {
|
||||||
virtual bool has_width() const;
|
virtual bool has_width() const;
|
||||||
virtual ivl_variable_type_t expr_type() const;
|
virtual ivl_variable_type_t expr_type() const;
|
||||||
virtual NetEBComp* dup_expr() const;
|
virtual NetEBComp* dup_expr() const;
|
||||||
virtual NetEConst* eval_tree();
|
|
||||||
virtual NetNet* synthesize(Design*, NetScope*scope, NetExpr*root);
|
virtual NetNet* synthesize(Design*, NetScope*scope, NetExpr*root);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
@ -3673,7 +3671,6 @@ class NetEBLogic : public NetEBinary {
|
||||||
~NetEBLogic();
|
~NetEBLogic();
|
||||||
|
|
||||||
virtual NetEBLogic* dup_expr() const;
|
virtual NetEBLogic* dup_expr() const;
|
||||||
virtual NetEConst* eval_tree();
|
|
||||||
virtual NetNet* synthesize(Design*, NetScope*scope, NetExpr*root);
|
virtual NetNet* synthesize(Design*, NetScope*scope, NetExpr*root);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
@ -3696,8 +3693,6 @@ class NetEBMinMax : public NetEBinary {
|
||||||
|
|
||||||
virtual ivl_variable_type_t expr_type() const;
|
virtual ivl_variable_type_t expr_type() const;
|
||||||
|
|
||||||
virtual NetExpr* eval_tree();
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
NetExpr* eval_arguments_(const NetExpr*l, const NetExpr*r) const;
|
NetExpr* eval_arguments_(const NetExpr*l, const NetExpr*r) const;
|
||||||
NetExpr* eval_tree_real_(const NetExpr*l, const NetExpr*r) const;
|
NetExpr* eval_tree_real_(const NetExpr*l, const NetExpr*r) const;
|
||||||
|
|
@ -3715,7 +3710,6 @@ class NetEBMult : public NetEBinary {
|
||||||
virtual ivl_variable_type_t expr_type() const;
|
virtual ivl_variable_type_t expr_type() const;
|
||||||
|
|
||||||
virtual NetEBMult* dup_expr() const;
|
virtual NetEBMult* dup_expr() const;
|
||||||
virtual NetExpr* eval_tree();
|
|
||||||
virtual NetNet* synthesize(Design*, NetScope*scope, NetExpr*root);
|
virtual NetNet* synthesize(Design*, NetScope*scope, NetExpr*root);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
@ -3735,7 +3729,6 @@ class NetEBPow : public NetEBinary {
|
||||||
virtual ivl_variable_type_t expr_type() const;
|
virtual ivl_variable_type_t expr_type() const;
|
||||||
|
|
||||||
virtual NetEBPow* dup_expr() const;
|
virtual NetEBPow* dup_expr() const;
|
||||||
virtual NetExpr* eval_tree();
|
|
||||||
virtual NetNet* synthesize(Design*, NetScope*scope, NetExpr*root);
|
virtual NetNet* synthesize(Design*, NetScope*scope, NetExpr*root);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
@ -3762,7 +3755,6 @@ class NetEBShift : public NetEBinary {
|
||||||
virtual bool has_width() const;
|
virtual bool has_width() const;
|
||||||
|
|
||||||
virtual NetEBShift* dup_expr() const;
|
virtual NetEBShift* dup_expr() const;
|
||||||
virtual NetEConst* eval_tree();
|
|
||||||
virtual NetNet* synthesize(Design*, NetScope*scope, NetExpr*root);
|
virtual NetNet* synthesize(Design*, NetScope*scope, NetExpr*root);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
@ -4129,7 +4121,6 @@ class NetEUBits : public NetEUnary {
|
||||||
virtual NetNet* synthesize(Design*, NetScope*scope, NetExpr*root);
|
virtual NetNet* synthesize(Design*, NetScope*scope, NetExpr*root);
|
||||||
|
|
||||||
virtual NetEUBits* dup_expr() const;
|
virtual NetEUBits* dup_expr() const;
|
||||||
virtual NetExpr* eval_tree();
|
|
||||||
virtual ivl_variable_type_t expr_type() const;
|
virtual ivl_variable_type_t expr_type() const;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -4141,7 +4132,6 @@ class NetEUReduce : public NetEUnary {
|
||||||
|
|
||||||
virtual NetNet* synthesize(Design*, NetScope*scope, NetExpr*root);
|
virtual NetNet* synthesize(Design*, NetScope*scope, NetExpr*root);
|
||||||
virtual NetEUReduce* dup_expr() const;
|
virtual NetEUReduce* dup_expr() const;
|
||||||
virtual NetEConst* eval_tree();
|
|
||||||
virtual ivl_variable_type_t expr_type() const;
|
virtual ivl_variable_type_t expr_type() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue