Fix for issue #281 - the condition operator may return a valid enum type.
If the condition expression is 2-state, the result won't be blended, so the result will be a valid enum value if both true and false expressions return the same enum type.
This commit is contained in:
parent
7feb26ff6b
commit
82c8a49573
14
netlist.cc
14
netlist.cc
|
|
@ -2524,6 +2524,20 @@ NetETernary::~NetETernary()
|
||||||
delete false_val_;
|
delete false_val_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const netenum_t* NetETernary::enumeration() const
|
||||||
|
{
|
||||||
|
// If the condition can evaluate to an ambiguous value,
|
||||||
|
// the result may be blended, and so is not guaranteed
|
||||||
|
// to be a valid enumeration value.
|
||||||
|
if (cond_->expr_type() != IVL_VT_BOOL)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (true_val_->enumeration() != false_val_->enumeration())
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return true_val_->enumeration();
|
||||||
|
}
|
||||||
|
|
||||||
const NetExpr* NetETernary::cond_expr() const
|
const NetExpr* NetETernary::cond_expr() const
|
||||||
{
|
{
|
||||||
return cond_;
|
return cond_;
|
||||||
|
|
|
||||||
|
|
@ -4757,6 +4757,8 @@ class NetETernary : public NetExpr {
|
||||||
NetETernary(NetExpr*c, NetExpr*t, NetExpr*f, unsigned wid, bool signed_flag);
|
NetETernary(NetExpr*c, NetExpr*t, NetExpr*f, unsigned wid, bool signed_flag);
|
||||||
~NetETernary();
|
~NetETernary();
|
||||||
|
|
||||||
|
const netenum_t* enumeration() const;
|
||||||
|
|
||||||
const NetExpr*cond_expr() const;
|
const NetExpr*cond_expr() const;
|
||||||
const NetExpr*true_expr() const;
|
const NetExpr*true_expr() const;
|
||||||
const NetExpr*false_expr() const;
|
const NetExpr*false_expr() const;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue