read_vcd id->values

Signed-off-by: James Cherry <cherry@parallaxsw.com>
This commit is contained in:
James Cherry 2022-10-25 18:00:40 -07:00
parent 20ed9e5537
commit bd4e4e77a1
1 changed files with 18 additions and 44 deletions

View File

@ -61,12 +61,11 @@ private:
void makeVarIdMap(); void makeVarIdMap();
void appendVarValue(string id, void appendVarValue(string id,
char value); char value);
size_t varMaxValueCount();
VarTime varMinTimeDelta(); VarTime varMinTimeDelta();
string getToken(); string getToken();
string readStmtString(); string readStmtString();
vector<string> readStmtTokens(); vector<string> readStmtTokens();
VcdValues &values(VcdVar &var);
gzFile stream_; gzFile stream_;
string token_; string token_;
@ -83,7 +82,7 @@ private:
vector<VcdVar> vars_; vector<VcdVar> vars_;
size_t max_var_name_length_; size_t max_var_name_length_;
int max_var_width_; int max_var_width_;
map<string, VcdVar*> id_var_map_; map<string, VcdValues> id_values_map_;
VarTime time_; VarTime time_;
VarTime time_max_; VarTime time_max_;
}; };
@ -100,18 +99,12 @@ public:
VarType type() const { return type_; } VarType type() const { return type_; }
int width() const { return width_; } int width() const { return width_; }
const string& id() const { return id_; } const string& id() const { return id_; }
void pushValue(VarTime time,
char value);
void pushBusValue(VarTime time,
VarTime bus_value);
VcdValues values() { return values_; }
private: private:
string name_; string name_;
VarType type_; VarType type_;
int width_; int width_;
string id_; string id_;
VcdValues values_;
}; };
class VcdValue class VcdValue
@ -268,15 +261,13 @@ VcdReader::parseUpscope()
readStmtTokens(); readStmtTokens();
} }
// vars_ grows so the map has to be built after the vars. // Make entries for each ID used by variables.
void void
VcdReader::makeVarIdMap() VcdReader::makeVarIdMap()
{ {
for (VcdVar &var : vars_) { for (VcdVar &var : vars_) {
const string &id = var.id(); const string &id = var.id();
// Use the first variable definition which has the highest scope. id_values_map_[id].clear();
if (id_var_map_.find(id) == id_var_map_.end())
id_var_map_[id] = &var;
} }
} }
@ -306,12 +297,12 @@ VcdReader::parseVarValues()
char *end; char *end;
int64_t bus_value = strtol(bin.c_str(), &end, 2); int64_t bus_value = strtol(bin.c_str(), &end, 2);
string id = getToken(); string id = getToken();
auto var_itr = id_var_map_.find(id); auto values_itr = id_values_map_.find(id);
if (var_itr == id_var_map_.end()) if (values_itr == id_values_map_.end())
report_->fileError(804, filename_, stmt_line_, report_->fileError(804, filename_, stmt_line_,
"unknown variable %s", id.c_str()); "unknown variable %s", id.c_str());
VcdVar *var = var_itr->second; VcdValues &values = values_itr->second;
var->pushBusValue(time_, bus_value); values.push_back(VcdValue(time_, '\0', bus_value));
} }
} }
token = getToken(); token = getToken();
@ -323,29 +314,27 @@ void
VcdReader::appendVarValue(string id, VcdReader::appendVarValue(string id,
char value) char value)
{ {
auto var_itr = id_var_map_.find(id); auto values_itr = id_values_map_.find(id);
if (var_itr == id_var_map_.end()) if (values_itr == id_values_map_.end())
report_->fileError(805, filename_, stmt_line_, report_->fileError(805, filename_, stmt_line_,
"Unknown variable %s", id.c_str()); "Unknown variable %s", id.c_str());
VcdVar *var = var_itr->second; VcdValues &values = values_itr->second;
var->pushValue(time_, value); values.push_back(VcdValue(time_, value, 0));
} }
size_t VcdValues &
VcdReader::varMaxValueCount() VcdReader::values(VcdVar &var)
{ {
size_t max_count = 0; return id_values_map_[var.id()];
for (VcdVar &var : vars_)
max_count = max(max_count, var.values().size());
return max_count;
} }
VarTime VarTime
VcdReader::varMinTimeDelta() VcdReader::varMinTimeDelta()
{ {
VarTime min_delta = std::numeric_limits<VarTime>::max(); VarTime min_delta = std::numeric_limits<VarTime>::max();
for (VcdVar &var : vars_) { for (VcdVar &var : vars_) {
const VcdValues &var_values = var.values(); const VcdValues &var_values = values(var);
if (!var_values.empty()) { if (!var_values.empty()) {
VarTime prev_time = var_values[0].time(); VarTime prev_time = var_values[0].time();
for (const VcdValue &value : var_values) { for (const VcdValue &value : var_values) {
@ -425,8 +414,7 @@ VcdReader::reportWaveforms()
printf(" %-*s", printf(" %-*s",
static_cast<int>(max_var_name_length_), static_cast<int>(max_var_name_length_),
var.name().c_str()); var.name().c_str());
// WRONG - copies vector const VcdValues &var_values = values(var);
VcdValues var_values = var.values();
if (!var_values.empty()) { if (!var_values.empty()) {
size_t value_index = 0; size_t value_index = 0;
VcdValue var_value = var_values[value_index]; VcdValue var_value = var_values[value_index];
@ -485,20 +473,6 @@ VcdVar::VcdVar(string name,
{ {
} }
void
VcdVar::pushValue(VarTime time,
char value)
{
values_.push_back(VcdValue(time, value, 0));
}
void
VcdVar::pushBusValue(VarTime time,
int64_t bus_value)
{
values_.push_back(VcdValue(time, '\0', bus_value));
}
VcdValue::VcdValue(VarTime time, VcdValue::VcdValue(VarTime time,
char value, char value,
uint64_t bus_value) : uint64_t bus_value) :