diff options
Diffstat (limited to 'src/systemc/tests/systemc/communication/sc_event_queue/test01/test01.cpp')
-rw-r--r-- | src/systemc/tests/systemc/communication/sc_event_queue/test01/test01.cpp | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/src/systemc/tests/systemc/communication/sc_event_queue/test01/test01.cpp b/src/systemc/tests/systemc/communication/sc_event_queue/test01/test01.cpp new file mode 100644 index 000000000..85e52c703 --- /dev/null +++ b/src/systemc/tests/systemc/communication/sc_event_queue/test01/test01.cpp @@ -0,0 +1,88 @@ +#include <systemc.h> + +SC_MODULE(Rec) { + sc_event_queue_port E; + + SC_CTOR(Rec) { + SC_METHOD(P); + sensitive << E; + dont_initialize(); + } + void P() { + cout << sc_time_stamp() + << " delta " << sc_delta_count() + << ": P awakes\n"; + } +}; + +SC_MODULE(Sender) { + sc_in<bool> Clock; + sc_event_queue_port E; + + SC_CTOR(Sender) { + SC_METHOD(P); + sensitive << Clock.pos(); + dont_initialize(); + } + void P() { + // trigger in now (2x), now+1ns (2x) + E->notify( 0, SC_NS ); + E->notify( 0, SC_NS ); + E->notify( 1, SC_NS ); + E->notify( 1, SC_NS ); + } +}; + +SC_MODULE(xyz) { + SC_CTOR(xyz) { + SC_THREAD(P); + } + void P() { + wait(15, SC_NS); + cout << sc_time_stamp() + << " delta " << sc_delta_count() + << ": xyz awakes\n"; + } +}; + +int sc_main (int agrc, char** argv) +{ + sc_event_queue E("E"); + + Rec R("Rec"); + R.E(E); + + sc_clock C1 ("C1", 20, SC_NS); + sc_clock C2 ("C2", 40, SC_NS); + + xyz xyz_obj("xyz"); + + // Events at 0ns (2x), 1ns (2x), 20ns (2x), 21ns (2x), 40ns (2x), ... + Sender S1("S1"); + S1.Clock(C1); + S1.E(E); + + // Events at 0ns (2x), 1ns (2x), 40ns (2x), 41ns (2x), 80ns (2x), ... + Sender S2("S2"); + S2.Clock(C2); + S2.E(E); + + // Events at 3ns, 5ns (2x), 8ns + sc_start(10, SC_NS); + E.notify( 5,SC_NS ); + E.notify( 3,SC_NS ); + E.notify( 5,SC_NS ); + E.notify( 8,SC_NS) ; + + // Events would be at 40ns, 43ns (2x), 44ns but all are cancelled + sc_start(40, SC_NS); + E.notify( 3, SC_NS ); + E.notify( 3, SC_NS ); + E.notify( 4, SC_NS ); + E.notify( SC_ZERO_TIME ); + E.cancel_all(); + + sc_start(40, SC_NS); + + return 0; +} |