diff --git a/power/ReadVcdActivities.cc b/power/ReadVcdActivities.cc index 8f53da0e..f151d75d 100644 --- a/power/ReadVcdActivities.cc +++ b/power/ReadVcdActivities.cc @@ -131,36 +131,42 @@ ReadVcdActivities::setVarActivity(VcdVar *var, string &var_name, 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); + } else { bool is_bus, is_range, subscript_wild; string bus_name; int from, to; - parseBusName(sta_name.c_str(), '[', ']', '\\', + parseBusName(var_name.c_str(), '[', ']', '\\', is_bus, is_range, bus_name, from, to, subscript_wild); - int value_bit = 0; - if (to < from) { - for (int bus_bit = to; bus_bit <= from; bus_bit++) { - string pin_name = bus_name; - pin_name += '['; - pin_name += to_string(bus_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; - pin_name += '['; - pin_name += to_string(bus_bit); - pin_name += ']'; - setVarActivity(pin_name.c_str(), var_values, value_bit); - value_bit++; + if (is_bus) { + string sta_bus_name = netVerilogToSta(bus_name.c_str()); + int value_bit = 0; + if (to < from) { + for (int bus_bit = to; bus_bit <= from; bus_bit++) { + string pin_name = sta_bus_name; + pin_name += '['; + pin_name += to_string(bus_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 = sta_bus_name; + pin_name += '['; + pin_name += to_string(bus_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 { power_->setUserActivity(pin, activity, duty, PwrActivityOrigin::user); - if (annotated_pins_.hasKey(pin)) - printf("luse\n"); annotated_pins_.insert(pin); } } diff --git a/power/VcdReader.cc b/power/VcdReader.cc index 8c6ff5c8..7d990dee 100644 --- a/power/VcdReader.cc +++ b/power/VcdReader.cc @@ -194,7 +194,7 @@ VcdReader::parseVar() type_name.c_str()); else { int width = stoi(tokens[1]); - string id = tokens[2]; + string &id = tokens[2]; string name; for (string &context : scope_) { @@ -203,8 +203,12 @@ VcdReader::parseVar() } name += tokens[3]; // 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]; + } vcd_->makeVar(name, type, width, id); }