sc_signal.hh revision 13141
12SN/A/* 28707Sandreas.hansson@arm.com * Copyright 2018 Google, Inc. 38707Sandreas.hansson@arm.com * 48707Sandreas.hansson@arm.com * Redistribution and use in source and binary forms, with or without 58707Sandreas.hansson@arm.com * modification, are permitted provided that the following conditions are 68707Sandreas.hansson@arm.com * met: redistributions of source code must retain the above copyright 78707Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer; 88707Sandreas.hansson@arm.com * redistributions in binary form must reproduce the above copyright 98707Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer in the 108707Sandreas.hansson@arm.com * documentation and/or other materials provided with the distribution; 118707Sandreas.hansson@arm.com * neither the name of the copyright holders nor the names of its 128707Sandreas.hansson@arm.com * contributors may be used to endorse or promote products derived from 138707Sandreas.hansson@arm.com * this software without specific prior written permission. 141762SN/A * 157897Shestness@cs.utexas.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 162SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 172SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 182SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 192SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 202SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 212SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 222SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 232SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 242SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 252SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 262SN/A * 272SN/A * Authors: Gabe Black 282SN/A */ 292SN/A 302SN/A#ifndef __SYSTEMC_EXT_CHANNEL_SC_SIGNAL_HH__ 312SN/A#define __SYSTEMC_EXT_CHANNEL_SC_SIGNAL_HH__ 322SN/A 332SN/A#include <iostream> 342SN/A#include <string> 352SN/A#include <vector> 362SN/A 372SN/A#include "../core/sc_event.hh" 382SN/A#include "../core/sc_module.hh" // for sc_gen_unique_name 392SN/A#include "../core/sc_prim.hh" 402665Ssaidi@eecs.umich.edu#include "../dt/bit/sc_logic.hh" 412665Ssaidi@eecs.umich.edu#include "sc_signal_inout_if.hh" 422665Ssaidi@eecs.umich.edu#include "warn_unimpl.hh" // for warn_unimpl 437897Shestness@cs.utexas.edu 442SN/Anamespace sc_core 452SN/A{ 461388SN/A 478229Snate@binkert.orgclass sc_port_base; 482SN/Aclass sc_trace_file; 492SN/A 507781SAli.Saidi@ARM.com// Nonstandard 518229Snate@binkert.org// Despite having a warning "FOR INTERNAL USE ONLY!" in all caps above this 521191SN/A// class definition in the Accellera implementation, it appears in their 531191SN/A// examples and test programs, and so we need to have it here as well. 541388SN/Astruct sc_trace_params 555529Snate@binkert.org{ 568733Sgeoffrey.blake@arm.com sc_trace_file *tf; 571717SN/A std::string name; 582651Ssaidi@eecs.umich.edu 598229Snate@binkert.org sc_trace_params(sc_trace_file *tf, const std::string &name) : 602680Sktlim@umich.edu tf(tf), name(name) 618232Snate@binkert.org {} 625529Snate@binkert.org}; 632190SN/Atypedef std::vector<sc_trace_params *> sc_trace_params_vec; 6456SN/A 658229Snate@binkert.orgtemplate <class T, sc_writer_policy WRITER_POLICY=SC_ONE_WRITER> 662190SN/Aclass sc_signal : public sc_signal_inout_if<T>, 672SN/A public sc_prim_channel 688733Sgeoffrey.blake@arm.com{ 698733Sgeoffrey.blake@arm.com public: 708733Sgeoffrey.blake@arm.com sc_signal() : sc_signal_inout_if<T>(), 718733Sgeoffrey.blake@arm.com sc_prim_channel(sc_gen_unique_name("signal")), 722359SN/A m_cur_val(T()), m_new_val(T()), _changeStamp(~0ULL) 732359SN/A {} 742359SN/A explicit sc_signal(const char *name) : 752SN/A sc_signal_inout_if<T>(), sc_prim_channel(name), 762SN/A m_cur_val(T()), m_new_val(T()), _changeStamp(~0ULL) 772SN/A {} 782SN/A explicit sc_signal(const char *name, const T &initial_value) : 792SN/A sc_signal_inout_if<T>(), sc_prim_channel(name), 802SN/A m_cur_val(initial_value), m_new_val(initial_value), _changeStamp(~0ULL) 812SN/A {} 822SN/A virtual ~sc_signal() {} 832SN/A 845606Snate@binkert.org virtual void 856144Sksewell@umich.edu register_port(sc_port_base &, const char *) 866144Sksewell@umich.edu { 873126Sktlim@umich.edu sc_channel_warn_unimpl(__PRETTY_FUNCTION__); 886144Sksewell@umich.edu } 897823Ssteve.reinhardt@amd.com 903126Sktlim@umich.edu virtual const T &read() const { return m_cur_val; } 913126Sktlim@umich.edu operator const T&() const { return read(); } 922356SN/A 932356SN/A virtual sc_writer_policy 942356SN/A get_writer_policy() const 952367SN/A { 962356SN/A return WRITER_POLICY; 976144Sksewell@umich.edu } 982367SN/A virtual void 996144Sksewell@umich.edu write(const T &t) 1006144Sksewell@umich.edu { 1016144Sksewell@umich.edu m_new_val = t; 1022356SN/A bool changed = !(m_cur_val == m_new_val); 1032367SN/A //TODO check whether this write follows the write policy. 1046144Sksewell@umich.edu if (changed) 1057823Ssteve.reinhardt@amd.com request_update(); 1066144Sksewell@umich.edu } 1072367SN/A sc_signal<T, WRITER_POLICY> & 1082356SN/A operator = (const T &t) 1096144Sksewell@umich.edu { 1106144Sksewell@umich.edu write(t); 1117823Ssteve.reinhardt@amd.com return *this; 1122356SN/A } 1132356SN/A sc_signal<T, WRITER_POLICY> & 1142356SN/A operator = (const sc_signal<T, WRITER_POLICY> &s) 1155336Shines@cs.fsu.edu { 1162356SN/A write(s.read()); 1174873Sstever@eecs.umich.edu return *this; 1182356SN/A } 1192356SN/A 1201858SN/A virtual const sc_event & 1211400SN/A default_event() const 1225712Shsul@eecs.umich.edu { 1235712Shsul@eecs.umich.edu return value_changed_event(); 1246221Snate@binkert.org } 1253661Srdreslin@umich.edu virtual const sc_event & 1262SN/A value_changed_event() const 1271400SN/A { 1285712Shsul@eecs.umich.edu return _valueChangedEvent; 1296221Snate@binkert.org } 1303661Srdreslin@umich.edu virtual bool 1312SN/A event() const 1322SN/A { 1337823Ssteve.reinhardt@amd.com return _changeStamp == ::sc_gem5::getChangeStamp(); 1341062SN/A } 1355712Shsul@eecs.umich.edu 1365712Shsul@eecs.umich.edu virtual void print(std::ostream &os=std::cout) const { os << m_cur_val; } 1375712Shsul@eecs.umich.edu virtual void 1385712Shsul@eecs.umich.edu dump(std::ostream &os=std::cout) const 1395712Shsul@eecs.umich.edu { 1402SN/A os << " name = " << name() << ::std::endl; 1412SN/A os << " value = " << m_cur_val << ::std::endl; 1422SN/A os << "new value = " << m_new_val << ::std::endl; 1435712Shsul@eecs.umich.edu } 1445712Shsul@eecs.umich.edu virtual const char *kind() const { return "sc_signal"; } 1456221Snate@binkert.org 1466221Snate@binkert.org protected: 1472SN/A virtual void 1482SN/A update() 1496221Snate@binkert.org { 1506221Snate@binkert.org if (m_new_val == m_cur_val) 1516221Snate@binkert.org return; 1526221Snate@binkert.org 1532SN/A m_cur_val = m_new_val; 1542SN/A _changeStamp = ::sc_gem5::getChangeStamp(); 1552SN/A _valueChangedEvent.notify(SC_ZERO_TIME); 1562SN/A } 1575606Snate@binkert.org 1585606Snate@binkert.org // These members which store the current and future value of the signal 1596221Snate@binkert.org // are not specified in the standard but are referred to directly by one 1605606Snate@binkert.org // of the tests. 1616221Snate@binkert.org T m_cur_val; 1625606Snate@binkert.org T m_new_val; 1635606Snate@binkert.org 1642SN/A private: 1651400SN/A sc_event _valueChangedEvent; 1665606Snate@binkert.org uint64_t _changeStamp; 1675606Snate@binkert.org 1682SN/A // Disabled 1692SN/A sc_signal(const sc_signal<T, WRITER_POLICY> &) : 1702SN/A sc_signal_inout_if<T>(), sc_prim_channel("") 1712SN/A {} 1726221Snate@binkert.org}; 1736221Snate@binkert.org 1745606Snate@binkert.orgtemplate <class T, sc_writer_policy WRITER_POLICY> 1756670Shsul@eecs.umich.eduinline std::ostream & 1765606Snate@binkert.orgoperator << (std::ostream &os, const sc_signal<T, WRITER_POLICY> &) 1772SN/A{ 1782SN/A sc_channel_warn_unimpl(__PRETTY_FUNCTION__); 179124SN/A return os; 1806221Snate@binkert.org} 1816221Snate@binkert.org 1826221Snate@binkert.orgtemplate <sc_writer_policy WRITER_POLICY> 183124SN/Aclass sc_signal<bool, WRITER_POLICY> : 184124SN/A public sc_signal_inout_if<bool>, public sc_prim_channel 185124SN/A{ 186124SN/A public: 1875606Snate@binkert.org sc_signal() : sc_signal_inout_if<bool>(), 1885606Snate@binkert.org sc_prim_channel(sc_gen_unique_name("signal")), 1896221Snate@binkert.org m_cur_val(bool()), m_new_val(bool()), 1905606Snate@binkert.org _changeStamp(~0ULL), _posStamp(~0ULL), _negStamp(~0ULL) 1916221Snate@binkert.org {} 1925606Snate@binkert.org explicit sc_signal(const char *name) : 1935606Snate@binkert.org sc_signal_inout_if<bool>(), sc_prim_channel(name), 194124SN/A m_cur_val(bool()), m_new_val(bool()), 1951400SN/A _changeStamp(~0ULL), _posStamp(~0ULL), _negStamp(~0ULL) 1965606Snate@binkert.org {} 197124SN/A explicit sc_signal(const char *name, const bool &initial_value) : 198124SN/A sc_signal_inout_if<bool>(), sc_prim_channel(name), 199124SN/A m_cur_val(initial_value), m_new_val(initial_value), 200124SN/A _changeStamp(~0ULL), _posStamp(~0ULL), _negStamp(~0ULL) 2016221Snate@binkert.org {} 2026221Snate@binkert.org virtual ~sc_signal() {} 2035606Snate@binkert.org 2046221Snate@binkert.org virtual void 2055606Snate@binkert.org register_port(sc_port_base &, const char *) 206124SN/A { 207124SN/A sc_channel_warn_unimpl(__PRETTY_FUNCTION__); 2081191SN/A } 2095529Snate@binkert.org 2108634Schris.emmons@arm.com virtual const bool &read() const { return m_cur_val; } 2118634Schris.emmons@arm.com operator const bool &() const { return read(); } 2128634Schris.emmons@arm.com 2138634Schris.emmons@arm.com virtual sc_writer_policy 2148634Schris.emmons@arm.com get_writer_policy() const 2151191SN/A { 2165529Snate@binkert.org return WRITER_POLICY; 2171191SN/A } 2185529Snate@binkert.org virtual void 2191191SN/A write(const bool &b) 2201191SN/A { 2215606Snate@binkert.org m_new_val = b; 2225606Snate@binkert.org bool changed = !(m_cur_val == m_new_val); 2235606Snate@binkert.org //TODO check whether this write follows the write policy. 2241191SN/A if (changed) 2251191SN/A request_update(); 2261917SN/A } 2278733Sgeoffrey.blake@arm.com sc_signal<bool, WRITER_POLICY> & 2288733Sgeoffrey.blake@arm.com operator = (const bool &b) 2298733Sgeoffrey.blake@arm.com { 2308733Sgeoffrey.blake@arm.com write(b); 2315810Sgblack@eecs.umich.edu return *this; 2321917SN/A } 2335529Snate@binkert.org sc_signal<bool, WRITER_POLICY> & 2345529Snate@binkert.org operator = (const sc_signal<bool, WRITER_POLICY> &s) 2351917SN/A { 2365529Snate@binkert.org write(s.read()); 2371917SN/A return *this; 2381191SN/A } 2391191SN/A 2401191SN/A virtual const sc_event & 2411191SN/A default_event() const 2421191SN/A { 2431191SN/A return value_changed_event(); 2441191SN/A } 2451191SN/A 2461191SN/A virtual const sc_event & 2471191SN/A value_changed_event() const 2481191SN/A { 2491129SN/A return _valueChangedEvent; 2501129SN/A } 2511129SN/A virtual const sc_event & 2525529Snate@binkert.org posedge_event() const 2532680Sktlim@umich.edu { 2541129SN/A return _posedgeEvent; 255180SN/A } 2562SN/A virtual const sc_event & 2571917SN/A negedge_event() const 2581917SN/A { 2591917SN/A return _negedgeEvent; 2605529Snate@binkert.org } 2617823Ssteve.reinhardt@amd.com 2621917SN/A virtual bool 2632356SN/A event() const 2645529Snate@binkert.org { 2655606Snate@binkert.org return _changeStamp == ::sc_gem5::getChangeStamp(); 2666144Sksewell@umich.edu } 2678607Sgblack@eecs.umich.edu virtual bool 2682356SN/A posedge() const 2691917SN/A { 2701917SN/A return _posStamp == ::sc_gem5::getChangeStamp(); 2711917SN/A } 2721917SN/A virtual bool 2732SN/A negedge() const 2742SN/A { 275729SN/A return _negStamp == ::sc_gem5::getChangeStamp(); 276707SN/A } 277707SN/A 278707SN/A virtual void print(std::ostream &os=std::cout) const { os << m_cur_val; } 279707SN/A virtual void 280707SN/A dump(std::ostream &os=std::cout) const 281707SN/A { 2827914SBrad.Beckmann@amd.com os << " name = " << name() << ::std::endl; 2837914SBrad.Beckmann@amd.com os << " value = " << m_cur_val << ::std::endl; 2847914SBrad.Beckmann@amd.com os << "new value = " << m_new_val << ::std::endl; 2857914SBrad.Beckmann@amd.com } 2867914SBrad.Beckmann@amd.com virtual const char *kind() const { return "sc_signal"; } 2877914SBrad.Beckmann@amd.com 2887914SBrad.Beckmann@amd.com protected: 2897914SBrad.Beckmann@amd.com virtual void 2907914SBrad.Beckmann@amd.com update() 2917914SBrad.Beckmann@amd.com { 2922680Sktlim@umich.edu if (m_new_val == m_cur_val) 2932SN/A return; 2942SN/A 2952SN/A m_cur_val = m_new_val; 2962SN/A uint64_t change_stamp = ::sc_gem5::getChangeStamp(); 2972680Sktlim@umich.edu _changeStamp = change_stamp; 2982SN/A _valueChangedEvent.notify(SC_ZERO_TIME); 2992SN/A if (m_cur_val) { 3002680Sktlim@umich.edu _posStamp = change_stamp; 3012190SN/A _posedgeEvent.notify(SC_ZERO_TIME); 3022190SN/A } else { 3032190SN/A _negStamp = change_stamp; 3042SN/A _negedgeEvent.notify(SC_ZERO_TIME); 3052SN/A } 3063495Sktlim@umich.edu } 3073495Sktlim@umich.edu 3083495Sktlim@umich.edu bool m_cur_val; 3097823Ssteve.reinhardt@amd.com bool m_new_val; 3103495Sktlim@umich.edu 3113661Srdreslin@umich.edu private: 3123495Sktlim@umich.edu sc_event _valueChangedEvent; 3133495Sktlim@umich.edu sc_event _posedgeEvent; 3143495Sktlim@umich.edu sc_event _negedgeEvent; 3153495Sktlim@umich.edu 3163495Sktlim@umich.edu uint64_t _changeStamp; 3173495Sktlim@umich.edu uint64_t _posStamp; 3183495Sktlim@umich.edu uint64_t _negStamp; 3194599Sacolyte@umich.edu 3204599Sacolyte@umich.edu // Disabled 3213661Srdreslin@umich.edu sc_signal(const sc_signal<bool, WRITER_POLICY> &) : 3223495Sktlim@umich.edu sc_signal_inout_if<bool>(), sc_prim_channel("") 3237823Ssteve.reinhardt@amd.com {} 3243495Sktlim@umich.edu}; 3253495Sktlim@umich.edu 326180SN/Atemplate <sc_writer_policy WRITER_POLICY> 327180SN/Aclass sc_signal<sc_dt::sc_logic, WRITER_POLICY> : 3282680Sktlim@umich.edu public sc_signal_inout_if<sc_dt::sc_logic>, public sc_prim_channel 329180SN/A{ 3306221Snate@binkert.org public: 3316221Snate@binkert.org sc_signal() : sc_signal_inout_if<sc_dt::sc_logic>(), 3326221Snate@binkert.org sc_prim_channel(sc_gen_unique_name("signal")), 3332378SN/A m_cur_val(sc_dt::sc_logic()), m_new_val(sc_dt::sc_logic()), 3345718Shsul@eecs.umich.edu _changeStamp(~0ULL), _posStamp(~0ULL), _negStamp(~0ULL) 3355718Shsul@eecs.umich.edu {} 3365718Shsul@eecs.umich.edu explicit sc_signal(const char *name) : 3375718Shsul@eecs.umich.edu sc_signal_inout_if<sc_dt::sc_logic>(), sc_prim_channel(name), 3385718Shsul@eecs.umich.edu m_cur_val(sc_dt::sc_logic()), m_new_val(sc_dt::sc_logic()), 3395718Shsul@eecs.umich.edu _changeStamp(~0ULL), _posStamp(~0ULL), _negStamp(~0ULL) 3405718Shsul@eecs.umich.edu {} 3416221Snate@binkert.org explicit sc_signal(const char *name, 3425718Shsul@eecs.umich.edu const sc_dt::sc_logic &initial_value) : 3435718Shsul@eecs.umich.edu sc_signal_inout_if<sc_dt::sc_logic>(), sc_prim_channel(name), 3445718Shsul@eecs.umich.edu m_cur_val(initial_value), m_new_val(initial_value), 3455713Shsul@eecs.umich.edu _changeStamp(~0ULL), _posStamp(~0ULL), _negStamp(~0ULL) 3465714Shsul@eecs.umich.edu {} 347180SN/A virtual ~sc_signal() {} 348180SN/A 349180SN/A virtual void 350180SN/A register_port(sc_port_base &, const char *) 351180SN/A { 3524000Ssaidi@eecs.umich.edu sc_channel_warn_unimpl(__PRETTY_FUNCTION__); 3534000Ssaidi@eecs.umich.edu } 3544000Ssaidi@eecs.umich.edu 3556221Snate@binkert.org virtual const sc_dt::sc_logic &read() const { return m_cur_val; } 3566221Snate@binkert.org operator const sc_dt::sc_logic &() const { return read(); } 3576221Snate@binkert.org 3586221Snate@binkert.org virtual sc_writer_policy 3594000Ssaidi@eecs.umich.edu get_writer_policy() const 3604000Ssaidi@eecs.umich.edu { 3614000Ssaidi@eecs.umich.edu return WRITER_POLICY; 3624000Ssaidi@eecs.umich.edu } 363180SN/A virtual void 3642798Sktlim@umich.edu write(const sc_dt::sc_logic &l) 365180SN/A { 3662359SN/A m_new_val = l; 3672359SN/A bool changed = !(m_cur_val == m_new_val); 3682359SN/A //TODO check whether this write follows the write policy. 3695606Snate@binkert.org if (changed) 3702359SN/A request_update(); 371180SN/A } 372180SN/A sc_signal<sc_dt::sc_logic, WRITER_POLICY> & 373180SN/A operator = (const sc_dt::sc_logic &l) 3748737Skoansin.tan@gmail.com { 375180SN/A write(l); 3768737Skoansin.tan@gmail.com return *this; 3778737Skoansin.tan@gmail.com } 3782680Sktlim@umich.edu sc_signal<sc_dt::sc_logic, WRITER_POLICY> & 379180SN/A operator = (const sc_signal<sc_dt::sc_logic, WRITER_POLICY> &s) 3805712Shsul@eecs.umich.edu { 3815712Shsul@eecs.umich.edu write(s.read()); 3826221Snate@binkert.org return *this; 3836221Snate@binkert.org } 3842680Sktlim@umich.edu 3852680Sktlim@umich.edu virtual const sc_event & 386180SN/A default_event() const 3872680Sktlim@umich.edu { 3882651Ssaidi@eecs.umich.edu return value_changed_event(); 3892680Sktlim@umich.edu } 3902651Ssaidi@eecs.umich.edu 3915714Shsul@eecs.umich.edu virtual const sc_event & 3925715Shsul@eecs.umich.edu value_changed_event() const 3935714Shsul@eecs.umich.edu { 3942359SN/A return _valueChangedEvent; 3955875Ssteve.reinhardt@amd.com } 3965875Ssteve.reinhardt@amd.com virtual const sc_event & 3975875Ssteve.reinhardt@amd.com posedge_event() const 3985875Ssteve.reinhardt@amd.com { 3995217Ssaidi@eecs.umich.edu return _posedgeEvent; 4005875Ssteve.reinhardt@amd.com } 4017781SAli.Saidi@ARM.com virtual const sc_event & 4027781SAli.Saidi@ARM.com negedge_event() const 4037781SAli.Saidi@ARM.com { 4047781SAli.Saidi@ARM.com return _negedgeEvent; 4057781SAli.Saidi@ARM.com } 4067781SAli.Saidi@ARM.com 4077781SAli.Saidi@ARM.com virtual bool 4087781SAli.Saidi@ARM.com event() const 4097781SAli.Saidi@ARM.com { 4107781SAli.Saidi@ARM.com return _changeStamp == ::sc_gem5::getChangeStamp(); 4117781SAli.Saidi@ARM.com } 4127781SAli.Saidi@ARM.com virtual bool 4137781SAli.Saidi@ARM.com posedge() const 4147781SAli.Saidi@ARM.com { 4157781SAli.Saidi@ARM.com return _posStamp == ::sc_gem5::getChangeStamp(); 4167781SAli.Saidi@ARM.com } 4177781SAli.Saidi@ARM.com virtual bool 4187781SAli.Saidi@ARM.com negedge() const 4197781SAli.Saidi@ARM.com { 4207781SAli.Saidi@ARM.com return _negStamp == ::sc_gem5::getChangeStamp(); 4218733Sgeoffrey.blake@arm.com } 4228733Sgeoffrey.blake@arm.com 4238733Sgeoffrey.blake@arm.com virtual void print(std::ostream &os=std::cout) const { os << m_cur_val; } 4248733Sgeoffrey.blake@arm.com virtual void 4258733Sgeoffrey.blake@arm.com dump(std::ostream &os=std::cout) const 4268733Sgeoffrey.blake@arm.com { 4278733Sgeoffrey.blake@arm.com os << " name = " << name() << ::std::endl; 4288733Sgeoffrey.blake@arm.com os << " value = " << m_cur_val << ::std::endl; 4298733Sgeoffrey.blake@arm.com os << "new value = " << m_new_val << ::std::endl; 4308733Sgeoffrey.blake@arm.com } 4318733Sgeoffrey.blake@arm.com virtual const char *kind() const { return "sc_signal"; } 4328733Sgeoffrey.blake@arm.com 4338733Sgeoffrey.blake@arm.com protected: 4348733Sgeoffrey.blake@arm.com virtual void 4358733Sgeoffrey.blake@arm.com update() 4368733Sgeoffrey.blake@arm.com { 4378733Sgeoffrey.blake@arm.com if (m_new_val == m_cur_val) 4388733Sgeoffrey.blake@arm.com return; 4398733Sgeoffrey.blake@arm.com 4408733Sgeoffrey.blake@arm.com m_cur_val = m_new_val; 4418733Sgeoffrey.blake@arm.com _valueChangedEvent.notify(SC_ZERO_TIME); 4428733Sgeoffrey.blake@arm.com if (m_cur_val == sc_dt::SC_LOGIC_1) 4438733Sgeoffrey.blake@arm.com _posedgeEvent.notify(SC_ZERO_TIME); 4448733Sgeoffrey.blake@arm.com else if (m_cur_val == sc_dt::SC_LOGIC_0) 4458733Sgeoffrey.blake@arm.com _negedgeEvent.notify(SC_ZERO_TIME); 4468733Sgeoffrey.blake@arm.com } 4478733Sgeoffrey.blake@arm.com 4488733Sgeoffrey.blake@arm.com sc_dt::sc_logic m_cur_val; 4498733Sgeoffrey.blake@arm.com sc_dt::sc_logic m_new_val; 450180SN/A 451605SN/A private: 4521858SN/A sc_event _valueChangedEvent; 4533520Sgblack@eecs.umich.edu sc_event _posedgeEvent; 4545810Sgblack@eecs.umich.edu sc_event _negedgeEvent; 4552254SN/A 4566221Snate@binkert.org uint64_t _changeStamp; 4572680Sktlim@umich.edu uint64_t _posStamp; 4582254SN/A uint64_t _negStamp; 4594947Snate@binkert.org 4607823Ssteve.reinhardt@amd.com // Disabled 461612SN/A sc_signal(const sc_signal<sc_dt::sc_logic, WRITER_POLICY> &) : 4624192Sktlim@umich.edu sc_signal_inout_if<sc_dt::sc_logic>(), sc_prim_channel("") 4634192Sktlim@umich.edu {} 4644192Sktlim@umich.edu}; 4654192Sktlim@umich.edu 4665476Snate@binkert.org} // namespace sc_core 4675476Snate@binkert.org 4684192Sktlim@umich.edu#endif //__SYSTEMC_EXT_CHANNEL_SC_SIGNAL_HH__ 4695476Snate@binkert.org