Fix associative add tree to get result width correct.
When evaluating A+1+2 in eval_tree, the (1+2) needs to have the correct result width, or the elaborated expression with will be lost.
This commit is contained in:
parent
5fd3be570e
commit
18de6980ff
|
|
@ -133,6 +133,8 @@ NetExpr* NetEBAdd::eval_tree(int prune_to_width)
|
|||
verinum lval = lc->value();
|
||||
verinum rval = rc->value();
|
||||
|
||||
ivl_assert(*this, se->expr_width() == this->expr_width());
|
||||
|
||||
verinum val;
|
||||
if (op_ == se->op_) {
|
||||
/* (a + lval) + rval --> a + (rval+lval) */
|
||||
|
|
@ -144,6 +146,13 @@ NetExpr* NetEBAdd::eval_tree(int prune_to_width)
|
|||
val = rval - lval;
|
||||
}
|
||||
|
||||
val = pad_to_width(val, expr_width());
|
||||
if (val.len() > expr_width()) {
|
||||
verinum tmp (val, expr_width());
|
||||
tmp.has_sign(val.has_sign());
|
||||
val = tmp;
|
||||
}
|
||||
|
||||
NetEConst*tmp = new NetEConst(val);
|
||||
left_ = se->left_->dup_expr();
|
||||
delete se;
|
||||
|
|
|
|||
|
|
@ -99,8 +99,8 @@ NetNet* NetEBAdd::synthesize(Design*des, NetScope*scope)
|
|||
return 0;
|
||||
}
|
||||
|
||||
assert(expr_width() >= lsig->vector_width());
|
||||
assert(expr_width() >= rsig->vector_width());
|
||||
ivl_assert(*this, expr_width() >= lsig->vector_width());
|
||||
ivl_assert(*this, expr_width() >= rsig->vector_width());
|
||||
|
||||
unsigned width;
|
||||
if (expr_type() == IVL_VT_REAL) {
|
||||
|
|
@ -752,7 +752,7 @@ NetNet* NetEConst::synthesize(Design*des, NetScope*scope)
|
|||
perm_string path = scope->local_symbol();
|
||||
unsigned width=expr_width();
|
||||
|
||||
NetNet*osig = new NetNet(scope, path, NetNet::IMPLICIT, width-1,0);
|
||||
NetNet*osig = new NetNet(scope, path, NetNet::IMPLICIT, width);
|
||||
osig->local_flag(true);
|
||||
osig->data_type(expr_type());
|
||||
osig->set_signed(has_sign());
|
||||
|
|
|
|||
Loading…
Reference in New Issue