test01.cpp revision 12855:588919e0e4aa
1#include <systemc.h>
2
3SC_MODULE(Rec) {
4  sc_event_queue_port E;
5
6  SC_CTOR(Rec) {
7    SC_METHOD(P);
8    sensitive << E;
9    dont_initialize();
10  }
11  void P() {
12    cout << sc_time_stamp()
13	 << " delta " << sc_delta_count()
14	 << ": P awakes\n";
15  }
16};
17
18SC_MODULE(Sender) {
19  sc_in<bool> Clock;
20  sc_event_queue_port E;
21
22  SC_CTOR(Sender) {
23      SC_METHOD(P);
24      sensitive << Clock.pos();
25      dont_initialize();
26  }
27  void P() {
28      // trigger in now (2x), now+1ns (2x)
29      E->notify( 0, SC_NS );
30      E->notify( 0, SC_NS );
31      E->notify( 1, SC_NS );
32      E->notify( 1, SC_NS );
33  }
34};
35
36SC_MODULE(xyz) {
37  SC_CTOR(xyz) {
38      SC_THREAD(P);
39  }
40  void P() {
41      wait(15, SC_NS);
42      cout << sc_time_stamp()
43	   << " delta " << sc_delta_count()
44	   << ": xyz awakes\n";
45  }
46};
47
48int sc_main (int agrc, char** argv)
49{
50  sc_event_queue E("E");
51
52  Rec R("Rec");
53  R.E(E);
54
55  sc_clock C1 ("C1", 20, SC_NS);
56  sc_clock C2 ("C2", 40, SC_NS);
57
58  xyz xyz_obj("xyz");
59
60  // Events at 0ns (2x), 1ns (2x),   20ns (2x), 21ns (2x),   40ns (2x), ...
61  Sender S1("S1");
62  S1.Clock(C1);
63  S1.E(E);
64
65  // Events at 0ns (2x), 1ns (2x),   40ns (2x), 41ns (2x),   80ns (2x), ...
66  Sender S2("S2");
67  S2.Clock(C2);
68  S2.E(E);
69
70  // Events at 3ns, 5ns (2x), 8ns
71  sc_start(10, SC_NS);
72  E.notify( 5,SC_NS );
73  E.notify( 3,SC_NS );
74  E.notify( 5,SC_NS );
75  E.notify( 8,SC_NS) ;
76
77  // Events would be at 40ns, 43ns (2x), 44ns but all are cancelled
78  sc_start(40, SC_NS);
79  E.notify( 3, SC_NS );
80  E.notify( 3, SC_NS );
81  E.notify( 4, SC_NS );
82  E.notify( SC_ZERO_TIME );
83  E.cancel_all();
84
85  sc_start(40, SC_NS);
86
87  return 0;
88}
89