diff --git a/src/V3AstNodes.h b/src/V3AstNodes.h index 0be2fa713..4729b2264 100644 --- a/src/V3AstNodes.h +++ b/src/V3AstNodes.h @@ -3076,7 +3076,7 @@ struct AstLogIf : public AstNodeBiop { AstLogIf(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiop(fl, lhsp, rhsp) { dtypeSetLogicBool(); } ASTNODE_NODE_FUNCS(LogIf, LOGIF) - virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { V3ERROR_NA; } + virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opLogIf(lhs,rhs); } virtual string emitVerilog() { return "%k(%l %f-> %r)"; } virtual string emitC() { return "VL_LOGIF_%nq%lq%rq(%nw,%lw,%rw, %P, %li, %ri)"; } virtual string emitSimpleOperator() { return "->"; } @@ -3089,7 +3089,7 @@ struct AstLogIff : public AstNodeBiCom { AstLogIff(FileLine* fl, AstNode* lhsp, AstNode* rhsp) : AstNodeBiCom(fl, lhsp, rhsp) { dtypeSetLogicBool(); } ASTNODE_NODE_FUNCS(LogIff, LOGIFF) - virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { V3ERROR_NA; } + virtual void numberOperate(V3Number& out, const V3Number& lhs, const V3Number& rhs) { out.opLogIff(lhs,rhs); } virtual string emitVerilog() { return "%k(%l %f<-> %r)"; } virtual string emitC() { return "VL_LOGIFF_%nq%lq%rq(%nw,%lw,%rw, %P, %li, %ri)"; } virtual string emitSimpleOperator() { return "<->"; } diff --git a/src/V3Number.cpp b/src/V3Number.cpp index efba062e7..fba516467 100644 --- a/src/V3Number.cpp +++ b/src/V3Number.cpp @@ -916,6 +916,18 @@ last: return setSingleBits(outc); } +V3Number& V3Number::opLogIf (const V3Number& lhs, const V3Number& rhs) { + // i op j, 1 bit return, max(L(lhs),L(rhs)) calculation, careful need to + // X/Z extend. Use opLogNot and opLogOr to do this for us. + return opLogOr(opLogNot(lhs), rhs); +} + +V3Number& V3Number::opLogIff (const V3Number& lhs, const V3Number& rhs) { + // i op j, 1 bit return, max(L(lhs),L(rhs)) calculation, careful need to + // X/Z extend. Use opLogNot and opLogXor to do this for us. + return opLogNot(opXor(lhs, rhs)); +} + V3Number& V3Number::opEq (const V3Number& lhs, const V3Number& rhs) { // i op j, 1 bit return, max(L(lhs),L(rhs)) calculation, careful need to X/Z extend. char outc = 1; diff --git a/src/V3Number.h b/src/V3Number.h index c507ca9da..86d15b2d9 100644 --- a/src/V3Number.h +++ b/src/V3Number.h @@ -227,6 +227,8 @@ public: V3Number& opLogNot (const V3Number& lhs); V3Number& opLogAnd (const V3Number& lhs, const V3Number& rhs); V3Number& opLogOr (const V3Number& lhs, const V3Number& rhs); + V3Number& opLogIf (const V3Number& lhs, const V3Number& rhs); + V3Number& opLogIff (const V3Number& lhs, const V3Number& rhs); V3Number& opAbsS (const V3Number& lhs); V3Number& opNegate (const V3Number& lhs); V3Number& opAdd (const V3Number& lhs, const V3Number& rhs);