Internals: New VL_ZERO_W for faster inline. Prefer WData for wide. No functional change intended.

This commit is contained in:
Wilson Snyder 2017-06-05 20:04:09 -04:00
parent 9b06178f35
commit f0fb3b78d1
4 changed files with 27 additions and 22 deletions

View File

@ -779,7 +779,7 @@ IData VL_FOPEN_NI(const string& filename, IData mode) {
return VL_FOPEN_S(filename.c_str(), modez); return VL_FOPEN_S(filename.c_str(), modez);
} }
IData VL_FOPEN_QI(QData filename, IData mode) { IData VL_FOPEN_QI(QData filename, IData mode) {
IData fnw[2]; VL_SET_WQ(fnw, filename); WData fnw[2]; VL_SET_WQ(fnw, filename);
return VL_FOPEN_WI(2, fnw, mode); return VL_FOPEN_WI(2, fnw, mode);
} }
IData VL_FOPEN_WI(int fnwords, WDataInP filenamep, IData mode) { IData VL_FOPEN_WI(int fnwords, WDataInP filenamep, IData mode) {
@ -913,7 +913,7 @@ IData VL_FSCANF_IX(IData fpi, const char* formatp, ...) {
} }
IData VL_SSCANF_IIX(int lbits, IData ld, const char* formatp, ...) { IData VL_SSCANF_IIX(int lbits, IData ld, const char* formatp, ...) {
IData fnw[2]; VL_SET_WI(fnw, ld); WData fnw[2]; VL_SET_WI(fnw, ld);
va_list ap; va_list ap;
va_start(ap,formatp); va_start(ap,formatp);
@ -922,7 +922,7 @@ IData VL_SSCANF_IIX(int lbits, IData ld, const char* formatp, ...) {
return got; return got;
} }
IData VL_SSCANF_IQX(int lbits, QData ld, const char* formatp, ...) { IData VL_SSCANF_IQX(int lbits, QData ld, const char* formatp, ...) {
IData fnw[2]; VL_SET_WQ(fnw, ld); WData fnw[2]; VL_SET_WQ(fnw, ld);
va_list ap; va_list ap;
va_start(ap,formatp); va_start(ap,formatp);
@ -947,7 +947,7 @@ IData VL_SSCANF_INX(int, const string& ld, const char* formatp, ...) {
void VL_READMEM_Q(bool hex, int width, int depth, int array_lsb, int, void VL_READMEM_Q(bool hex, int width, int depth, int array_lsb, int,
QData ofilename, void* memp, IData start, IData end) { QData ofilename, void* memp, IData start, IData end) {
IData fnw[2]; VL_SET_WQ(fnw, ofilename); WData fnw[2]; VL_SET_WQ(fnw, ofilename);
return VL_READMEM_W(hex,width,depth,array_lsb,2, fnw,memp,start,end); return VL_READMEM_W(hex,width,depth,array_lsb,2, fnw,memp,start,end);
} }
@ -1060,7 +1060,7 @@ void VL_READMEM_N(bool hex, int width, int depth, int array_lsb, int fnwords,
} }
IData VL_SYSTEM_IQ(QData lhs) { IData VL_SYSTEM_IQ(QData lhs) {
IData lhsw[2]; VL_SET_WQ(lhsw, lhs); WData lhsw[2]; VL_SET_WQ(lhsw, lhs);
return VL_SYSTEM_IW(2, lhsw); return VL_SYSTEM_IW(2, lhsw);
} }
IData VL_SYSTEM_IW(int lhswords, WDataInP filenamep) { IData VL_SYSTEM_IW(int lhswords, WDataInP filenamep) {

View File

@ -349,7 +349,7 @@ extern WDataOutP VL_RANDOM_W(int obits, WDataOutP outwp); ///< Randomize a signa
extern IData VL_RAND_RESET_I(int obits); ///< Random reset a signal extern IData VL_RAND_RESET_I(int obits); ///< Random reset a signal
extern QData VL_RAND_RESET_Q(int obits); ///< Random reset a signal extern QData VL_RAND_RESET_Q(int obits); ///< Random reset a signal
extern WDataOutP VL_RAND_RESET_W(int obits, WDataOutP outwp); ///< Random reset a signal extern WDataOutP VL_RAND_RESET_W(int obits, WDataOutP outwp); ///< Random reset a signal
extern WDataOutP VL_ZERO_RESET_W(int obits, WDataOutP outwp); ///< Zero reset a signal extern WDataOutP VL_ZERO_RESET_W(int obits, WDataOutP outwp); ///< Zero reset a signal (slow - else use VL_ZERO_W)
/// Math /// Math
extern WDataOutP _vl_moddiv_w(int lbits, WDataOutP owp, WDataInP lwp, WDataInP rwp, bool is_modulus); extern WDataOutP _vl_moddiv_w(int lbits, WDataOutP owp, WDataInP lwp, WDataInP rwp, bool is_modulus);
@ -398,7 +398,7 @@ extern const char* vl_mc_scan_plusargs(const char* prefixp); // PLIish
//========================================================================= //=========================================================================
// Base macros // Base macros
/// Return true if data[bit] set /// Return true if data[bit] set; not 0/1 return, but 0/non-zero return.
#define VL_BITISSET_I(data,bit) (data & (VL_UL(1)<<VL_BITBIT_I(bit))) #define VL_BITISSET_I(data,bit) (data & (VL_UL(1)<<VL_BITBIT_I(bit)))
#define VL_BITISSET_Q(data,bit) (data & (VL_ULL(1)<<VL_BITBIT_Q(bit))) #define VL_BITISSET_Q(data,bit) (data & (VL_ULL(1)<<VL_BITBIT_Q(bit)))
#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)))
@ -508,6 +508,11 @@ static inline WDataOutP VL_CLEAN_WW(int obits, int, WDataOutP owp, WDataInP lwp)
owp[words-1] = lwp[words-1] & VL_MASK_I(obits); owp[words-1] = lwp[words-1] & VL_MASK_I(obits);
return(owp); return(owp);
} }
static inline WDataOutP VL_ZERO_W(int obits, WDataOutP owp) {
int words = VL_WORDS_I(obits);
for (int i=0; i < words; ++i) owp[i] = 0;
return owp;
}
// EMIT_RULE: VL_ASSIGN: oclean=rclean; obits==lbits; // EMIT_RULE: VL_ASSIGN: oclean=rclean; obits==lbits;
// For now, we always have a clean rhs. // For now, we always have a clean rhs.
@ -1078,9 +1083,9 @@ static inline QData VL_MULS_QQQ(int,int lbits,int, QData lhs,QData rhs) {
static inline WDataOutP VL_MULS_WWW(int,int lbits,int, WDataOutP owp,WDataInP lwp,WDataInP rwp){ static inline WDataOutP VL_MULS_WWW(int,int lbits,int, WDataOutP owp,WDataInP lwp,WDataInP rwp){
int words = VL_WORDS_I(lbits); int words = VL_WORDS_I(lbits);
// cppcheck-suppress variableScope // cppcheck-suppress variableScope
IData lwstore[VL_MULS_MAX_WORDS]; // Fixed size, as MSVC++ doesn't allow [words] here WData lwstore[VL_MULS_MAX_WORDS]; // Fixed size, as MSVC++ doesn't allow [words] here
// cppcheck-suppress variableScope // cppcheck-suppress variableScope
IData rwstore[VL_MULS_MAX_WORDS]; WData rwstore[VL_MULS_MAX_WORDS];
WDataInP lwusp = lwp; WDataInP lwusp = lwp;
WDataInP rwusp = rwp; WDataInP rwusp = rwp;
IData lneg = VL_SIGN_I(lbits,lwp[words-1]); IData lneg = VL_SIGN_I(lbits,lwp[words-1]);
@ -1141,9 +1146,9 @@ static inline WDataOutP VL_DIVS_WWW(int lbits, WDataOutP owp,WDataInP lwp,WDataI
IData lsign = VL_SIGN_I(lbits,lwp[words-1]); IData lsign = VL_SIGN_I(lbits,lwp[words-1]);
IData rsign = VL_SIGN_I(lbits,rwp[words-1]); IData rsign = VL_SIGN_I(lbits,rwp[words-1]);
// cppcheck-suppress variableScope // cppcheck-suppress variableScope
IData lwstore[VL_MULS_MAX_WORDS]; // Fixed size, as MSVC++ doesn't allow [words] here WData lwstore[VL_MULS_MAX_WORDS]; // Fixed size, as MSVC++ doesn't allow [words] here
// cppcheck-suppress variableScope // cppcheck-suppress variableScope
IData rwstore[VL_MULS_MAX_WORDS]; WData rwstore[VL_MULS_MAX_WORDS];
WDataInP ltup = lwp; WDataInP ltup = lwp;
WDataInP rtup = rwp; WDataInP rtup = rwp;
if (lsign) { ltup = _VL_CLEAN_INPLACE_W(lbits, VL_NEGATE_W(VL_WORDS_I(lbits), lwstore, lwp)); } if (lsign) { ltup = _VL_CLEAN_INPLACE_W(lbits, VL_NEGATE_W(VL_WORDS_I(lbits), lwstore, lwp)); }
@ -1162,15 +1167,15 @@ static inline WDataOutP VL_MODDIVS_WWW(int lbits, WDataOutP owp,WDataInP lwp,WDa
IData lsign = VL_SIGN_I(lbits,lwp[words-1]); IData lsign = VL_SIGN_I(lbits,lwp[words-1]);
IData rsign = VL_SIGN_I(lbits,rwp[words-1]); IData rsign = VL_SIGN_I(lbits,rwp[words-1]);
// cppcheck-suppress variableScope // cppcheck-suppress variableScope
IData lwstore[VL_MULS_MAX_WORDS]; // Fixed size, as MSVC++ doesn't allow [words] here WData lwstore[VL_MULS_MAX_WORDS]; // Fixed size, as MSVC++ doesn't allow [words] here
// cppcheck-suppress variableScope // cppcheck-suppress variableScope
IData rwstore[VL_MULS_MAX_WORDS]; WData rwstore[VL_MULS_MAX_WORDS];
WDataInP ltup = lwp; WDataInP ltup = lwp;
WDataInP rtup = rwp; WDataInP rtup = rwp;
if (lsign) { ltup = _VL_CLEAN_INPLACE_W(lbits, VL_NEGATE_W(VL_WORDS_I(lbits), lwstore, lwp)); } if (lsign) { ltup = _VL_CLEAN_INPLACE_W(lbits, VL_NEGATE_W(VL_WORDS_I(lbits), lwstore, lwp)); }
if (rsign) { rtup = _VL_CLEAN_INPLACE_W(lbits, VL_NEGATE_W(VL_WORDS_I(lbits), rwstore, rwp)); } if (rsign) { rtup = _VL_CLEAN_INPLACE_W(lbits, VL_NEGATE_W(VL_WORDS_I(lbits), rwstore, rwp)); }
if (lsign) { // Only dividend sign matters for modulus if (lsign) { // Only dividend sign matters for modulus
IData qNoSign[VL_MULS_MAX_WORDS]; WData qNoSign[VL_MULS_MAX_WORDS];
VL_MODDIV_WWW(lbits,qNoSign,ltup,rtup); VL_MODDIV_WWW(lbits,qNoSign,ltup,rtup);
_VL_CLEAN_INPLACE_W(lbits, VL_NEGATE_W(VL_WORDS_I(lbits), owp, qNoSign)); _VL_CLEAN_INPLACE_W(lbits, VL_NEGATE_W(VL_WORDS_I(lbits), owp, qNoSign));
return owp; return owp;
@ -1472,7 +1477,7 @@ static inline QData VL_STREAML_QQI(int, int lbits, int, QData ld, IData rd) {
} }
static inline WDataOutP VL_STREAML_WWI(int, int lbits, int, WDataOutP owp, WDataInP lwp, IData rd) { static inline WDataOutP VL_STREAML_WWI(int, int lbits, int, WDataOutP owp, WDataInP lwp, IData rd) {
VL_ZERO_RESET_W(lbits, owp); VL_ZERO_W(lbits, owp);
// Slice size should never exceed the lhs width // Slice size should never exceed the lhs width
int ssize = (rd < (IData)lbits) ? rd : ((IData)lbits); int ssize = (rd < (IData)lbits) ? rd : ((IData)lbits);
for (int istart=0; istart<lbits; istart+=rd) { for (int istart=0; istart<lbits; istart+=rd) {
@ -1588,7 +1593,7 @@ static inline WDataOutP VL_SHIFTL_WWI(int obits,int,int,WDataOutP owp,WDataInP l
static inline WDataOutP VL_SHIFTL_WWW(int obits,int lbits,int rbits,WDataOutP owp,WDataInP lwp, WDataInP rwp) { static inline WDataOutP VL_SHIFTL_WWW(int obits,int lbits,int rbits,WDataOutP owp,WDataInP lwp, WDataInP rwp) {
for (int i=1; i < VL_WORDS_I(rbits); i++) { for (int i=1; i < VL_WORDS_I(rbits); i++) {
if (VL_UNLIKELY(rwp[i])) { // Huge shift 1>>32 or more if (VL_UNLIKELY(rwp[i])) { // Huge shift 1>>32 or more
return VL_ZERO_RESET_W(obits, owp); return VL_ZERO_W(obits, owp);
} }
} }
return VL_SHIFTL_WWI(obits,lbits,32,owp,lwp,rwp[0]); return VL_SHIFTL_WWI(obits,lbits,32,owp,lwp,rwp[0]);
@ -1633,7 +1638,7 @@ static inline WDataOutP VL_SHIFTR_WWI(int obits,int,int,WDataOutP owp,WDataInP l
static inline WDataOutP VL_SHIFTR_WWW(int obits,int lbits,int rbits,WDataOutP owp,WDataInP lwp, WDataInP rwp) { static inline WDataOutP VL_SHIFTR_WWW(int obits,int lbits,int rbits,WDataOutP owp,WDataInP lwp, WDataInP rwp) {
for (int i=1; i < VL_WORDS_I(rbits); i++) { for (int i=1; i < VL_WORDS_I(rbits); i++) {
if (VL_UNLIKELY(rwp[i])) { // Huge shift 1>>32 or more if (VL_UNLIKELY(rwp[i])) { // Huge shift 1>>32 or more
return VL_ZERO_RESET_W(obits, owp); return VL_ZERO_W(obits, owp);
} }
} }
return VL_SHIFTR_WWI(obits,lbits,32,owp,lwp,rwp[0]); return VL_SHIFTR_WWI(obits,lbits,32,owp,lwp,rwp[0]);

View File

@ -38,14 +38,14 @@
extern string VL_CVT_PACK_STR_NW(int lwords, WDataInP lwp); extern string VL_CVT_PACK_STR_NW(int lwords, WDataInP lwp);
inline string VL_CVT_PACK_STR_NQ(QData lhs) { inline string VL_CVT_PACK_STR_NQ(QData lhs) {
IData lw[2]; VL_SET_WQ(lw, lhs); WData lw[2]; VL_SET_WQ(lw, lhs);
return VL_CVT_PACK_STR_NW(2, lw); return VL_CVT_PACK_STR_NW(2, lw);
} }
inline string VL_CVT_PACK_STR_NN(const string& lhs) { inline string VL_CVT_PACK_STR_NN(const string& lhs) {
return lhs; return lhs;
} }
inline string VL_CVT_PACK_STR_NI(IData lhs) { inline string VL_CVT_PACK_STR_NI(IData lhs) {
IData lw[1]; lw[0] = lhs; WData lw[1]; lw[0] = lhs;
return VL_CVT_PACK_STR_NW(1, lw); return VL_CVT_PACK_STR_NW(1, lw);
} }
inline string VL_CONCATN_NNN(const string& lhs, const string& rhs) { inline string VL_CONCATN_NNN(const string& lhs, const string& rhs) {
@ -68,13 +68,13 @@ extern void VL_SFORMAT_X(int obits_ignored, string &output, const char* formatp,
extern string VL_SFORMATF_NX(const char* formatp, ...); extern string VL_SFORMATF_NX(const char* formatp, ...);
extern IData VL_VALUEPLUSARGS_INW(int rbits, const string& ld, WDataOutP rdp); extern IData VL_VALUEPLUSARGS_INW(int rbits, const string& ld, WDataOutP rdp);
inline IData VL_VALUEPLUSARGS_INI(int rbits, const string& ld, IData& rdr) { inline IData VL_VALUEPLUSARGS_INI(int rbits, const string& ld, IData& rdr) {
IData rwp[1]; WData rwp[1];
IData got = VL_VALUEPLUSARGS_INW(rbits,ld,rwp); IData got = VL_VALUEPLUSARGS_INW(rbits,ld,rwp);
if (got) rdr = rwp[0]; if (got) rdr = rwp[0];
return got; return got;
} }
inline IData VL_VALUEPLUSARGS_INQ(int rbits, const string& ld, QData& rdr) { inline IData VL_VALUEPLUSARGS_INQ(int rbits, const string& ld, QData& rdr) {
IData rwp[2]; WData rwp[2];
IData got = VL_VALUEPLUSARGS_INW(rbits,ld,rwp); IData got = VL_VALUEPLUSARGS_INW(rbits,ld,rwp);
if (got) rdr = VL_SET_QW(rwp); if (got) rdr = VL_SET_QW(rwp);
return got; return got;

View File

@ -1255,7 +1255,7 @@ void vpi_get_time(vpiHandle object, p_vpi_time time_p) {
} }
if (time_p->type == vpiSimTime) { if (time_p->type == vpiSimTime) {
QData qtime = VL_TIME_Q(); QData qtime = VL_TIME_Q();
IData itime[2]; WData itime[2];
VL_SET_WQ(itime, qtime); VL_SET_WQ(itime, qtime);
time_p->low = itime[0]; time_p->low = itime[0];
time_p->high = itime[1]; time_p->high = itime[1];