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