21class async_event :
public sc_core::sc_prim_channel,
public sc_core::sc_event
24 sc_core::sc_time m_delay;
27 bool outstanding =
false;
28 enum { none, attach, detach } attach_pending_state = none;
33 tid = std::this_thread::get_id();
37 void async_notify() { notify(); }
41 if (tid == std::this_thread::get_id()) {
42 sc_core::sc_event::notify();
44 notify(sc_core::SC_ZERO_TIME);
47 void notify(
double d, sc_core::sc_time_unit
u) { notify(sc_core::sc_time(
d,
u)); }
48 void notify(sc_core::sc_time delay)
50 if (tid == std::this_thread::get_id()) {
51 sc_core::sc_event::notify(delay);
58#ifndef SC_HAS_SUSPENDING
59 sc_core::sc_internal_async_wakeup();
64 void async_attach_suspending()
66#ifndef SC_HAS_ASYNC_ATTACH_SUSPENDING
67 sc_core::async_attach_suspending(
this);
69 if (tid == std::this_thread::get_id()) {
70 this->sc_core::sc_prim_channel::async_attach_suspending();
73 attach_pending_state = attach;
80 void async_detach_suspending()
82#ifndef SC_HAS_ASYNC_ATTACH_SUSPENDING
83 sc_core::async_detach_suspending(
this);
85 if (tid == std::this_thread::get_id()) {
86 this->sc_core::sc_prim_channel::async_detach_suspending();
89 attach_pending_state = detach;
96 void enable_attach_suspending(
bool e) {
e ? this->async_attach_suspending() : this->async_detach_suspending(); }
104 sc_event::notify(m_delay);
107 switch (attach_pending_state) {
109 this->async_attach_suspending();
112 this->async_detach_suspending();
117 attach_pending_state = none;
120 void start_of_simulation()