verilated internals: Add VL_BITRSHIFT_W. No functional change.

This commit is contained in:
Wilson Snyder 2017-12-02 08:17:20 -05:00
parent f0217edef1
commit 754527edfd
2 changed files with 17 additions and 14 deletions

View File

@ -572,7 +572,7 @@ void _vl_vsformat(std::string& output, const char* formatp, va_list ap) VL_MT_SA
case 's': case 's':
for (; lsb>=0; --lsb) { for (; lsb>=0; --lsb) {
lsb = (lsb / 8) * 8; // Next digit lsb = (lsb / 8) * 8; // Next digit
IData charval = (lwp[VL_BITWORD_I(lsb)]>>VL_BITBIT_I(lsb)) & 0xff; IData charval = VL_BITRSHIFT_W(lwp, lsb) & 0xff;
output += (charval==0)?' ':charval; output += (charval==0)?' ':charval;
} }
break; break;
@ -621,7 +621,7 @@ void _vl_vsformat(std::string& output, const char* formatp, va_list ap) VL_MT_SA
} }
case 'b': case 'b':
for (; lsb>=0; --lsb) { for (; lsb>=0; --lsb) {
output += ((lwp[VL_BITWORD_I(lsb)]>>VL_BITBIT_I(lsb)) & 1) + '0'; output += (VL_BITRSHIFT_W(lwp, lsb) & 1) + '0';
} }
break; break;
break; break;
@ -658,14 +658,14 @@ void _vl_vsformat(std::string& output, const char* formatp, va_list ap) VL_MT_SA
break; break;
case 'v': // Strength; assume always strong case 'v': // Strength; assume always strong
for (lsb=lbits-1; lsb>=0; --lsb) { for (lsb=lbits-1; lsb>=0; --lsb) {
if ((lwp[VL_BITWORD_I(lsb)]>>VL_BITBIT_I(lsb)) & 1) output += "St1 "; if (VL_BITRSHIFT_W(lwp, lsb) & 1) output += "St1 ";
else output += "St0 "; else output += "St0 ";
} }
break; break;
case 'x': case 'x':
for (; lsb>=0; --lsb) { for (; lsb>=0; --lsb) {
lsb = (lsb / 4) * 4; // Next digit lsb = (lsb / 4) * 4; // Next digit
IData charval = (lwp[VL_BITWORD_I(lsb)]>>VL_BITBIT_I(lsb)) & 0xf; IData charval = VL_BITRSHIFT_W(lwp, lsb) & 0xf;
output += "0123456789abcdef"[charval]; output += "0123456789abcdef"[charval];
} }
break; break;
@ -701,7 +701,7 @@ static inline int _vl_vsss_peek(FILE* fp, int& floc, WDataInP fromp, const std:
if (fromp == NULL) { if (fromp == NULL) {
return fstr[fstr.length()-1 - (floc>>3)]; return fstr[fstr.length()-1 - (floc>>3)];
} else { } else {
return (fromp[VL_BITWORD_I(floc)] >> VL_BITBIT_I(floc)) & 0xff; return VL_BITRSHIFT_W(fromp, floc) & 0xff;
} }
} }
} }
@ -916,7 +916,7 @@ void _VL_VINT_TO_STRING(int obits, char* destoutp, WDataInP sourcep) VL_MT_SAFE
char* destp = destoutp; char* destp = destoutp;
for (; lsb>=0; --lsb) { for (; lsb>=0; --lsb) {
lsb = (lsb / 8) * 8; // Next digit lsb = (lsb / 8) * 8; // Next digit
IData charval = (sourcep[VL_BITWORD_I(lsb)]>>VL_BITBIT_I(lsb)) & 0xff; IData charval = VL_BITRSHIFT_W(sourcep, lsb) & 0xff;
if (!start || charval) { if (!start || charval) {
*destp++ = (charval==0)?' ':charval; *destp++ = (charval==0)?' ':charval;
start = false; // Drop leading 0s start = false; // Drop leading 0s
@ -1385,7 +1385,7 @@ std::string VL_CVT_PACK_STR_NW(int lwords, WDataInP lwp) VL_MT_SAFE {
int len = 0; int len = 0;
for (; lsb>=0; --lsb) { for (; lsb>=0; --lsb) {
lsb = (lsb / 8) * 8; // Next digit lsb = (lsb / 8) * 8; // Next digit
IData charval = (lwp[VL_BITWORD_I(lsb)]>>VL_BITBIT_I(lsb)) & 0xff; IData charval = VL_BITRSHIFT_W(lwp, lsb) & 0xff;
if (!start || charval) { if (!start || charval) {
*destp++ = (charval==0)?' ':charval; *destp++ = (charval==0)?' ':charval;
len++; len++;

View File

@ -577,6 +577,9 @@ extern const char* vl_mc_scan_plusargs(const char* prefixp); // PLIish
#define VL_BITISSET_W(data,bit) (data[VL_BITWORD_I(bit)] & (VL_UL(1)<<VL_BITBIT_I(bit))) #define VL_BITISSET_W(data,bit) (data[VL_BITWORD_I(bit)] & (VL_UL(1)<<VL_BITBIT_I(bit)))
#define VL_BITISSETLIMIT_W(data,width,bit) (((bit)<(width)) && data[VL_BITWORD_I(bit)] & (VL_UL(1)<<VL_BITBIT_I(bit))) #define VL_BITISSETLIMIT_W(data,width,bit) (((bit)<(width)) && data[VL_BITWORD_I(bit)] & (VL_UL(1)<<VL_BITBIT_I(bit)))
/// Shift appropriate word by bit. Does not account for wrapping between two words
#define VL_BITRSHIFT_W(data,bit) (data[VL_BITWORD_I(bit)] >> VL_BITBIT_I(bit))
/// Create two 32-bit words from quadword /// Create two 32-bit words from quadword
/// WData is always at least 2 words; does not clean upper bits /// WData is always at least 2 words; does not clean upper bits
#define VL_SET_WQ(owp,data) { owp[0]=static_cast<IData>(data); owp[1]=static_cast<IData>((data)>>VL_WORDSIZE); } #define VL_SET_WQ(owp,data) { owp[0]=static_cast<IData>(data); owp[1]=static_cast<IData>((data)>>VL_WORDSIZE); }
@ -1679,7 +1682,7 @@ static inline WDataOutP VL_STREAML_WWI(int, int lbits, int, WDataOutP owp, WData
for (int sbit=0; sbit<ssize && sbit<lbits-istart; ++sbit) { for (int sbit=0; sbit<ssize && sbit<lbits-istart; ++sbit) {
// Extract a single bit from lwp and shift it to the correct // Extract a single bit from lwp and shift it to the correct
// location for owp. // location for owp.
WData bit= ((lwp[VL_BITWORD_I(istart+sbit)] >> VL_BITBIT_I(istart+sbit)) & 1) << VL_BITBIT_I(ostart+sbit); WData bit= (VL_BITRSHIFT_W(lwp, (istart+sbit)) & 1) << VL_BITBIT_I(ostart+sbit);
owp[VL_BITWORD_I(ostart+sbit)] |= bit; owp[VL_BITWORD_I(ostart+sbit)] |= bit;
} }
} }
@ -1964,12 +1967,12 @@ static inline IData VL_SEL_IWII(int, int lbits, int, int, WDataInP lwp, IData ls
if (VL_UNLIKELY(msb>lbits)) { if (VL_UNLIKELY(msb>lbits)) {
return ~0; // Spec says you can go outside the range of a array. Don't coredump if so. return ~0; // Spec says you can go outside the range of a array. Don't coredump if so.
} else if (VL_BITWORD_I(msb)==VL_BITWORD_I(static_cast<int>(lsb))) { } else if (VL_BITWORD_I(msb)==VL_BITWORD_I(static_cast<int>(lsb))) {
return (lwp[VL_BITWORD_I(lsb)]>>VL_BITBIT_I(lsb)); return VL_BITRSHIFT_W(lwp, lsb);
} else { } else {
// 32 bit extraction may span two words // 32 bit extraction may span two words
int nbitsfromlow = 32-VL_BITBIT_I(lsb); // bits that come from low word int nbitsfromlow = 32-VL_BITBIT_I(lsb); // bits that come from low word
return ((lwp[VL_BITWORD_I(msb)]<<nbitsfromlow) return ((lwp[VL_BITWORD_I(msb)]<<nbitsfromlow)
|(lwp[VL_BITWORD_I(lsb)]>>VL_BITBIT_I(lsb))); | VL_BITRSHIFT_W(lwp, lsb));
} }
} }
@ -1978,18 +1981,18 @@ static inline QData VL_SEL_QWII(int, int lbits, int, int, WDataInP lwp, IData ls
if (VL_UNLIKELY(msb>lbits)) { if (VL_UNLIKELY(msb>lbits)) {
return ~0; // Spec says you can go outside the range of a array. Don't coredump if so. return ~0; // Spec says you can go outside the range of a array. Don't coredump if so.
} else if (VL_BITWORD_I(msb)==VL_BITWORD_I(static_cast<int>(lsb))) { } else if (VL_BITWORD_I(msb)==VL_BITWORD_I(static_cast<int>(lsb))) {
return (lwp[VL_BITWORD_I(lsb)]>>VL_BITBIT_I(lsb)); return VL_BITRSHIFT_W(lwp, lsb);
} else if (VL_BITWORD_I(msb)==1+VL_BITWORD_I(static_cast<int>(lsb))) { } else if (VL_BITWORD_I(msb)==1+VL_BITWORD_I(static_cast<int>(lsb))) {
int nbitsfromlow = 32-VL_BITBIT_I(lsb); int nbitsfromlow = 32-VL_BITBIT_I(lsb);
QData hi = (lwp[VL_BITWORD_I(msb)]); QData hi = (lwp[VL_BITWORD_I(msb)]);
QData lo = (lwp[VL_BITWORD_I(lsb)]>>VL_BITBIT_I(lsb)); QData lo = VL_BITRSHIFT_W(lwp, lsb);
return (hi<<nbitsfromlow) | lo; return (hi<<nbitsfromlow) | lo;
} else { } else {
// 64 bit extraction may span three words // 64 bit extraction may span three words
int nbitsfromlow = 32-VL_BITBIT_I(lsb); int nbitsfromlow = 32-VL_BITBIT_I(lsb);
QData hi = (lwp[VL_BITWORD_I(msb)]); QData hi = (lwp[VL_BITWORD_I(msb)]);
QData mid= (lwp[VL_BITWORD_I(lsb)+1]); QData mid= (lwp[VL_BITWORD_I(lsb)+1]);
QData lo = (lwp[VL_BITWORD_I(lsb)]>>VL_BITBIT_I(lsb)); QData lo = VL_BITRSHIFT_W(lwp, lsb);
return (hi<<(nbitsfromlow+32)) | (mid<<nbitsfromlow) | lo; return (hi<<(nbitsfromlow+32)) | (mid<<nbitsfromlow) | lo;
} }
} }