Internals: Use elementsConst for AstRange width.

This commit is contained in:
Wilson Snyder 2011-11-30 07:51:05 -05:00
parent 7618133298
commit da13ba6c67
3 changed files with 5 additions and 7 deletions

View File

@ -130,7 +130,6 @@ public:
:AstNode(fl) { :AstNode(fl) {
m_littleEndian = false; m_littleEndian = false;
setOp2p(new AstConst(fl,msb)); setOp3p(new AstConst(fl,lsb)); setOp2p(new AstConst(fl,msb)); setOp3p(new AstConst(fl,lsb));
width(msb-lsb+1,msb-lsb+1);
} }
ASTNODE_NODE_FUNCS(Range, RANGE) ASTNODE_NODE_FUNCS(Range, RANGE)
AstNode* msbp() const { return op2p()->castNode(); } // op2 = Msb expression AstNode* msbp() const { return op2p()->castNode(); } // op2 = Msb expression
@ -271,7 +270,7 @@ private:
if (keyword().width() > 1 && !isOpaque()) rangep = new AstRange(fileline(), keyword().width()-1, 0); if (keyword().width() > 1 && !isOpaque()) rangep = new AstRange(fileline(), keyword().width()-1, 0);
width(keyword().width(), keyword().width()); width(keyword().width(), keyword().width());
} else { } else {
widthFrom(rangep); // Maybe unknown if parameters underneath it width(rangep->elementsConst(), rangep->elementsConst()); // Maybe unknown if parameters underneath it
} }
setNOp1p(rangep); setNOp1p(rangep);
} }

View File

@ -199,7 +199,7 @@ private:
int expwidth = nodep->exprp()->width(); int expwidth = nodep->exprp()->width();
if (expwidth == pinwidth) { if (expwidth == pinwidth) {
// NOP: Arrayed instants: widths match so connect to each instance // NOP: Arrayed instants: widths match so connect to each instance
} else if (expwidth == pinwidth*m_cellRangep->width()) { } else if (expwidth == pinwidth*m_cellRangep->elementsConst()) {
// Arrayed instants: one bit for each of the instants (each assign is 1 pinwidth wide) // Arrayed instants: one bit for each of the instants (each assign is 1 pinwidth wide)
AstNode* exprp = nodep->exprp()->unlinkFrBack(); AstNode* exprp = nodep->exprp()->unlinkFrBack();
bool inputPin = nodep->modVarp()->isInput(); bool inputPin = nodep->modVarp()->isInput();

View File

@ -356,8 +356,7 @@ private:
checkCvtUS(nodep->lsbp()); checkCvtUS(nodep->lsbp());
int width = nodep->elementsConst(); int width = nodep->elementsConst();
if (width > (1<<28)) nodep->v3error("Width of bit range is huge; vector of over 1billion bits: 0x"<<hex<<width); if (width > (1<<28)) nodep->v3error("Width of bit range is huge; vector of over 1billion bits: 0x"<<hex<<width);
nodep->numeric(AstNumeric::UNSIGNED); // Note width() not set on range; use elementsConst()
nodep->width(width,width);
if (nodep->littleEndian()) { if (nodep->littleEndian()) {
nodep->v3warn(LITENDIAN,"Little bit endian vector: MSB < LSB of bit range: "<<nodep->lsbConst()<<":"<<nodep->msbConst()); nodep->v3warn(LITENDIAN,"Little bit endian vector: MSB < LSB of bit range: "<<nodep->lsbConst()<<":"<<nodep->msbConst());
} }
@ -620,7 +619,7 @@ private:
virtual void visit(AstBasicDType* nodep, AstNUser* vup) { virtual void visit(AstBasicDType* nodep, AstNUser* vup) {
if (nodep->rangep()) { if (nodep->rangep()) {
nodep->rangep()->iterateAndNext(*this,WidthVP(ANYSIZE,0,BOTH).p()); nodep->rangep()->iterateAndNext(*this,WidthVP(ANYSIZE,0,BOTH).p());
nodep->widthFrom(nodep->rangep()); nodep->width(nodep->rangep()->elementsConst(), nodep->rangep()->elementsConst());
} }
// else width in node is correct; it was set based on keyword().width() // else width in node is correct; it was set based on keyword().width()
// at construction time. Ditto signed, so "unsigned byte" etc works right. // at construction time. Ditto signed, so "unsigned byte" etc works right.
@ -1102,7 +1101,7 @@ private:
bool inputPin = nodep->modVarp()->isInput(); bool inputPin = nodep->modVarp()->isInput();
int awidth; int awidth;
if (m_cellRangep) { if (m_cellRangep) {
int numInsts = m_cellRangep->width(); int numInsts = m_cellRangep->elementsConst();
if (expwidth == pinwidth) { if (expwidth == pinwidth) {
awidth = pinwidth; // Arrayed instants: widths match so connect to each instance awidth = pinwidth; // Arrayed instants: widths match so connect to each instance
} else if (expwidth == pinwidth*numInsts) { } else if (expwidth == pinwidth*numInsts) {