mirror of
https://github.com/verilator/verilator.git
synced 2025-01-01 04:07:34 +00:00
Internals: Mark some VL_PURE functions. No functional change.
This commit is contained in:
parent
04f68cbd99
commit
e6da59eecd
@ -586,7 +586,7 @@ static inline WDataOutP VL_EXTENDS_WW(int obits, int lbits, WDataOutP owp,
|
||||
// EMIT_RULE: VL_REDAND: oclean=clean; lclean==clean; obits=1;
|
||||
#define VL_REDAND_II(lbits, lhs) ((lhs) == VL_MASK_I(lbits))
|
||||
#define VL_REDAND_IQ(lbits, lhs) ((lhs) == VL_MASK_Q(lbits))
|
||||
static inline IData VL_REDAND_IW(int lbits, WDataInP const lwp) VL_MT_SAFE {
|
||||
static inline IData VL_REDAND_IW(int lbits, WDataInP const lwp) VL_PURE {
|
||||
const int words = VL_WORDS_I(lbits);
|
||||
EData combine = lwp[0];
|
||||
for (int i = 1; i < words - 1; ++i) combine &= lwp[i];
|
||||
@ -597,7 +597,7 @@ static inline IData VL_REDAND_IW(int lbits, WDataInP const lwp) VL_MT_SAFE {
|
||||
// EMIT_RULE: VL_REDOR: oclean=clean; lclean==clean; obits=1;
|
||||
#define VL_REDOR_I(lhs) ((lhs) != 0)
|
||||
#define VL_REDOR_Q(lhs) ((lhs) != 0)
|
||||
static inline IData VL_REDOR_W(int words, WDataInP const lwp) VL_MT_SAFE {
|
||||
static inline IData VL_REDOR_W(int words, WDataInP const lwp) VL_PURE {
|
||||
EData equal = 0;
|
||||
for (int i = 0; i < words; ++i) equal |= lwp[i];
|
||||
return (equal != 0);
|
||||
@ -664,7 +664,7 @@ static inline IData VL_REDXOR_64(QData r) VL_PURE {
|
||||
return static_cast<IData>(r);
|
||||
#endif
|
||||
}
|
||||
static inline IData VL_REDXOR_W(int words, WDataInP const lwp) VL_MT_SAFE {
|
||||
static inline IData VL_REDXOR_W(int words, WDataInP const lwp) VL_PURE {
|
||||
EData r = lwp[0];
|
||||
for (int i = 1; i < words; ++i) r ^= lwp[i];
|
||||
return VL_REDXOR_32(r);
|
||||
@ -683,7 +683,7 @@ static inline IData VL_COUNTONES_Q(QData lhs) VL_PURE {
|
||||
return VL_COUNTONES_I(static_cast<IData>(lhs)) + VL_COUNTONES_I(static_cast<IData>(lhs >> 32));
|
||||
}
|
||||
#define VL_COUNTONES_E VL_COUNTONES_I
|
||||
static inline IData VL_COUNTONES_W(int words, WDataInP const lwp) VL_MT_SAFE {
|
||||
static inline IData VL_COUNTONES_W(int words, WDataInP const lwp) VL_PURE {
|
||||
EData r = 0;
|
||||
for (int i = 0; i < words; ++i) r += VL_COUNTONES_E(lwp[i]);
|
||||
return r;
|
||||
@ -725,7 +725,7 @@ static inline IData VL_ONEHOT_I(IData lhs) VL_PURE {
|
||||
static inline IData VL_ONEHOT_Q(QData lhs) VL_PURE {
|
||||
return (((lhs & (lhs - 1)) == 0) & (lhs != 0));
|
||||
}
|
||||
static inline IData VL_ONEHOT_W(int words, WDataInP const lwp) VL_MT_SAFE {
|
||||
static inline IData VL_ONEHOT_W(int words, WDataInP const lwp) VL_PURE {
|
||||
EData one = 0;
|
||||
for (int i = 0; (i < words); ++i) {
|
||||
if (lwp[i]) {
|
||||
@ -739,7 +739,7 @@ static inline IData VL_ONEHOT_W(int words, WDataInP const lwp) VL_MT_SAFE {
|
||||
|
||||
static inline IData VL_ONEHOT0_I(IData lhs) VL_PURE { return ((lhs & (lhs - 1)) == 0); }
|
||||
static inline IData VL_ONEHOT0_Q(QData lhs) VL_PURE { return ((lhs & (lhs - 1)) == 0); }
|
||||
static inline IData VL_ONEHOT0_W(int words, WDataInP const lwp) VL_MT_SAFE {
|
||||
static inline IData VL_ONEHOT0_W(int words, WDataInP const lwp) VL_PURE {
|
||||
bool one = false;
|
||||
for (int i = 0; (i < words); ++i) {
|
||||
if (lwp[i]) {
|
||||
@ -766,7 +766,7 @@ static inline IData VL_CLOG2_Q(QData lhs) VL_PURE {
|
||||
for (; lhs != 0; ++shifts) lhs = lhs >> 1ULL;
|
||||
return shifts;
|
||||
}
|
||||
static inline IData VL_CLOG2_W(int words, WDataInP const lwp) VL_MT_SAFE {
|
||||
static inline IData VL_CLOG2_W(int words, WDataInP const lwp) VL_PURE {
|
||||
const EData adjust = (VL_COUNTONES_W(words, lwp) == 1) ? 0 : 1;
|
||||
for (int i = words - 1; i >= 0; --i) {
|
||||
if (VL_UNLIKELY(lwp[i])) { // Shorter worst case if predict not taken
|
||||
@ -781,7 +781,7 @@ static inline IData VL_CLOG2_W(int words, WDataInP const lwp) VL_MT_SAFE {
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline IData VL_MOSTSETBITP1_W(int words, WDataInP const lwp) VL_MT_SAFE {
|
||||
static inline IData VL_MOSTSETBITP1_W(int words, WDataInP const lwp) VL_PURE {
|
||||
// MSB set bit plus one; similar to FLS. 0=value is zero
|
||||
for (int i = words - 1; i >= 0; --i) {
|
||||
if (VL_UNLIKELY(lwp[i])) { // Shorter worst case if predict not taken
|
||||
@ -810,7 +810,7 @@ static inline WDataOutP VL_OR_W(int words, WDataOutP owp, WDataInP const lwp,
|
||||
return owp;
|
||||
}
|
||||
// EMIT_RULE: VL_CHANGEXOR: oclean=1; obits=32; lbits==rbits;
|
||||
static inline IData VL_CHANGEXOR_W(int words, WDataInP const lwp, WDataInP const rwp) VL_MT_SAFE {
|
||||
static inline IData VL_CHANGEXOR_W(int words, WDataInP const lwp, WDataInP const rwp) VL_PURE {
|
||||
IData od = 0;
|
||||
for (int i = 0; (i < words); ++i) od |= (lwp[i] ^ rwp[i]);
|
||||
return od;
|
||||
@ -843,14 +843,14 @@ static inline WDataOutP VL_NOT_W(int words, WDataOutP owp, WDataInP const lwp) V
|
||||
#define VL_GTE_W(words, lwp, rwp) (_vl_cmp_w(words, lwp, rwp) >= 0)
|
||||
|
||||
// Output clean, <lhs> AND <rhs> MUST BE CLEAN
|
||||
static inline IData VL_EQ_W(int words, WDataInP const lwp, WDataInP const rwp) VL_MT_SAFE {
|
||||
static inline IData VL_EQ_W(int words, WDataInP const lwp, WDataInP const rwp) VL_PURE {
|
||||
EData nequal = 0;
|
||||
for (int i = 0; (i < words); ++i) nequal |= (lwp[i] ^ rwp[i]);
|
||||
return (nequal == 0);
|
||||
}
|
||||
|
||||
// Internal usage
|
||||
static inline int _vl_cmp_w(int words, WDataInP const lwp, WDataInP const rwp) VL_MT_SAFE {
|
||||
static inline int _vl_cmp_w(int words, WDataInP const lwp, WDataInP const rwp) VL_PURE {
|
||||
for (int i = words - 1; i >= 0; --i) {
|
||||
if (lwp[i] > rwp[i]) return 1;
|
||||
if (lwp[i] < rwp[i]) return -1;
|
||||
@ -909,7 +909,7 @@ static inline IData VL_LTES_IQQ(int lbits, QData lhs, QData rhs) VL_PURE {
|
||||
return lhs_signed <= rhs_signed;
|
||||
}
|
||||
|
||||
static inline int _vl_cmps_w(int lbits, WDataInP const lwp, WDataInP const rwp) VL_MT_SAFE {
|
||||
static inline int _vl_cmps_w(int lbits, WDataInP const lwp, WDataInP const rwp) VL_PURE {
|
||||
const int words = VL_WORDS_I(lbits);
|
||||
int i = words - 1;
|
||||
// We need to flip sense if negative comparison
|
||||
|
@ -197,7 +197,7 @@ public:
|
||||
/// zero in memory, but during intermediate operations in the Verilated
|
||||
/// internals is unpredictable.
|
||||
|
||||
static int _vl_cmp_w(int words, WDataInP const lwp, WDataInP const rwp) VL_MT_SAFE;
|
||||
static int _vl_cmp_w(int words, WDataInP const lwp, WDataInP const rwp) VL_PURE;
|
||||
|
||||
template <std::size_t T_Words>
|
||||
struct VlWide final {
|
||||
|
@ -732,11 +732,11 @@ public:
|
||||
}
|
||||
VL_FATAL_MT(__FILE__, __LINE__, "", "vpi_unsupported called without error info set");
|
||||
}
|
||||
static const char* strFromVpiVal(PLI_INT32 vpiVal) VL_MT_SAFE;
|
||||
static const char* strFromVpiObjType(PLI_INT32 vpiVal) VL_MT_SAFE;
|
||||
static const char* strFromVpiMethod(PLI_INT32 vpiVal) VL_MT_SAFE;
|
||||
static const char* strFromVpiCallbackReason(PLI_INT32 vpiVal) VL_MT_SAFE;
|
||||
static const char* strFromVpiProp(PLI_INT32 vpiVal) VL_MT_SAFE;
|
||||
static const char* strFromVpiVal(PLI_INT32 vpiVal) VL_PURE;
|
||||
static const char* strFromVpiObjType(PLI_INT32 vpiVal) VL_PURE;
|
||||
static const char* strFromVpiMethod(PLI_INT32 vpiVal) VL_PURE;
|
||||
static const char* strFromVpiCallbackReason(PLI_INT32 vpiVal) VL_PURE;
|
||||
static const char* strFromVpiProp(PLI_INT32 vpiVal) VL_PURE;
|
||||
};
|
||||
|
||||
//======================================================================
|
||||
@ -775,7 +775,7 @@ VerilatedVpiError* VerilatedVpiImp::error_info() VL_MT_UNSAFE_ONE {
|
||||
//======================================================================
|
||||
// VerilatedVpiError Methods
|
||||
|
||||
const char* VerilatedVpiError::strFromVpiVal(PLI_INT32 vpiVal) VL_MT_SAFE {
|
||||
const char* VerilatedVpiError::strFromVpiVal(PLI_INT32 vpiVal) VL_PURE {
|
||||
// clang-format off
|
||||
static const char* const names[] = {
|
||||
"*undefined*",
|
||||
@ -802,7 +802,7 @@ const char* VerilatedVpiError::strFromVpiVal(PLI_INT32 vpiVal) VL_MT_SAFE {
|
||||
if (VL_UNCOVERABLE(vpiVal < 0)) return names[0];
|
||||
return names[(vpiVal <= vpiRawFourStateVal) ? vpiVal : 0];
|
||||
}
|
||||
const char* VerilatedVpiError::strFromVpiObjType(PLI_INT32 vpiVal) VL_MT_SAFE {
|
||||
const char* VerilatedVpiError::strFromVpiObjType(PLI_INT32 vpiVal) VL_PURE {
|
||||
// clang-format off
|
||||
static const char* const names[] = {
|
||||
"*undefined*",
|
||||
@ -947,7 +947,7 @@ const char* VerilatedVpiError::strFromVpiObjType(PLI_INT32 vpiVal) VL_MT_SAFE {
|
||||
if (VL_UNCOVERABLE(vpiVal < 0)) return names[0];
|
||||
return names[(vpiVal <= vpiAutomatics) ? vpiVal : 0];
|
||||
}
|
||||
const char* VerilatedVpiError::strFromVpiMethod(PLI_INT32 vpiVal) VL_MT_SAFE {
|
||||
const char* VerilatedVpiError::strFromVpiMethod(PLI_INT32 vpiVal) VL_PURE {
|
||||
// clang-format off
|
||||
static const char* const names[] = {
|
||||
"vpiCondition",
|
||||
@ -990,7 +990,7 @@ const char* VerilatedVpiError::strFromVpiMethod(PLI_INT32 vpiVal) VL_MT_SAFE {
|
||||
return names[vpiVal - vpiCondition];
|
||||
}
|
||||
|
||||
const char* VerilatedVpiError::strFromVpiCallbackReason(PLI_INT32 vpiVal) VL_MT_SAFE {
|
||||
const char* VerilatedVpiError::strFromVpiCallbackReason(PLI_INT32 vpiVal) VL_PURE {
|
||||
// clang-format off
|
||||
static const char* const names[] = {
|
||||
"*undefined*",
|
||||
@ -1031,7 +1031,7 @@ const char* VerilatedVpiError::strFromVpiCallbackReason(PLI_INT32 vpiVal) VL_MT_
|
||||
return names[(vpiVal <= cbAtEndOfSimTime) ? vpiVal : 0];
|
||||
}
|
||||
|
||||
const char* VerilatedVpiError::strFromVpiProp(PLI_INT32 vpiVal) VL_MT_SAFE {
|
||||
const char* VerilatedVpiError::strFromVpiProp(PLI_INT32 vpiVal) VL_PURE {
|
||||
// clang-format off
|
||||
static const char* const names[] = {
|
||||
"*undefined or other*",
|
||||
|
@ -275,7 +275,7 @@ public:
|
||||
}
|
||||
|
||||
private:
|
||||
static constexpr int bitsToWords(int bitsCount) VL_MT_SAFE { return (bitsCount + 31) / 32; }
|
||||
static constexpr int bitsToWords(int bitsCount) VL_PURE { return (bitsCount + 31) / 32; }
|
||||
|
||||
bool isNumber() const VL_MT_SAFE {
|
||||
return m_type == V3NumberDataType::DOUBLE || m_type == V3NumberDataType::LOGIC;
|
||||
|
Loading…
Reference in New Issue
Block a user