VPI internals: Rename VerilatedRange left/right to match IEEE + VNumRange. No functional change.
This commit is contained in:
parent
6cf9468477
commit
e63ff77b15
|
|
@ -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.
|
||||||
|
|
|
||||||
|
|
@ -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)); }
|
||||||
};
|
};
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
|
|
|
||||||
|
|
@ -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++) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue