read vcd reorg as class

Signed-off-by: James Cherry <cherry@parallaxsw.com>
This commit is contained in:
James Cherry 2022-10-30 13:49:38 -07:00
parent ca29f41613
commit 3ba89a1a9c
1 changed files with 65 additions and 51 deletions

View File

@ -31,62 +31,83 @@ using std::min;
using std::swap; using std::swap;
using std::to_string; using std::to_string;
static void class ReadVcdActivities : public StaState
setVcdActivities(Vcd &vcd, {
const char *scope, public:
Sta *sta); ReadVcdActivities(const char *filename,
static void const char *scope,
findVarActivity(const char *pin_name, Sta *sta);
int value_bit, void readActivities();
const VcdValues &var_values,
Vcd &vcd,
float clk_period,
Debug *debug,
Network *network,
Power *power);
//////////////////////////////////////////////////////////////// private:
void setActivities();
void findVarActivity(const char *pin_name,
int value_bit,
const VcdValues &var_values);
const char *filename_;
const char *scope_;
Vcd vcd_;
float clk_period_;
Sta *sta_;
Power *power_;
};
void void
readVcdActivities(const char *filename, readVcdActivities(const char *filename,
const char *scope, const char *scope,
Sta *sta) Sta *sta)
{ {
Vcd vcd = readVcdFile(filename, sta); ReadVcdActivities reader(filename, scope, sta);
setVcdActivities(vcd, scope, sta); reader.readActivities();
} }
static void ReadVcdActivities::ReadVcdActivities(const char *filename,
setVcdActivities(Vcd &vcd, const char *scope,
const char *scope, Sta *sta) :
Sta *sta) StaState(sta),
filename_(filename),
scope_(scope),
vcd_(sta),
sta_(sta),
power_(sta->power())
{ {
Debug *debug = sta->debug(); }
Network *network = sta->network();
Power *power = sta->power();
float clk_period = INF; void
size_t scope_length = strlen(scope); ReadVcdActivities::readActivities()
for (Clock *clk : *sta->sdc()->clocks()) {
clk_period = min(clk->period(), clk_period); vcd_ = readVcdFile(filename_, sta_);
for (VcdVar &var : vcd.vars()) { clk_period_ = INF;
const VcdValues &var_values = vcd.values(var); for (Clock *clk : *sta_->sdc()->clocks())
clk_period_ = min(clk->period(), clk_period_);
//checkClkPeriods();
setActivities();
}
void
ReadVcdActivities::setActivities()
{
size_t scope_length = strlen(scope_);
for (VcdVar &var : vcd_.vars()) {
const VcdValues &var_values = vcd_.values(var);
if (!var_values.empty() if (!var_values.empty()
&& (var.type() == VcdVarType::wire && (var.type() == VcdVarType::wire
|| var.type() == VcdVarType::reg)) { || var.type() == VcdVarType::reg)) {
string var_name = var.name(); string var_name = var.name();
// string::starts_with in c++20 // string::starts_with in c++20
if (scope_length if (scope_length
&& var_name.substr(0, scope_length) == scope) && var_name.substr(0, scope_length) == scope_)
var_name = var_name.substr(scope_length + 1); var_name = var_name.substr(scope_length + 1);
if (var_name[0] == '\\') if (var_name[0] == '\\')
var_name += ' '; var_name += ' ';
const char *sta_name = verilogToSta(var_name.c_str()); const char *sta_name = verilogToSta(var_name.c_str());
if (var.width() == 1) if (var.width() == 1)
findVarActivity(sta_name, 0, var_values, vcd, findVarActivity(sta_name, 0, var_values);
clk_period, debug, network, power);
else { else {
char *bus_name; char *bus_name;
int from, to; int from, to;
@ -99,8 +120,7 @@ setVcdActivities(Vcd &vcd,
pin_name += '['; pin_name += '[';
pin_name += to_string(bus_bit); pin_name += to_string(bus_bit);
pin_name += ']'; pin_name += ']';
findVarActivity(pin_name.c_str(), value_bit, var_values, vcd, findVarActivity(pin_name.c_str(), value_bit, var_values);
clk_period, debug, network, power);
value_bit++; value_bit++;
} }
} }
@ -110,8 +130,7 @@ setVcdActivities(Vcd &vcd,
pin_name += '['; pin_name += '[';
pin_name += to_string(bus_bit); pin_name += to_string(bus_bit);
pin_name += ']'; pin_name += ']';
findVarActivity(pin_name.c_str(), value_bit, var_values, vcd, findVarActivity(pin_name.c_str(), value_bit, var_values);
clk_period, debug, network, power);
value_bit++; value_bit++;
} }
} }
@ -120,15 +139,10 @@ setVcdActivities(Vcd &vcd,
} }
} }
static void void
findVarActivity(const char *pin_name, ReadVcdActivities::findVarActivity(const char *pin_name,
int value_bit, int value_bit,
const VcdValues &var_values, const VcdValues &var_values)
Vcd &vcd,
float clk_period,
Debug *debug,
Network *network,
Power *power)
{ {
int transition_count = 0; int transition_count = 0;
char prev_value = var_values[0].value(); char prev_value = var_values[0].value();
@ -147,23 +161,23 @@ findVarActivity(const char *pin_name,
prev_time = time; prev_time = time;
prev_value = value; prev_value = value;
} }
VcdTime time_max = vcd.timeMax(); VcdTime time_max = vcd_.timeMax();
if (prev_value == '1') if (prev_value == '1')
high_time += time_max - prev_time; high_time += time_max - prev_time;
float duty = static_cast<float>(high_time) / time_max; float duty = static_cast<float>(high_time) / time_max;
float activity = transition_count float activity = transition_count
/ (time_max * vcd.timeUnitScale() / clk_period); / (time_max * vcd_.timeUnitScale() / clk_period_);
Pin *pin = network->findPin(pin_name); Pin *pin = network_->findPin(pin_name);
if (pin) { if (pin) {
debugPrint(debug, "read_vcd_activities", 1, debugPrint(debug_, "read_vcd_activities", 1,
"%s transitions %d activity %.2f duty %.2f", "%s transitions %d activity %.2f duty %.2f",
pin_name, pin_name,
transition_count, transition_count,
activity, activity,
duty); duty);
power->setUserActivity(pin, activity, duty, power_->setUserActivity(pin, activity, duty,
PwrActivityOrigin::user); PwrActivityOrigin::user);
} }
} }