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