From 0cf44a9c4f1960e916abc2a3feea0fa9314eb6aa Mon Sep 17 00:00:00 2001 From: Wilson Snyder Date: Mon, 30 Mar 2020 18:12:50 -0400 Subject: [PATCH] Internals: Refactor InsideRange common code. No functional change intended. --- src/V3AstNodes.cpp | 9 +++++++++ src/V3AstNodes.h | 2 ++ src/V3Case.cpp | 11 ++--------- src/V3Width.cpp | 11 ++--------- 4 files changed, 15 insertions(+), 18 deletions(-) diff --git a/src/V3AstNodes.cpp b/src/V3AstNodes.cpp index fad0a3156..64df9f9df 100644 --- a/src/V3AstNodes.cpp +++ b/src/V3AstNodes.cpp @@ -193,6 +193,15 @@ AstExecGraph::~AstExecGraph() { VL_DO_DANGLING(delete m_depGraphp, m_depGraphp); } +AstNode* AstInsideRange::newAndFromInside(AstNode* exprp, AstNode* lhsp, AstNode* rhsp) { + AstNode* ap = new AstGte(fileline(), exprp->cloneTree(true), lhsp); + AstNode* bp = new AstLte(fileline(), exprp->cloneTree(true), rhsp); + ap->fileline()->modifyWarnOff(V3ErrorCode::UNSIGNED, true); + bp->fileline()->modifyWarnOff(V3ErrorCode::CMPCONST, true); + AstNode* newp = new AstAnd(fileline(), ap, bp); + return newp; +} + bool AstVar::isSigPublic() const { return (m_sigPublic || (v3Global.opt.allPublic() && !isTemp() && !isGenVar())); } diff --git a/src/V3AstNodes.h b/src/V3AstNodes.h index 86ae1b9e8..4ddb7b024 100644 --- a/src/V3AstNodes.h +++ b/src/V3AstNodes.h @@ -3898,6 +3898,8 @@ public: virtual string emitVerilog() { return "[%l:%r]"; } virtual string emitC() { V3ERROR_NA; return ""; } virtual bool cleanOut() const { return false; } // NA + // Create AstAnd(AstGte(...), AstLte(...)) + AstNode* newAndFromInside(AstNode* exprp, AstNode* lhsp, AstNode* rhsp); }; class AstInitItem : public AstNode { diff --git a/src/V3Case.cpp b/src/V3Case.cpp index b8682f0a4..de10eaf3b 100644 --- a/src/V3Case.cpp +++ b/src/V3Case.cpp @@ -333,15 +333,8 @@ private: condp = new AstConst(itemp->fileline(), AstConst::LogicFalse()); } else if (AstInsideRange* irangep = VN_CAST(icondp, InsideRange)) { // Similar logic in V3Width::visit(AstInside) - AstNode* ap = AstGte::newTyped(itemp->fileline(), - cexprp->cloneTree(false), - irangep->lhsp()->unlinkFrBack()); - AstNode* bp = AstLte::newTyped(itemp->fileline(), - cexprp->cloneTree(false), - irangep->rhsp()->unlinkFrBack()); - ap->fileline()->modifyWarnOff(V3ErrorCode::UNSIGNED, true); - bp->fileline()->modifyWarnOff(V3ErrorCode::CMPCONST, true); - condp = new AstAnd(itemp->fileline(), ap, bp); + condp = irangep->newAndFromInside(cexprp, irangep->lhsp()->unlinkFrBack(), + irangep->rhsp()->unlinkFrBack()); } else if (iconstp && iconstp->num().isFourState() && (nodep->casex() || nodep->casez() || nodep->caseInside())) { V3Number nummask (itemp, iconstp->width()); diff --git a/src/V3Width.cpp b/src/V3Width.cpp index 5fc18b0b9..93e2a1046 100644 --- a/src/V3Width.cpp +++ b/src/V3Width.cpp @@ -1699,15 +1699,8 @@ private: AstNode* inewp; if (AstInsideRange* irangep = VN_CAST(itemp, InsideRange)) { // Similar logic in V3Case - AstNode* ap = new AstGte(itemp->fileline(), - nodep->exprp()->cloneTree(true), - irangep->lhsp()->unlinkFrBack()); - AstNode* bp = new AstLte(itemp->fileline(), - nodep->exprp()->cloneTree(true), - irangep->rhsp()->unlinkFrBack()); - ap->fileline()->modifyWarnOff(V3ErrorCode::UNSIGNED, true); - bp->fileline()->modifyWarnOff(V3ErrorCode::CMPCONST, true); - inewp = new AstAnd(itemp->fileline(), ap, bp); + inewp = irangep->newAndFromInside(nodep->exprp(), irangep->lhsp()->unlinkFrBack(), + irangep->rhsp()->unlinkFrBack()); } else { inewp = new AstEqWild(itemp->fileline(), nodep->exprp()->cloneTree(true),