[#73220] move emitting functions to ActivityVar and remove duplicate code

This commit is contained in:
Mateusz Gancarz 2025-02-27 12:20:18 +01:00
parent 40bfe54ebc
commit 6ebc4fae7f
2 changed files with 44 additions and 37 deletions

View File

@ -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<CData>(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<SData>(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<IData>(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<QData>(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

View File

@ -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 <typename DataType>
VL_ATTR_ALWINLINE
void emitData(uint64_t time, DataType newval, uint32_t bits) {
static_assert(std::is_integral<DataType>::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);