diff options
Diffstat (limited to 'src/systemc/utils/vcd.hh')
-rw-r--r-- | src/systemc/utils/vcd.hh | 154 |
1 files changed, 154 insertions, 0 deletions
diff --git a/src/systemc/utils/vcd.hh b/src/systemc/utils/vcd.hh new file mode 100644 index 000000000..dce7f4607 --- /dev/null +++ b/src/systemc/utils/vcd.hh @@ -0,0 +1,154 @@ +/* + * Copyright 2018 Google, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer; + * redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution; + * neither the name of the copyright holders nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Authors: Gabe Black + */ + +#ifndef __SYSTEMC_UTILS_VCD_HH__ +#define __SYSTEMC_UTILS_VCD_HH__ + +#include <map> + +#include "systemc/utils/tracefile.hh" + +namespace sc_gem5 +{ + +class VcdTraceValBase; + +class VcdTraceScope +{ + private: + std::vector<std::pair<std::string, VcdTraceValBase *>> values; + std::map<std::string, VcdTraceScope *> scopes; + + public: + void addValue(const std::string &name, VcdTraceValBase *value); + void output(const std::string &name, std::ostream &os); +}; + +class VcdTraceFile : public TraceFile +{ + private: + Tick lastPrintedTime; + uint64_t deltasAtNow; + + static const int NextNameChars = 5; + char _nextName[NextNameChars + 1]; + std::string nextSignalName(); + + bool initialized; + void initialize(); + + std::vector<VcdTraceValBase *> traceVals; + VcdTraceScope topScope; + + public: + VcdTraceFile(const std::string &name) : + TraceFile(name + ".vcd"), lastPrintedTime(0), deltasAtNow(0), + initialized(false) + { + _nextName[NextNameChars] = '\0'; + for (int i = 0; i < NextNameChars; i++) + _nextName[i] = 'a'; + } + ~VcdTraceFile(); + + void trace(bool delta) override; + + template<typename TV> + void + addNewTraceVal(const typename TV::TracedType *v, const std::string &name, + int width=1) + { + VcdTraceValBase *tv = new TV(v, nextSignalName(), width); + traceVals.push_back(tv); + topScope.addValue(name, tv); + } + + void addTraceVal(const bool *v, const std::string &name) override; + void addTraceVal(const float *v, const std::string &name) override; + void addTraceVal(const double *v, const std::string &name) override; + + void addTraceVal(const sc_dt::sc_logic *v, + const std::string &name) override; + void addTraceVal(const sc_dt::sc_int_base *v, + const std::string &name) override; + void addTraceVal(const sc_dt::sc_uint_base *v, + const std::string &name) override; + void addTraceVal(const sc_dt::sc_signed *v, + const std::string &name) override; + void addTraceVal(const sc_dt::sc_unsigned *v, + const std::string &name) override; + void addTraceVal(const sc_dt::sc_bv_base *v, + const std::string &name) override; + void addTraceVal(const sc_dt::sc_lv_base *v, + const std::string &name) override; + void addTraceVal(const sc_dt::sc_fxval *v, + const std::string &name) override; + void addTraceVal(const sc_dt::sc_fxval_fast *v, + const std::string &name) override; + void addTraceVal(const sc_dt::sc_fxnum *v, + const std::string &name) override; + void addTraceVal(const sc_dt::sc_fxnum_fast *v, + const std::string &name) override; + + void addTraceVal(const sc_core::sc_event *v, + const std::string &name) override; + void addTraceVal(const sc_core::sc_time *v, + const std::string &name) override; + + void addTraceVal(const unsigned char *v, + const std::string &name, int width) override; + void addTraceVal(const char *v, const std::string &name, + int width) override; + void addTraceVal(const unsigned short *v, + const std::string &name, int width) override; + void addTraceVal(const short *v, const std::string &name, + int width) override; + void addTraceVal(const unsigned int *v, + const std::string &name, int width) override; + void addTraceVal(const int *v, const std::string &name, + int width) override; + void addTraceVal(const unsigned long *v, + const std::string &name, int width) override; + void addTraceVal(const long *v, const std::string &name, + int width) override; + + void addTraceVal(const sc_dt::int64 *v, + const std::string &name, int width) override; + void addTraceVal(const sc_dt::uint64 *v, + const std::string &name, int width) override; + + void addTraceVal(const unsigned int *, const std::string &name, + const char **literals) override; + + void writeComment(const std::string &comment) override; +}; + +} // namespace sc_gem5 + +#endif // __SYSTEMC_UTILS_VCD_HH__ |