From 8817e547e524cd81b5176cf277ef611920b0815a Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Tue, 11 Sep 2018 21:46:12 -0700 Subject: systemc: Implement sc_buffer. This required a small change to sc_signal so that the value change event and the change stamp for it were accessible. Change-Id: Ife0545d84f3b25e98da079786c30ffa51025cce7 Reviewed-on: https://gem5-review.googlesource.com/c/12804 Reviewed-by: Gabe Black Maintainer: Gabe Black --- src/systemc/ext/channel/sc_buffer.hh | 21 ++++++++++--------- src/systemc/ext/channel/sc_signal.hh | 39 ++++++++++++++++++++++++++++-------- 2 files changed, 42 insertions(+), 18 deletions(-) (limited to 'src') diff --git a/src/systemc/ext/channel/sc_buffer.hh b/src/systemc/ext/channel/sc_buffer.hh index 22081605e..21dc52be0 100644 --- a/src/systemc/ext/channel/sc_buffer.hh +++ b/src/systemc/ext/channel/sc_buffer.hh @@ -32,7 +32,6 @@ #include "../core/sc_module.hh" // for sc_gen_unique_name #include "sc_signal.hh" -#include "warn_unimpl.hh" // for warn_unimpl namespace sc_core { @@ -49,27 +48,28 @@ class sc_buffer : public sc_signal {} virtual void - write(const T&) + write(const T &t) { - sc_channel_warn_unimpl(__PRETTY_FUNCTION__); + this->m_new_val = t; + this->request_update(); } sc_buffer & - operator = (const T &) + operator = (const T &arg) { - sc_channel_warn_unimpl(__PRETTY_FUNCTION__); + write(arg); return *this; } sc_buffer & - operator = (const sc_signal &) + operator = (const sc_signal &arg) { - sc_channel_warn_unimpl(__PRETTY_FUNCTION__); + write(arg.read()); return *this; } sc_buffer & - operator = (const sc_buffer &) + operator = (const sc_buffer &arg) { - sc_channel_warn_unimpl(__PRETTY_FUNCTION__); + write(arg.read()); return *this; } @@ -79,7 +79,8 @@ class sc_buffer : public sc_signal virtual void update() { - sc_channel_warn_unimpl(__PRETTY_FUNCTION__); + this->m_cur_val = this->m_new_val; + this->_signalChange(); } private: diff --git a/src/systemc/ext/channel/sc_signal.hh b/src/systemc/ext/channel/sc_signal.hh index 022bd3394..bbe2d0116 100644 --- a/src/systemc/ext/channel/sc_signal.hh +++ b/src/systemc/ext/channel/sc_signal.hh @@ -151,6 +151,14 @@ class sc_signal : public sc_signal_inout_if, return; m_cur_val = m_new_val; + _signalChange(); + _changeStamp = ::sc_gem5::getChangeStamp(); + _valueChangedEvent.notify(SC_ZERO_TIME); + } + + void + _signalChange() + { _changeStamp = ::sc_gem5::getChangeStamp(); _valueChangedEvent.notify(SC_ZERO_TIME); } @@ -293,18 +301,23 @@ class sc_signal : return; m_cur_val = m_new_val; - uint64_t change_stamp = ::sc_gem5::getChangeStamp(); - _changeStamp = change_stamp; - _valueChangedEvent.notify(SC_ZERO_TIME); + _signalChange(); if (m_cur_val) { - _posStamp = change_stamp; + _posStamp = ::sc_gem5::getChangeStamp(); _posedgeEvent.notify(SC_ZERO_TIME); } else { - _negStamp = change_stamp; + _negStamp = ::sc_gem5::getChangeStamp(); _negedgeEvent.notify(SC_ZERO_TIME); } } + void + _signalChange() + { + _changeStamp = ::sc_gem5::getChangeStamp(); + _valueChangedEvent.notify(SC_ZERO_TIME); + } + bool m_cur_val; bool m_new_val; @@ -438,11 +451,21 @@ class sc_signal : return; m_cur_val = m_new_val; - _valueChangedEvent.notify(SC_ZERO_TIME); - if (m_cur_val == sc_dt::SC_LOGIC_1) + _signalChange(); + if (m_cur_val == sc_dt::SC_LOGIC_1) { + _posStamp = ::sc_gem5::getChangeStamp(); _posedgeEvent.notify(SC_ZERO_TIME); - else if (m_cur_val == sc_dt::SC_LOGIC_0) + } else if (m_cur_val == sc_dt::SC_LOGIC_0) { + _negStamp = ::sc_gem5::getChangeStamp(); _negedgeEvent.notify(SC_ZERO_TIME); + } + } + + void + _signalChange() + { + _changeStamp = ::sc_gem5::getChangeStamp(); + _valueChangedEvent.notify(SC_ZERO_TIME); } sc_dt::sc_logic m_cur_val; -- cgit v1.2.3