diff --git a/include/verilated_saif_c.cpp b/include/verilated_saif_c.cpp index 3ea02ac3d..25ed11a27 100644 --- a/include/verilated_saif_c.cpp +++ b/include/verilated_saif_c.cpp @@ -64,6 +64,25 @@ //============================================================================= // ActivityVar +VL_ATTR_ALWINLINE +void ActivityVar::emitBit(uint64_t time, CData newval) { + assert(m_lastTime <= time); + m_bits[0].aggregateVal(time - m_lastTime, newval); + updateLastTime(time); +} + +VL_ATTR_ALWINLINE +void ActivityVar::emitWData(uint64_t time, const WData* newvalp, uint32_t bits) { + assert(m_lastTime <= time); + uint64_t dt = time - m_lastTime; + for (std::size_t i = 0; i < std::min(m_width, bits); ++i) { + size_t wordIndex = i / VL_EDATASIZE; + m_bits[i].aggregateVal(dt, (newvalp[wordIndex] >> VL_BITBIT_E(i)) & 1); + } + + updateLastTime(time); +} + ActivityBit& ActivityVar::getBit(std::size_t index) { assert(index < m_width); @@ -327,6 +346,8 @@ bool VerilatedSaif::printActivityStats(uint32_t activityCode, const char* activi printStr("))\n"); } + activity.updateLastTime(m_time); + return anyNetValid; } @@ -501,72 +522,42 @@ VL_ATTR_ALWINLINE void VerilatedSaifBuffer::emitBit(uint32_t code, CData newval) { assert(m_owner.m_activity.count(code) && "Activity must be declared earlier"); ActivityVar& activity = m_owner.m_activity.at(code); - - ActivityBit& bit = activity.getBit(0); - bit.aggregateVal(m_owner.m_time - activity.getLastUpdateTime(), newval); - activity.updateLastTime(m_owner.m_time); + activity.emitBit(m_owner.m_time, newval); } VL_ATTR_ALWINLINE void VerilatedSaifBuffer::emitCData(uint32_t code, CData newval, int bits) { assert(m_owner.m_activity.count(code) && "Activity must be declared earlier"); ActivityVar& activity = m_owner.m_activity.at(code); - - uint64_t dt = m_owner.m_time - activity.getLastUpdateTime(); - for (size_t i = 0; i < activity.getWidth(); i++) { - activity.getBit(i).aggregateVal(dt, (newval >> i) & 1); - } - activity.updateLastTime(m_owner.m_time); + activity.emitData(m_owner.m_time, newval, bits); } VL_ATTR_ALWINLINE void VerilatedSaifBuffer::emitSData(uint32_t code, SData newval, int bits) { assert(m_owner.m_activity.count(code) && "Activity must be declared earlier"); ActivityVar& activity = m_owner.m_activity.at(code); - - uint64_t dt = m_owner.m_time - activity.getLastUpdateTime(); - for (size_t i = 0; i < activity.getWidth(); i++) { - activity.getBit(i).aggregateVal(dt, (newval >> i) & 1); - } - activity.updateLastTime(m_owner.m_time); + activity.emitData(m_owner.m_time, newval, bits); } VL_ATTR_ALWINLINE void VerilatedSaifBuffer::emitIData(uint32_t code, IData newval, int bits) { assert(m_owner.m_activity.count(code) && "Activity must be declared earlier"); ActivityVar& activity = m_owner.m_activity.at(code); - - uint64_t dt = m_owner.m_time - activity.getLastUpdateTime(); - for (size_t i = 0; i < activity.getWidth(); i++) { - activity.getBit(i).aggregateVal(dt, (newval >> i) & 1); - } - activity.updateLastTime(m_owner.m_time); + activity.emitData(m_owner.m_time, newval, bits); } VL_ATTR_ALWINLINE void VerilatedSaifBuffer::emitQData(uint32_t code, QData newval, int bits) { assert(m_owner.m_activity.count(code) && "Activity must be declared earlier"); ActivityVar& activity = m_owner.m_activity.at(code); - - uint64_t dt = m_owner.m_time - activity.getLastUpdateTime(); - for (size_t i = 0; i < activity.getWidth(); i++) { - activity.getBit(i).aggregateVal(dt, (newval >> i) & 1); - } - activity.updateLastTime(m_owner.m_time); + activity.emitData(m_owner.m_time, newval, bits); } VL_ATTR_ALWINLINE void VerilatedSaifBuffer::emitWData(uint32_t code, const WData* newvalp, int bits) { assert(m_owner.m_activity.count(code) && "Activity must be declared earlier"); ActivityVar& activity = m_owner.m_activity.at(code); - - uint64_t dt = m_owner.m_time - activity.getLastUpdateTime(); - for (std::size_t i = 0; i < activity.getWidth(); ++i) { - size_t wordIndex = i / VL_EDATASIZE; - activity.getBit(i).aggregateVal(dt, (newvalp[wordIndex] >> VL_BITBIT_E(i)) & 1); - } - - activity.updateLastTime(m_owner.m_time); + activity.emitWData(m_owner.m_time, newvalp, bits); } VL_ATTR_ALWINLINE diff --git a/include/verilated_saif_c.h b/include/verilated_saif_c.h index 7d2c252c8..dfd855644 100644 --- a/include/verilated_saif_c.h +++ b/include/verilated_saif_c.h @@ -40,6 +40,7 @@ public: VL_ATTR_ALWINLINE void aggregateVal(uint64_t dt, bool newVal) { m_transitions += newVal != m_lastVal ? 1 : 0; + assert(dt < 10000); m_highTime += m_lastVal ? dt : 0; m_lastVal = newVal; } @@ -69,6 +70,21 @@ public: ActivityVar& operator=(ActivityVar&&) = default; // METHODS + VL_ATTR_ALWINLINE void emitBit(uint64_t time, CData newval); + + template + VL_ATTR_ALWINLINE + void emitData(uint64_t time, DataType newval, uint32_t bits) { + static_assert(std::is_integral::value); + + uint64_t dt = time - m_lastTime; + for (size_t i = 0; i < std::min(m_width, bits); i++) { + m_bits[i].aggregateVal(dt, (newval >> i) & 1); + } + updateLastTime(time); + } + + VL_ATTR_ALWINLINE void emitWData(uint64_t time, const WData* newvalp, uint32_t bits); VL_ATTR_ALWINLINE void updateLastTime(uint64_t val) { m_lastTime = val; } // ACCESSORS @@ -156,7 +172,7 @@ private: void decrementIndent(); void printIndent(); - int m_indent = 0; // Indentation depth + int m_indent = 0; void printStr(const char* str);