diff options
author | Gabe Black <gabeblack@google.com> | 2018-09-20 02:57:54 -0700 |
---|---|---|
committer | Gabe Black <gabeblack@google.com> | 2018-10-16 00:26:15 +0000 |
commit | 3d29513196e7d59e1b8f9da120089bac17e8771d (patch) | |
tree | 600c99d37f34fd7ec07b7221fb41f14848b4938c /src/systemc/ext | |
parent | a503a24d97b29ef246330e95dab77669a0a4256c (diff) | |
download | gem5-3d29513196e7d59e1b8f9da120089bac17e8771d.tar.xz |
systemc: Implement general and VCD trace support.
This doesn't include WIF trace support, but does make allowances for
adding it in the future.
Change-Id: Ifb62f40a7d8a13e94463930a44ac4b1cf41e3009
Reviewed-on: https://gem5-review.googlesource.com/c/12826
Reviewed-by: Gabe Black <gabeblack@google.com>
Maintainer: Gabe Black <gabeblack@google.com>
Diffstat (limited to 'src/systemc/ext')
-rw-r--r-- | src/systemc/ext/channel/sc_in.hh | 77 | ||||
-rw-r--r-- | src/systemc/ext/channel/sc_inout.hh | 64 | ||||
-rw-r--r-- | src/systemc/ext/channel/sc_signal.hh | 16 | ||||
-rw-r--r-- | src/systemc/ext/core/sc_port.hh | 16 | ||||
-rw-r--r-- | src/systemc/ext/dt/fx/sc_fxnum.hh | 16 | ||||
-rw-r--r-- | src/systemc/ext/utils/sc_trace_file.hh | 5 |
6 files changed, 150 insertions, 44 deletions
diff --git a/src/systemc/ext/channel/sc_in.hh b/src/systemc/ext/channel/sc_in.hh index b7170aed3..a76840161 100644 --- a/src/systemc/ext/channel/sc_in.hh +++ b/src/systemc/ext/channel/sc_in.hh @@ -34,9 +34,9 @@ #include "../core/sc_event.hh" #include "../core/sc_port.hh" +#include "../utils/sc_trace_file.hh" #include "sc_signal_in_if.hh" #include "sc_signal_inout_if.hh" -#include "warn_unimpl.hh" namespace sc_core { @@ -112,7 +112,14 @@ class sc_in : public sc_port<sc_signal_in_if<T>, 1> bind(p); } - virtual void end_of_elaboration() { /* Implementation defined. */ } + virtual void + end_of_elaboration() + { + for (auto params: traceParamsVec) + sc_trace(params->tf, (*this)->read(), params->name); + + traceParamsVec.clear(); + } const T &read() const { return (*this)->read(); } operator const T& () const { return (*this)->read(); } @@ -128,9 +135,17 @@ class sc_in : public sc_port<sc_signal_in_if<T>, 1> virtual const char *kind() const { return "sc_in"; } + void + add_trace(sc_trace_file *tf, const std::string &name) const + { + traceParamsVec.push_back(new sc_trace_params(tf, name)); + } + private: mutable sc_event_finder_t<sc_signal_in_if<T> > _valueChangedFinder; + mutable sc_trace_params_vec traceParamsVec; + // Disabled sc_in(const sc_in<T> &); sc_in<T> &operator = (const sc_in<T> &); @@ -138,9 +153,12 @@ class sc_in : public sc_port<sc_signal_in_if<T>, 1> template <class T> inline void -sc_trace(sc_trace_file *, const sc_in<T> &, const std::string &) +sc_trace(sc_trace_file *tf, const sc_in<T> &i, const std::string &name) { - sc_channel_warn_unimpl(__PRETTY_FUNCTION__); + if (i.size()) + sc_trace(tf, i->read(), name); + else + i.add_trace(tf, name); } template <> @@ -236,7 +254,14 @@ class sc_in<bool> : public sc_port<sc_signal_in_if<bool>, 1> bind(p); } - virtual void end_of_elaboration() { /* Implementation defined. */ } + virtual void + end_of_elaboration() + { + for (auto params: traceParamsVec) + sc_trace(params->tf, (*this)->read(), params->name); + + traceParamsVec.clear(); + } const bool &read() const { return (*this)->read(); } operator const bool& () const { return (*this)->read(); } @@ -268,11 +293,19 @@ class sc_in<bool> : public sc_port<sc_signal_in_if<bool>, 1> virtual const char *kind() const { return "sc_in"; } + void + add_trace(sc_trace_file *tf, const std::string &name) const + { + traceParamsVec.push_back(new sc_trace_params(tf, name)); + } + private: mutable sc_event_finder_t<sc_signal_in_if<bool> > _valueChangedFinder; mutable sc_event_finder_t<sc_signal_in_if<bool> > _posFinder; mutable sc_event_finder_t<sc_signal_in_if<bool> > _negFinder; + mutable sc_trace_params_vec traceParamsVec; + // Disabled sc_in(const sc_in<bool> &); sc_in<bool> &operator = (const sc_in<bool> &); @@ -280,9 +313,13 @@ class sc_in<bool> : public sc_port<sc_signal_in_if<bool>, 1> template <> inline void -sc_trace<bool>(sc_trace_file *, const sc_in<bool> &, const std::string &) +sc_trace<bool>(sc_trace_file *tf, const sc_in<bool> &i, + const std::string &name) { - sc_channel_warn_unimpl(__PRETTY_FUNCTION__); + if (i.size()) + sc_trace(tf, i->read(), name); + else + i.add_trace(tf, name); } template <> @@ -383,7 +420,14 @@ class sc_in<sc_dt::sc_logic> : bind(p); } - virtual void end_of_elaboration() { /* Implementation defined. */ } + virtual void + end_of_elaboration() + { + for (auto params: traceParamsVec) + sc_trace(params->tf, (*this)->read(), params->name); + + traceParamsVec.clear(); + } const sc_dt::sc_logic &read() const { return (*this)->read(); } operator const sc_dt::sc_logic& () const { return (*this)->read(); } @@ -407,12 +451,20 @@ class sc_in<sc_dt::sc_logic> : virtual const char *kind() const { return "sc_in"; } + void + add_trace(sc_trace_file *tf, const std::string &name) const + { + traceParamsVec.push_back(new sc_trace_params(tf, name)); + } + private: mutable sc_event_finder_t<sc_signal_in_if<sc_dt::sc_logic> > _valueChangedFinder; mutable sc_event_finder_t<sc_signal_in_if<sc_dt::sc_logic> > _posFinder; mutable sc_event_finder_t<sc_signal_in_if<sc_dt::sc_logic> > _negFinder; + mutable sc_trace_params_vec traceParamsVec; + // Disabled sc_in(const sc_in<sc_dt::sc_logic> &); sc_in<sc_dt::sc_logic> &operator = (const sc_in<sc_dt::sc_logic> &); @@ -420,10 +472,13 @@ class sc_in<sc_dt::sc_logic> : template <> inline void -sc_trace<sc_dt::sc_logic>( - sc_trace_file *, const sc_in<sc_dt::sc_logic> &, const std::string &) +sc_trace<sc_dt::sc_logic>(sc_trace_file *tf, const sc_in<sc_dt::sc_logic> &i, + const std::string &name) { - sc_channel_warn_unimpl(__PRETTY_FUNCTION__); + if (i.size()) + sc_trace(tf, i->read(), name); + else + i.add_trace(tf, name); } } // namespace sc_core diff --git a/src/systemc/ext/channel/sc_inout.hh b/src/systemc/ext/channel/sc_inout.hh index 54b0ae7da..7f19443d5 100644 --- a/src/systemc/ext/channel/sc_inout.hh +++ b/src/systemc/ext/channel/sc_inout.hh @@ -35,8 +35,8 @@ #include "../core/sc_event.hh" #include "../core/sc_port.hh" #include "../dt/bit/sc_logic.hh" +#include "../utils/sc_trace_file.hh" #include "sc_signal_inout_if.hh" -#include "warn_unimpl.hh" namespace sc_dt { @@ -111,6 +111,11 @@ class sc_inout : public sc_port<sc_signal_inout_if<T>, 1> delete initValue; initValue = nullptr; } + + for (auto params: traceParamsVec) + sc_trace(params->tf, (*this)->read(), params->name); + + traceParamsVec.clear(); } const T &read() const { return (*this)->read(); } @@ -159,19 +164,30 @@ class sc_inout : public sc_port<sc_signal_inout_if<T>, 1> virtual const char *kind() const { return "sc_inout"; } + void + add_trace(sc_trace_file *tf, const std::string &name) const + { + traceParamsVec.push_back(new sc_trace_params(tf, name)); + } + private: T *initValue; mutable sc_event_finder_t<sc_signal_inout_if<T> > _valueChangedFinder; + mutable sc_trace_params_vec traceParamsVec; + // Disabled sc_inout(const sc_inout<T> &); }; template <class T> inline void -sc_trace(sc_trace_file *, const sc_inout<T> &, const std::string &) +sc_trace(sc_trace_file *tf, const sc_inout<T> &i, const std::string &name) { - sc_channel_warn_unimpl(__PRETTY_FUNCTION__); + if (i.size()) + sc_trace(tf, i->read(), name); + else + i.add_trace(tf, name); } template <> @@ -259,6 +275,11 @@ class sc_inout<bool> : public sc_port<sc_signal_inout_if<bool>, 1> delete initValue; initValue = nullptr; } + + for (auto params: traceParamsVec) + sc_trace(params->tf, (*this)->read(), params->name); + + traceParamsVec.clear(); } const bool &read() const { return (*this)->read(); } @@ -314,21 +335,32 @@ class sc_inout<bool> : public sc_port<sc_signal_inout_if<bool>, 1> virtual const char *kind() const { return "sc_inout"; } + void + add_trace(sc_trace_file *tf, const std::string &name) const + { + traceParamsVec.push_back(new sc_trace_params(tf, name)); + } + private: bool *initValue; mutable sc_event_finder_t<sc_signal_inout_if<bool> > _valueChangedFinder; mutable sc_event_finder_t<sc_signal_inout_if<bool> > _posFinder; mutable sc_event_finder_t<sc_signal_inout_if<bool> > _negFinder; + mutable sc_trace_params_vec traceParamsVec; + // Disabled sc_inout(const sc_inout<bool> &); }; template <> inline void sc_trace<bool>( - sc_trace_file *, const sc_inout<bool> &, const std::string &) + sc_trace_file *tf, const sc_inout<bool> &i, const std::string &name) { - sc_channel_warn_unimpl(__PRETTY_FUNCTION__); + if (i.size()) + sc_trace(tf, i->read(), name); + else + i.add_trace(tf, name); } template <> @@ -433,6 +465,11 @@ class sc_inout<sc_dt::sc_logic> : delete initValue; initValue = nullptr; } + + for (auto params: traceParamsVec) + sc_trace(params->tf, (*this)->read(), params->name); + + traceParamsVec.clear(); } const sc_dt::sc_logic &read() const { return (*this)->read(); } @@ -488,6 +525,12 @@ class sc_inout<sc_dt::sc_logic> : virtual const char *kind() const { return "sc_inout"; } + void + add_trace(sc_trace_file *tf, const std::string &name) const + { + traceParamsVec.push_back(new sc_trace_params(tf, name)); + } + private: sc_dt::sc_logic *initValue; mutable sc_event_finder_t< @@ -495,16 +538,21 @@ class sc_inout<sc_dt::sc_logic> : mutable sc_event_finder_t<sc_signal_inout_if<sc_dt::sc_logic> > _posFinder; mutable sc_event_finder_t<sc_signal_inout_if<sc_dt::sc_logic> > _negFinder; + mutable sc_trace_params_vec traceParamsVec; + // Disabled sc_inout(const sc_inout<sc_dt::sc_logic> &); }; template <> inline void -sc_trace<sc_dt::sc_logic>(sc_trace_file *, const sc_inout<sc_dt::sc_logic> &, - const std::string &) +sc_trace<sc_dt::sc_logic>(sc_trace_file *tf, + const sc_inout<sc_dt::sc_logic> &i, const std::string &name) { - sc_channel_warn_unimpl(__PRETTY_FUNCTION__); + if (i.size()) + sc_trace(tf, i->read(), name); + else + i.add_trace(tf, name); } } // namespace sc_core diff --git a/src/systemc/ext/channel/sc_signal.hh b/src/systemc/ext/channel/sc_signal.hh index bbe2d0116..7c0183763 100644 --- a/src/systemc/ext/channel/sc_signal.hh +++ b/src/systemc/ext/channel/sc_signal.hh @@ -45,22 +45,6 @@ namespace sc_core { class sc_port_base; -class sc_trace_file; - -// Nonstandard -// Despite having a warning "FOR INTERNAL USE ONLY!" in all caps above this -// class definition in the Accellera implementation, it appears in their -// examples and test programs, and so we need to have it here as well. -struct sc_trace_params -{ - sc_trace_file *tf; - std::string name; - - sc_trace_params(sc_trace_file *tf, const std::string &name) : - tf(tf), name(name) - {} -}; -typedef std::vector<sc_trace_params *> sc_trace_params_vec; template <class T, sc_writer_policy WRITER_POLICY=SC_ONE_WRITER> class sc_signal : public sc_signal_inout_if<T>, diff --git a/src/systemc/ext/core/sc_port.hh b/src/systemc/ext/core/sc_port.hh index c9d436ec3..3586fec73 100644 --- a/src/systemc/ext/core/sc_port.hh +++ b/src/systemc/ext/core/sc_port.hh @@ -47,6 +47,22 @@ namespace sc_core { class sc_interface; +class sc_trace_file; + +// Nonstandard +// Despite having a warning "FOR INTERNAL USE ONLY!" in all caps above this +// class definition in the Accellera implementation, it appears in their +// examples and test programs, and so we need to have it here as well. +struct sc_trace_params +{ + sc_trace_file *tf; + std::string name; + + sc_trace_params(sc_trace_file *tf, const std::string &name) : + tf(tf), name(name) + {} +}; +typedef std::vector<sc_trace_params *> sc_trace_params_vec; enum sc_port_policy { diff --git a/src/systemc/ext/dt/fx/sc_fxnum.hh b/src/systemc/ext/dt/fx/sc_fxnum.hh index 1138646f3..8a0b7f612 100644 --- a/src/systemc/ext/dt/fx/sc_fxnum.hh +++ b/src/systemc/ext/dt/fx/sc_fxnum.hh @@ -66,13 +66,11 @@ #include "sc_fxval.hh" #include "scfx_params.hh" -namespace sc_core +namespace sc_gem5 { -class vcd_sc_fxnum_trace; -class vcd_sc_fxnum_fast_trace; -class wif_sc_fxnum_trace; -class wif_sc_fxnum_fast_trace; +template <typename T, typename B> +class TraceValFxnumBase; } // namespace sc_core @@ -490,8 +488,8 @@ class sc_fxnum friend class sc_fxnum_fast_bitref; friend class sc_fxnum_fast_subref; - friend class sc_core::vcd_sc_fxnum_trace; - friend class sc_core::wif_sc_fxnum_trace; + template <typename T, typename B> + friend class sc_gem5::TraceValFxnumBase; protected: sc_fxnum_observer *observer() const; @@ -851,8 +849,8 @@ class sc_fxnum_fast friend class sc_fxnum_fast_bitref; friend class sc_fxnum_fast_subref; - friend class sc_core::vcd_sc_fxnum_fast_trace; - friend class sc_core::wif_sc_fxnum_fast_trace; + template <typename T, typename B> + friend class sc_gem5::TraceValFxnumBase; protected: sc_fxnum_fast_observer *observer() const; diff --git a/src/systemc/ext/utils/sc_trace_file.hh b/src/systemc/ext/utils/sc_trace_file.hh index 0b4b0d02b..09f5bb254 100644 --- a/src/systemc/ext/utils/sc_trace_file.hh +++ b/src/systemc/ext/utils/sc_trace_file.hh @@ -63,7 +63,12 @@ class sc_time; class sc_trace_file { + protected: + sc_trace_file(); + public: + virtual ~sc_trace_file(); + virtual void set_time_unit(double, sc_time_unit) = 0; }; |