From 3e5a30bf33cf63bfe5eef1eda9d5ae7b783a08d1 Mon Sep 17 00:00:00 2001 From: James Cherry Date: Wed, 26 Oct 2022 14:35:25 -0700 Subject: [PATCH] factor reportWaveforms out of Vcd Signed-off-by: James Cherry --- search/ReadVcd.cc | 152 ++++++++++++++++++++++++---------------------- 1 file changed, 81 insertions(+), 71 deletions(-) diff --git a/search/ReadVcd.cc b/search/ReadVcd.cc index 045d50c5..3bdae7f9 100644 --- a/search/ReadVcd.cc +++ b/search/ReadVcd.cc @@ -72,7 +72,6 @@ class Vcd : public StaState public: Vcd(StaState *sta); VcdValues &values(VcdVar &var); - void reportWaveforms(); const string &date() const { return date_; } void setDate(const string &date); @@ -89,10 +88,13 @@ public: void setTimeMax(VarTime time_max); VarTime minDeltaTime() const { return min_delta_time_; } void setMinDeltaTime(VarTime min_delta_time); + vector vars() { return vars_; } void makeVar(string &name, VcdVar::VarType type, int width, string &id); + int maxVarWidth() const { return max_var_width_; } + int maxVarNameLength() const { return max_var_name_length_; } bool varIdValid(string &id); void varAppendValue(string &id, VarTime time, @@ -134,6 +136,10 @@ private: uint64_t bus_value_; }; +static void +reportWaveforms(Vcd &vcd, + Report *report); + //////////////////////////////////////////////////////////////// class VcdReader : public StaState @@ -172,7 +178,7 @@ readVcdFile(const char *filename, { VcdReader reader(sta); Vcd vcd = reader.read(filename); - vcd.reportWaveforms(); + reportWaveforms(vcd, sta->report()); } Vcd @@ -435,75 +441,6 @@ Vcd::Vcd(StaState *sta) : { } -void -Vcd::reportWaveforms() -{ - report_->reportLine("Date: %s", date_.c_str()); - report_->reportLine("Timescale: %.2f%s", time_scale_, time_unit_.c_str()); - // Characters per time sample. - int zoom = (max_var_width_ + 7) / 4; - int time_delta = min_delta_time_; - - for (VcdVar &var : vars_) { - string line; - stringPrint(line, " %-*s", - static_cast(max_var_name_length_), - var.name().c_str()); - const VcdValues &var_values = values(var); - if (!var_values.empty()) { - size_t value_index = 0; - VcdValue var_value = var_values[value_index]; - VcdValue prev_var_value = var_values[value_index]; - VarTime next_value_time = var_values[value_index + 1].time(); - for (double time = 0.0; time < time_max_; time += time_delta) { - if (time >= next_value_time) { - if (value_index < var_values.size() - 1) - value_index++; - var_value = var_values[value_index]; - if (value_index < var_values.size()) - next_value_time = var_values[value_index + 1].time(); - } - if (var_value.value()) { - // 01UZX - char value = var_value.value(); - char prev_value = prev_var_value.value(); - if (var.width() == 1) { - if (value == '0' || value == '1') { - for (int z = 0; z < zoom; z++) { - if (z == 0 - && value != prev_value - && (prev_value == '0' - || prev_value == '1')) - line += (prev_value == '1') ? "╲" : "╱"; - else - line += (value == '1') ? "▔" : "▁"; - } - } - else { - string field; - stringPrint(field, "%-*c", zoom, value); - line += field; - } - } - else { - string field; - stringPrint(field, "%-*c", zoom, value); - line += field; - } - } - else { - // bus - string field; - stringPrint(field, "%-*llX", zoom, var_value.busValue()); - line += field; - } - prev_var_value = var_value; - } - } - report_->reportLineString(line); - } -} - //////////////////////////////////////////////////////////////// void @@ -623,4 +560,77 @@ VcdValue::VcdValue(VarTime time, { } +//////////////////////////////////////////////////////////////// + +static void +reportWaveforms(Vcd &vcd, + Report *report) +{ + report->reportLine("Date: %s", vcd.date().c_str()); + report->reportLine("Timescale: %.2f%s", vcd.timeScale(), vcd.timeUnit().c_str()); + // Characters per time sample. + int zoom = (vcd.maxVarWidth() + 7) / 4; + int time_delta = vcd.minDeltaTime(); + + int max_var_name_length = vcd.maxVarNameLength(); + for (VcdVar &var : vcd.vars()) { + string line; + stringPrint(line, " %-*s", + static_cast(max_var_name_length), + var.name().c_str()); + const VcdValues &var_values = vcd.values(var); + if (!var_values.empty()) { + size_t value_index = 0; + VcdValue var_value = var_values[value_index]; + VcdValue prev_var_value = var_values[value_index]; + VarTime next_value_time = var_values[value_index + 1].time(); + for (double time = 0.0; time < vcd.timeMax(); time += time_delta) { + if (time >= next_value_time) { + if (value_index < var_values.size() - 1) + value_index++; + var_value = var_values[value_index]; + if (value_index < var_values.size()) + next_value_time = var_values[value_index + 1].time(); + } + if (var_value.value()) { + // 01UZX + char value = var_value.value(); + char prev_value = prev_var_value.value(); + if (var.width() == 1) { + if (value == '0' || value == '1') { + for (int z = 0; z < zoom; z++) { + if (z == 0 + && value != prev_value + && (prev_value == '0' + || prev_value == '1')) + line += (prev_value == '1') ? "╲" : "╱"; + else + line += (value == '1') ? "▔" : "▁"; + } + } + else { + string field; + stringPrint(field, "%-*c", zoom, value); + line += field; + } + } + else { + string field; + stringPrint(field, "%-*c", zoom, value); + line += field; + } + } + else { + // bus + string field; + stringPrint(field, "%-*llX", zoom, var_value.busValue()); + line += field; + } + prev_var_value = var_value; + } + } + report->reportLineString(line); + } +} + }