From fe34731b02b1a32a0f881846d5b04d11ba6a2d12 Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Mon, 13 Aug 2018 18:20:52 -0700 Subject: systemc: Implement the sc_in class. Change-Id: I08174462cb650c7918a4e8f5284d4ee814cf595d Reviewed-on: https://gem5-review.googlesource.com/12085 Reviewed-by: Gabe Black Maintainer: Gabe Black --- src/systemc/ext/channel/sc_in.hh | 441 +++++++++++++++++---------------------- 1 file changed, 188 insertions(+), 253 deletions(-) (limited to 'src/systemc/ext/channel/sc_in.hh') diff --git a/src/systemc/ext/channel/sc_in.hh b/src/systemc/ext/channel/sc_in.hh index f691afee0..b7170aed3 100644 --- a/src/systemc/ext/channel/sc_in.hh +++ b/src/systemc/ext/channel/sc_in.hh @@ -32,6 +32,7 @@ #include +#include "../core/sc_event.hh" #include "../core/sc_port.hh" #include "sc_signal_in_if.hh" #include "sc_signal_inout_if.hh" @@ -41,119 +42,98 @@ namespace sc_core { class sc_event; -class sc_event_finder; class sc_trace_file; template class sc_in : public sc_port, 1> { public: - sc_in() : sc_port, 1>() {} - explicit sc_in(const char *name) : sc_port, 1>(name) {} + sc_in() : sc_port, 1>(), + _valueChangedFinder(*this, &sc_signal_in_if::value_changed_event) + {} + explicit sc_in(const char *name) : sc_port, 1>(name), + _valueChangedFinder(*this, &sc_signal_in_if::value_changed_event) + {} virtual ~sc_in() {} // Deprecated binding constructors. explicit sc_in(const sc_signal_in_if &interface) : - sc_port, 1>(interface) + sc_port, 1>(interface), + _valueChangedFinder(*this, &sc_signal_in_if::value_changed_event) {} sc_in(const char *name, const sc_signal_in_if &interface) : - sc_port, 1>(name, interface) + sc_port, 1>(name, interface), + _valueChangedFinder(*this, &sc_signal_in_if::value_changed_event) {} explicit sc_in(sc_port_b > &parent) : - sc_port, 1>(parent) + sc_port, 1>(parent), + _valueChangedFinder(*this, &sc_signal_in_if::value_changed_event) {} sc_in(const char *name, sc_port_b > &parent) : - sc_port, 1>(name, parent) + sc_port, 1>(name, parent), + _valueChangedFinder(*this, &sc_signal_in_if::value_changed_event) {} explicit sc_in(sc_port, 1> &parent) : - sc_port, 1>(parent) + sc_port, 1>(parent), + _valueChangedFinder(*this, &sc_signal_in_if::value_changed_event) {} sc_in(const char *name, sc_port, 1> &parent) : - sc_port, 1>(name, parent) + sc_port, 1>(name, parent), + _valueChangedFinder(*this, &sc_signal_in_if::value_changed_event) {} virtual void - bind(const sc_signal_in_if &) - { - sc_channel_warn_unimpl(__PRETTY_FUNCTION__); - } - void - operator () (const sc_signal_in_if &) + bind(const sc_signal_in_if &i) { - sc_channel_warn_unimpl(__PRETTY_FUNCTION__); + sc_port, 1>::bind( + const_cast &>(i)); } + void operator () (const sc_signal_in_if &i) { bind(i); } virtual void - bind(sc_port, 1> &) + bind(sc_port, 1> &i) { - sc_channel_warn_unimpl(__PRETTY_FUNCTION__); + sc_port, 1>::bind(i); } void - operator () (sc_port, 1> &) + operator () (sc_port, 1> &p) { - sc_channel_warn_unimpl(__PRETTY_FUNCTION__); + bind(p); } virtual void - bind(sc_port, 1> &) + bind(sc_port, 1> &p) { - sc_channel_warn_unimpl(__PRETTY_FUNCTION__); + sc_port_base::bind(p); } void - operator () (sc_port, 1> &) + operator () (sc_port, 1> &p) { - sc_channel_warn_unimpl(__PRETTY_FUNCTION__); + bind(p); } - virtual void - end_of_elaboration() - { - sc_channel_warn_unimpl(__PRETTY_FUNCTION__); - } + virtual void end_of_elaboration() { /* Implementation defined. */ } - const T & - read() const - { - sc_channel_warn_unimpl(__PRETTY_FUNCTION__); - return *(const T *)nullptr; - } - operator const T& () const - { - sc_channel_warn_unimpl(__PRETTY_FUNCTION__); - return *(const T *)nullptr; - } + const T &read() const { return (*this)->read(); } + operator const T& () const { return (*this)->read(); } - const sc_event & - default_event() const - { - sc_channel_warn_unimpl(__PRETTY_FUNCTION__); - return *(const sc_event *)nullptr; - } + const sc_event &default_event() const { return (*this)->default_event(); } const sc_event & value_changed_event() const { - sc_channel_warn_unimpl(__PRETTY_FUNCTION__); - return *(const sc_event *)nullptr; - } - bool - event() const - { - sc_channel_warn_unimpl(__PRETTY_FUNCTION__); - return false; - } - sc_event_finder & - value_changed() const - { - sc_channel_warn_unimpl(__PRETTY_FUNCTION__); - return *(sc_event_finder *)nullptr; + return (*this)->value_changed_event(); } + bool event() const { return (*this)->event(); } + sc_event_finder &value_changed() const { return _valueChangedFinder; } virtual const char *kind() const { return "sc_in"; } private: + mutable sc_event_finder_t > _valueChangedFinder; + // Disabled - sc_in(const sc_in &) : sc_port, 1>() {} - sc_in &operator = (const sc_in &) { return *this; } + sc_in(const sc_in &); + sc_in &operator = (const sc_in &); }; template @@ -167,151 +147,135 @@ template <> class sc_in : public sc_port, 1> { public: - sc_in() : sc_port, 1>() {} + sc_in() : sc_port, 1>(), + _valueChangedFinder(*this, + &sc_signal_in_if::value_changed_event), + _posFinder(*this, &sc_signal_in_if::posedge_event), + _negFinder(*this, &sc_signal_in_if::negedge_event) + {} explicit sc_in(const char *name) : - sc_port, 1>(name) {} + sc_port, 1>(name), + _valueChangedFinder(*this, + &sc_signal_in_if::value_changed_event), + _posFinder(*this, &sc_signal_in_if::posedge_event), + _negFinder(*this, &sc_signal_in_if::negedge_event) + {} virtual ~sc_in() {} // Deprecated binding constructors. explicit sc_in(const sc_signal_in_if &interface) : - sc_port, 1>(interface) + sc_port, 1>(interface), + _valueChangedFinder(*this, + &sc_signal_in_if::value_changed_event), + _posFinder(*this, &sc_signal_in_if::posedge_event), + _negFinder(*this, &sc_signal_in_if::negedge_event) {} sc_in(const char *name, const sc_signal_in_if &interface) : - sc_port, 1>(name, interface) + sc_port, 1>(name, interface), + _valueChangedFinder(*this, + &sc_signal_in_if::value_changed_event), + _posFinder(*this, &sc_signal_in_if::posedge_event), + _negFinder(*this, &sc_signal_in_if::negedge_event) {} explicit sc_in(sc_port_b > &parent) : - sc_port, 1>(parent) + sc_port, 1>(parent), + _valueChangedFinder(*this, + &sc_signal_in_if::value_changed_event), + _posFinder(*this, &sc_signal_in_if::posedge_event), + _negFinder(*this, &sc_signal_in_if::negedge_event) {} sc_in(const char *name, sc_port_b > &parent) : - sc_port, 1>(name, parent) + sc_port, 1>(name, parent), + _valueChangedFinder(*this, + &sc_signal_in_if::value_changed_event), + _posFinder(*this, &sc_signal_in_if::posedge_event), + _negFinder(*this, &sc_signal_in_if::negedge_event) {} explicit sc_in(sc_port, 1> &parent) : - sc_port, 1>(parent) + sc_port, 1>(parent), + _valueChangedFinder(*this, + &sc_signal_in_if::value_changed_event), + _posFinder(*this, &sc_signal_in_if::posedge_event), + _negFinder(*this, &sc_signal_in_if::negedge_event) {} sc_in(const char *name, sc_port, 1> &parent) : - sc_port, 1>(name, parent) + sc_port, 1>(name, parent), + _valueChangedFinder(*this, + &sc_signal_in_if::value_changed_event), + _posFinder(*this, &sc_signal_in_if::posedge_event), + _negFinder(*this, &sc_signal_in_if::negedge_event) {} virtual void - bind(const sc_signal_in_if &) + bind(const sc_signal_in_if &i) { - sc_channel_warn_unimpl(__PRETTY_FUNCTION__); - } - void - operator () (const sc_signal_in_if &) - { - sc_channel_warn_unimpl(__PRETTY_FUNCTION__); + sc_port, 1>::bind( + const_cast &>(i)); } + void operator () (const sc_signal_in_if &i) { bind(i); } virtual void - bind(sc_port, 1> &) + bind(sc_port, 1> &p) { - sc_channel_warn_unimpl(__PRETTY_FUNCTION__); + sc_port, 1>::bind(p); } void - operator () (sc_port, 1> &) + operator () (sc_port, 1> &p) { - sc_channel_warn_unimpl(__PRETTY_FUNCTION__); + bind(p); } virtual void - bind(sc_port, 1> &) + bind(sc_port, 1> &p) { - sc_channel_warn_unimpl(__PRETTY_FUNCTION__); + sc_port_base::bind(p); } void - operator () (sc_port, 1> &) + operator () (sc_port, 1> &p) { - sc_channel_warn_unimpl(__PRETTY_FUNCTION__); + bind(p); } - virtual void - end_of_elaboration() - { - sc_channel_warn_unimpl(__PRETTY_FUNCTION__); - } + virtual void end_of_elaboration() { /* Implementation defined. */ } - const bool & - read() const - { - sc_channel_warn_unimpl(__PRETTY_FUNCTION__); - return *(const bool *)nullptr; - } - operator const bool& () const - { - sc_channel_warn_unimpl(__PRETTY_FUNCTION__); - return *(const bool *)nullptr; - } + const bool &read() const { return (*this)->read(); } + operator const bool& () const { return (*this)->read(); } - const sc_event & - default_event() const - { - sc_channel_warn_unimpl(__PRETTY_FUNCTION__); - return *(const sc_event *)nullptr; - } + const sc_event &default_event() const { return (*this)->default_event(); } const sc_event & value_changed_event() const { - sc_channel_warn_unimpl(__PRETTY_FUNCTION__); - return *(const sc_event *)nullptr; + return (*this)->value_changed_event(); } const sc_event & posedge_event() const { - sc_channel_warn_unimpl(__PRETTY_FUNCTION__); - return *(const sc_event *)nullptr; + return (*this)->posedge_event(); } const sc_event & negedge_event() const { - sc_channel_warn_unimpl(__PRETTY_FUNCTION__); - return *(const sc_event *)nullptr; + return (*this)->negedge_event(); } - bool - event() const - { - sc_channel_warn_unimpl(__PRETTY_FUNCTION__); - return false; - } - bool - posedge() const - { - sc_channel_warn_unimpl(__PRETTY_FUNCTION__); - return false; - } - bool - negedge() const - { - sc_channel_warn_unimpl(__PRETTY_FUNCTION__); - return false; - } + bool event() const { return (*this)->event(); } + bool posedge() const { return (*this)->posedge(); } + bool negedge() const { return (*this)->negedge(); } - sc_event_finder & - value_changed() const - { - sc_channel_warn_unimpl(__PRETTY_FUNCTION__); - return *(sc_event_finder *)nullptr; - } - sc_event_finder & - pos() const - { - sc_channel_warn_unimpl(__PRETTY_FUNCTION__); - return *(sc_event_finder *)nullptr; - } - sc_event_finder & - neg() const - { - sc_channel_warn_unimpl(__PRETTY_FUNCTION__); - return *(sc_event_finder *)nullptr; - } + sc_event_finder &value_changed() const { return _valueChangedFinder; } + sc_event_finder &pos() const { return _posFinder; } + sc_event_finder &neg() const { return _negFinder; } virtual const char *kind() const { return "sc_in"; } private: + mutable sc_event_finder_t > _valueChangedFinder; + mutable sc_event_finder_t > _posFinder; + mutable sc_event_finder_t > _negFinder; + // Disabled - sc_in(const sc_in &) : sc_port, 1>() {} - sc_in &operator = (const sc_in &) { return *this; } + sc_in(const sc_in &); + sc_in &operator = (const sc_in &); }; template <> @@ -326,161 +290,132 @@ class sc_in : public sc_port, 1> { public: - sc_in() : sc_port, 1>() {} + sc_in() : sc_port, 1>(), + _valueChangedFinder(*this, + &sc_signal_in_if::value_changed_event), + _posFinder(*this, &sc_signal_in_if::posedge_event), + _negFinder(*this, &sc_signal_in_if::negedge_event) + {} explicit sc_in(const char *name) : - sc_port, 1>(name) + sc_port, 1>(name), + _valueChangedFinder(*this, + &sc_signal_in_if::value_changed_event), + _posFinder(*this, &sc_signal_in_if::posedge_event), + _negFinder(*this, &sc_signal_in_if::negedge_event) {} virtual ~sc_in() {} // Deprecated binding constructors. explicit sc_in(const sc_signal_in_if &interface) : - sc_port, 1>(interface) + sc_port, 1>(interface), + _valueChangedFinder(*this, + &sc_signal_in_if::value_changed_event), + _posFinder(*this, &sc_signal_in_if::posedge_event), + _negFinder(*this, &sc_signal_in_if::negedge_event) {} sc_in(const char *name, const sc_signal_in_if &interface) : - sc_port, 1>(name, interface) + sc_port, 1>(name, interface), + _valueChangedFinder(*this, + &sc_signal_in_if::value_changed_event), + _posFinder(*this, &sc_signal_in_if::posedge_event), + _negFinder(*this, &sc_signal_in_if::negedge_event) {} explicit sc_in(sc_port_b > &parent) : - sc_port, 1>(parent) + sc_port, 1>(parent), + _valueChangedFinder(*this, + &sc_signal_in_if::value_changed_event), + _posFinder(*this, &sc_signal_in_if::posedge_event), + _negFinder(*this, &sc_signal_in_if::negedge_event) {} sc_in(const char *name, sc_port_b > &parent) : - sc_port, 1>(name, parent) + sc_port, 1>(name, parent), + _valueChangedFinder(*this, + &sc_signal_in_if::value_changed_event), + _posFinder(*this, &sc_signal_in_if::posedge_event), + _negFinder(*this, &sc_signal_in_if::negedge_event) {} explicit sc_in(sc_port, 1> &parent) : - sc_port, 1>(parent) + sc_port, 1>(parent), + _valueChangedFinder(*this, + &sc_signal_in_if::value_changed_event), + _posFinder(*this, &sc_signal_in_if::posedge_event), + _negFinder(*this, &sc_signal_in_if::negedge_event) {} sc_in(const char *name, sc_port, 1> &parent) : - sc_port, 1>(name, parent) + sc_port, 1>(name, parent), + _valueChangedFinder(*this, + &sc_signal_in_if::value_changed_event), + _posFinder(*this, &sc_signal_in_if::posedge_event), + _negFinder(*this, &sc_signal_in_if::negedge_event) {} virtual void - bind(const sc_signal_in_if &) + bind(const sc_signal_in_if &i) { - sc_channel_warn_unimpl(__PRETTY_FUNCTION__); + sc_port, 1>::bind( + const_cast &>(i)); } void - operator () (const sc_signal_in_if &) - { - sc_channel_warn_unimpl(__PRETTY_FUNCTION__); - } + operator () (const sc_signal_in_if &i) { bind(i); } virtual void - bind(sc_port, 1> &) + bind(sc_port, 1> &i) { - sc_channel_warn_unimpl(__PRETTY_FUNCTION__); + sc_port, 1>::bind(i); } void - operator () (sc_port, 1> &) + operator () (sc_port, 1> &p) { - sc_channel_warn_unimpl(__PRETTY_FUNCTION__); + bind(p); } virtual void - bind(sc_port, 1> &) + bind(sc_port, 1> &p) { - sc_channel_warn_unimpl(__PRETTY_FUNCTION__); + sc_port_base::bind(p); } void - operator () (sc_port, 1> &) + operator () (sc_port, 1> &p) { - sc_channel_warn_unimpl(__PRETTY_FUNCTION__); + bind(p); } - virtual void - end_of_elaboration() - { - sc_channel_warn_unimpl(__PRETTY_FUNCTION__); - } + virtual void end_of_elaboration() { /* Implementation defined. */ } - const sc_dt::sc_logic & - read() const - { - sc_channel_warn_unimpl(__PRETTY_FUNCTION__); - return *(const sc_dt::sc_logic *)nullptr; - } - operator const sc_dt::sc_logic& () const - { - sc_channel_warn_unimpl(__PRETTY_FUNCTION__); - return *(const sc_dt::sc_logic *)nullptr; - } + const sc_dt::sc_logic &read() const { return (*this)->read(); } + operator const sc_dt::sc_logic& () const { return (*this)->read(); } - const sc_event & - default_event() const - { - sc_channel_warn_unimpl(__PRETTY_FUNCTION__); - return *(const sc_event *)nullptr; - } + const sc_event &default_event() const { return (*this)->default_event(); } const sc_event & value_changed_event() const { - sc_channel_warn_unimpl(__PRETTY_FUNCTION__); - return *(const sc_event *)nullptr; - } - const sc_event & - posedge_event() const - { - sc_channel_warn_unimpl(__PRETTY_FUNCTION__); - return *(const sc_event *)nullptr; - } - const sc_event & - negedge_event() const - { - sc_channel_warn_unimpl(__PRETTY_FUNCTION__); - return *(const sc_event *)nullptr; + return (*this)->value_changed_event(); } + const sc_event &posedge_event() const { return (*this)->posedge_event(); } + const sc_event &negedge_event() const { return (*this)->negedge_event(); } - bool - event() const - { - sc_channel_warn_unimpl(__PRETTY_FUNCTION__); - return false; - } - bool - posedge() const - { - sc_channel_warn_unimpl(__PRETTY_FUNCTION__); - return false; - } - bool - negedge() const - { - sc_channel_warn_unimpl(__PRETTY_FUNCTION__); - return false; - } + bool event() const { return (*this)->event(); } + bool posedge() const { return (*this)->posedge(); } + bool negedge() const { return (*this)->negedge(); } - sc_event_finder & - value_changed() const - { - sc_channel_warn_unimpl(__PRETTY_FUNCTION__); - return *(sc_event_finder *)nullptr; - } - sc_event_finder & - pos() const - { - sc_channel_warn_unimpl(__PRETTY_FUNCTION__); - return *(sc_event_finder *)nullptr; - } - sc_event_finder & - neg() const - { - sc_channel_warn_unimpl(__PRETTY_FUNCTION__); - return *(sc_event_finder *)nullptr; - } + sc_event_finder &value_changed() const { return _valueChangedFinder; } + sc_event_finder &pos() const { return _posFinder; } + sc_event_finder &neg() const { return _negFinder; } virtual const char *kind() const { return "sc_in"; } private: + mutable sc_event_finder_t > + _valueChangedFinder; + mutable sc_event_finder_t > _posFinder; + mutable sc_event_finder_t > _negFinder; + // Disabled - sc_in(const sc_in &) : - sc_port, 1>() - {} - sc_in & - operator = (const sc_in &) - { - return *this; - } + sc_in(const sc_in &); + sc_in &operator = (const sc_in &); }; template <> -- cgit v1.2.3