read vcd reorg as class
Signed-off-by: James Cherry <cherry@parallaxsw.com>
This commit is contained in:
parent
ca29f41613
commit
3ba89a1a9c
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue