From 7a8184d20612dcaadd06e23e1c7495a48ea8458e Mon Sep 17 00:00:00 2001 From: Wilson Snyder Date: Sun, 13 Jan 2013 15:21:38 -0500 Subject: [PATCH] Internals: Remove dimension and use only dtypes for V3Width. --- src/V3AstNodes.cpp | 14 -------------- src/V3AstNodes.h | 1 - src/V3Width.cpp | 13 ++++--------- 3 files changed, 4 insertions(+), 24 deletions(-) diff --git a/src/V3AstNodes.cpp b/src/V3AstNodes.cpp index 9ce88ef74..4e7f56d93 100644 --- a/src/V3AstNodes.cpp +++ b/src/V3AstNodes.cpp @@ -386,20 +386,6 @@ int AstNodeDType::widthPow2() const { return 1; } -// Special operators -int AstArraySel::dimension(AstNode* nodep) { - // How many dimensions is this reference from the base variable? - // nodep is typically the fromp() of a select; thus the first select - // is selecting from the entire variable type - effectively dimension 0. - // Dimension passed to AstVar::dtypeDimensionp; see comments there - int dim = 0; - while (nodep) { - if (nodep->castNodeSel()) { dim++; nodep=nodep->castNodeSel()->fromp(); continue; } - if (nodep->castNodePreSel()) { dim++; nodep=nodep->castNodePreSel()->fromp(); continue; } - break; - } - return dim; -} AstNode* AstArraySel::baseFromp(AstNode* nodep) { ///< What is the base variable (or const) this dereferences? // Else AstArraySel etc; search for the base while (nodep) { diff --git a/src/V3AstNodes.h b/src/V3AstNodes.h index d0382fe03..454501e2b 100644 --- a/src/V3AstNodes.h +++ b/src/V3AstNodes.h @@ -650,7 +650,6 @@ public: void start(unsigned start) { m_start = start; } unsigned start() const { return m_start; } // Special operators - static int dimension(AstNode* nodep); ///< How many dimensions is this reference from the base variable? static AstNode* baseFromp(AstNode* nodep); ///< What is the base variable (or const) this dereferences? virtual void dump(ostream& str); }; diff --git a/src/V3Width.cpp b/src/V3Width.cpp index 511bd5eed..2e2d43bbd 100644 --- a/src/V3Width.cpp +++ b/src/V3Width.cpp @@ -504,15 +504,11 @@ private: checkCvtUS(nodep->bitp()); // nodep->fromp()->iterateAndNext(*this,WidthVP(ANYSIZE,0,PRELIM).p()); - AstNode* basefromp = AstArraySel::baseFromp(nodep->fromp()); - int dimension = AstArraySel::dimension(nodep->fromp()); - AstNodeVarRef* varrp = basefromp->castNodeVarRef(); - if (!varrp) nodep->v3fatalSrc("No VarRef found under ArraySel(s)"); // int frommsb; int fromlsb; - AstNodeDType* ddtypep = varrp->varp()->dtypep()->dtypeDimensionp(dimension); - if (AstNodeArrayDType* adtypep = ddtypep->castNodeArrayDType()) { + AstNodeDType* fromDtp = nodep->fromp()->dtypep()->skipRefp(); + if (AstNodeArrayDType* adtypep = fromDtp->castNodeArrayDType()) { frommsb = adtypep->msb(); fromlsb = adtypep->lsb(); if (fromlsb>frommsb) {int t=frommsb; frommsb=fromlsb; fromlsb=t; } @@ -521,9 +517,8 @@ private: nodep->dtypeFrom(adtypep->subDTypep()); // Need to strip off array reference } else { - UINFO(1," Related var dtypep: "<varp()->dtypep()<v3fatalSrc("Array reference exceeds dimension of array"); frommsb = fromlsb = 0; }