From 8a02616465ae0182575ce5e168ae7379a8c46c79 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Wed, 26 Jan 2022 10:23:38 +0100 Subject: Add fstdata helper class --- kernel/fstdata.cc | 265 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ kernel/fstdata.h | 79 ++++++++++++++++ 2 files changed, 344 insertions(+) create mode 100644 kernel/fstdata.cc create mode 100644 kernel/fstdata.h (limited to 'kernel') diff --git a/kernel/fstdata.cc b/kernel/fstdata.cc new file mode 100644 index 000000000..e497ff7ad --- /dev/null +++ b/kernel/fstdata.cc @@ -0,0 +1,265 @@ +/* + * yosys -- Yosys Open SYnthesis Suite + * + * Copyright (C) 2022 Miodrag Milanovic + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + */ + +#include "kernel/fstdata.h" + +USING_YOSYS_NAMESPACE + +FstData::FstData(std::string filename) : ctx(nullptr) +{ + ctx = (fstReaderContext *)fstReaderOpen(filename.c_str()); + extractVarNames(); +} + +FstData::~FstData() +{ + if (ctx) + fstReaderClose(ctx); +} + +uint64_t FstData::getStartTime() { return fstReaderGetStartTime(ctx); } + +uint64_t FstData::getEndTime() { return fstReaderGetEndTime(ctx); } + +fstHandle FstData::getHandle(std::string name) { + if (name_to_handle.find(name) != name_to_handle.end()) + return name_to_handle[name]; + else + log("Not found key %s\n", name.c_str()); + return 0; +}; + +static std::string remove_spaces(std::string str) +{ + str.erase(std::remove(str.begin(), str.end(), ' '), str.end()); + return str; +} + +void FstData::extractVarNames() +{ + struct fstHier *h; + intptr_t snum = 0; + + while ((h = fstReaderIterateHier(ctx))) { + switch (h->htyp) { + case FST_HT_SCOPE: { + snum++; + std::string fst_scope_name = fstReaderPushScope(ctx, h->u.scope.name, (void *)(snum)); + scopes.push_back(fst_scope_name); + break; + } + case FST_HT_UPSCOPE: { + fstReaderPopScope(ctx); + snum = fstReaderGetCurrentScopeLen(ctx) ? (intptr_t)fstReaderGetCurrentScopeUserInfo(ctx) : 0; + break; + } + case FST_HT_VAR: { + FstVar var; + var.id = h->u.var.handle; + var.is_alias = h->u.var.is_alias; + var.name = remove_spaces(h->u.var.name); + var.scope = scopes.back(); + var.width = h->u.var.length; + vars.push_back(var); + if (!var.is_alias) + handle_to_var[h->u.var.handle] = var; + std::string clean_name; + for(size_t i=0;iu.var.name);i++) + { + char c = h->u.var.name[i]; + if(c==' ') break; + clean_name += c; + } + //log("adding %s.%s\n",var.scope.c_str(), clean_name.c_str()); + + name_to_handle[var.scope+"."+clean_name] = h->u.var.handle; + break; + } + } + } +} + +static void reconstruct_clb_varlen(void *user_data, uint64_t pnt_time, fstHandle pnt_facidx, const unsigned char *pnt_value, uint32_t plen) +{ + FstData *ptr = (FstData*)user_data; + ptr->reconstruct_callback(pnt_time, pnt_facidx, pnt_value, plen); +} + +static void reconstruct_clb(void *user_data, uint64_t pnt_time, fstHandle pnt_facidx, const unsigned char *pnt_value) +{ + FstData *ptr = (FstData*)user_data; + uint32_t plen = (pnt_value) ? strlen((const char *)pnt_value) : 0; + ptr->reconstruct_callback(pnt_time, pnt_facidx, pnt_value, plen); +} + +void FstData::reconstruct_callback(uint64_t pnt_time, fstHandle pnt_facidx, const unsigned char *pnt_value, uint32_t /* plen */) +{ + handle_to_data[pnt_facidx].push_back(std::make_pair(pnt_time, std::string((const char *)pnt_value))); + size_t index = handle_to_data[pnt_facidx].size() - 1; + time_to_index[pnt_facidx][pnt_time] = index; + index_to_time[pnt_facidx][index] = pnt_time; +} + +void FstData::reconstruct(std::vector &signal) +{ + handle_to_data.clear(); + time_to_index.clear(); + index_to_time.clear(); + fstReaderClrFacProcessMaskAll(ctx); + for(const auto sig : signal) + fstReaderSetFacProcessMask(ctx,sig); + fstReaderIterBlocks2(ctx, reconstruct_clb, reconstruct_clb_varlen, this, nullptr); +} + +void FstData::reconstuctAll() +{ + handle_to_data.clear(); + time_to_index.clear(); + index_to_time.clear(); + fstReaderSetFacProcessMaskAll(ctx); + fstReaderIterBlocks2(ctx, reconstruct_clb, reconstruct_clb_varlen, this, nullptr); +} + +static void reconstruct_clb_varlen_attimes(void *user_data, uint64_t pnt_time, fstHandle pnt_facidx, const unsigned char *pnt_value, uint32_t plen) +{ + FstData *ptr = (FstData*)user_data; + ptr->reconstruct_callback_attimes(pnt_time, pnt_facidx, pnt_value, plen); +} + +static void reconstruct_clb_attimes(void *user_data, uint64_t pnt_time, fstHandle pnt_facidx, const unsigned char *pnt_value) +{ + FstData *ptr = (FstData*)user_data; + uint32_t plen = (pnt_value) ? strlen((const char *)pnt_value) : 0; + ptr->reconstruct_callback_attimes(pnt_time, pnt_facidx, pnt_value, plen); +} + +void FstData::reconstruct_callback_attimes(uint64_t pnt_time, fstHandle pnt_facidx, const unsigned char *pnt_value, uint32_t /* plen */) +{ + if (sample_times_ndx > sample_times.size()) return; + uint64_t time = sample_times[sample_times_ndx]; + // if we are past the timestamp + if (pnt_time > time) { + for (auto const& c : current) + { + handle_to_data[c.first].push_back(std::make_pair(time,c.second)); + size_t index = handle_to_data[c.first].size() - 1; + time_to_index[c.first][time] = index; + index_to_time[c.first][index] = time; + } + sample_times_ndx++; + } + // always update current + current[pnt_facidx] = std::string((const char *)pnt_value); +} + +void FstData::reconstructAtTimes(std::vector &signal, std::vector time) +{ + handle_to_data.clear(); + time_to_index.clear(); + index_to_time.clear(); + current.clear(); + sample_times_ndx = 0; + sample_times = time; + fstReaderClrFacProcessMaskAll(ctx); + for(const auto sig : signal) + fstReaderSetFacProcessMask(ctx,sig); + fstReaderIterBlocks2(ctx, reconstruct_clb_attimes, reconstruct_clb_varlen_attimes, this, nullptr); + + if (time_to_index[signal.back()].count(time.back())==0) { + for (auto const& c : current) + { + handle_to_data[c.first].push_back(std::make_pair(time.back(),c.second)); + size_t index = handle_to_data[c.first].size() - 1; + time_to_index[c.first][time.back()] = index; + index_to_time[c.first][index] = time.back(); + } + } +} + +void FstData::reconstructAllAtTimes(std::vector time) +{ + handle_to_data.clear(); + time_to_index.clear(); + index_to_time.clear(); + current.clear(); + sample_times_ndx = 0; + sample_times = time; + fstReaderSetFacProcessMaskAll(ctx); + fstReaderIterBlocks2(ctx, reconstruct_clb_attimes, reconstruct_clb_varlen_attimes, this, nullptr); +/* + if (time_to_index[signal.back()].count(time.back())==0) { + for (auto const& c : current) + { + handle_to_data[c.first].push_back(std::make_pair(time.back(),c.second)); + size_t index = handle_to_data[c.first].size() - 1; + time_to_index[c.first][time.back()] = index; + index_to_time[c.first][index] = time.back(); + } + }*/ +} + +std::string FstData::valueAt(fstHandle signal, uint64_t time) +{ + // TODO: Check if signal exist + auto &data = handle_to_data[signal]; + if (time_to_index[signal].count(time)!=0) { + size_t index = time_to_index[signal][time]; + return data.at(index).second; + } else { + size_t index = 0; + for(size_t i = 0; i< data.size(); i++) { + uint64_t t = index_to_time[signal][i]; + if (t > time) + break; + index = i; + } + return data.at(index).second; + } +} + +std::vector FstData::edges(fstHandle signal, bool positive, bool negative) +{ + // TODO: Check if signal exist + auto &data = handle_to_data[signal]; + std::string prev = "x"; + std::vector retVal; + for(auto &d : data) { + if (positive && prev=="0" && d.second=="1") + retVal.push_back(d.first); + if (negative && prev=="1" && d.second=="0") + retVal.push_back(d.first); + prev = d.second; + } + return retVal; +} + +void FstData::recalc_time_offsets(fstHandle signal, std::vector time) +{ + size_t index = 0; + auto &data = handle_to_data[signal]; + for(auto curr : time) { + for(size_t i = index; i< data.size(); i++) { + uint64_t t = index_to_time[signal][i]; + if (t > curr) + break; + index = i; + } + time_to_index[signal][curr] = index; + } +} diff --git a/kernel/fstdata.h b/kernel/fstdata.h new file mode 100644 index 000000000..c9a933836 --- /dev/null +++ b/kernel/fstdata.h @@ -0,0 +1,79 @@ +/* + * yosys -- Yosys Open SYnthesis Suite + * + * Copyright (C) 2022 Miodrag Milanovic + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + */ + +#ifndef FSTDATA_H +#define FSTDATA_H + +#include "kernel/yosys.h" +#include "libs/fst/fstapi.h" + +YOSYS_NAMESPACE_BEGIN + +struct FstVar +{ + fstHandle id; + std::string name; + bool is_alias; + std::string scope; + int width; +}; + +class FstData +{ + public: + FstData(std::string filename); + ~FstData(); + + uint64_t getStartTime(); + uint64_t getEndTime(); + + std::vector& getVars() { return vars; }; + + void reconstruct_callback(uint64_t pnt_time, fstHandle pnt_facidx, const unsigned char *pnt_value, uint32_t plen); + void reconstruct(std::vector &signal); + void reconstuctAll(); + + void reconstruct_callback_attimes(uint64_t pnt_time, fstHandle pnt_facidx, const unsigned char *pnt_value, uint32_t plen); + void reconstructAtTimes(std::vector &signal,std::vector time); + void reconstructAllAtTimes(std::vector time); + + std::string valueAt(fstHandle signal, uint64_t time); + std::vector edges(fstHandle signal, bool positive, bool negative); + void recalc_time_offsets(fstHandle signal, std::vector time); + + fstHandle getHandle(std::string name); + private: + void extractVarNames(); + + struct fstReaderContext *ctx; + std::vector scopes; + std::vector vars; + std::map handle_to_var; + std::map name_to_handle; + std::map>> handle_to_data; + std::map> time_to_index; + std::map> index_to_time; + std::vector sample_times; + size_t sample_times_ndx; + std::map current; +}; + +YOSYS_NAMESPACE_END + +#endif -- cgit v1.2.3 From 226dc659f08ae4b58b22ff13b484f338160b539a Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Wed, 26 Jan 2022 16:39:51 +0100 Subject: Fix tabs/spaces --- kernel/fstdata.h | 62 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 31 insertions(+), 31 deletions(-) (limited to 'kernel') diff --git a/kernel/fstdata.h b/kernel/fstdata.h index c9a933836..e7595cbf6 100644 --- a/kernel/fstdata.h +++ b/kernel/fstdata.h @@ -27,51 +27,51 @@ YOSYS_NAMESPACE_BEGIN struct FstVar { - fstHandle id; - std::string name; - bool is_alias; - std::string scope; - int width; + fstHandle id; + std::string name; + bool is_alias; + std::string scope; + int width; }; class FstData { - public: - FstData(std::string filename); - ~FstData(); + public: + FstData(std::string filename); + ~FstData(); - uint64_t getStartTime(); - uint64_t getEndTime(); + uint64_t getStartTime(); + uint64_t getEndTime(); - std::vector& getVars() { return vars; }; + std::vector& getVars() { return vars; }; - void reconstruct_callback(uint64_t pnt_time, fstHandle pnt_facidx, const unsigned char *pnt_value, uint32_t plen); - void reconstruct(std::vector &signal); - void reconstuctAll(); + void reconstruct_callback(uint64_t pnt_time, fstHandle pnt_facidx, const unsigned char *pnt_value, uint32_t plen); + void reconstruct(std::vector &signal); + void reconstuctAll(); - void reconstruct_callback_attimes(uint64_t pnt_time, fstHandle pnt_facidx, const unsigned char *pnt_value, uint32_t plen); - void reconstructAtTimes(std::vector &signal,std::vector time); + void reconstruct_callback_attimes(uint64_t pnt_time, fstHandle pnt_facidx, const unsigned char *pnt_value, uint32_t plen); + void reconstructAtTimes(std::vector &signal,std::vector time); void reconstructAllAtTimes(std::vector time); - std::string valueAt(fstHandle signal, uint64_t time); - std::vector edges(fstHandle signal, bool positive, bool negative); - void recalc_time_offsets(fstHandle signal, std::vector time); + std::string valueAt(fstHandle signal, uint64_t time); + std::vector edges(fstHandle signal, bool positive, bool negative); + void recalc_time_offsets(fstHandle signal, std::vector time); fstHandle getHandle(std::string name); - private: - void extractVarNames(); +private: + void extractVarNames(); - struct fstReaderContext *ctx; - std::vector scopes; - std::vector vars; - std::map handle_to_var; + struct fstReaderContext *ctx; + std::vector scopes; + std::vector vars; + std::map handle_to_var; std::map name_to_handle; - std::map>> handle_to_data; - std::map> time_to_index; - std::map> index_to_time; - std::vector sample_times; - size_t sample_times_ndx; - std::map current; + std::map>> handle_to_data; + std::map> time_to_index; + std::map> index_to_time; + std::vector sample_times; + size_t sample_times_ndx; + std::map current; }; YOSYS_NAMESPACE_END -- cgit v1.2.3 From 3e35de2be108b7d8b24808aa55a0f0f9f8570705 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Fri, 28 Jan 2022 10:18:02 +0100 Subject: Add more options and time handling --- kernel/fstdata.cc | 1 + kernel/fstdata.h | 2 ++ 2 files changed, 3 insertions(+) (limited to 'kernel') diff --git a/kernel/fstdata.cc b/kernel/fstdata.cc index e497ff7ad..466b8f19f 100644 --- a/kernel/fstdata.cc +++ b/kernel/fstdata.cc @@ -24,6 +24,7 @@ USING_YOSYS_NAMESPACE FstData::FstData(std::string filename) : ctx(nullptr) { ctx = (fstReaderContext *)fstReaderOpen(filename.c_str()); + timescale = pow(10.0, (int)fstReaderGetTimescale(ctx)); extractVarNames(); } diff --git a/kernel/fstdata.h b/kernel/fstdata.h index e7595cbf6..4c54a3f22 100644 --- a/kernel/fstdata.h +++ b/kernel/fstdata.h @@ -58,6 +58,7 @@ class FstData void recalc_time_offsets(fstHandle signal, std::vector time); fstHandle getHandle(std::string name); + double getTimescale() { return timescale; } private: void extractVarNames(); @@ -72,6 +73,7 @@ private: std::vector sample_times; size_t sample_times_ndx; std::map current; + double timescale; }; YOSYS_NAMESPACE_END -- cgit v1.2.3 From 4f75a2ca1b4a71ad335124b45d36eed9c8d619c8 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Fri, 28 Jan 2022 12:50:41 +0100 Subject: Do actual compare --- kernel/fstdata.cc | 106 +++++++++++++++++++++--------------------------------- kernel/fstdata.h | 13 ++++--- 2 files changed, 47 insertions(+), 72 deletions(-) (limited to 'kernel') diff --git a/kernel/fstdata.cc b/kernel/fstdata.cc index 466b8f19f..d700f61b6 100644 --- a/kernel/fstdata.cc +++ b/kernel/fstdata.cc @@ -96,45 +96,47 @@ void FstData::extractVarNames() } } -static void reconstruct_clb_varlen(void *user_data, uint64_t pnt_time, fstHandle pnt_facidx, const unsigned char *pnt_value, uint32_t plen) +static void reconstruct_edges_varlen(void *user_data, uint64_t pnt_time, fstHandle pnt_facidx, const unsigned char *pnt_value, uint32_t plen) { FstData *ptr = (FstData*)user_data; - ptr->reconstruct_callback(pnt_time, pnt_facidx, pnt_value, plen); + ptr->reconstruct_edges_callback(pnt_time, pnt_facidx, pnt_value, plen); } -static void reconstruct_clb(void *user_data, uint64_t pnt_time, fstHandle pnt_facidx, const unsigned char *pnt_value) +static void reconstruct_edges(void *user_data, uint64_t pnt_time, fstHandle pnt_facidx, const unsigned char *pnt_value) { FstData *ptr = (FstData*)user_data; uint32_t plen = (pnt_value) ? strlen((const char *)pnt_value) : 0; - ptr->reconstruct_callback(pnt_time, pnt_facidx, pnt_value, plen); + ptr->reconstruct_edges_callback(pnt_time, pnt_facidx, pnt_value, plen); } -void FstData::reconstruct_callback(uint64_t pnt_time, fstHandle pnt_facidx, const unsigned char *pnt_value, uint32_t /* plen */) +void FstData::reconstruct_edges_callback(uint64_t pnt_time, fstHandle pnt_facidx, const unsigned char *pnt_value, uint32_t /* plen */) { - handle_to_data[pnt_facidx].push_back(std::make_pair(pnt_time, std::string((const char *)pnt_value))); - size_t index = handle_to_data[pnt_facidx].size() - 1; - time_to_index[pnt_facidx][pnt_time] = index; - index_to_time[pnt_facidx][index] = pnt_time; + std::string val = std::string((const char *)pnt_value); + std::string prev = last_data[pnt_facidx]; + if (pnt_time>=start_time) { + if (prev=="0" && val=="1") + edges.push_back(pnt_time); + if (prev=="1" && val=="0") + edges.push_back(pnt_time); + } + last_data[pnt_facidx] = val; } -void FstData::reconstruct(std::vector &signal) +std::vector FstData::getAllEdges(std::vector &signal, uint64_t start, uint64_t end) { - handle_to_data.clear(); - time_to_index.clear(); - index_to_time.clear(); + start_time = start; + end_time = end; + last_data.clear(); + for(auto &s : signal) { + last_data[s] = "x"; + } + edges.clear(); + fstReaderSetLimitTimeRange(ctx, start_time, end_time); fstReaderClrFacProcessMaskAll(ctx); for(const auto sig : signal) fstReaderSetFacProcessMask(ctx,sig); - fstReaderIterBlocks2(ctx, reconstruct_clb, reconstruct_clb_varlen, this, nullptr); -} - -void FstData::reconstuctAll() -{ - handle_to_data.clear(); - time_to_index.clear(); - index_to_time.clear(); - fstReaderSetFacProcessMaskAll(ctx); - fstReaderIterBlocks2(ctx, reconstruct_clb, reconstruct_clb_varlen, this, nullptr); + fstReaderIterBlocks2(ctx, reconstruct_edges, reconstruct_edges_varlen, this, nullptr); + return edges; } static void reconstruct_clb_varlen_attimes(void *user_data, uint64_t pnt_time, fstHandle pnt_facidx, const unsigned char *pnt_value, uint32_t plen) @@ -153,10 +155,11 @@ static void reconstruct_clb_attimes(void *user_data, uint64_t pnt_time, fstHandl void FstData::reconstruct_callback_attimes(uint64_t pnt_time, fstHandle pnt_facidx, const unsigned char *pnt_value, uint32_t /* plen */) { if (sample_times_ndx > sample_times.size()) return; + uint64_t time = sample_times[sample_times_ndx]; // if we are past the timestamp if (pnt_time > time) { - for (auto const& c : current) + for (auto const& c : last_data) { handle_to_data[c.first].push_back(std::make_pair(time,c.second)); size_t index = handle_to_data[c.first].size() - 1; @@ -165,8 +168,8 @@ void FstData::reconstruct_callback_attimes(uint64_t pnt_time, fstHandle pnt_faci } sample_times_ndx++; } - // always update current - current[pnt_facidx] = std::string((const char *)pnt_value); + // always update last_data + last_data[pnt_facidx] = std::string((const char *)pnt_value); } void FstData::reconstructAtTimes(std::vector &signal, std::vector time) @@ -174,16 +177,17 @@ void FstData::reconstructAtTimes(std::vector &signal, std::vector time) handle_to_data.clear(); time_to_index.clear(); index_to_time.clear(); - current.clear(); + last_data.clear(); sample_times_ndx = 0; sample_times = time; + + fstReaderSetUnlimitedTimeRange(ctx); fstReaderSetFacProcessMaskAll(ctx); fstReaderIterBlocks2(ctx, reconstruct_clb_attimes, reconstruct_clb_varlen_attimes, this, nullptr); -/* - if (time_to_index[signal.back()].count(time.back())==0) { - for (auto const& c : current) + + if (time_to_index[1].count(time.back())==0) { + for (auto const& c : last_data) { handle_to_data[c.first].push_back(std::make_pair(time.back(),c.second)); size_t index = handle_to_data[c.first].size() - 1; time_to_index[c.first][time.back()] = index; index_to_time[c.first][index] = time.back(); } - }*/ + } } std::string FstData::valueAt(fstHandle signal, uint64_t time) { - // TODO: Check if signal exist + if (handle_to_data.find(signal) == handle_to_data.end()) + log_error("Signal id %d not found\n", (int)signal); auto &data = handle_to_data[signal]; if (time_to_index[signal].count(time)!=0) { size_t index = time_to_index[signal][time]; @@ -233,34 +240,3 @@ std::string FstData::valueAt(fstHandle signal, uint64_t time) return data.at(index).second; } } - -std::vector FstData::edges(fstHandle signal, bool positive, bool negative) -{ - // TODO: Check if signal exist - auto &data = handle_to_data[signal]; - std::string prev = "x"; - std::vector retVal; - for(auto &d : data) { - if (positive && prev=="0" && d.second=="1") - retVal.push_back(d.first); - if (negative && prev=="1" && d.second=="0") - retVal.push_back(d.first); - prev = d.second; - } - return retVal; -} - -void FstData::recalc_time_offsets(fstHandle signal, std::vector time) -{ - size_t index = 0; - auto &data = handle_to_data[signal]; - for(auto curr : time) { - for(size_t i = index; i< data.size(); i++) { - uint64_t t = index_to_time[signal][i]; - if (t > curr) - break; - index = i; - } - time_to_index[signal][curr] = index; - } -} diff --git a/kernel/fstdata.h b/kernel/fstdata.h index 4c54a3f22..5d4899f47 100644 --- a/kernel/fstdata.h +++ b/kernel/fstdata.h @@ -45,18 +45,14 @@ class FstData std::vector& getVars() { return vars; }; - void reconstruct_callback(uint64_t pnt_time, fstHandle pnt_facidx, const unsigned char *pnt_value, uint32_t plen); - void reconstruct(std::vector &signal); - void reconstuctAll(); + void reconstruct_edges_callback(uint64_t pnt_time, fstHandle pnt_facidx, const unsigned char *pnt_value, uint32_t plen); + std::vector getAllEdges(std::vector &signal, uint64_t start_time, uint64_t end_time); void reconstruct_callback_attimes(uint64_t pnt_time, fstHandle pnt_facidx, const unsigned char *pnt_value, uint32_t plen); void reconstructAtTimes(std::vector &signal,std::vector time); void reconstructAllAtTimes(std::vector time); std::string valueAt(fstHandle signal, uint64_t time); - std::vector edges(fstHandle signal, bool positive, bool negative); - void recalc_time_offsets(fstHandle signal, std::vector time); - fstHandle getHandle(std::string name); double getTimescale() { return timescale; } private: @@ -68,12 +64,15 @@ private: std::map handle_to_var; std::map name_to_handle; std::map>> handle_to_data; + std::map last_data; std::map> time_to_index; std::map> index_to_time; std::vector sample_times; size_t sample_times_ndx; - std::map current; double timescale; + uint64_t start_time; + uint64_t end_time; + std::vector edges; }; YOSYS_NAMESPACE_END -- cgit v1.2.3 From a8d03df173021ea6fa6258c207c7dc30449af455 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Fri, 28 Jan 2022 12:54:16 +0100 Subject: cleanup --- kernel/fstdata.cc | 14 +------------- kernel/fstdata.h | 1 - 2 files changed, 1 insertion(+), 14 deletions(-) (limited to 'kernel') diff --git a/kernel/fstdata.cc b/kernel/fstdata.cc index d700f61b6..9170da45e 100644 --- a/kernel/fstdata.cc +++ b/kernel/fstdata.cc @@ -164,7 +164,6 @@ void FstData::reconstruct_callback_attimes(uint64_t pnt_time, fstHandle pnt_faci handle_to_data[c.first].push_back(std::make_pair(time,c.second)); size_t index = handle_to_data[c.first].size() - 1; time_to_index[c.first][time] = index; - index_to_time[c.first][index] = time; } sample_times_ndx++; } @@ -176,7 +175,6 @@ void FstData::reconstructAtTimes(std::vector &signal, std::vector &signal, std::vector time) { handle_to_data.clear(); time_to_index.clear(); - index_to_time.clear(); last_data.clear(); sample_times_ndx = 0; sample_times = time; @@ -216,7 +212,6 @@ void FstData::reconstructAllAtTimes(std::vector time) handle_to_data[c.first].push_back(std::make_pair(time.back(),c.second)); size_t index = handle_to_data[c.first].size() - 1; time_to_index[c.first][time.back()] = index; - index_to_time[c.first][index] = time.back(); } } } @@ -230,13 +225,6 @@ std::string FstData::valueAt(fstHandle signal, uint64_t time) size_t index = time_to_index[signal][time]; return data.at(index).second; } else { - size_t index = 0; - for(size_t i = 0; i< data.size(); i++) { - uint64_t t = index_to_time[signal][i]; - if (t > time) - break; - index = i; - } - return data.at(index).second; + log_error("No data for signal %d at time %d\n", (int)signal, (int)time); } } diff --git a/kernel/fstdata.h b/kernel/fstdata.h index 5d4899f47..8095981a2 100644 --- a/kernel/fstdata.h +++ b/kernel/fstdata.h @@ -66,7 +66,6 @@ private: std::map>> handle_to_data; std::map last_data; std::map> time_to_index; - std::map> index_to_time; std::vector sample_times; size_t sample_times_ndx; double timescale; -- cgit v1.2.3 From 72acce0c82a14b615710acc186e209068b6b9fea Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Fri, 28 Jan 2022 13:53:27 +0100 Subject: detect edges even when x --- kernel/fstdata.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'kernel') diff --git a/kernel/fstdata.cc b/kernel/fstdata.cc index 9170da45e..53603ef49 100644 --- a/kernel/fstdata.cc +++ b/kernel/fstdata.cc @@ -114,9 +114,9 @@ void FstData::reconstruct_edges_callback(uint64_t pnt_time, fstHandle pnt_facidx std::string val = std::string((const char *)pnt_value); std::string prev = last_data[pnt_facidx]; if (pnt_time>=start_time) { - if (prev=="0" && val=="1") + if (prev!="1" && val=="1") edges.push_back(pnt_time); - if (prev=="1" && val=="0") + if (prev!="0" && val=="0") edges.push_back(pnt_time); } last_data[pnt_facidx] = val; -- cgit v1.2.3 From f0f3c81c566778b223ba3c5c0c224d5e09ac983d Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Fri, 28 Jan 2022 14:10:39 +0100 Subject: preserve VCD mangled names --- kernel/fstdata.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'kernel') diff --git a/kernel/fstdata.cc b/kernel/fstdata.cc index 53603ef49..70dcb88ce 100644 --- a/kernel/fstdata.cc +++ b/kernel/fstdata.cc @@ -42,7 +42,7 @@ fstHandle FstData::getHandle(std::string name) { if (name_to_handle.find(name) != name_to_handle.end()) return name_to_handle[name]; else - log("Not found key %s\n", name.c_str()); + log_warning("Unable to found wire %s in input file.\n", name.c_str()); return 0; }; @@ -87,6 +87,8 @@ void FstData::extractVarNames() if(c==' ') break; clean_name += c; } + if (clean_name[0]=='\\') + clean_name = clean_name.substr(1); //log("adding %s.%s\n",var.scope.c_str(), clean_name.c_str()); name_to_handle[var.scope+"."+clean_name] = h->u.var.handle; -- cgit v1.2.3 From cb12b7c4d8153896b1f798994aed2aa97a41f011 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Fri, 28 Jan 2022 14:20:16 +0100 Subject: ignore not found private signals --- kernel/fstdata.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'kernel') diff --git a/kernel/fstdata.cc b/kernel/fstdata.cc index 70dcb88ce..5d6d85ed8 100644 --- a/kernel/fstdata.cc +++ b/kernel/fstdata.cc @@ -42,8 +42,7 @@ fstHandle FstData::getHandle(std::string name) { if (name_to_handle.find(name) != name_to_handle.end()) return name_to_handle[name]; else - log_warning("Unable to found wire %s in input file.\n", name.c_str()); - return 0; + return 0; }; static std::string remove_spaces(std::string str) -- cgit v1.2.3 From 543feb75cb3765746ea865c11aa6ceccaf0adeac Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Mon, 31 Jan 2022 10:52:47 +0100 Subject: Display simulation time data --- kernel/fstdata.cc | 22 +++++++++++++++++++++- kernel/fstdata.h | 2 ++ 2 files changed, 23 insertions(+), 1 deletion(-) (limited to 'kernel') diff --git a/kernel/fstdata.cc b/kernel/fstdata.cc index 5d6d85ed8..a7a2c80f7 100644 --- a/kernel/fstdata.cc +++ b/kernel/fstdata.cc @@ -21,10 +21,30 @@ USING_YOSYS_NAMESPACE + FstData::FstData(std::string filename) : ctx(nullptr) { + const std::vector g_units = { "s", "ms", "us", "ns", "ps", "fs", "as", "zs" }; ctx = (fstReaderContext *)fstReaderOpen(filename.c_str()); - timescale = pow(10.0, (int)fstReaderGetTimescale(ctx)); + int scale = (int)fstReaderGetTimescale(ctx); + timescale = pow(10.0, scale); + timescale_str = ""; + int unit = 0; + int zeros = 0; + if (scale > 0) { + zeros = scale; + } else { + if ((scale % 3) == 0) { + zeros = (-scale % 3); + unit = (-scale / 3); + } else { + zeros = 3 - (-scale % 3); + unit = (-scale / 3) + 1; + } + } + for (int i=0;i0)timescale_str += " "; + timescale_str += g_units[unit]; extractVarNames(); } diff --git a/kernel/fstdata.h b/kernel/fstdata.h index 8095981a2..c069ff5e5 100644 --- a/kernel/fstdata.h +++ b/kernel/fstdata.h @@ -55,6 +55,7 @@ class FstData std::string valueAt(fstHandle signal, uint64_t time); fstHandle getHandle(std::string name); double getTimescale() { return timescale; } + const char *getTimescaleString() { return timescale_str.c_str(); } private: void extractVarNames(); @@ -69,6 +70,7 @@ private: std::vector sample_times; size_t sample_times_ndx; double timescale; + std::string timescale_str; uint64_t start_time; uint64_t end_time; std::vector edges; -- cgit v1.2.3 From 26de52fa094f90d5ce7a2766df5a53e6188b4d13 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Mon, 31 Jan 2022 12:00:15 +0100 Subject: Cleanup --- kernel/fstdata.cc | 1 - 1 file changed, 1 deletion(-) (limited to 'kernel') diff --git a/kernel/fstdata.cc b/kernel/fstdata.cc index a7a2c80f7..17498c4ee 100644 --- a/kernel/fstdata.cc +++ b/kernel/fstdata.cc @@ -43,7 +43,6 @@ FstData::FstData(std::string filename) : ctx(nullptr) } } for (int i=0;i0)timescale_str += " "; timescale_str += g_units[unit]; extractVarNames(); } -- cgit v1.2.3 From 6db23de7b13c57eb82489d4bf2f0658b6deb4488 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Fri, 4 Feb 2022 10:01:06 +0100 Subject: bug fix and cleanups --- kernel/fstdata.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'kernel') diff --git a/kernel/fstdata.cc b/kernel/fstdata.cc index 17498c4ee..0b62564f6 100644 --- a/kernel/fstdata.cc +++ b/kernel/fstdata.cc @@ -174,7 +174,7 @@ static void reconstruct_clb_attimes(void *user_data, uint64_t pnt_time, fstHandl void FstData::reconstruct_callback_attimes(uint64_t pnt_time, fstHandle pnt_facidx, const unsigned char *pnt_value, uint32_t /* plen */) { - if (sample_times_ndx > sample_times.size()) return; + if (sample_times_ndx >= sample_times.size()) return; uint64_t time = sample_times[sample_times_ndx]; // if we are past the timestamp -- cgit v1.2.3 From c0a156bcb43bb0bb42eb3f2d94c12cda9ca5ee37 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Fri, 4 Feb 2022 11:11:36 +0100 Subject: Error detection for co-simulation --- kernel/fstdata.cc | 2 ++ 1 file changed, 2 insertions(+) (limited to 'kernel') diff --git a/kernel/fstdata.cc b/kernel/fstdata.cc index 0b62564f6..330c4d189 100644 --- a/kernel/fstdata.cc +++ b/kernel/fstdata.cc @@ -26,6 +26,8 @@ FstData::FstData(std::string filename) : ctx(nullptr) { const std::vector g_units = { "s", "ms", "us", "ns", "ps", "fs", "as", "zs" }; ctx = (fstReaderContext *)fstReaderOpen(filename.c_str()); + if (!ctx) + log_error("Error opening '%s'\n", filename.c_str()); int scale = (int)fstReaderGetTimescale(ctx); timescale = pow(10.0, scale); timescale_str = ""; -- cgit v1.2.3