summaryrefslogtreecommitdiff
path: root/src/systemc/tests/systemc/communication/sc_event_queue/test01/test01.cpp
blob: 85e52c703139b5128b22038c1ca03fae1bf534e4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
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;
}