test12.cpp revision 12855:588919e0e4aa
1/*****************************************************************************
2
3  Licensed to Accellera Systems Initiative Inc. (Accellera) under one or
4  more contributor license agreements.  See the NOTICE file distributed
5  with this work for additional information regarding copyright ownership.
6  Accellera licenses this file to you under the Apache License, Version 2.0
7  (the "License"); you may not use this file except in compliance with the
8  License.  You may obtain a copy of the License at
9
10    http://www.apache.org/licenses/LICENSE-2.0
11
12  Unless required by applicable law or agreed to in writing, software
13  distributed under the License is distributed on an "AS IS" BASIS,
14  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
15  implied.  See the License for the specific language governing
16  permissions and limitations under the License.
17
18 *****************************************************************************/
19
20/*****************************************************************************
21
22  test12.cpp --
23
24  Original Author: Martin Janssen, Synopsys, Inc., 2002-02-15
25
26 *****************************************************************************/
27
28/*****************************************************************************
29
30  MODIFICATION LOG - modifiers, enter your name, affiliation, date and
31  changes you are making here.
32
33      Name, Affiliation, Date:
34  Description of Modification:
35
36 *****************************************************************************/
37
38// test of next_trigger() for dynamic sensitivity; last call counts
39
40#include "systemc.h"
41
42SC_MODULE( mod_a )
43{
44    sc_event e1;
45    sc_event e2;
46    sc_event e3;
47    sc_event e_ack;
48
49    void write( const char* msg )
50    {
51        cout << sc_delta_count() << ":" << sc_time_stamp()
52             << " " << msg << "\n";
53    }
54
55    bool sender_first;
56
57    void sender()
58    {
59        next_trigger( SC_ZERO_TIME );
60        if( sender_first ) {
61            sender_first = false;
62            return;
63        }
64
65        e2.cancel();
66        e3.cancel();
67        e1.notify();
68        e2.notify( SC_ZERO_TIME );
69        e3.notify( 2, SC_NS );
70        timed_out() ? write( "sender - timed out" )
71                    : write( "sender" );
72        next_trigger( 3, SC_NS, e_ack );
73    }
74
75    int receiver_state;
76
77    void receiver()
78    {
79        sc_time t1( 1, SC_NS );
80
81        switch( receiver_state ) {
82	case 0:
83	    // test next_trigger(e)
84	    cout << "*** next_trigger(e)\n";
85
86	    next_trigger( e1 );
87	    break;
88	case 1:
89	    write( "receiver - e1" );
90	    e_ack.notify();
91	    next_trigger( e1 );
92	    next_trigger( e2 );
93	    break;
94	case 2:
95	    write( "receiver - e2" );
96	    e_ack.notify();
97	    next_trigger( e2 );
98	    next_trigger( e3 );
99	    break;
100	case 3:
101	    write( "receiver - e3" );
102	    e_ack.notify();
103
104	    // test next_trigger(or_list)
105	    cout << "*** next_trigger(or_list)\n";
106
107	    next_trigger( e3 );
108	    next_trigger( e1 | e1 | e1 );
109	    break;
110	case 4:
111	    write( "receiver - e1 | e1 | e1" );
112	    e_ack.notify();
113	    next_trigger( e1 | e1 | e1 );
114	    next_trigger( e2 | e2 | e2 );
115	    break;
116	case 5:
117	    write( "receiver - e2 | e2 | e2" );
118	    e_ack.notify();
119	    next_trigger( e2 | e2 | e2 );
120	    next_trigger( e3 | e3 | e3 );
121	    break;
122	case 6:
123	    write( "receiver - e3 | e3 | e3" );
124	    e_ack.notify();
125	    next_trigger( e3 | e3 | e3 );
126	    next_trigger( e1 | e2 | e3 );
127	    break;
128	case 7:
129	    write( "receiver - e1 | e2 | e3" );
130	    e_ack.notify();
131	    next_trigger( e1 | e2 | e3 );
132	    next_trigger( e3 | e2 | e1 );
133	    break;
134	case 8:
135	    write( "receiver - e3 | e2 | e1" );
136	    e_ack.notify();
137
138	    // test next_trigger(and_list)
139	    cout << "*** next_trigger(and_list)\n";
140
141	    next_trigger( e3 | e2 | e1 );
142	    next_trigger( e1 & e1 & e1 );
143	    break;
144	case 9:
145	    write( "receiver - e1 & e1 & e1" );
146	    e_ack.notify();
147	    next_trigger( e1 & e1 & e1 );
148	    next_trigger( e2 & e2 & e2 );
149	    break;
150	case 10:
151	    write( "receiver - e2 & e2 & e2" );
152	    e_ack.notify();
153	    next_trigger( e2 & e2 & e2 );
154	    next_trigger( e3 & e3 & e3 );
155	    break;
156	case 11:
157	    write( "receiver - e3 & e3 & e3" );
158	    e_ack.notify();
159	    next_trigger( e3 & e3 & e3 );
160	    next_trigger( e1 & e2 & e3 );
161	    break;
162	case 12:
163	    write( "receiver - e1 & e2 & e3" );
164	    e_ack.notify();
165	    next_trigger( e1 & e2 & e3 );
166	    next_trigger( e3 & e2 & e1 );
167	    break;
168	case 13:
169	    write( "receiver - e3 & e2 & e1" );
170
171	    // test next_trigger(t)
172	    cout << "*** next_trigger(t)\n";
173
174	    next_trigger( e3 & e2 & e1 );
175	    next_trigger( 0, SC_NS );
176	    break;
177	case 14:
178	    write( "receiver - 0 ns" );
179	    next_trigger( 0, SC_NS );
180	    next_trigger( 1, SC_NS );
181	    break;
182	case 15:
183	    write( "receiver - 1 ns" );
184
185	    e_ack.notify();
186
187	    // test next_trigger(t,e)
188	    cout << "*** next_trigger(t,e)\n";
189
190	    next_trigger( 1, SC_NS );
191	    next_trigger( 1, SC_NS, e1 );
192	    break;
193	case 16:
194	    timed_out() ? write( "receiver - 1 ns | e1 - timed out" )
195		        : write( "receiver - 1 ns | e1" );
196	    e_ack.notify();
197	    next_trigger( 1, SC_NS, e1 );
198	    next_trigger( t1, e2 );
199	    break;
200	case 17:
201	    timed_out() ? write( "receiver - 1 ns | e2 - timed out" )
202                        : write( "receiver - 1 ns | e2" );
203	    e_ack.notify();
204	    next_trigger( t1, e2 );
205	    next_trigger( 1, SC_NS, e3 );
206	    break;
207	case 18:
208	    timed_out() ? write( "receiver - 1 ns | e3 - timed out" )
209		        : write( "receiver - 1 ns | e3" );
210	    e_ack.notify();
211
212	    // test next_trigger(t,or_list)
213	    cout << "*** next_trigger(t,or_list)\n";
214
215	    next_trigger( 1, SC_NS, e3 );
216	    next_trigger( t1, e1 | e2 | e3 );
217	    break;
218	case 19:
219	    timed_out() ? write( "receiver - 1 ns | e1 | e2 | e3 - timed out" )
220                        : write( "receiver - 1 ns | e1 | e2 | e3" );
221	    e_ack.notify();
222
223	    // test next_trigger(t,and_list)
224	    cout << "*** next_trigger(t,and_list)\n";
225
226	    next_trigger( t1, e1 | e2 | e3 );
227	    next_trigger( t1, e1 & e2 & e3 );
228	    break;
229	case 20:
230	    timed_out() ? write( "receiver - 1 ns | e1 & e2 & e3 - timed out" )
231                        : write( "receiver - 1 ns | e1 & e2 & e3" );
232
233	    sc_stop();
234	    write( "receiver - stop" );
235	    next_trigger( t1, e1 & e2 & e3 );
236	    next_trigger( SC_ZERO_TIME );
237	    break;
238	default:
239	    sc_assert( false );
240        }
241	receiver_state ++;
242    }
243
244    SC_CTOR( mod_a )
245    {
246        SC_METHOD( sender );
247        sender_first = true;
248        SC_METHOD( receiver );
249        receiver_state = 0;
250    }
251};
252
253int
254sc_main( int, char*[] )
255{
256    mod_a a( "a" );
257
258    sc_start();
259
260    return 0;
261}
262