sc_signal.hh revision 13044:df7783886021
110263Satgutier@umich.edu/* 210941Sdavid.guillen@arm.com * Copyright 2018 Google, Inc. 310263Satgutier@umich.edu * 410263Satgutier@umich.edu * Redistribution and use in source and binary forms, with or without 510263Satgutier@umich.edu * modification, are permitted provided that the following conditions are 610263Satgutier@umich.edu * met: redistributions of source code must retain the above copyright 710263Satgutier@umich.edu * notice, this list of conditions and the following disclaimer; 810263Satgutier@umich.edu * redistributions in binary form must reproduce the above copyright 910263Satgutier@umich.edu * notice, this list of conditions and the following disclaimer in the 1010263Satgutier@umich.edu * documentation and/or other materials provided with the distribution; 1110263Satgutier@umich.edu * neither the name of the copyright holders nor the names of its 1210263Satgutier@umich.edu * contributors may be used to endorse or promote products derived from 1310263Satgutier@umich.edu * this software without specific prior written permission. 1410263Satgutier@umich.edu * 1510263Satgutier@umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1610263Satgutier@umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1710263Satgutier@umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1810263Satgutier@umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 1910263Satgutier@umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2010263Satgutier@umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2110263Satgutier@umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2210263Satgutier@umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2310263Satgutier@umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2410263Satgutier@umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2510263Satgutier@umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2610263Satgutier@umich.edu * 2710263Satgutier@umich.edu * Authors: Gabe Black 2810263Satgutier@umich.edu */ 2910263Satgutier@umich.edu 3010263Satgutier@umich.edu#ifndef __SYSTEMC_EXT_CHANNEL_SC_SIGNAL_HH__ 3110263Satgutier@umich.edu#define __SYSTEMC_EXT_CHANNEL_SC_SIGNAL_HH__ 3210263Satgutier@umich.edu 3310263Satgutier@umich.edu#include <iostream> 3410263Satgutier@umich.edu#include <string> 3510263Satgutier@umich.edu#include <vector> 3610263Satgutier@umich.edu 3710263Satgutier@umich.edu#include "../core/sc_event.hh" 3810263Satgutier@umich.edu#include "../core/sc_module.hh" // for sc_gen_unique_name 3910263Satgutier@umich.edu#include "../core/sc_prim.hh" 4010263Satgutier@umich.edu#include "../dt/bit/sc_logic.hh" 4110263Satgutier@umich.edu#include "sc_signal_inout_if.hh" 4210263Satgutier@umich.edu#include "warn_unimpl.hh" // for warn_unimpl 4310263Satgutier@umich.edu 4410263Satgutier@umich.edunamespace sc_core 4510263Satgutier@umich.edu{ 4610263Satgutier@umich.edu 4710263Satgutier@umich.educlass sc_port_base; 4810263Satgutier@umich.educlass sc_trace_file; 4910263Satgutier@umich.edu 5010263Satgutier@umich.edu// Nonstandard 5110263Satgutier@umich.edu// Despite having a warning "FOR INTERNAL USE ONLY!" in all caps above this 5210263Satgutier@umich.edu// class definition in the Accellera implementation, it appears in their 5310263Satgutier@umich.edu// examples and test programs, and so we need to have it here as well. 5410263Satgutier@umich.edustruct sc_trace_params 5510263Satgutier@umich.edu{ 5610263Satgutier@umich.edu sc_trace_file *tf; 5710263Satgutier@umich.edu std::string name; 5810263Satgutier@umich.edu 5910263Satgutier@umich.edu sc_trace_params(sc_trace_file *tf, const std::string &name) : 6010263Satgutier@umich.edu tf(tf), name(name) 6110263Satgutier@umich.edu {} 6210263Satgutier@umich.edu}; 6310263Satgutier@umich.edutypedef std::vector<sc_trace_params *> sc_trace_params_vec; 6410263Satgutier@umich.edu 6510263Satgutier@umich.edutemplate <class T, sc_writer_policy WRITER_POLICY=SC_ONE_WRITER> 6610263Satgutier@umich.educlass sc_signal : public sc_signal_inout_if<T>, 6710263Satgutier@umich.edu public sc_prim_channel 6810263Satgutier@umich.edu{ 6910263Satgutier@umich.edu public: 7010263Satgutier@umich.edu sc_signal() : sc_signal_inout_if<T>(), 7110263Satgutier@umich.edu sc_prim_channel(sc_gen_unique_name("signal")), 7210263Satgutier@umich.edu m_cur_val(T()), m_new_val(T()) 7310263Satgutier@umich.edu {} 7410263Satgutier@umich.edu explicit sc_signal(const char *name) : 7510263Satgutier@umich.edu sc_signal_inout_if<T>(), sc_prim_channel(name), 7610263Satgutier@umich.edu m_cur_val(T()), m_new_val(T()) 7710263Satgutier@umich.edu {} 7810263Satgutier@umich.edu explicit sc_signal(const char *name, const T &initial_value) : 7910263Satgutier@umich.edu sc_signal_inout_if<T>(), sc_prim_channel(name), 8010263Satgutier@umich.edu m_cur_val(initial_value), m_new_val(initial_value) 8110263Satgutier@umich.edu {} 8210263Satgutier@umich.edu virtual ~sc_signal() {} 8310263Satgutier@umich.edu 8410263Satgutier@umich.edu virtual void 8510263Satgutier@umich.edu register_port(sc_port_base &, const char *) 8610263Satgutier@umich.edu { 8710263Satgutier@umich.edu sc_channel_warn_unimpl(__PRETTY_FUNCTION__); 8810263Satgutier@umich.edu } 8910263Satgutier@umich.edu 9010941Sdavid.guillen@arm.com virtual const T &read() const { return m_cur_val; } 9110941Sdavid.guillen@arm.com operator const T&() const { return read(); } 9210263Satgutier@umich.edu 9310263Satgutier@umich.edu virtual sc_writer_policy 9410263Satgutier@umich.edu get_writer_policy() const 9510263Satgutier@umich.edu { 9610263Satgutier@umich.edu return WRITER_POLICY; 9710263Satgutier@umich.edu } 9810263Satgutier@umich.edu virtual void 9910263Satgutier@umich.edu write(const T &t) 10010263Satgutier@umich.edu { 10110263Satgutier@umich.edu m_new_val = t; 10210263Satgutier@umich.edu bool changed = !(m_cur_val == m_new_val); 10310263Satgutier@umich.edu //TODO check whether this write follows the write policy. 10410263Satgutier@umich.edu if (changed) 10510263Satgutier@umich.edu request_update(); 10610263Satgutier@umich.edu } 10710263Satgutier@umich.edu sc_signal<T, WRITER_POLICY> & 10810263Satgutier@umich.edu operator = (const T &t) 10910263Satgutier@umich.edu { 11010263Satgutier@umich.edu write(t); 11110263Satgutier@umich.edu return *this; 11210263Satgutier@umich.edu } 11310263Satgutier@umich.edu sc_signal<T, WRITER_POLICY> & 11410263Satgutier@umich.edu operator = (const sc_signal<T, WRITER_POLICY> &s) 11510263Satgutier@umich.edu { 11610263Satgutier@umich.edu write(s.read()); 11710263Satgutier@umich.edu return *this; 11810263Satgutier@umich.edu } 11910263Satgutier@umich.edu 12010263Satgutier@umich.edu virtual const sc_event & 12110263Satgutier@umich.edu default_event() const 12210263Satgutier@umich.edu { 12310263Satgutier@umich.edu return value_changed_event(); 12410263Satgutier@umich.edu } 12510263Satgutier@umich.edu virtual const sc_event & 12610263Satgutier@umich.edu value_changed_event() const 12710263Satgutier@umich.edu { 12810263Satgutier@umich.edu return _valueChangedEvent; 12910263Satgutier@umich.edu } 13010263Satgutier@umich.edu virtual bool 13110263Satgutier@umich.edu event() const 13210263Satgutier@umich.edu { 13310263Satgutier@umich.edu sc_channel_warn_unimpl(__PRETTY_FUNCTION__); 13410263Satgutier@umich.edu return false; 13510263Satgutier@umich.edu } 13610263Satgutier@umich.edu 13710263Satgutier@umich.edu virtual void print(std::ostream &os=std::cout) const { os << m_cur_val; } 13810263Satgutier@umich.edu virtual void 13910263Satgutier@umich.edu dump(std::ostream &os=std::cout) const 14010263Satgutier@umich.edu { 14110263Satgutier@umich.edu os << " name = " << name() << ::std::endl; 14210263Satgutier@umich.edu os << " value = " << m_cur_val << ::std::endl; 14310263Satgutier@umich.edu os << "new value = " << m_new_val << ::std::endl; 14410263Satgutier@umich.edu } 14510263Satgutier@umich.edu virtual const char *kind() const { return "sc_signal"; } 14610263Satgutier@umich.edu 14710263Satgutier@umich.edu protected: 14810263Satgutier@umich.edu virtual void 14910263Satgutier@umich.edu update() 15010263Satgutier@umich.edu { 15110941Sdavid.guillen@arm.com if (m_new_val == m_cur_val) 15210941Sdavid.guillen@arm.com return; 15310941Sdavid.guillen@arm.com 15410941Sdavid.guillen@arm.com m_cur_val = m_new_val; 15511169Sandreas.hansson@arm.com _valueChangedEvent.notify(SC_ZERO_TIME); 15610941Sdavid.guillen@arm.com } 15710941Sdavid.guillen@arm.com 15810941Sdavid.guillen@arm.com // These members which store the current and future value of the signal 15910941Sdavid.guillen@arm.com // are not specified in the standard but are referred to directly by one 16010941Sdavid.guillen@arm.com // of the tests. 16110941Sdavid.guillen@arm.com T m_cur_val; 16210941Sdavid.guillen@arm.com T m_new_val; 16310941Sdavid.guillen@arm.com 16410941Sdavid.guillen@arm.com private: 16511169Sandreas.hansson@arm.com sc_event _valueChangedEvent; 16610941Sdavid.guillen@arm.com 16710941Sdavid.guillen@arm.com // Disabled 16810941Sdavid.guillen@arm.com sc_signal(const sc_signal<T, WRITER_POLICY> &) : 16910941Sdavid.guillen@arm.com sc_signal_inout_if<T>(), sc_prim_channel("") 17010941Sdavid.guillen@arm.com {} 17110941Sdavid.guillen@arm.com}; 17210941Sdavid.guillen@arm.com 17310941Sdavid.guillen@arm.comtemplate <class T, sc_writer_policy WRITER_POLICY> 17410941Sdavid.guillen@arm.cominline std::ostream & 17510941Sdavid.guillen@arm.comoperator << (std::ostream &os, const sc_signal<T, WRITER_POLICY> &) 17611169Sandreas.hansson@arm.com{ 17710941Sdavid.guillen@arm.com sc_channel_warn_unimpl(__PRETTY_FUNCTION__); 17810941Sdavid.guillen@arm.com return os; 17910263Satgutier@umich.edu} 18010263Satgutier@umich.edu 18110263Satgutier@umich.edutemplate <sc_writer_policy WRITER_POLICY> 18211169Sandreas.hansson@arm.comclass sc_signal<bool, WRITER_POLICY> : 18310263Satgutier@umich.edu public sc_signal_inout_if<bool>, public sc_prim_channel 18410263Satgutier@umich.edu{ 18510263Satgutier@umich.edu public: 18610263Satgutier@umich.edu sc_signal() : sc_signal_inout_if<bool>(), 18710263Satgutier@umich.edu sc_prim_channel(sc_gen_unique_name("signal")), 18810263Satgutier@umich.edu m_cur_val(bool()), m_new_val(bool()) 18910263Satgutier@umich.edu {} 19010263Satgutier@umich.edu explicit sc_signal(const char *name) : 19110263Satgutier@umich.edu sc_signal_inout_if<bool>(), sc_prim_channel(name), 19210263Satgutier@umich.edu m_cur_val(bool()), m_new_val(bool()) 19310263Satgutier@umich.edu {} 19410263Satgutier@umich.edu explicit sc_signal(const char *name, const bool &initial_value) : 19510263Satgutier@umich.edu sc_signal_inout_if<bool>(), sc_prim_channel(name), 19610263Satgutier@umich.edu m_cur_val(initial_value), m_new_val(initial_value) 19710263Satgutier@umich.edu {} 19810263Satgutier@umich.edu virtual ~sc_signal() {} 19910263Satgutier@umich.edu 20010263Satgutier@umich.edu virtual void 20110263Satgutier@umich.edu register_port(sc_port_base &, const char *) 20210263Satgutier@umich.edu { 20310263Satgutier@umich.edu sc_channel_warn_unimpl(__PRETTY_FUNCTION__); 20410263Satgutier@umich.edu } 20510815Sdavid.guillen@arm.com 20611169Sandreas.hansson@arm.com virtual const bool &read() const { return m_cur_val; } 20710263Satgutier@umich.edu operator const bool &() const { return read(); } 20810263Satgutier@umich.edu 20910263Satgutier@umich.edu virtual sc_writer_policy 21010263Satgutier@umich.edu get_writer_policy() const 21110693SMarco.Balboni@ARM.com { 21210263Satgutier@umich.edu return WRITER_POLICY; 21310263Satgutier@umich.edu } 21410263Satgutier@umich.edu virtual void 21510263Satgutier@umich.edu write(const bool &b) 21610941Sdavid.guillen@arm.com { 21710263Satgutier@umich.edu m_new_val = b; 21810263Satgutier@umich.edu bool changed = !(m_cur_val == m_new_val); 21910263Satgutier@umich.edu //TODO check whether this write follows the write policy. 22010263Satgutier@umich.edu if (changed) 22110263Satgutier@umich.edu request_update(); 22210941Sdavid.guillen@arm.com } 22310263Satgutier@umich.edu sc_signal<bool, WRITER_POLICY> & 22410263Satgutier@umich.edu operator = (const bool &b) 22510263Satgutier@umich.edu { 22610263Satgutier@umich.edu write(b); 22710263Satgutier@umich.edu return *this; 22810693SMarco.Balboni@ARM.com } 22910263Satgutier@umich.edu sc_signal<bool, WRITER_POLICY> & 23010263Satgutier@umich.edu operator = (const sc_signal<bool, WRITER_POLICY> &s) 23110263Satgutier@umich.edu { 23210263Satgutier@umich.edu write(s.read()); 23310263Satgutier@umich.edu return *this; 23410263Satgutier@umich.edu } 23510263Satgutier@umich.edu 23610263Satgutier@umich.edu virtual const sc_event & 23710263Satgutier@umich.edu default_event() const 23810263Satgutier@umich.edu { 23910263Satgutier@umich.edu return value_changed_event(); 24010263Satgutier@umich.edu } 24110263Satgutier@umich.edu 24210263Satgutier@umich.edu virtual const sc_event & 24310263Satgutier@umich.edu value_changed_event() const 24410263Satgutier@umich.edu { 24511169Sandreas.hansson@arm.com return _valueChangedEvent; 24610263Satgutier@umich.edu } 24710263Satgutier@umich.edu virtual const sc_event & 24810263Satgutier@umich.edu posedge_event() const 24910263Satgutier@umich.edu { 25010263Satgutier@umich.edu return _posedgeEvent; 25110263Satgutier@umich.edu } 25210263Satgutier@umich.edu virtual const sc_event & 25310263Satgutier@umich.edu negedge_event() const 25411169Sandreas.hansson@arm.com { 25510263Satgutier@umich.edu return _negedgeEvent; 25610263Satgutier@umich.edu } 25710263Satgutier@umich.edu 25810263Satgutier@umich.edu virtual bool 25910263Satgutier@umich.edu event() const 26010941Sdavid.guillen@arm.com { 26110263Satgutier@umich.edu sc_channel_warn_unimpl(__PRETTY_FUNCTION__); 26210941Sdavid.guillen@arm.com return false; 26310263Satgutier@umich.edu } 26410263Satgutier@umich.edu virtual bool 26510263Satgutier@umich.edu posedge() const 26610263Satgutier@umich.edu { 26710263Satgutier@umich.edu sc_channel_warn_unimpl(__PRETTY_FUNCTION__); 26810263Satgutier@umich.edu return false; 26910263Satgutier@umich.edu } 27010263Satgutier@umich.edu virtual bool 27110263Satgutier@umich.edu negedge() const 27210263Satgutier@umich.edu { 27310263Satgutier@umich.edu sc_channel_warn_unimpl(__PRETTY_FUNCTION__); 27411169Sandreas.hansson@arm.com return false; 27510263Satgutier@umich.edu } 27610263Satgutier@umich.edu 27710263Satgutier@umich.edu virtual void print(std::ostream &os=std::cout) const { os << m_cur_val; } 27810263Satgutier@umich.edu virtual void 27910274Smitch.hayenga@arm.com dump(std::ostream &os=std::cout) const 28010263Satgutier@umich.edu { 28110263Satgutier@umich.edu os << " name = " << name() << ::std::endl; 28210263Satgutier@umich.edu os << " value = " << m_cur_val << ::std::endl; 28310263Satgutier@umich.edu os << "new value = " << m_new_val << ::std::endl; 28410263Satgutier@umich.edu } 28510263Satgutier@umich.edu virtual const char *kind() const { return "sc_signal"; } 28610263Satgutier@umich.edu 28710263Satgutier@umich.edu protected: 28810263Satgutier@umich.edu virtual void 28910263Satgutier@umich.edu update() 29010263Satgutier@umich.edu { 29110263Satgutier@umich.edu if (m_new_val == m_cur_val) 29210263Satgutier@umich.edu return; 29310263Satgutier@umich.edu 29410263Satgutier@umich.edu m_cur_val = m_new_val; 29510263Satgutier@umich.edu _valueChangedEvent.notify(SC_ZERO_TIME); 29610263Satgutier@umich.edu if (m_cur_val) 29710263Satgutier@umich.edu _posedgeEvent.notify(SC_ZERO_TIME); 29810263Satgutier@umich.edu else 29910263Satgutier@umich.edu _negedgeEvent.notify(SC_ZERO_TIME); 30010263Satgutier@umich.edu } 30110263Satgutier@umich.edu 30210263Satgutier@umich.edu bool m_cur_val; 30310263Satgutier@umich.edu bool m_new_val; 30410263Satgutier@umich.edu 30510263Satgutier@umich.edu private: 30610263Satgutier@umich.edu sc_event _valueChangedEvent; 30710274Smitch.hayenga@arm.com sc_event _posedgeEvent; 30810263Satgutier@umich.edu sc_event _negedgeEvent; 30910263Satgutier@umich.edu 31010263Satgutier@umich.edu // Disabled 31110263Satgutier@umich.edu sc_signal(const sc_signal<bool, WRITER_POLICY> &) : 31210263Satgutier@umich.edu sc_signal_inout_if<bool>(), sc_prim_channel("") 31310263Satgutier@umich.edu {} 31410263Satgutier@umich.edu}; 31510263Satgutier@umich.edu 31610263Satgutier@umich.edutemplate <sc_writer_policy WRITER_POLICY> 31710263Satgutier@umich.educlass sc_signal<sc_dt::sc_logic, WRITER_POLICY> : 31810263Satgutier@umich.edu public sc_signal_inout_if<sc_dt::sc_logic>, public sc_prim_channel 31910263Satgutier@umich.edu{ 32010263Satgutier@umich.edu public: 32110263Satgutier@umich.edu sc_signal() : sc_signal_inout_if<sc_dt::sc_logic>(), 32210263Satgutier@umich.edu sc_prim_channel(sc_gen_unique_name("signal")), 32310263Satgutier@umich.edu m_cur_val(sc_dt::sc_logic()), m_new_val(sc_dt::sc_logic()) 32410941Sdavid.guillen@arm.com {} 32510941Sdavid.guillen@arm.com explicit sc_signal(const char *name) : 32610941Sdavid.guillen@arm.com sc_signal_inout_if<sc_dt::sc_logic>(), sc_prim_channel(name), 32711169Sandreas.hansson@arm.com m_cur_val(sc_dt::sc_logic()), m_new_val(sc_dt::sc_logic()) 32810941Sdavid.guillen@arm.com {} 32910941Sdavid.guillen@arm.com explicit sc_signal(const char *name, 33010941Sdavid.guillen@arm.com const sc_dt::sc_logic &initial_value) : 33110941Sdavid.guillen@arm.com sc_signal_inout_if<sc_dt::sc_logic>(), sc_prim_channel(name), 33210941Sdavid.guillen@arm.com m_cur_val(initial_value), m_new_val(initial_value) 33310941Sdavid.guillen@arm.com {} 33410941Sdavid.guillen@arm.com virtual ~sc_signal() {} 33510941Sdavid.guillen@arm.com 33610941Sdavid.guillen@arm.com virtual void 33711169Sandreas.hansson@arm.com register_port(sc_port_base &, const char *) 33810941Sdavid.guillen@arm.com { 33910941Sdavid.guillen@arm.com sc_channel_warn_unimpl(__PRETTY_FUNCTION__); 34010941Sdavid.guillen@arm.com } 34110941Sdavid.guillen@arm.com 34210941Sdavid.guillen@arm.com virtual const sc_dt::sc_logic &read() const { return m_cur_val; } 34310263Satgutier@umich.edu operator const sc_dt::sc_logic &() const { return read(); } 34410263Satgutier@umich.edu 34510263Satgutier@umich.edu virtual sc_writer_policy 34610263Satgutier@umich.edu get_writer_policy() const 34711169Sandreas.hansson@arm.com { 34810263Satgutier@umich.edu return WRITER_POLICY; 34910263Satgutier@umich.edu } 35010263Satgutier@umich.edu virtual void 35110263Satgutier@umich.edu write(const sc_dt::sc_logic &l) 35210263Satgutier@umich.edu { 35310263Satgutier@umich.edu m_new_val = l; 35410263Satgutier@umich.edu bool changed = !(m_cur_val == m_new_val); 35510263Satgutier@umich.edu //TODO check whether this write follows the write policy. 35610263Satgutier@umich.edu if (changed) 35711169Sandreas.hansson@arm.com request_update(); 35810263Satgutier@umich.edu } 35910263Satgutier@umich.edu sc_signal<sc_dt::sc_logic, WRITER_POLICY> & 36010263Satgutier@umich.edu operator = (const sc_dt::sc_logic &l) 36110263Satgutier@umich.edu { 36210263Satgutier@umich.edu write(l); 36310263Satgutier@umich.edu return *this; 36410263Satgutier@umich.edu } 36510263Satgutier@umich.edu sc_signal<sc_dt::sc_logic, WRITER_POLICY> & 36610263Satgutier@umich.edu operator = (const sc_signal<sc_dt::sc_logic, WRITER_POLICY> &s) 36710263Satgutier@umich.edu { 36810263Satgutier@umich.edu write(s.read()); 36910263Satgutier@umich.edu return *this; 37010263Satgutier@umich.edu } 37110263Satgutier@umich.edu 37210263Satgutier@umich.edu virtual const sc_event & 37310263Satgutier@umich.edu default_event() const 37410263Satgutier@umich.edu { 37510263Satgutier@umich.edu return value_changed_event(); 37610263Satgutier@umich.edu } 37710263Satgutier@umich.edu 37811169Sandreas.hansson@arm.com virtual const sc_event & 37910263Satgutier@umich.edu value_changed_event() const 38010263Satgutier@umich.edu { 38110263Satgutier@umich.edu return _valueChangedEvent; 38210263Satgutier@umich.edu } 38310263Satgutier@umich.edu virtual const sc_event & 38410263Satgutier@umich.edu posedge_event() const 38510263Satgutier@umich.edu { 38611169Sandreas.hansson@arm.com return _posedgeEvent; 38710263Satgutier@umich.edu } 38810263Satgutier@umich.edu virtual const sc_event & 38910263Satgutier@umich.edu negedge_event() const 39010263Satgutier@umich.edu { 39111169Sandreas.hansson@arm.com return _negedgeEvent; 39210263Satgutier@umich.edu } 39310263Satgutier@umich.edu 39410263Satgutier@umich.edu virtual bool 39510263Satgutier@umich.edu event() const 39611169Sandreas.hansson@arm.com { 39710263Satgutier@umich.edu sc_channel_warn_unimpl(__PRETTY_FUNCTION__); 39810263Satgutier@umich.edu return false; 39910263Satgutier@umich.edu } 40010263Satgutier@umich.edu virtual bool 40110263Satgutier@umich.edu posedge() const 40210263Satgutier@umich.edu { 40310263Satgutier@umich.edu sc_channel_warn_unimpl(__PRETTY_FUNCTION__); 40410263Satgutier@umich.edu return false; 40510263Satgutier@umich.edu } 40610263Satgutier@umich.edu virtual bool 40710263Satgutier@umich.edu negedge() const 40810263Satgutier@umich.edu { 40910263Satgutier@umich.edu sc_channel_warn_unimpl(__PRETTY_FUNCTION__); 41011168Sandreas.hansson@arm.com return false; 41110263Satgutier@umich.edu } 41210263Satgutier@umich.edu 41310263Satgutier@umich.edu virtual void print(std::ostream &os=std::cout) const { os << m_cur_val; } 41410263Satgutier@umich.edu virtual void 41510263Satgutier@umich.edu dump(std::ostream &os=std::cout) const 41610263Satgutier@umich.edu { 41710263Satgutier@umich.edu os << " name = " << name() << ::std::endl; 41810263Satgutier@umich.edu os << " value = " << m_cur_val << ::std::endl; 419 os << "new value = " << m_new_val << ::std::endl; 420 } 421 virtual const char *kind() const { return "sc_signal"; } 422 423 protected: 424 virtual void 425 update() 426 { 427 if (m_new_val == m_cur_val) 428 return; 429 430 m_cur_val = m_new_val; 431 _valueChangedEvent.notify(SC_ZERO_TIME); 432 if (m_cur_val == sc_dt::SC_LOGIC_1) 433 _posedgeEvent.notify(SC_ZERO_TIME); 434 else if (m_cur_val == sc_dt::SC_LOGIC_0) 435 _negedgeEvent.notify(SC_ZERO_TIME); 436 } 437 438 sc_dt::sc_logic m_cur_val; 439 sc_dt::sc_logic m_new_val; 440 441 private: 442 sc_event _valueChangedEvent; 443 sc_event _posedgeEvent; 444 sc_event _negedgeEvent; 445 446 // Disabled 447 sc_signal(const sc_signal<sc_dt::sc_logic, WRITER_POLICY> &) : 448 sc_signal_inout_if<sc_dt::sc_logic>(), sc_prim_channel("") 449 {} 450}; 451 452} // namespace sc_core 453 454#endif //__SYSTEMC_EXT_CHANNEL_SC_SIGNAL_HH__ 455