VPI internals: Rename VerilatedRange left/right to match IEEE + VNumRange. No functional change.

This commit is contained in:
Wilson Snyder 2013-06-13 08:05:38 -04:00
parent 6cf9468477
commit e63ff77b15
3 changed files with 40 additions and 39 deletions

View File

@ -1114,7 +1114,7 @@ vluint32_t VerilatedVar::entSize() const {
case VLVT_UINT16: size=sizeof(SData); break; case VLVT_UINT16: size=sizeof(SData); break;
case VLVT_UINT32: size=sizeof(IData); break; case VLVT_UINT32: size=sizeof(IData); break;
case VLVT_UINT64: size=sizeof(QData); 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; default: size=0; break;
} }
return size; return size;
@ -1186,11 +1186,11 @@ void VerilatedScope::varInsert(int finalize, const char* namep, void* datap,
int msb = va_arg(ap,int); int msb = va_arg(ap,int);
int lsb = va_arg(ap,int); int lsb = va_arg(ap,int);
if (i==0) { if (i==0) {
var.m_range.m_lhs = msb; var.m_range.m_left = msb;
var.m_range.m_rhs = lsb; var.m_range.m_right = lsb;
} else if (i==1) { } else if (i==1) {
var.m_array.m_lhs = msb; var.m_array.m_left = msb;
var.m_array.m_rhs = lsb; var.m_array.m_right = lsb;
} else { } else {
// We could have a linked list of ranges, but really this whole thing needs // We could have a linked list of ranges, but really this whole thing needs
// to be generalized to support structs and unions, etc. // to be generalized to support structs and unions, etc.

View File

@ -45,19 +45,20 @@ struct VerilatedCStrCmp {
//=========================================================================== //===========================================================================
/// Verilator range /// Verilator range
// See also V3Ast::VNumRange
class VerilatedRange { class VerilatedRange {
int m_lhs; int m_left;
int m_rhs; int m_right;
protected: protected:
friend class VerilatedVar; friend class VerilatedVar;
friend class VerilatedScope; friend class VerilatedScope;
VerilatedRange() : m_lhs(0), m_rhs(0) {} VerilatedRange() : m_left(0), m_right(0) {}
void sets(int lhs, int rhs) { m_lhs=lhs; m_rhs=rhs; } void sets(int left, int right) { m_left=left; m_right=right; }
public: public:
~VerilatedRange() {} ~VerilatedRange() {}
int lhs() const { return m_lhs; } int left() const { return m_left; }
int rhs() const { return m_rhs; } int right() const { return m_right; }
int bits() const { return (VL_LIKELY(m_lhs>=m_rhs)?(m_lhs-m_rhs+1):(m_rhs-m_lhs+1)); } int elements() const { return (VL_LIKELY(m_left>=m_right)?(m_left-m_right+1):(m_right-m_left+1)); }
}; };
//=========================================================================== //===========================================================================

View File

@ -140,7 +140,7 @@ public:
virtual ~VerilatedVpioRange() {} virtual ~VerilatedVpioRange() {}
static inline VerilatedVpioRange* castp(vpiHandle h) { return dynamic_cast<VerilatedVpioRange*>((VerilatedVpio*)h); } static inline VerilatedVpioRange* castp(vpiHandle h) { return dynamic_cast<VerilatedVpioRange*>((VerilatedVpio*)h); }
virtual const vluint32_t type() { return vpiRange; } 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; } virtual const VerilatedRange* rangep() const { return m_range; }
int iteration() const { return m_iteration; } int iteration() const { return m_iteration; }
void iterationInc() { ++m_iteration; } void iterationInc() { ++m_iteration; }
@ -184,7 +184,7 @@ public:
VerilatedVpioVar(const VerilatedVar* varp, const VerilatedScope* scopep) VerilatedVpioVar(const VerilatedVar* varp, const VerilatedScope* scopep)
: m_varp(varp), m_scopep(scopep), m_index(0) { : m_varp(varp), m_scopep(scopep), m_index(0) {
m_prevDatap = NULL; 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_entSize = varp->entSize();
m_varDatap = varp->datap(); m_varDatap = varp->datap();
} }
@ -199,7 +199,7 @@ public:
vluint32_t entSize() const { return m_entSize; } vluint32_t entSize() const { return m_entSize; }
const vluint32_t index() { return m_index; } 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 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(); } const VerilatedRange& range() { return m_varp->dims()?m_varp->array():m_varp->range(); }
virtual const VerilatedRange* rangep() { return &range(); } virtual const VerilatedRange* rangep() { return &range(); }
virtual const char* name() { return m_varp->name(); } virtual const char* name() { return m_varp->name(); }
@ -229,7 +229,7 @@ public:
virtual ~VerilatedVpioMemoryWord() {} virtual ~VerilatedVpioMemoryWord() {}
static inline VerilatedVpioMemoryWord* castp(vpiHandle h) { return dynamic_cast<VerilatedVpioMemoryWord*>((VerilatedVpio*)h); } static inline VerilatedVpioMemoryWord* castp(vpiHandle h) { return dynamic_cast<VerilatedVpioMemoryWord*>((VerilatedVpio*)h); }
virtual const vluint32_t type() { return vpiMemoryWord; } 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 VerilatedRange* rangep() { return &(varp()->range()); }
virtual const char* fullname() { virtual const char* fullname() {
VL_STATIC_OR_THREAD string out; VL_STATIC_OR_THREAD string out;
@ -271,11 +271,11 @@ class VerilatedVpioMemoryWordIter : public VerilatedVpio {
bool m_done; bool m_done;
public: public:
VerilatedVpioMemoryWordIter(const vpiHandle handle, const VerilatedVar* varp) 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() {} virtual ~VerilatedVpioMemoryWordIter() {}
static inline VerilatedVpioMemoryWordIter* castp(vpiHandle h) { return dynamic_cast<VerilatedVpioMemoryWordIter*>((VerilatedVpio*)h); } static inline VerilatedVpioMemoryWordIter* castp(vpiHandle h) { return dynamic_cast<VerilatedVpioMemoryWordIter*>((VerilatedVpio*)h); }
virtual const vluint32_t type() { return vpiIterator; } 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() { virtual vpiHandle dovpi_scan() {
vpiHandle result; vpiHandle result;
if (m_done) return 0; 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 _VL_VPI_ERROR_RESET(); // reset vpi error status
if (VL_LIKELY(varop)) { if (VL_LIKELY(varop)) {
if (varop->varp()->dims()<2) return 0; if (varop->varp()->dims()<2) return 0;
if (VL_LIKELY(varop->varp()->array().lhs() >= varop->varp()->array().rhs())) { if (VL_LIKELY(varop->varp()->array().left() >= varop->varp()->array().right())) {
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, return (new VerilatedVpioMemoryWord(varop->varp(), varop->scopep(), indx,
indx - varop->varp()->array().rhs())) indx - varop->varp()->array().right()))
->castVpiHandle(); ->castVpiHandle();
} else { } 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, return (new VerilatedVpioMemoryWord(varop->varp(), varop->scopep(), indx,
indx - varop->varp()->array().lhs())) indx - varop->varp()->array().left()))
->castVpiHandle(); ->castVpiHandle();
} }
} else { } else {
@ -614,13 +614,13 @@ vpiHandle vpi_handle(PLI_INT32 type, vpiHandle object) {
VerilatedVpioVar* vop = VerilatedVpioVar::castp(object); VerilatedVpioVar* vop = VerilatedVpioVar::castp(object);
if (VL_UNLIKELY(!vop)) return 0; if (VL_UNLIKELY(!vop)) return 0;
if (VL_UNLIKELY(!vop->rangep())) 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: { case vpiRightRange: {
VerilatedVpioVar* vop = VerilatedVpioVar::castp(object); VerilatedVpioVar* vop = VerilatedVpioVar::castp(object);
if (VL_UNLIKELY(!vop)) return 0; if (VL_UNLIKELY(!vop)) return 0;
if (VL_UNLIKELY(!vop->rangep())) 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: { case vpiIndex: {
VerilatedVpioVar* vop = VerilatedVpioVar::castp(object); VerilatedVpioVar* vop = VerilatedVpioVar::castp(object);
@ -800,7 +800,7 @@ void vpi_get_value(vpiHandle object, p_vpi_value value_p) {
out[0].bval = 0; out[0].bval = 0;
return; return;
case VLVT_WDATA: { 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)) { 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"); 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_UINT32:
case VLVT_UINT64: case VLVT_UINT64:
case VLVT_WDATA: { case VLVT_WDATA: {
int bits = vop->varp()->range().bits(); int bits = vop->varp()->range().elements();
CData* datap = ((CData*)(vop->varDatap())); CData* datap = ((CData*)(vop->varDatap()));
int i; int i;
if (bits > outStrSz) { if (bits > outStrSz) {
@ -862,8 +862,8 @@ void vpi_get_value(vpiHandle object, p_vpi_value value_p) {
case VLVT_UINT32: case VLVT_UINT32:
case VLVT_UINT64: case VLVT_UINT64:
case VLVT_WDATA: { case VLVT_WDATA: {
int chars = (vop->varp()->range().bits()+2)/3; int chars = (vop->varp()->range().elements()+2)/3;
int bytes = VL_BYTES_I(vop->varp()->range().bits()); int bytes = VL_BYTES_I(vop->varp()->range().elements());
CData* datap = ((CData*)(vop->varDatap())); CData* datap = ((CData*)(vop->varDatap()));
int i; int i;
if (chars > outStrSz) { if (chars > outStrSz) {
@ -885,7 +885,7 @@ void vpi_get_value(vpiHandle object, p_vpi_value value_p) {
if (i==(chars-1)) { if (i==(chars-1)) {
// most signifcant char, mask off non existant bits when vector // most signifcant char, mask off non existant bits when vector
// size is not a multiple of 3 // 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) { if (rem) {
// generate bit mask & zero non existant bits // generate bit mask & zero non existant bits
val &= (1<<rem)-1; val &= (1<<rem)-1;
@ -924,7 +924,7 @@ void vpi_get_value(vpiHandle object, p_vpi_value value_p) {
case VLVT_UINT32: case VLVT_UINT32:
case VLVT_UINT64: case VLVT_UINT64:
case VLVT_WDATA: { case VLVT_WDATA: {
int chars = (vop->varp()->range().bits()+3)>>2; int chars = (vop->varp()->range().elements()+3)>>2;
CData* datap = ((CData*)(vop->varDatap())); CData* datap = ((CData*)(vop->varDatap()));
int i; int i;
if (chars > outStrSz) { if (chars > outStrSz) {
@ -939,7 +939,7 @@ void vpi_get_value(vpiHandle object, p_vpi_value value_p) {
if (i==(chars-1)) { if (i==(chars-1)) {
// most signifcant char, mask off non existant bits when vector // most signifcant char, mask off non existant bits when vector
// size is not a multiple of 4 // 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) { if (rem) {
// generate bit mask & zero non existant bits // generate bit mask & zero non existant bits
val &= (1<<rem)-1; val &= (1<<rem)-1;
@ -963,7 +963,7 @@ void vpi_get_value(vpiHandle object, p_vpi_value value_p) {
case VLVT_UINT32: case VLVT_UINT32:
case VLVT_UINT64: case VLVT_UINT64:
case VLVT_WDATA: { case VLVT_WDATA: {
int bytes = VL_BYTES_I(vop->varp()->range().bits()); int bytes = VL_BYTES_I(vop->varp()->range().elements());
CData* datap = ((CData*)(vop->varDatap())); CData* datap = ((CData*)(vop->varDatap()));
int i; int i;
if (bytes > outStrSz) { 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(); *((IData*)(vop->varDatap())) = value_p->value.vector[0].aval & vop->mask();
return object; return object;
case VLVT_WDATA: { 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())); WDataOutP datap = ((IData*)(vop->varDatap()));
for (int i=0; i<words; i++) { for (int i=0; i<words; i++) {
datap[i] = value_p->value.vector[i].aval; datap[i] = value_p->value.vector[i].aval;
@ -1083,7 +1083,7 @@ vpiHandle vpi_put_value(vpiHandle object, p_vpi_value value_p,
case VLVT_UINT32: case VLVT_UINT32:
case VLVT_UINT64: case VLVT_UINT64:
case VLVT_WDATA: { case VLVT_WDATA: {
int bits = vop->varp()->range().bits(); int bits = vop->varp()->range().elements();
int len = strlen(value_p->value.str); int len = strlen(value_p->value.str);
CData* datap = ((CData*)(vop->varDatap())); CData* datap = ((CData*)(vop->varDatap()));
for (int i=0; i<bits; i++) { for (int i=0; i<bits; i++) {
@ -1110,8 +1110,8 @@ vpiHandle vpi_put_value(vpiHandle object, p_vpi_value value_p,
case VLVT_UINT32: case VLVT_UINT32:
case VLVT_UINT64: case VLVT_UINT64:
case VLVT_WDATA: { case VLVT_WDATA: {
int chars = (vop->varp()->range().bits()+2)/3; int chars = (vop->varp()->range().elements()+2)/3;
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); int len = strlen(value_p->value.str);
CData* datap = ((CData*)(vop->varDatap())); CData* datap = ((CData*)(vop->varDatap()));
div_t idx; div_t idx;
@ -1196,7 +1196,7 @@ vpiHandle vpi_put_value(vpiHandle object, p_vpi_value value_p,
case VLVT_UINT32: case VLVT_UINT32:
case VLVT_UINT64: case VLVT_UINT64:
case VLVT_WDATA: { case VLVT_WDATA: {
int chars = (vop->varp()->range().bits()+3)>>2; int chars = (vop->varp()->range().elements()+3)>>2;
CData* datap = ((CData*)(vop->varDatap())); CData* datap = ((CData*)(vop->varDatap()));
char* val = value_p->value.str; char* val = value_p->value.str;
// skip hex ident if one is detected at the start of the string // 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_UINT32:
case VLVT_UINT64: case VLVT_UINT64:
case VLVT_WDATA: { 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); int len = strlen(value_p->value.str);
CData* datap = ((CData*)(vop->varDatap())); CData* datap = ((CData*)(vop->varDatap()));
for (int i=0; i<bytes; i++) { for (int i=0; i<bytes; i++) {