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