diff --git a/src/V3Ast.cpp b/src/V3Ast.cpp index 5ef692278..8a3d52689 100644 --- a/src/V3Ast.cpp +++ b/src/V3Ast.cpp @@ -858,7 +858,7 @@ void AstNode::cloneRelinkTree() { // private: Cleanup clone() operation on whole tree. Publicly call cloneTree() instead. for (AstNode* nodep=this; nodep; nodep=nodep->m_nextp) { if (m_dtypep && m_dtypep->clonep()) { - m_dtypep = m_dtypep->clonep()->castNodeDType(); + m_dtypep = m_dtypep->clonep(); } nodep->cloneRelink(); if (nodep->m_op1p) nodep->m_op1p->cloneRelinkTree(); diff --git a/src/V3Ast.h b/src/V3Ast.h index 11a59533d..34ee04451 100644 --- a/src/V3Ast.h +++ b/src/V3Ast.h @@ -1289,7 +1289,8 @@ inline void AstNRelinker::relink(AstNode* newp) { newp->AstNode::relink(this); } #define ASTNODE_BASE_FUNCS(name) \ virtual ~Ast ##name() {} \ - Ast ##name * cloneTree(bool cloneNext) { return AstNode::cloneTree(cloneNext)->cast ##name(); } + Ast ##name * cloneTree(bool cloneNext) { return static_cast(AstNode::cloneTree(cloneNext)); } \ + Ast ##name * clonep() const { return static_cast(AstNode::clonep()); } class AstNodeMath : public AstNode { // Math -- anything that's part of an expression tree @@ -1732,7 +1733,7 @@ public: virtual const char* broken() const { BROKEN_RTN(!((m_refDTypep && !childDTypep() && m_refDTypep->brokeExists()) || (!m_refDTypep && childDTypep()))); return NULL; } virtual void cloneRelink() { if (m_refDTypep && m_refDTypep->clonep()) { - m_refDTypep = m_refDTypep->clonep()->castNodeDType(); + m_refDTypep = m_refDTypep->clonep(); }} virtual bool same(AstNode* samep) const { AstNodeArrayDType* sp = samep->castNodeArrayDType(); @@ -1871,7 +1872,7 @@ public: ASTNODE_BASE_FUNCS(NodeFTaskRef) virtual const char* broken() const { BROKEN_RTN(m_taskp && !m_taskp->brokeExists()); return NULL; } virtual void cloneRelink() { if (m_taskp && m_taskp->clonep()) { - m_taskp = m_taskp->clonep()->castNodeFTask(); + m_taskp = m_taskp->clonep(); }} virtual void dump(ostream& str=cout); virtual string name() const { return m_name; } // * = Var name @@ -1983,8 +1984,8 @@ inline int AstNodeArrayDType::elementsConst() const { return rangep()->elementsC inline VNumRange AstNodeArrayDType::declRange() const { return VNumRange(msb(), lsb(), rangep()->littleEndian()); } inline void AstIfaceRefDType::cloneRelink() { - if (m_cellp && m_cellp->clonep()) m_cellp = m_cellp->clonep()->castCell(); - if (m_ifacep && m_ifacep->clonep()) m_ifacep = m_ifacep->clonep()->castIface(); - if (m_modportp && m_modportp->clonep()) m_modportp = m_modportp->clonep()->castModport(); } + if (m_cellp && m_cellp->clonep()) m_cellp = m_cellp->clonep(); + if (m_ifacep && m_ifacep->clonep()) m_ifacep = m_ifacep->clonep(); + if (m_modportp && m_modportp->clonep()) m_modportp = m_modportp->clonep(); } #endif // Guard diff --git a/src/V3AstNodes.cpp b/src/V3AstNodes.cpp index f06446736..37cca4332 100644 --- a/src/V3AstNodes.cpp +++ b/src/V3AstNodes.cpp @@ -53,7 +53,7 @@ const char* AstNodeVarRef::broken() const { } void AstNodeVarRef::cloneRelink() { - if (m_varp && m_varp->clonep()) { m_varp = m_varp->clonep()->castVar(); } + if (m_varp && m_varp->clonep()) { m_varp = m_varp->clonep(); } } int AstNodeSel::bitConst() const { @@ -495,9 +495,9 @@ const char* AstScope::broken() const { } void AstScope::cloneRelink() { - if (m_aboveScopep && m_aboveScopep->clonep()) m_aboveScopep->clonep()->castScope(); - if (m_aboveCellp && m_aboveCellp->clonep()) m_aboveCellp->clonep()->castCell(); - if (m_modp && ((AstNode*)m_modp)->clonep()) ((AstNode*)m_modp)->clonep()->castNodeModule(); + if (m_aboveScopep && m_aboveScopep->clonep()) m_aboveScopep->clonep(); + if (m_aboveCellp && m_aboveCellp->clonep()) m_aboveCellp->clonep(); + if (m_modp && ((AstNode*)m_modp)->clonep()) ((AstNode*)m_modp)->clonep(); } string AstScope::nameDotless() const { diff --git a/src/V3AstNodes.h b/src/V3AstNodes.h index b799a8ccf..6c688a425 100644 --- a/src/V3AstNodes.h +++ b/src/V3AstNodes.h @@ -33,7 +33,8 @@ virtual AstType type() const { return AstType::at ## name; } \ virtual AstNode* clone() { return new Ast ##name (*this); } \ virtual void accept(AstNVisitor& v, AstNUser* vup=NULL) { v.visit(this,vup); } \ - Ast ##name * cloneTree(bool cloneNext) { return AstNode::cloneTree(cloneNext)->cast ##name(); } + Ast ##name * cloneTree(bool cloneNext) { return static_cast(AstNode::cloneTree(cloneNext)); } \ + Ast ##name * clonep() const { return static_cast(AstNode::clonep()); } //###################################################################### //=== Ast* : Specific types @@ -451,7 +452,7 @@ public: virtual const char* broken() const { BROKEN_RTN(!((m_refDTypep && !childDTypep() && m_refDTypep->brokeExists()) || (!m_refDTypep && childDTypep()))); return NULL; } virtual void cloneRelink() { if (m_refDTypep && m_refDTypep->clonep()) { - m_refDTypep = m_refDTypep->clonep()->castNodeDType(); + m_refDTypep = m_refDTypep->clonep(); }} virtual bool same(AstNode* samep) const { return (m_refDTypep==samep->castConstDType()->m_refDTypep); } @@ -533,7 +534,7 @@ public: // METHODS virtual const char* broken() const { BROKEN_RTN(m_refDTypep && !m_refDTypep->brokeExists()); return NULL; } virtual void cloneRelink() { if (m_refDTypep && m_refDTypep->clonep()) { - m_refDTypep = m_refDTypep->clonep()->castNodeDType(); + m_refDTypep = m_refDTypep->clonep(); }} virtual bool same(AstNode* samep) const { return (m_refDTypep==samep->castRefDType()->m_refDTypep @@ -700,7 +701,7 @@ public: virtual const char* broken() const { BROKEN_RTN(!((m_refDTypep && !childDTypep() && m_refDTypep->brokeExists()) || (!m_refDTypep && childDTypep()))); return NULL; } virtual void cloneRelink() { if (m_refDTypep && m_refDTypep->clonep()) { - m_refDTypep = m_refDTypep->clonep()->castNodeDType(); + m_refDTypep = m_refDTypep->clonep(); }} virtual bool same(AstNode* samep) const { return m_uniqueNum==samep->castEnumDType()->m_uniqueNum; } virtual V3Hash sameHash() const { return V3Hash(m_uniqueNum); } @@ -1295,9 +1296,9 @@ public: } ASTNODE_NODE_FUNCS(VarScope) virtual void cloneRelink() { if (m_varp && m_varp->clonep()) { - m_varp = m_varp->clonep()->castVar(); + m_varp = m_varp->clonep(); UASSERT(m_scopep->clonep(), "No clone cross link: "<clonep()->castScope(); + m_scopep = m_scopep->clonep(); }} virtual const char* broken() const { BROKEN_RTN(m_varp && !m_varp->brokeExists()); BROKEN_RTN(m_scopep && !m_scopep->brokeExists()); return NULL; } @@ -1498,7 +1499,7 @@ public: : AstNode (fl), m_name(name), m_packagep(packagep) {} ASTNODE_NODE_FUNCS(PackageImport) virtual const char* broken() const { BROKEN_RTN(!m_packagep || !m_packagep->brokeExists()); return NULL; } - virtual void cloneRelink() { if (m_packagep && m_packagep->clonep()) m_packagep = m_packagep->clonep()->castPackage(); } + virtual void cloneRelink() { if (m_packagep && m_packagep->clonep()) m_packagep = m_packagep->clonep(); } virtual void dump(ostream& str); virtual string name() const { return m_name; } AstPackage* packagep() const { return m_packagep; } @@ -1528,7 +1529,7 @@ public: virtual const char* broken() const { BROKEN_RTN(m_ftaskp && !m_ftaskp->brokeExists()); return NULL; } virtual void dump(ostream& str); virtual string name() const { return m_name; } - virtual void cloneRelink() { if (m_ftaskp && m_ftaskp->clonep()) m_ftaskp = m_ftaskp->clonep()->castNodeFTask(); } + virtual void cloneRelink() { if (m_ftaskp && m_ftaskp->clonep()) m_ftaskp = m_ftaskp->clonep(); } bool isImport() const { return !m_export; } bool isExport() const { return m_export; } AstNodeFTask* ftaskp() const { return m_ftaskp; } // [After Link] Pointer to variable @@ -1549,7 +1550,7 @@ public: ASTNODE_NODE_FUNCS(ModportVarRef) virtual const char* broken() const { BROKEN_RTN(m_varp && !m_varp->brokeExists()); return NULL; } virtual void dump(ostream& str); - virtual void cloneRelink() { if (m_varp && m_varp->clonep()) m_varp = m_varp->clonep()->castVar(); } + virtual void cloneRelink() { if (m_varp && m_varp->clonep()) m_varp = m_varp->clonep(); } virtual string name() const { return m_name; } AstVarType varType() const { return m_type; } // * = Type of variable bool isInput() const { return (varType()==AstVarType::INPUT || varType()==AstVarType::INOUT); } @@ -1773,7 +1774,7 @@ public: // METHODS virtual const char* broken() const { BROKEN_RTN(!m_packagep || !m_packagep->brokeExists()); return NULL; } virtual void cloneRelink() { if (m_packagep && m_packagep->clonep()) { - m_packagep = m_packagep->clonep()->castPackage(); + m_packagep = m_packagep->clonep(); }} virtual bool same(AstNode* samep) const { return (m_packagep==samep->castPackageRef()->m_packagep); } @@ -2160,7 +2161,7 @@ public: BROKEN_RTN(m_dataDeclp && !m_dataDeclp->brokeExists()); if (m_dataDeclp && m_dataDeclp->m_dataDeclp) v3fatalSrc("dataDeclp should point to real data, not be a list"); // Avoid O(n^2) accessing return NULL; } - virtual void cloneRelink() { if (m_dataDeclp && m_dataDeclp->clonep()) m_dataDeclp = m_dataDeclp->clonep()->castCoverDecl(); } + virtual void cloneRelink() { if (m_dataDeclp && m_dataDeclp->clonep()) m_dataDeclp = m_dataDeclp->clonep(); } virtual void dump(ostream& str); virtual int instrCount() const { return 1+2*instrCountLd(); } virtual bool maybePointedTo() const { return true; } @@ -2198,7 +2199,7 @@ public: } ASTNODE_NODE_FUNCS(CoverInc) virtual const char* broken() const { BROKEN_RTN(!declp()->brokeExists()); return NULL; } - virtual void cloneRelink() { if (m_declp->clonep()) m_declp = m_declp->clonep()->castCoverDecl(); } + virtual void cloneRelink() { if (m_declp->clonep()) m_declp = m_declp->clonep(); } virtual void dump(ostream& str); virtual int instrCount() const { return 1+2*instrCountLd(); } virtual V3Hash sameHash() const { return V3Hash(declp()); } @@ -2839,7 +2840,7 @@ public: } ASTNODE_NODE_FUNCS(JumpGo) virtual const char* broken() const { BROKEN_RTN(!labelp()->brokeExistsAbove()); return NULL; } - virtual void cloneRelink() { if (m_labelp->clonep()) m_labelp = m_labelp->clonep()->castJumpLabel(); } + virtual void cloneRelink() { if (m_labelp->clonep()) m_labelp = m_labelp->clonep(); } virtual void dump(ostream& str); virtual int instrCount() const { return instrCountBranch(); } virtual V3Hash sameHash() const { return V3Hash(labelp()); } @@ -3135,7 +3136,7 @@ public: } ASTNODE_NODE_FUNCS(TraceInc) virtual const char* broken() const { BROKEN_RTN(!declp()->brokeExists()); return NULL; } - virtual void cloneRelink() { if (m_declp->clonep()) m_declp = m_declp->clonep()->castTraceDecl(); } + virtual void cloneRelink() { if (m_declp->clonep()) m_declp = m_declp->clonep(); } virtual void dump(ostream& str); virtual int instrCount() const { return 10+2*instrCountLd(); } virtual bool hasDType() const { return true; } @@ -3174,7 +3175,7 @@ public: virtual const char* broken() const { BROKEN_RTN(m_sensesp && !m_sensesp->brokeExists()); return NULL; } virtual void cloneRelink() { if (m_sensesp->clonep()) { - m_sensesp = m_sensesp->clonep()->castSenTree(); + m_sensesp = m_sensesp->clonep(); UASSERT(m_sensesp, "Bad clone cross link: "<clonep()) { - m_funcp = m_funcp->clonep()->castCFunc(); + m_funcp = m_funcp->clonep(); }} virtual const char* broken() const { BROKEN_RTN(m_funcp && !m_funcp->brokeExists()); return NULL; } virtual int instrCount() const { return instrCountCall(); } diff --git a/src/V3Inline.cpp b/src/V3Inline.cpp index a086fb78d..2481b6a92 100644 --- a/src/V3Inline.cpp +++ b/src/V3Inline.cpp @@ -509,7 +509,7 @@ private: // need an alias to trace correctly. If tracing is disabled, we'll // delete it in later optimizations. AstVar* pinOldVarp = pinp->modVarp(); - AstVar* pinNewVarp = pinOldVarp->clonep()->castVar(); + AstVar* pinNewVarp = pinOldVarp->clonep(); AstNode* connectRefp = pinp->exprp(); if (!connectRefp->castConst() && !connectRefp->castVarRef()) { diff --git a/src/V3Param.cpp b/src/V3Param.cpp index 26c814f4e..06ed3c395 100644 --- a/src/V3Param.cpp +++ b/src/V3Param.cpp @@ -176,14 +176,14 @@ private: if (AstVar* varp = stmtp->castVar()) { if (varp->isIO() || varp->isGParam() || varp->isIfaceRef()) { // Cloning saved a pointer to the new node for us, so just follow that link. - AstVar* oldvarp = varp->clonep()->castVar(); + AstVar* oldvarp = varp->clonep(); //UINFO(8,"Clone list 0x"< 0x"<<(uint32_t)varp<insert(make_pair(oldvarp, varp)); } } else if (AstParamTypeDType* ptp = stmtp->castParamTypeDType()) { if (ptp->isGParam()) { - AstParamTypeDType* oldptp = ptp->clonep()->castParamTypeDType(); + AstParamTypeDType* oldptp = ptp->clonep(); clonemapp->insert(make_pair(oldptp, ptp)); } } @@ -637,7 +637,7 @@ void ParamVisitor::visitCell(AstCell* nodep) { for (IfaceRefRefs::iterator it=ifaceRefRefs.begin(); it!=ifaceRefRefs.end(); ++it) { AstIfaceRefDType* portIrefp = it->first; AstIfaceRefDType* pinIrefp = it->second; - AstIfaceRefDType* cloneIrefp = portIrefp->clonep()->castIfaceRefDType(); + AstIfaceRefDType* cloneIrefp = portIrefp->clonep(); UINFO(8," IfaceOld "<v3fatalSrc("parameter clone didn't hit AstIfaceRefDType");