read_vcd id->values
Signed-off-by: James Cherry <cherry@parallaxsw.com>
This commit is contained in:
parent
20ed9e5537
commit
bd4e4e77a1
|
|
@ -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) :
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue