read_power_activities escaped bus name issue

Signed-off-by: James Cherry <cherry@parallaxsw.com>
This commit is contained in:
James Cherry 2023-10-16 20:44:39 -07:00
parent b00ac00485
commit 8f5216dc13
2 changed files with 34 additions and 26 deletions

View File

@ -131,36 +131,42 @@ ReadVcdActivities::setVarActivity(VcdVar *var,
string &var_name, string &var_name,
const VcdValues &var_values) const VcdValues &var_values)
{ {
string sta_name = netVerilogToSta(var_name.c_str()); if (var->width() == 1) {
if (var->width() == 1) string sta_name = netVerilogToSta(var_name.c_str());
setVarActivity(sta_name.c_str(), var_values, 0); setVarActivity(sta_name.c_str(), var_values, 0);
}
else { else {
bool is_bus, is_range, subscript_wild; bool is_bus, is_range, subscript_wild;
string bus_name; string bus_name;
int from, to; int from, to;
parseBusName(sta_name.c_str(), '[', ']', '\\', parseBusName(var_name.c_str(), '[', ']', '\\',
is_bus, is_range, bus_name, from, to, subscript_wild); is_bus, is_range, bus_name, from, to, subscript_wild);
int value_bit = 0; if (is_bus) {
if (to < from) { string sta_bus_name = netVerilogToSta(bus_name.c_str());
for (int bus_bit = to; bus_bit <= from; bus_bit++) { int value_bit = 0;
string pin_name = bus_name; if (to < from) {
pin_name += '['; for (int bus_bit = to; bus_bit <= from; bus_bit++) {
pin_name += to_string(bus_bit); string pin_name = sta_bus_name;
pin_name += ']'; pin_name += '[';
setVarActivity(pin_name.c_str(), var_values, value_bit); pin_name += to_string(bus_bit);
value_bit++; pin_name += ']';
} setVarActivity(pin_name.c_str(), var_values, value_bit);
} value_bit++;
else { }
for (int bus_bit = to; bus_bit >= from; bus_bit--) { }
string pin_name = bus_name; else {
pin_name += '['; for (int bus_bit = to; bus_bit >= from; bus_bit--) {
pin_name += to_string(bus_bit); string pin_name = sta_bus_name;
pin_name += ']'; pin_name += '[';
setVarActivity(pin_name.c_str(), var_values, value_bit); pin_name += to_string(bus_bit);
value_bit++; pin_name += ']';
setVarActivity(pin_name.c_str(), var_values, value_bit);
value_bit++;
}
} }
} }
else
report_->warn(807, "problem parsing bus %s.", var_name.c_str());
} }
} }
@ -185,8 +191,6 @@ ReadVcdActivities::setVarActivity(const char *pin_name,
else { else {
power_->setUserActivity(pin, activity, duty, power_->setUserActivity(pin, activity, duty,
PwrActivityOrigin::user); PwrActivityOrigin::user);
if (annotated_pins_.hasKey(pin))
printf("luse\n");
annotated_pins_.insert(pin); annotated_pins_.insert(pin);
} }
} }

View File

@ -194,7 +194,7 @@ VcdReader::parseVar()
type_name.c_str()); type_name.c_str());
else { else {
int width = stoi(tokens[1]); int width = stoi(tokens[1]);
string id = tokens[2]; string &id = tokens[2];
string name; string name;
for (string &context : scope_) { for (string &context : scope_) {
@ -203,8 +203,12 @@ VcdReader::parseVar()
} }
name += tokens[3]; name += tokens[3];
// iverilog separates bus base name from bit range. // iverilog separates bus base name from bit range.
if (tokens.size() == 5) if (tokens.size() == 5) {
// Preserve space after esacaped name.
if (name[0] == '\\')
name += ' ';
name += tokens[4]; name += tokens[4];
}
vcd_->makeVar(name, type, width, id); vcd_->makeVar(name, type, width, id);
} }