36a37
> #include "../core/sc_event.hh"
38a40
> #include "../dt/bit/sc_logic.hh"
69c71,72
< sc_prim_channel(sc_gen_unique_name("signal"))
---
> sc_prim_channel(sc_gen_unique_name("signal")),
> m_cur_val(T()), m_new_val(T())
71,72c74,76
< explicit sc_signal(const char *name) : sc_signal_inout_if<T>(),
< sc_prim_channel(name)
---
> explicit sc_signal(const char *name) :
> sc_signal_inout_if<T>(), sc_prim_channel(name),
> m_cur_val(T()), m_new_val(T())
75,79c79,81
< sc_signal_inout_if<T>(), sc_prim_channel(name)
< {
< // Need to consume initial_value.
< sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
< }
---
> sc_signal_inout_if<T>(), sc_prim_channel(name),
> m_cur_val(initial_value), m_new_val(initial_value)
> {}
88,98c90,91
< virtual const T&
< read() const
< {
< sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
< return *(const T *)nullptr;
< }
< operator const T&() const
< {
< sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
< return *(const T *)nullptr;
< }
---
> virtual const T &read() const { return m_cur_val; }
> operator const T&() const { return read(); }
106c99
< write(const T&)
---
> write(const T &t)
108c101,105
< sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
---
> m_new_val = t;
> bool changed = !(m_cur_val == m_new_val);
> //TODO check whether this write follows the write policy.
> if (changed)
> request_update();
111c108
< operator = (const T&)
---
> operator = (const T &t)
113c110
< sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
---
> write(t);
117c114
< operator = (const sc_signal<T, WRITER_POLICY> &)
---
> operator = (const sc_signal<T, WRITER_POLICY> &s)
119c116
< sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
---
> write(s.read());
126,127c123
< sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
< return *(sc_event *)nullptr;
---
> return value_changed_event();
132,133c128
< sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
< return *(sc_event *)nullptr;
---
> return _valueChangedEvent;
141a137
> virtual void print(std::ostream &os=std::cout) const { os << m_cur_val; }
143c139
< print(std::ostream & =std::cout) const
---
> dump(std::ostream &os=std::cout) const
145c141,143
< sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
---
> os << " name = " << name() << ::std::endl;
> os << " value = " << m_cur_val << ::std::endl;
> os << "new value = " << m_new_val << ::std::endl;
147,151d144
< virtual void
< dump(std::ostream & =std::cout) const
< {
< sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
< }
158c151,155
< sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
---
> if (m_new_val == m_cur_val)
> return;
>
> m_cur_val = m_new_val;
> _valueChangedEvent.notify(SC_ZERO_TIME);
167a165,166
> sc_event _valueChangedEvent;
>
187,194c186,193
< sc_signal()
< {
< sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
< }
< explicit sc_signal(const char *)
< {
< sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
< }
---
> sc_signal() : sc_signal_inout_if<bool>(),
> sc_prim_channel(sc_gen_unique_name("signal")),
> m_cur_val(bool()), m_new_val(bool())
> {}
> explicit sc_signal(const char *name) :
> sc_signal_inout_if<bool>(), sc_prim_channel(name),
> m_cur_val(bool()), m_new_val(bool())
> {}
196,204c195,198
< sc_signal_inout_if<bool>(), sc_prim_channel(name)
< {
< // Need to consume initial_value.
< sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
< }
< virtual ~sc_signal()
< {
< sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
< }
---
> sc_signal_inout_if<bool>(), sc_prim_channel(name),
> m_cur_val(initial_value), m_new_val(initial_value)
> {}
> virtual ~sc_signal() {}
212,222c206,207
< virtual const bool &
< read() const
< {
< sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
< return *(const bool *)nullptr;
< }
< operator const bool &() const
< {
< sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
< return *(const bool *)nullptr;
< }
---
> virtual const bool &read() const { return m_cur_val; }
> operator const bool &() const { return read(); }
230c215
< write(const bool &)
---
> write(const bool &b)
232c217,221
< sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
---
> m_new_val = b;
> bool changed = !(m_cur_val == m_new_val);
> //TODO check whether this write follows the write policy.
> if (changed)
> request_update();
235c224
< operator = (const bool &)
---
> operator = (const bool &b)
237c226
< sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
---
> write(b);
241c230
< operator = (const sc_signal<bool, WRITER_POLICY> &)
---
> operator = (const sc_signal<bool, WRITER_POLICY> &s)
243c232
< sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
---
> write(s.read());
250,251c239
< sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
< return *(sc_event *)nullptr;
---
> return value_changed_event();
257,258c245
< sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
< return *(sc_event *)nullptr;
---
> return _valueChangedEvent;
263,264c250
< sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
< return *(sc_event *)nullptr;
---
> return _posedgeEvent;
269,270c255
< sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
< return *(sc_event *)nullptr;
---
> return _negedgeEvent;
291a277
> virtual void print(std::ostream &os=std::cout) const { os << m_cur_val; }
293c279
< print(std::ostream & =std::cout) const
---
> dump(std::ostream &os=std::cout) const
295c281,283
< sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
---
> os << " name = " << name() << ::std::endl;
> os << " value = " << m_cur_val << ::std::endl;
> os << "new value = " << m_new_val << ::std::endl;
297,301d284
< virtual void
< dump(std::ostream & =std::cout) const
< {
< sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
< }
308c291,299
< sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
---
> if (m_new_val == m_cur_val)
> return;
>
> m_cur_val = m_new_val;
> _valueChangedEvent.notify(SC_ZERO_TIME);
> if (m_cur_val)
> _posedgeEvent.notify(SC_ZERO_TIME);
> else
> _negedgeEvent.notify(SC_ZERO_TIME);
310a302,304
> bool m_cur_val;
> bool m_new_val;
>
311a306,309
> sc_event _valueChangedEvent;
> sc_event _posedgeEvent;
> sc_event _negedgeEvent;
>
323,330c321,328
< sc_signal()
< {
< sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
< }
< explicit sc_signal(const char *)
< {
< sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
< }
---
> sc_signal() : sc_signal_inout_if<sc_dt::sc_logic>(),
> sc_prim_channel(sc_gen_unique_name("signal")),
> m_cur_val(sc_dt::sc_logic()), m_new_val(sc_dt::sc_logic())
> {}
> explicit sc_signal(const char *name) :
> sc_signal_inout_if<sc_dt::sc_logic>(), sc_prim_channel(name),
> m_cur_val(sc_dt::sc_logic()), m_new_val(sc_dt::sc_logic())
> {}
333,341c331,334
< sc_signal_inout_if<sc_dt::sc_logic>(), sc_prim_channel(name)
< {
< // Need to consume initial_value.
< sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
< }
< virtual ~sc_signal()
< {
< sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
< }
---
> sc_signal_inout_if<sc_dt::sc_logic>(), sc_prim_channel(name),
> m_cur_val(initial_value), m_new_val(initial_value)
> {}
> virtual ~sc_signal() {}
349,359c342,343
< virtual const sc_dt::sc_logic &
< read() const
< {
< sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
< return *(const sc_dt::sc_logic *)nullptr;
< }
< operator const sc_dt::sc_logic &() const
< {
< sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
< return *(const sc_dt::sc_logic *)nullptr;
< }
---
> virtual const sc_dt::sc_logic &read() const { return m_cur_val; }
> operator const sc_dt::sc_logic &() const { return read(); }
367c351
< write(const sc_dt::sc_logic &)
---
> write(const sc_dt::sc_logic &l)
369c353,357
< sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
---
> m_new_val = l;
> bool changed = !(m_cur_val == m_new_val);
> //TODO check whether this write follows the write policy.
> if (changed)
> request_update();
372c360
< operator = (const sc_dt::sc_logic &)
---
> operator = (const sc_dt::sc_logic &l)
374c362
< sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
---
> write(l);
378c366
< operator = (const sc_signal<sc_dt::sc_logic, WRITER_POLICY> &)
---
> operator = (const sc_signal<sc_dt::sc_logic, WRITER_POLICY> &s)
380c368
< sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
---
> write(s.read());
387,388c375
< sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
< return *(sc_event *)nullptr;
---
> return value_changed_event();
394,395c381
< sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
< return *(sc_event *)nullptr;
---
> return _valueChangedEvent;
400,401c386
< sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
< return *(sc_event *)nullptr;
---
> return _posedgeEvent;
406,407c391
< sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
< return *(sc_event *)nullptr;
---
> return _negedgeEvent;
428a413
> virtual void print(std::ostream &os=std::cout) const { os << m_cur_val; }
430c415
< print(std::ostream & =std::cout) const
---
> dump(std::ostream &os=std::cout) const
432c417,419
< sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
---
> os << " name = " << name() << ::std::endl;
> os << " value = " << m_cur_val << ::std::endl;
> os << "new value = " << m_new_val << ::std::endl;
434,438d420
< virtual void
< dump(std::ostream & =std::cout) const
< {
< sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
< }
445c427,435
< sc_channel_warn_unimpl(__PRETTY_FUNCTION__);
---
> if (m_new_val == m_cur_val)
> return;
>
> m_cur_val = m_new_val;
> _valueChangedEvent.notify(SC_ZERO_TIME);
> if (m_cur_val == sc_dt::SC_LOGIC_1)
> _posedgeEvent.notify(SC_ZERO_TIME);
> else if (m_cur_val == sc_dt::SC_LOGIC_0)
> _negedgeEvent.notify(SC_ZERO_TIME);
447a438,440
> sc_dt::sc_logic m_cur_val;
> sc_dt::sc_logic m_new_val;
>
448a442,445
> sc_event _valueChangedEvent;
> sc_event _posedgeEvent;
> sc_event _negedgeEvent;
>