diff --git a/eval_tree.cc b/eval_tree.cc index 214971387..bb8ca78c6 100644 --- a/eval_tree.cc +++ b/eval_tree.cc @@ -1597,7 +1597,7 @@ NetExpr* NetECast::eval_arguments_(const NetExpr*ex) const switch (op_) { case 'r': if (const NetEConst*val = dynamic_cast(ex)) { - verireal res_val = verireal(val->value().as_double()); + verireal res_val(val->value().as_double()); res = new NetECReal(res_val); } break; @@ -1605,11 +1605,15 @@ NetExpr* NetECast::eval_arguments_(const NetExpr*ex) const if (const NetEConst*val = dynamic_cast(ex)) { verinum res_val(val->value()); res_val.cast_to_int2(); + if (expr_width() > 0) + res_val = cast_to_width(res_val, expr_width()); res = new NetEConst(res_val); } case 'v': if (const NetECReal*val = dynamic_cast(ex)) { - verinum res_val = verinum(val->value().as_double(), false); + verinum res_val(val->value().as_double(), false); + if (expr_width() > 0) + res_val = cast_to_width(res_val, expr_width()); res = new NetEConst(res_val); } break; diff --git a/netmisc.cc b/netmisc.cc index 3144822aa..701121a47 100644 --- a/netmisc.cc +++ b/netmisc.cc @@ -803,10 +803,10 @@ NetExpr* elab_and_eval(Design*des, NetScope*scope, PExpr*pe, tmp = cast_to_real(tmp); break; case IVL_VT_BOOL: - tmp = cast_to_int2(tmp, context_width); + tmp = cast_to_int2(tmp, context_width > 0 ? context_width : 0); break; case IVL_VT_LOGIC: - tmp = cast_to_int4(tmp, context_width); + tmp = cast_to_int4(tmp, context_width > 0 ? context_width : 0); break; default: break; diff --git a/pform.cc b/pform.cc index c559cd44b..ab18d2b0c 100644 --- a/pform.cc +++ b/pform.cc @@ -2646,15 +2646,16 @@ void pform_set_specparam(const struct vlltype&loc, perm_string name, parm.expr = expr; - parm.type = IVL_VT_LOGIC; if (range) { assert(range->size() == 1); pform_range_t&rng = range->front(); assert(rng.first); assert(rng.second); + parm.type = IVL_VT_LOGIC; parm.msb = rng.first; parm.lsb = rng.second; } else { + parm.type = IVL_VT_NO_TYPE; parm.msb = 0; parm.lsb = 0; }