sc_signal.hh revision 13277
12810Srdreslin@umich.edu/* 211375Sandreas.hansson@arm.com * Copyright 2018 Google, Inc. 311051Sandreas.hansson@arm.com * 411051Sandreas.hansson@arm.com * Redistribution and use in source and binary forms, with or without 511051Sandreas.hansson@arm.com * modification, are permitted provided that the following conditions are 611051Sandreas.hansson@arm.com * met: redistributions of source code must retain the above copyright 711051Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer; 811051Sandreas.hansson@arm.com * redistributions in binary form must reproduce the above copyright 911051Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer in the 1011051Sandreas.hansson@arm.com * documentation and/or other materials provided with the distribution; 1111051Sandreas.hansson@arm.com * neither the name of the copyright holders nor the names of its 1211051Sandreas.hansson@arm.com * contributors may be used to endorse or promote products derived from 1311051Sandreas.hansson@arm.com * this software without specific prior written permission. 1411051Sandreas.hansson@arm.com * 1511051Sandreas.hansson@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 162810Srdreslin@umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 172810Srdreslin@umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 182810Srdreslin@umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 192810Srdreslin@umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 202810Srdreslin@umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 212810Srdreslin@umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 222810Srdreslin@umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 232810Srdreslin@umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 242810Srdreslin@umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 252810Srdreslin@umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 262810Srdreslin@umich.edu * 272810Srdreslin@umich.edu * Authors: Gabe Black 282810Srdreslin@umich.edu */ 292810Srdreslin@umich.edu 302810Srdreslin@umich.edu#ifndef __SYSTEMC_EXT_CHANNEL_SC_SIGNAL_HH__ 312810Srdreslin@umich.edu#define __SYSTEMC_EXT_CHANNEL_SC_SIGNAL_HH__ 322810Srdreslin@umich.edu 332810Srdreslin@umich.edu#include <iostream> 342810Srdreslin@umich.edu#include <string> 352810Srdreslin@umich.edu#include <vector> 362810Srdreslin@umich.edu 372810Srdreslin@umich.edu#include "../core/sc_event.hh" 382810Srdreslin@umich.edu#include "../core/sc_module.hh" // for sc_gen_unique_name 392810Srdreslin@umich.edu#include "../core/sc_prim.hh" 402810Srdreslin@umich.edu#include "../dt/bit/sc_logic.hh" 412810Srdreslin@umich.edu#include "sc_signal_inout_if.hh" 4211051Sandreas.hansson@arm.com 4311051Sandreas.hansson@arm.comnamespace sc_core 442810Srdreslin@umich.edu{ 4511051Sandreas.hansson@arm.com 4611051Sandreas.hansson@arm.comclass sc_port_base; 472810Srdreslin@umich.edu 482810Srdreslin@umich.edu} // namespace sc_core 492810Srdreslin@umich.edu 502810Srdreslin@umich.edunamespace sc_gem5 5111051Sandreas.hansson@arm.com{ 522810Srdreslin@umich.edu 532810Srdreslin@umich.educlass Process; 5411051Sandreas.hansson@arm.com 552810Srdreslin@umich.educlass ScSignalBase : public sc_core::sc_prim_channel 5611051Sandreas.hansson@arm.com{ 5711051Sandreas.hansson@arm.com public: 5811051Sandreas.hansson@arm.com virtual const char *kind() const { return "sc_signal"; } 5911051Sandreas.hansson@arm.com 6011051Sandreas.hansson@arm.com protected: 6111288Ssteve.reinhardt@amd.com ScSignalBase(const char *_name); 6211051Sandreas.hansson@arm.com virtual ~ScSignalBase(); 6311051Sandreas.hansson@arm.com 6411051Sandreas.hansson@arm.com const sc_core::sc_event &defaultEvent() const; 6511051Sandreas.hansson@arm.com const sc_core::sc_event &valueChangedEvent() const; 6611051Sandreas.hansson@arm.com 6711053Sandreas.hansson@arm.com bool event() const; 6811053Sandreas.hansson@arm.com 6911051Sandreas.hansson@arm.com void _signalChange(); 7011051Sandreas.hansson@arm.com 7111051Sandreas.hansson@arm.com virtual sc_core::sc_writer_policy get_writer_policy() const = 0; 7211197Sandreas.hansson@arm.com 7311197Sandreas.hansson@arm.com sc_core::sc_event _valueChangedEvent; 7411199Sandreas.hansson@arm.com uint64_t _changeStamp; 7511197Sandreas.hansson@arm.com sc_core::sc_port_base *_gem5WriterPort; 7611197Sandreas.hansson@arm.com}; 7711197Sandreas.hansson@arm.com 7811051Sandreas.hansson@arm.comclass ScSignalBaseBinary : public ScSignalBase 7911051Sandreas.hansson@arm.com{ 8011051Sandreas.hansson@arm.com protected: 8111051Sandreas.hansson@arm.com ScSignalBaseBinary(const char *_name); 8211051Sandreas.hansson@arm.com 8311051Sandreas.hansson@arm.com const sc_core::sc_event &posedgeEvent() const; 8411051Sandreas.hansson@arm.com const sc_core::sc_event &negedgeEvent() const; 8511051Sandreas.hansson@arm.com 8611051Sandreas.hansson@arm.com bool posedge() const; 8711051Sandreas.hansson@arm.com bool negedge() const; 8811051Sandreas.hansson@arm.com 8911051Sandreas.hansson@arm.com sc_core::sc_event _posedgeEvent; 9011051Sandreas.hansson@arm.com sc_core::sc_event _negedgeEvent; 9111051Sandreas.hansson@arm.com 9211051Sandreas.hansson@arm.com uint64_t _posStamp; 9311051Sandreas.hansson@arm.com uint64_t _negStamp; 9411051Sandreas.hansson@arm.com}; 9511051Sandreas.hansson@arm.com 9611051Sandreas.hansson@arm.comtemplate <class T> 9711051Sandreas.hansson@arm.comclass ScSignalBasePicker : public ScSignalBase 9811051Sandreas.hansson@arm.com{ 9911051Sandreas.hansson@arm.com protected: 10011051Sandreas.hansson@arm.com ScSignalBasePicker(const char *_name) : ScSignalBase(_name) {} 10111051Sandreas.hansson@arm.com}; 10211051Sandreas.hansson@arm.com 10311051Sandreas.hansson@arm.comtemplate <> 10411051Sandreas.hansson@arm.comclass ScSignalBasePicker<bool> : public ScSignalBaseBinary 10511051Sandreas.hansson@arm.com{ 10611051Sandreas.hansson@arm.com protected: 10711051Sandreas.hansson@arm.com ScSignalBasePicker(const char *_name) : ScSignalBaseBinary(_name) {} 10811051Sandreas.hansson@arm.com}; 10911051Sandreas.hansson@arm.com 11011051Sandreas.hansson@arm.comtemplate <> 11111051Sandreas.hansson@arm.comclass ScSignalBasePicker<sc_dt::sc_logic> : public ScSignalBaseBinary 11211051Sandreas.hansson@arm.com{ 11311051Sandreas.hansson@arm.com protected: 11411051Sandreas.hansson@arm.com ScSignalBasePicker(const char *_name) : ScSignalBaseBinary(_name) {} 11511051Sandreas.hansson@arm.com}; 11611051Sandreas.hansson@arm.com 11711051Sandreas.hansson@arm.comtemplate <sc_core::sc_writer_policy WRITER_POLICY> 11811051Sandreas.hansson@arm.comclass WriteChecker; 11911051Sandreas.hansson@arm.com 12011051Sandreas.hansson@arm.comtemplate <> 12111051Sandreas.hansson@arm.comclass WriteChecker<sc_core::SC_ONE_WRITER> 12211051Sandreas.hansson@arm.com{ 12311051Sandreas.hansson@arm.com public: 12411051Sandreas.hansson@arm.com WriteChecker(ScSignalBase *_sig); 12511051Sandreas.hansson@arm.com 12611051Sandreas.hansson@arm.com void checkPort(sc_core::sc_port_base &port, 12711051Sandreas.hansson@arm.com std::string iface_type_name, std::string out_name); 12811051Sandreas.hansson@arm.com void checkWriter(); 12911051Sandreas.hansson@arm.com 13011051Sandreas.hansson@arm.com private: 13111051Sandreas.hansson@arm.com ScSignalBase *sig; 13211051Sandreas.hansson@arm.com sc_core::sc_port_base *firstPort; 13311051Sandreas.hansson@arm.com Process *proc; 13411051Sandreas.hansson@arm.com uint64_t writeStamp; 13511051Sandreas.hansson@arm.com}; 13611051Sandreas.hansson@arm.com 13711051Sandreas.hansson@arm.comtemplate <> 13811051Sandreas.hansson@arm.comclass WriteChecker<sc_core::SC_MANY_WRITERS> 13911051Sandreas.hansson@arm.com{ 14011051Sandreas.hansson@arm.com public: 14111051Sandreas.hansson@arm.com WriteChecker(ScSignalBase *_sig); 14211051Sandreas.hansson@arm.com 14311051Sandreas.hansson@arm.com void checkPort(sc_core::sc_port_base &port, 14411051Sandreas.hansson@arm.com std::string iface_type_name, std::string out_name); 14511051Sandreas.hansson@arm.com void checkWriter(); 14611051Sandreas.hansson@arm.com 14711051Sandreas.hansson@arm.com private: 14811051Sandreas.hansson@arm.com ScSignalBase *sig; 14911601Sandreas.hansson@arm.com Process *proc; 15011601Sandreas.hansson@arm.com uint64_t writeStamp; 15111051Sandreas.hansson@arm.com}; 15211051Sandreas.hansson@arm.com 15311051Sandreas.hansson@arm.comtemplate <class T, sc_core::sc_writer_policy WRITER_POLICY> 15411051Sandreas.hansson@arm.comclass ScSignalBaseT : 15511051Sandreas.hansson@arm.com public ScSignalBasePicker<T>, public sc_core::sc_signal_inout_if<T> 15611051Sandreas.hansson@arm.com{ 15711051Sandreas.hansson@arm.com public: 15811051Sandreas.hansson@arm.com ScSignalBaseT(const char *_name) : 15911051Sandreas.hansson@arm.com ScSignalBasePicker<T>(_name), m_cur_val(T()), m_new_val(T()), 16011051Sandreas.hansson@arm.com _checker(this) 16111284Sandreas.hansson@arm.com {} 16211051Sandreas.hansson@arm.com ScSignalBaseT(const char *_name, const T &initial_value) : 16311051Sandreas.hansson@arm.com ScSignalBasePicker<T>(_name), m_cur_val(initial_value), 16411051Sandreas.hansson@arm.com m_new_val(initial_value), _checker(this) 16511051Sandreas.hansson@arm.com {} 16611051Sandreas.hansson@arm.com virtual ~ScSignalBaseT() {} 16711051Sandreas.hansson@arm.com 16811051Sandreas.hansson@arm.com virtual void 16911284Sandreas.hansson@arm.com register_port(sc_core::sc_port_base &port, const char *iface_type_name) 17011284Sandreas.hansson@arm.com { 17111284Sandreas.hansson@arm.com# if !defined(SC_NO_WRITE_CHECK) 17211284Sandreas.hansson@arm.com { 17311051Sandreas.hansson@arm.com _checker.checkPort(port, iface_type_name, 17411284Sandreas.hansson@arm.com typeid(sc_core::sc_signal_inout_if<T>).name()); 17511051Sandreas.hansson@arm.com } 17611051Sandreas.hansson@arm.com# endif 17711051Sandreas.hansson@arm.com } 17811284Sandreas.hansson@arm.com 17911284Sandreas.hansson@arm.com virtual const T &read() const { return m_cur_val; } 18011284Sandreas.hansson@arm.com operator const T&() const { return read(); } 18111284Sandreas.hansson@arm.com 18211051Sandreas.hansson@arm.com virtual void 18311744Snikos.nikoleris@arm.com write(const T &t) 18411051Sandreas.hansson@arm.com { 18511051Sandreas.hansson@arm.com# if !defined(SC_NO_WRITE_CHECK) 18611051Sandreas.hansson@arm.com { 18711051Sandreas.hansson@arm.com _checker.checkWriter(); 18811286Sandreas.hansson@arm.com } 18911286Sandreas.hansson@arm.com# endif 19011286Sandreas.hansson@arm.com m_new_val = t; 19111051Sandreas.hansson@arm.com bool changed = !(m_cur_val == m_new_val); 19211286Sandreas.hansson@arm.com if (changed) 19311600Sandreas.hansson@arm.com this->request_update(); 19411600Sandreas.hansson@arm.com } 19511051Sandreas.hansson@arm.com 19611051Sandreas.hansson@arm.com virtual const sc_core::sc_event & 19711051Sandreas.hansson@arm.com default_event() const 19811284Sandreas.hansson@arm.com { 19911051Sandreas.hansson@arm.com return ScSignalBase::defaultEvent(); 20011051Sandreas.hansson@arm.com } 20111051Sandreas.hansson@arm.com 20211602Sandreas.hansson@arm.com virtual const sc_core::sc_event & 20311051Sandreas.hansson@arm.com value_changed_event() const 20411051Sandreas.hansson@arm.com { 20511284Sandreas.hansson@arm.com return ScSignalBase::valueChangedEvent(); 20611051Sandreas.hansson@arm.com } 20711284Sandreas.hansson@arm.com 20811602Sandreas.hansson@arm.com virtual void print(std::ostream &os=std::cout) const { os << m_cur_val; } 20911051Sandreas.hansson@arm.com virtual void 21011051Sandreas.hansson@arm.com dump(std::ostream &os=std::cout) const 21111284Sandreas.hansson@arm.com { 21211051Sandreas.hansson@arm.com os << " name = " << this->name() << ::std::endl; 21311284Sandreas.hansson@arm.com os << " value = " << m_cur_val << ::std::endl; 21411284Sandreas.hansson@arm.com os << "new value = " << m_new_val << ::std::endl; 21511284Sandreas.hansson@arm.com } 21611051Sandreas.hansson@arm.com 21711051Sandreas.hansson@arm.com virtual bool event() const { return ScSignalBase::event(); } 21811051Sandreas.hansson@arm.com 21911284Sandreas.hansson@arm.com virtual sc_core::sc_writer_policy 22011284Sandreas.hansson@arm.com get_writer_policy() const 22111284Sandreas.hansson@arm.com { 22211284Sandreas.hansson@arm.com return WRITER_POLICY; 22311051Sandreas.hansson@arm.com } 22411051Sandreas.hansson@arm.com 22511051Sandreas.hansson@arm.com protected: 22611284Sandreas.hansson@arm.com // These members which store the current and future value of the signal 22711284Sandreas.hansson@arm.com // are not specified in the standard but are referred to directly by one 22811284Sandreas.hansson@arm.com // of the tests. 22911197Sandreas.hansson@arm.com T m_cur_val; 23011601Sandreas.hansson@arm.com T m_new_val; 23111601Sandreas.hansson@arm.com 23211601Sandreas.hansson@arm.com WriteChecker<WRITER_POLICY> _checker; 23311601Sandreas.hansson@arm.com}; 23411601Sandreas.hansson@arm.com 23511601Sandreas.hansson@arm.comtemplate <typename T, sc_core::sc_writer_policy WRITER_POLICY> 23611601Sandreas.hansson@arm.comclass ScSignalBinary : public ScSignalBaseT<T, WRITER_POLICY> 23711601Sandreas.hansson@arm.com{ 23811197Sandreas.hansson@arm.com public: 23911601Sandreas.hansson@arm.com ScSignalBinary(const char *_name) : ScSignalBaseT<T, WRITER_POLICY>(_name) 24011601Sandreas.hansson@arm.com {} 24111601Sandreas.hansson@arm.com ScSignalBinary(const char *_name, const T& initial_value) : 24211601Sandreas.hansson@arm.com ScSignalBaseT<T, WRITER_POLICY>(_name, initial_value) 24311601Sandreas.hansson@arm.com {} 24411601Sandreas.hansson@arm.com 24511601Sandreas.hansson@arm.com const sc_core::sc_event & 24611051Sandreas.hansson@arm.com posedge_event() const 24711051Sandreas.hansson@arm.com { 24811051Sandreas.hansson@arm.com return ScSignalBaseBinary::posedgeEvent(); 24911051Sandreas.hansson@arm.com } 25011051Sandreas.hansson@arm.com const sc_core::sc_event & 25111284Sandreas.hansson@arm.com negedge_event() const 25211284Sandreas.hansson@arm.com { 25311051Sandreas.hansson@arm.com return ScSignalBaseBinary::negedgeEvent(); 25411051Sandreas.hansson@arm.com } 25511051Sandreas.hansson@arm.com 25611051Sandreas.hansson@arm.com bool posedge() const { return ScSignalBaseBinary::posedge(); } 25711284Sandreas.hansson@arm.com bool negedge() const { return ScSignalBaseBinary::negedge(); } 25811051Sandreas.hansson@arm.com}; 25911051Sandreas.hansson@arm.com 26011602Sandreas.hansson@arm.com} // namespace sc_gem5 26111602Sandreas.hansson@arm.com 26211602Sandreas.hansson@arm.comnamespace sc_core 26311602Sandreas.hansson@arm.com{ 26411602Sandreas.hansson@arm.com 26511602Sandreas.hansson@arm.comtemplate <class T, sc_writer_policy WRITER_POLICY=SC_ONE_WRITER> 26611602Sandreas.hansson@arm.comclass sc_signal : public sc_gem5::ScSignalBaseT<T, WRITER_POLICY> 26711602Sandreas.hansson@arm.com{ 26811602Sandreas.hansson@arm.com public: 26911602Sandreas.hansson@arm.com sc_signal() : sc_gem5::ScSignalBaseT<T, WRITER_POLICY>( 27011602Sandreas.hansson@arm.com sc_gen_unique_name("signal")) 27111051Sandreas.hansson@arm.com {} 27211602Sandreas.hansson@arm.com explicit sc_signal(const char *name) : 27311197Sandreas.hansson@arm.com sc_gem5::ScSignalBaseT<T, WRITER_POLICY>(name) 27411744Snikos.nikoleris@arm.com {} 27511744Snikos.nikoleris@arm.com explicit sc_signal(const char *name, const T &initial_value) : 27611051Sandreas.hansson@arm.com sc_gem5::ScSignalBaseT<T, WRITER_POLICY>(name, initial_value) 27711051Sandreas.hansson@arm.com {} 27811051Sandreas.hansson@arm.com virtual ~sc_signal() {} 27911051Sandreas.hansson@arm.com 28011051Sandreas.hansson@arm.com sc_signal<T, WRITER_POLICY> & 28111051Sandreas.hansson@arm.com operator = (const T &t) 28211051Sandreas.hansson@arm.com { 28311051Sandreas.hansson@arm.com this->write(t); 28411051Sandreas.hansson@arm.com return *this; 28511051Sandreas.hansson@arm.com } 28611051Sandreas.hansson@arm.com sc_signal<T, WRITER_POLICY> & 28711051Sandreas.hansson@arm.com operator = (const sc_signal<T, WRITER_POLICY> &s) 28811051Sandreas.hansson@arm.com { 28911051Sandreas.hansson@arm.com this->write(s.read()); 29011051Sandreas.hansson@arm.com return *this; 29111051Sandreas.hansson@arm.com } 29211051Sandreas.hansson@arm.com 29311051Sandreas.hansson@arm.com protected: 29411051Sandreas.hansson@arm.com virtual void 29511051Sandreas.hansson@arm.com update() 29611744Snikos.nikoleris@arm.com { 29711051Sandreas.hansson@arm.com if (this->m_new_val == this->m_cur_val) 29811051Sandreas.hansson@arm.com return; 29911744Snikos.nikoleris@arm.com 30011051Sandreas.hansson@arm.com this->m_cur_val = this->m_new_val; 30111051Sandreas.hansson@arm.com this->_signalChange(); 30211051Sandreas.hansson@arm.com } 30311051Sandreas.hansson@arm.com 30411199Sandreas.hansson@arm.com private: 30511051Sandreas.hansson@arm.com // Disabled 30611051Sandreas.hansson@arm.com sc_signal(const sc_signal<T, WRITER_POLICY> &); 30711051Sandreas.hansson@arm.com}; 30811051Sandreas.hansson@arm.com 30911051Sandreas.hansson@arm.comtemplate <class T, sc_writer_policy WRITER_POLICY> 31011051Sandreas.hansson@arm.cominline std::ostream & 31111051Sandreas.hansson@arm.comoperator << (std::ostream &os, const sc_signal<T, WRITER_POLICY> &s) 31211484Snikos.nikoleris@arm.com{ 31311051Sandreas.hansson@arm.com os << s.read(); 31411051Sandreas.hansson@arm.com return os; 31511051Sandreas.hansson@arm.com} 31611051Sandreas.hansson@arm.com 31711051Sandreas.hansson@arm.comtemplate <sc_writer_policy WRITER_POLICY> 31811051Sandreas.hansson@arm.comclass sc_signal<bool, WRITER_POLICY> : 31911051Sandreas.hansson@arm.com public sc_gem5::ScSignalBinary<bool, WRITER_POLICY> 32011051Sandreas.hansson@arm.com{ 32111051Sandreas.hansson@arm.com public: 32211051Sandreas.hansson@arm.com sc_signal() : 32311051Sandreas.hansson@arm.com sc_gem5::ScSignalBinary<bool, WRITER_POLICY>( 32411744Snikos.nikoleris@arm.com sc_gen_unique_name("signal")) 32511051Sandreas.hansson@arm.com {} 32611051Sandreas.hansson@arm.com explicit sc_signal(const char *name) : 32711051Sandreas.hansson@arm.com sc_gem5::ScSignalBinary<bool, WRITER_POLICY>(name) 32811199Sandreas.hansson@arm.com {} 32911051Sandreas.hansson@arm.com explicit sc_signal(const char *name, const bool &initial_value) : 33011051Sandreas.hansson@arm.com sc_gem5::ScSignalBinary<bool, WRITER_POLICY>(name, initial_value) 33111051Sandreas.hansson@arm.com {} 33211051Sandreas.hansson@arm.com virtual ~sc_signal() {} 33311051Sandreas.hansson@arm.com 33411051Sandreas.hansson@arm.com sc_signal<bool, WRITER_POLICY> & 33511051Sandreas.hansson@arm.com operator = (const bool &b) 33611051Sandreas.hansson@arm.com { 33711375Sandreas.hansson@arm.com this->write(b); 33811375Sandreas.hansson@arm.com return *this; 33911375Sandreas.hansson@arm.com } 34011199Sandreas.hansson@arm.com sc_signal<bool, WRITER_POLICY> & 34111199Sandreas.hansson@arm.com operator = (const sc_signal<bool, WRITER_POLICY> &s) 34211199Sandreas.hansson@arm.com { 34311199Sandreas.hansson@arm.com this->write(s.read()); 34411199Sandreas.hansson@arm.com return *this; 34511199Sandreas.hansson@arm.com } 34611199Sandreas.hansson@arm.com 34711199Sandreas.hansson@arm.com protected: 34811199Sandreas.hansson@arm.com virtual void 34911199Sandreas.hansson@arm.com update() 35011199Sandreas.hansson@arm.com { 35111199Sandreas.hansson@arm.com if (this->m_new_val == this->m_cur_val) 35211199Sandreas.hansson@arm.com return; 35311199Sandreas.hansson@arm.com 35411199Sandreas.hansson@arm.com this->m_cur_val = this->m_new_val; 35511199Sandreas.hansson@arm.com this->_signalChange(); 35611199Sandreas.hansson@arm.com if (this->m_cur_val) { 35711199Sandreas.hansson@arm.com this->_posStamp = ::sc_gem5::getChangeStamp(); 35811199Sandreas.hansson@arm.com this->_posedgeEvent.notify(SC_ZERO_TIME); 35911199Sandreas.hansson@arm.com } else { 36011375Sandreas.hansson@arm.com this->_negStamp = ::sc_gem5::getChangeStamp(); 36111199Sandreas.hansson@arm.com this->_negedgeEvent.notify(SC_ZERO_TIME); 36211199Sandreas.hansson@arm.com } 36311051Sandreas.hansson@arm.com } 36411051Sandreas.hansson@arm.com 36511051Sandreas.hansson@arm.com private: 36611051Sandreas.hansson@arm.com // Disabled 36711051Sandreas.hansson@arm.com sc_signal(const sc_signal<bool, WRITER_POLICY> &); 36811199Sandreas.hansson@arm.com}; 36911051Sandreas.hansson@arm.com 37011199Sandreas.hansson@arm.comtemplate <sc_writer_policy WRITER_POLICY> 37111199Sandreas.hansson@arm.comclass sc_signal<sc_dt::sc_logic, WRITER_POLICY> : 37211199Sandreas.hansson@arm.com public sc_gem5::ScSignalBinary<sc_dt::sc_logic, WRITER_POLICY> 37311199Sandreas.hansson@arm.com{ 37411199Sandreas.hansson@arm.com public: 37511199Sandreas.hansson@arm.com sc_signal() : 37611199Sandreas.hansson@arm.com sc_gem5::ScSignalBinary<sc_dt::sc_logic, WRITER_POLICY>( 37711199Sandreas.hansson@arm.com sc_gen_unique_name("signal")) 37811199Sandreas.hansson@arm.com {} 37911199Sandreas.hansson@arm.com explicit sc_signal(const char *name) : 38011199Sandreas.hansson@arm.com sc_gem5::ScSignalBinary<sc_dt::sc_logic, WRITER_POLICY>(name) 38111199Sandreas.hansson@arm.com {} 38211484Snikos.nikoleris@arm.com explicit sc_signal(const char *name, 38311051Sandreas.hansson@arm.com const sc_dt::sc_logic &initial_value) : 38411051Sandreas.hansson@arm.com sc_gem5::ScSignalBinary<sc_dt::sc_logic, WRITER_POLICY>( 38511484Snikos.nikoleris@arm.com name, initial_value) 38611051Sandreas.hansson@arm.com {} 38711051Sandreas.hansson@arm.com virtual ~sc_signal() {} 38811051Sandreas.hansson@arm.com 38911051Sandreas.hansson@arm.com sc_signal<sc_dt::sc_logic, WRITER_POLICY> & 39011051Sandreas.hansson@arm.com operator = (const sc_dt::sc_logic &l) 39111051Sandreas.hansson@arm.com { 39211051Sandreas.hansson@arm.com this->write(l); 39311051Sandreas.hansson@arm.com return *this; 39411051Sandreas.hansson@arm.com } 39511051Sandreas.hansson@arm.com sc_signal<sc_dt::sc_logic, WRITER_POLICY> & 39611051Sandreas.hansson@arm.com operator = (const sc_signal<sc_dt::sc_logic, WRITER_POLICY> &s) 39711199Sandreas.hansson@arm.com { 39811199Sandreas.hansson@arm.com this->write(s.read()); 39911199Sandreas.hansson@arm.com return *this; 40011199Sandreas.hansson@arm.com } 40111199Sandreas.hansson@arm.com 40211284Sandreas.hansson@arm.com protected: 40311284Sandreas.hansson@arm.com virtual void 40411284Sandreas.hansson@arm.com update() 40511284Sandreas.hansson@arm.com { 40611051Sandreas.hansson@arm.com if (this->m_new_val == this->m_cur_val) 40711051Sandreas.hansson@arm.com return; 40811051Sandreas.hansson@arm.com 40911051Sandreas.hansson@arm.com this->m_cur_val = this->m_new_val; 41011051Sandreas.hansson@arm.com this->_signalChange(); 41111051Sandreas.hansson@arm.com if (this->m_cur_val == sc_dt::SC_LOGIC_1) { 41211051Sandreas.hansson@arm.com this->_posStamp = ::sc_gem5::getChangeStamp(); 41311051Sandreas.hansson@arm.com this->_posedgeEvent.notify(SC_ZERO_TIME); 41411051Sandreas.hansson@arm.com } else if (this->m_cur_val == sc_dt::SC_LOGIC_0) { 41511484Snikos.nikoleris@arm.com this->_negStamp = ::sc_gem5::getChangeStamp(); 41611051Sandreas.hansson@arm.com this->_negedgeEvent.notify(SC_ZERO_TIME); 41711051Sandreas.hansson@arm.com } 41811051Sandreas.hansson@arm.com } 41911051Sandreas.hansson@arm.com 42011051Sandreas.hansson@arm.com private: 42111051Sandreas.hansson@arm.com // Disabled 42211051Sandreas.hansson@arm.com sc_signal(const sc_signal<sc_dt::sc_logic, WRITER_POLICY> &); 42311051Sandreas.hansson@arm.com}; 42411051Sandreas.hansson@arm.com 42511051Sandreas.hansson@arm.com} // namespace sc_core 42611051Sandreas.hansson@arm.com 42711601Sandreas.hansson@arm.com#endif //__SYSTEMC_EXT_CHANNEL_SC_SIGNAL_HH__ 42811601Sandreas.hansson@arm.com