Fix unary convert of real to bool

Sometimes real values are converted to BOOL values, and the
NetECast needs to handle it properly.
This commit is contained in:
Stephen Williams 2011-07-20 18:45:13 -07:00
parent e2932cb6b5
commit 4989555646
2 changed files with 36 additions and 10 deletions

View File

@ -184,7 +184,15 @@ NetNet* cast_to_real(Design*des, NetScope*scope, NetNet*src)
NetExpr* cast_to_int2(NetExpr*expr)
{
NetECast*cast = new NetECast('2', expr, expr->expr_width(),
// Special case: The expression is alreadt BOOL
if (expr->expr_type() == IVL_VT_BOOL)
return expr;
unsigned use_width = expr->expr_width();
if (expr->expr_type() == IVL_VT_REAL)
use_width = 64;
NetECast*cast = new NetECast('2', expr, use_width,
expr->has_sign());
cast->set_line(*expr);
return cast;

View File

@ -3118,19 +3118,37 @@ static struct vector_info draw_unary_expr(ivl_expr_t expr, unsigned wid)
local_count += 1;
break;
case '2': /* Cast logic to bool */
assert(ivl_expr_value(sub) == IVL_VT_LOGIC);
res = draw_eval_expr_wid(sub, wid, 0);
case '2': /* Cast expression to bool */
switch (ivl_expr_value(sub)) {
case IVL_VT_BOOL:
res = draw_eval_expr_wid(sub, wid, 0);
break;
/* Handle special case that value is 0 or 1. */
if (res.base == 0 || res.base == 1)
case IVL_VT_LOGIC:
res = draw_eval_expr_wid(sub, wid, 0);
/* Handle special case that value is 0 or 1. */
if (res.base == 0 || res.base == 1)
break;
if (res.base == 2 || res.base == 2) {
res.base = 0;
break;
}
fprintf(vvp_out, " %%cast2 %d, %d, %u;\n", res.base, res.base, res.wid);
break;
if (res.base == 2 || res.base == 2) {
res.base = 0;
case IVL_VT_REAL:
word = draw_eval_real(sub);
res.base = allocate_vector(wid);
res.wid = wid;
fprintf(vvp_out, " %%cvt/vr %d, %d, %u;\n", res.base, word, wid);
clr_word(word);
break;
default:
assert(0);
}
fprintf(vvp_out, " %%cast2 %d, %d, %u;\n", res.base, res.base, res.wid);
break;
case 'i': /* Cast a real value to an integer. */