diff --git a/include/verilated.cpp b/include/verilated.cpp index 123a5e9a4..65e89e00b 100644 --- a/include/verilated.cpp +++ b/include/verilated.cpp @@ -1114,7 +1114,7 @@ vluint32_t VerilatedVar::entSize() const { case VLVT_UINT16: size=sizeof(SData); break; case VLVT_UINT32: size=sizeof(IData); break; case VLVT_UINT64: size=sizeof(QData); break; - case VLVT_WDATA: size=VL_WORDS_I(range().bits())*sizeof(IData); break; + case VLVT_WDATA: size=VL_WORDS_I(range().elements())*sizeof(IData); break; default: size=0; break; } return size; @@ -1186,11 +1186,11 @@ void VerilatedScope::varInsert(int finalize, const char* namep, void* datap, int msb = va_arg(ap,int); int lsb = va_arg(ap,int); if (i==0) { - var.m_range.m_lhs = msb; - var.m_range.m_rhs = lsb; + var.m_range.m_left = msb; + var.m_range.m_right = lsb; } else if (i==1) { - var.m_array.m_lhs = msb; - var.m_array.m_rhs = lsb; + var.m_array.m_left = msb; + var.m_array.m_right = lsb; } else { // We could have a linked list of ranges, but really this whole thing needs // to be generalized to support structs and unions, etc. diff --git a/include/verilated_syms.h b/include/verilated_syms.h index 761b691c9..f310f12ef 100644 --- a/include/verilated_syms.h +++ b/include/verilated_syms.h @@ -45,19 +45,20 @@ struct VerilatedCStrCmp { //=========================================================================== /// Verilator range +// See also V3Ast::VNumRange class VerilatedRange { - int m_lhs; - int m_rhs; + int m_left; + int m_right; protected: friend class VerilatedVar; friend class VerilatedScope; - VerilatedRange() : m_lhs(0), m_rhs(0) {} - void sets(int lhs, int rhs) { m_lhs=lhs; m_rhs=rhs; } + VerilatedRange() : m_left(0), m_right(0) {} + void sets(int left, int right) { m_left=left; m_right=right; } public: ~VerilatedRange() {} - int lhs() const { return m_lhs; } - int rhs() const { return m_rhs; } - int bits() const { return (VL_LIKELY(m_lhs>=m_rhs)?(m_lhs-m_rhs+1):(m_rhs-m_lhs+1)); } + int left() const { return m_left; } + int right() const { return m_right; } + int elements() const { return (VL_LIKELY(m_left>=m_right)?(m_left-m_right+1):(m_right-m_left+1)); } }; //=========================================================================== diff --git a/include/verilated_vpi.h b/include/verilated_vpi.h index 9f249dc76..53e8cb6ce 100644 --- a/include/verilated_vpi.h +++ b/include/verilated_vpi.h @@ -140,7 +140,7 @@ public: virtual ~VerilatedVpioRange() {} static inline VerilatedVpioRange* castp(vpiHandle h) { return dynamic_cast((VerilatedVpio*)h); } virtual const vluint32_t type() { return vpiRange; } - virtual const vluint32_t size() const { return m_range->bits(); } + virtual const vluint32_t size() const { return m_range->elements(); } virtual const VerilatedRange* rangep() const { return m_range; } int iteration() const { return m_iteration; } void iterationInc() { ++m_iteration; } @@ -184,7 +184,7 @@ public: VerilatedVpioVar(const VerilatedVar* varp, const VerilatedScope* scopep) : m_varp(varp), m_scopep(scopep), m_index(0) { m_prevDatap = NULL; - m_mask.u32 = VL_MASK_I(varp->range().bits()); + m_mask.u32 = VL_MASK_I(varp->range().elements()); m_entSize = varp->entSize(); m_varDatap = varp->datap(); } @@ -199,7 +199,7 @@ public: vluint32_t entSize() const { return m_entSize; } const vluint32_t index() { return m_index; } virtual const vluint32_t type() { return (varp()->dims()>1) ? vpiMemory : vpiReg; /* but might be wire, logic */ } - virtual const vluint32_t size() { return range().bits(); } + virtual const vluint32_t size() { return range().elements(); } const VerilatedRange& range() { return m_varp->dims()?m_varp->array():m_varp->range(); } virtual const VerilatedRange* rangep() { return &range(); } virtual const char* name() { return m_varp->name(); } @@ -229,7 +229,7 @@ public: virtual ~VerilatedVpioMemoryWord() {} static inline VerilatedVpioMemoryWord* castp(vpiHandle h) { return dynamic_cast((VerilatedVpio*)h); } virtual const vluint32_t type() { return vpiMemoryWord; } - virtual const vluint32_t size() { return varp()->range().bits(); } + virtual const vluint32_t size() { return varp()->range().elements(); } virtual const VerilatedRange* rangep() { return &(varp()->range()); } virtual const char* fullname() { VL_STATIC_OR_THREAD string out; @@ -271,11 +271,11 @@ class VerilatedVpioMemoryWordIter : public VerilatedVpio { bool m_done; public: VerilatedVpioMemoryWordIter(const vpiHandle handle, const VerilatedVar* varp) - : m_handle(handle), m_varp(varp), m_iteration(varp->array().rhs()), m_direction(VL_LIKELY(varp->array().lhs()>varp->array().rhs())?1:-1), m_done(false) { } + : m_handle(handle), m_varp(varp), m_iteration(varp->array().right()), m_direction(VL_LIKELY(varp->array().left()>varp->array().right())?1:-1), m_done(false) { } virtual ~VerilatedVpioMemoryWordIter() {} static inline VerilatedVpioMemoryWordIter* castp(vpiHandle h) { return dynamic_cast((VerilatedVpio*)h); } virtual const vluint32_t type() { return vpiIterator; } - void iterationInc() { if (!(m_done = m_iteration == m_varp->array().lhs())) m_iteration+=m_direction; } + void iterationInc() { if (!(m_done = m_iteration == m_varp->array().left())) m_iteration+=m_direction; } virtual vpiHandle dovpi_scan() { vpiHandle result; if (m_done) return 0; @@ -587,15 +587,15 @@ vpiHandle vpi_handle_by_index(vpiHandle object, PLI_INT32 indx) { _VL_VPI_ERROR_RESET(); // reset vpi error status if (VL_LIKELY(varop)) { if (varop->varp()->dims()<2) return 0; - if (VL_LIKELY(varop->varp()->array().lhs() >= varop->varp()->array().rhs())) { - if (VL_UNLIKELY(indx > varop->varp()->array().lhs() || indx < varop->varp()->array().rhs())) return 0; + if (VL_LIKELY(varop->varp()->array().left() >= varop->varp()->array().right())) { + if (VL_UNLIKELY(indx > varop->varp()->array().left() || indx < varop->varp()->array().right())) return 0; return (new VerilatedVpioMemoryWord(varop->varp(), varop->scopep(), indx, - indx - varop->varp()->array().rhs())) + indx - varop->varp()->array().right())) ->castVpiHandle(); } else { - if (VL_UNLIKELY(indx < varop->varp()->array().lhs() || indx > varop->varp()->array().rhs())) return 0; + if (VL_UNLIKELY(indx < varop->varp()->array().left() || indx > varop->varp()->array().right())) return 0; return (new VerilatedVpioMemoryWord(varop->varp(), varop->scopep(), indx, - indx - varop->varp()->array().lhs())) + indx - varop->varp()->array().left())) ->castVpiHandle(); } } else { @@ -614,13 +614,13 @@ vpiHandle vpi_handle(PLI_INT32 type, vpiHandle object) { VerilatedVpioVar* vop = VerilatedVpioVar::castp(object); if (VL_UNLIKELY(!vop)) return 0; if (VL_UNLIKELY(!vop->rangep())) return 0; - return (new VerilatedVpioConst(vop->rangep()->lhs()))->castVpiHandle(); + return (new VerilatedVpioConst(vop->rangep()->left()))->castVpiHandle(); } case vpiRightRange: { VerilatedVpioVar* vop = VerilatedVpioVar::castp(object); if (VL_UNLIKELY(!vop)) return 0; if (VL_UNLIKELY(!vop->rangep())) return 0; - return (new VerilatedVpioConst(vop->rangep()->rhs()))->castVpiHandle(); + return (new VerilatedVpioConst(vop->rangep()->right()))->castVpiHandle(); } case vpiIndex: { VerilatedVpioVar* vop = VerilatedVpioVar::castp(object); @@ -800,7 +800,7 @@ void vpi_get_value(vpiHandle object, p_vpi_value value_p) { out[0].bval = 0; return; case VLVT_WDATA: { - int words = VL_WORDS_I(vop->varp()->range().bits()); + int words = VL_WORDS_I(vop->varp()->range().elements()); if (VL_UNLIKELY(words >= VL_MULS_MAX_WORDS)) { vl_fatal(__FILE__,__LINE__,"", "vpi_get_value with more than VL_MULS_MAX_WORDS; increase and recompile"); } @@ -833,7 +833,7 @@ void vpi_get_value(vpiHandle object, p_vpi_value value_p) { case VLVT_UINT32: case VLVT_UINT64: case VLVT_WDATA: { - int bits = vop->varp()->range().bits(); + int bits = vop->varp()->range().elements(); CData* datap = ((CData*)(vop->varDatap())); int i; if (bits > outStrSz) { @@ -862,8 +862,8 @@ void vpi_get_value(vpiHandle object, p_vpi_value value_p) { case VLVT_UINT32: case VLVT_UINT64: case VLVT_WDATA: { - int chars = (vop->varp()->range().bits()+2)/3; - int bytes = VL_BYTES_I(vop->varp()->range().bits()); + int chars = (vop->varp()->range().elements()+2)/3; + int bytes = VL_BYTES_I(vop->varp()->range().elements()); CData* datap = ((CData*)(vop->varDatap())); int i; if (chars > outStrSz) { @@ -885,7 +885,7 @@ void vpi_get_value(vpiHandle object, p_vpi_value value_p) { if (i==(chars-1)) { // most signifcant char, mask off non existant bits when vector // size is not a multiple of 3 - unsigned int rem = vop->varp()->range().bits() % 3; + unsigned int rem = vop->varp()->range().elements() % 3; if (rem) { // generate bit mask & zero non existant bits val &= (1<varp()->range().bits()+3)>>2; + int chars = (vop->varp()->range().elements()+3)>>2; CData* datap = ((CData*)(vop->varDatap())); int i; if (chars > outStrSz) { @@ -939,7 +939,7 @@ void vpi_get_value(vpiHandle object, p_vpi_value value_p) { if (i==(chars-1)) { // most signifcant char, mask off non existant bits when vector // size is not a multiple of 4 - unsigned int rem = vop->varp()->range().bits() & 3; + unsigned int rem = vop->varp()->range().elements() & 3; if (rem) { // generate bit mask & zero non existant bits val &= (1<varp()->range().bits()); + int bytes = VL_BYTES_I(vop->varp()->range().elements()); CData* datap = ((CData*)(vop->varDatap())); int i; if (bytes > outStrSz) { @@ -1054,7 +1054,7 @@ vpiHandle vpi_put_value(vpiHandle object, p_vpi_value value_p, *((IData*)(vop->varDatap())) = value_p->value.vector[0].aval & vop->mask(); return object; case VLVT_WDATA: { - int words = VL_WORDS_I(vop->varp()->range().bits()); + int words = VL_WORDS_I(vop->varp()->range().elements()); WDataOutP datap = ((IData*)(vop->varDatap())); for (int i=0; ivalue.vector[i].aval; @@ -1083,7 +1083,7 @@ vpiHandle vpi_put_value(vpiHandle object, p_vpi_value value_p, case VLVT_UINT32: case VLVT_UINT64: case VLVT_WDATA: { - int bits = vop->varp()->range().bits(); + int bits = vop->varp()->range().elements(); int len = strlen(value_p->value.str); CData* datap = ((CData*)(vop->varDatap())); for (int i=0; ivarp()->range().bits()+2)/3; - int bytes = VL_BYTES_I(vop->varp()->range().bits()); + int chars = (vop->varp()->range().elements()+2)/3; + int bytes = VL_BYTES_I(vop->varp()->range().elements()); int len = strlen(value_p->value.str); CData* datap = ((CData*)(vop->varDatap())); div_t idx; @@ -1196,7 +1196,7 @@ vpiHandle vpi_put_value(vpiHandle object, p_vpi_value value_p, case VLVT_UINT32: case VLVT_UINT64: case VLVT_WDATA: { - int chars = (vop->varp()->range().bits()+3)>>2; + int chars = (vop->varp()->range().elements()+3)>>2; CData* datap = ((CData*)(vop->varDatap())); char* val = value_p->value.str; // skip hex ident if one is detected at the start of the string @@ -1243,7 +1243,7 @@ vpiHandle vpi_put_value(vpiHandle object, p_vpi_value value_p, case VLVT_UINT32: case VLVT_UINT64: case VLVT_WDATA: { - int bytes = VL_BYTES_I(vop->varp()->range().bits()); + int bytes = VL_BYTES_I(vop->varp()->range().elements()); int len = strlen(value_p->value.str); CData* datap = ((CData*)(vop->varDatap())); for (int i=0; i