test203a.cpp revision 12855:588919e0e4aa
1#define SC_INCLUDE_DYNAMIC_PROCESSES
2
3#include <systemc>
4#include <cstring>
5using namespace sc_core;
6using namespace sc_dt;
7using std::cout;
8using std::endl;
9
10// 3) Process handle methods, including invalid and terminated process
11
12void invalid_handle_check(sc_process_handle& h)
13{
14
15    sc_assert(h.valid() == false);
16    sc_assert(strcmp(h.name(), "") == 0);
17    sc_assert(h.proc_kind() == SC_NO_PROC_);
18    sc_assert(h.get_process_object() == 0);
19    std::vector<sc_object*> children = h.get_child_objects();
20    sc_assert(children.size() == 0);
21    sc_assert(h.get_parent_object() == 0);
22    sc_assert(h.terminated() == false);
23    sc_assert(h.dynamic() == false);
24    sc_assert( !(h == h) );
25    sc_assert(h != h);
26
27    cout << "There should be warning 11 messages" << endl;
28
29    h.disable();
30    h.enable();
31    h.is_unwinding();
32    h.kill();
33    h.reset();
34    h.resume();
35    h.suspend();
36    h.sync_reset_off();
37    h.sync_reset_on();
38    h.terminated_event();
39    h.throw_it(sc_user(), SC_NO_DESCENDANTS);
40
41    cout << "End of warning messages" << endl;
42}
43
44SC_MODULE(M)
45{
46  sc_in_clk clk;
47  SC_CTOR(M)
48  {
49    sc_process_handle h;
50    invalid_handle_check(h);
51
52    SC_THREAD(T);
53    SC_CTHREAD(CT, clk.pos());
54    SC_METHOD(ME);
55
56    sc_process_handle h3 = sc_spawn(sc_bind(&M::stat_thread, this), "stat_thread");
57    sc_spawn_options opt;
58    opt.spawn_method();
59    sc_process_handle h4 = sc_spawn(sc_bind(&M::stat_method, this), "stat_method", &opt);
60
61    std::vector<sc_object*> children = this->get_child_objects();
62    sc_assert(children.size() == 6);
63  }
64  void T()
65  {
66    sc_process_handle h;
67    invalid_handle_check(h);
68
69    sc_process_handle h2 = sc_get_current_process_handle();
70    sc_assert(h2.valid() == true);
71    sc_assert(strcmp(h2.name(), "top.m.T") == 0);
72    sc_assert(h2.proc_kind() == SC_THREAD_PROC_);
73    sc_assert(h2.get_process_object() != 0);
74    std::vector<sc_object*> children2 = h2.get_child_objects();
75    sc_assert(children2.size() == 0);
76    sc_assert(h2.get_parent_object() == this);
77    sc_assert(h2.terminated() == false);
78    sc_assert(h2.dynamic() == false);
79    sc_assert(h2 == h2);
80    sc_assert(h2 != h);
81
82    sc_process_handle h3 = sc_spawn(sc_bind(&M::dyn_thread, this), "dyn_thread");
83    wait(1, SC_NS);
84
85    if (h3.valid() == true)
86    {
87      sc_assert(strcmp(h3.name(), "top.m.T.dyn_thread") == 0);
88      sc_assert(h3.proc_kind() == SC_THREAD_PROC_);
89      sc_assert(h3.get_process_object() != 0);
90      std::vector<sc_object*> children3 = h3.get_child_objects();
91      sc_assert(children3.size() == 0);
92      sc_assert(h3.get_parent_object() == sc_get_current_process_handle().get_process_object());
93      sc_assert(h3.terminated() == true);
94      sc_assert(h3.dynamic() == true);
95      sc_assert(h3 == h3);
96      sc_assert( !(h3 != h3) );
97    }
98
99    sc_spawn_options opt;
100    opt.spawn_method();
101    sc_process_handle h4 = sc_spawn(sc_bind(&M::dyn_method, this), "dyn_method", &opt);
102    sc_assert(h4 != h3);
103
104    wait(10, SC_NS);
105    sc_stop();
106  }
107
108  void stat_thread()
109  {
110    sc_process_handle h;
111    invalid_handle_check(h);
112
113    wait(5, SC_NS);
114
115    sc_process_handle h3 = sc_get_current_process_handle();
116    sc_assert(h3.valid() == true);
117    sc_assert(strcmp(h3.name(), "top.m.stat_thread") == 0);
118    sc_assert(h3.proc_kind() == SC_THREAD_PROC_);
119    sc_assert(h3.get_process_object() != 0);
120    std::vector<sc_object*> children3 = h3.get_child_objects();
121    sc_assert(children3.size() == 0);
122    sc_assert(h3.get_parent_object() != 0);
123    sc_assert(h3.terminated() == false);
124    sc_assert(h3.dynamic() == false);
125    sc_assert(h3 == h3);
126    sc_assert(h3 != h);
127
128    sc_process_handle h4;
129    h4 = h3;
130    sc_assert(h4 == h3);
131    sc_assert(h4 != h);
132  }
133
134  void stat_method()
135  {
136    sc_process_handle h;
137    invalid_handle_check(h);
138
139    sc_process_handle h3 = sc_get_current_process_handle();
140    sc_assert(h3.valid() == true);
141    sc_assert(strcmp(h3.name(), "top.m.stat_method") == 0);
142    sc_assert(h3.proc_kind() == SC_METHOD_PROC_);
143    sc_assert(h3.get_process_object() != 0);
144    std::vector<sc_object*> children3 = h3.get_child_objects();
145    sc_assert(children3.size() == 0);
146    sc_assert(h3.get_parent_object() != 0);
147    sc_assert(h3.terminated() == false);
148    sc_assert(h3.dynamic() == false);
149    sc_assert(h3 == h3);
150    sc_assert(h3 != h);
151
152    sc_process_handle h4;
153    h4 = h3;
154    sc_assert(h4 == h3);
155    sc_assert(h4 != h);
156  }
157
158  void dyn_thread()
159  {
160    sc_process_handle h;
161    invalid_handle_check(h);
162
163    sc_process_handle h3 = sc_get_current_process_handle();
164    sc_assert(h3.valid() == true);
165    sc_assert(strcmp(h3.name(), "top.m.T.dyn_thread") == 0);
166    sc_assert(h3.proc_kind() == SC_THREAD_PROC_);
167    sc_assert(h3.get_process_object() != 0);
168    std::vector<sc_object*> children3 = h3.get_child_objects();
169    sc_assert(children3.size() == 0);
170    sc_assert(h3.get_parent_object() != 0);
171    sc_assert(h3.terminated() == false);
172    sc_assert(h3.dynamic() == true);
173    sc_assert(h3 == h3);
174    sc_assert(h3 != h);
175
176    sc_process_handle h4(h3);
177    sc_assert(h4 == h3);
178  }
179
180  void dyn_method()
181  {
182    sc_process_handle h;
183    invalid_handle_check(h);
184
185    sc_process_handle h3 = sc_get_current_process_handle();
186    sc_assert(h3.valid() == true);
187    sc_assert(strcmp(h3.name(), "top.m.T.dyn_method") == 0);
188    sc_assert(h3.proc_kind() == SC_METHOD_PROC_);
189    sc_assert(h3.get_process_object() != 0);
190    std::vector<sc_object*> children3 = h3.get_child_objects();
191    sc_assert(children3.size() == 0);
192    sc_assert(h3.get_parent_object() != 0);
193    sc_assert(h3.terminated() == false);
194    sc_assert(h3.dynamic() == true);
195    sc_assert(h3 == h3);
196    sc_assert(h3 != h);
197
198    sc_process_handle h4(h3);
199    sc_assert(h4 == h3);
200  }
201
202  void CT()
203  {
204    sc_process_handle h;
205    invalid_handle_check(h);
206
207    sc_process_handle h2 = sc_get_current_process_handle();
208    sc_assert(h2.valid() == true);
209    sc_assert(strcmp(h2.name(), "top.m.CT") == 0);
210    sc_assert(h2.proc_kind() == SC_CTHREAD_PROC_);
211    sc_assert(h2.get_process_object() != 0);
212    std::vector<sc_object*> children2 = h2.get_child_objects();
213    sc_assert(children2.size() == 0);
214    sc_assert(h2.get_parent_object() == this);
215    sc_assert(h2.terminated() == false);
216    sc_assert(h2.dynamic() == false);
217    sc_assert(h2 == h2);
218    sc_assert(h2 != h);
219  }
220
221  void ME()
222  {
223    sc_process_handle h;
224    invalid_handle_check(h);
225
226    sc_process_handle h2 = sc_get_current_process_handle();
227    sc_assert(h2.valid() == true);
228    sc_assert(strcmp(h2.name(), "top.m.ME") == 0);
229    sc_assert(h2.proc_kind() == SC_METHOD_PROC_);
230    sc_assert(h2.get_process_object() != 0);
231    std::vector<sc_object*> children2 = h2.get_child_objects();
232    sc_assert(children2.size() == 0);
233    sc_assert(h2.get_parent_object() == this);
234    sc_assert(h2.terminated() == false);
235    sc_assert(h2.dynamic() == false);
236    sc_assert(h2 == h2);
237    sc_assert(h2 != h);
238  }
239
240};
241
242struct Top: sc_module
243{
244  M *m;
245  sc_clock clk;
246  Top(sc_module_name)
247  {
248    m = new M("m");
249    m->clk(clk);
250  }
251};
252
253int sc_main(int argc, char* argv[])
254{
255  cout << "Should be silent except for warning messages" << endl;
256
257  sc_process_handle h;
258  invalid_handle_check(h);
259
260  Top top("top");
261  sc_start();
262
263  cout << endl << "Success" << endl;
264  return 0;
265}
266