test208.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 sc_core::wait;
8using std::cout;
9using std::endl;
10
11// 8) get_parent_object, get_child_objects
12
13struct Object: sc_object
14{
15  Object(const char* _n) : sc_object(_n) {}
16};
17
18SC_MODULE(M)
19{
20  sc_signal<bool> sig;
21  sc_object* T_obj;
22
23  SC_CTOR(M)
24  {
25    std::vector<sc_object*> children = sig.get_child_objects();
26    sc_assert (children.size() == 0);
27    SC_THREAD(T);
28    sc_process_handle h = sc_get_current_process_handle();
29    sc_assert (h.valid());
30    T_obj = h.get_process_object();
31    children = h.get_child_objects();
32    sc_assert (children.size() == 0);
33    children = h.get_process_object()->get_child_objects();
34    sc_assert (children.size() == 0);
35
36    Object obj("obj");
37    children = obj.get_child_objects();
38    sc_assert (children.size() == 0);
39    sc_assert (obj.get_parent_object() == this);
40  }
41
42  void T()
43  {
44    sc_process_handle h = sc_get_current_process_handle();
45    sc_assert (h.valid());
46    sc_assert (h.dynamic() == false);
47    sc_assert (h.get_process_object() == T_obj);
48    sc_assert (h.get_parent_object() == this);
49    std::vector<sc_object*> children = h.get_child_objects();
50    sc_assert (children.size() == 0);
51    children = h.get_process_object()->get_child_objects();
52    sc_assert (children.size() == 0);
53
54    Object obj("obj");
55    children = obj.get_child_objects();
56    sc_assert (children.size() == 0);
57    sc_assert (obj.get_parent_object() == h.get_process_object());
58
59    children = h.get_child_objects();
60    sc_assert (children.size() == 1);
61    sc_assert (children[0] == &obj);
62    sc_assert (strcmp(children[0]->name(), "top.m.T.obj") == 0);
63    sc_assert (children[0]->get_parent_object() == h.get_process_object());
64
65    Object obj2("obj2");
66    children = h.get_child_objects();
67    sc_assert (children.size() == 2);
68    sc_assert (children[0] == &obj);
69    sc_assert (children[1] == &obj2);
70    sc_assert (children[0]->get_parent_object() == h.get_process_object());
71    sc_assert (children[1]->get_parent_object() == h.get_process_object());
72
73    wait (1, SC_NS);
74    sc_spawn(sc_bind(&M::dynamic_proc, this), "dynamic_proc");
75    wait (1, SC_NS);
76
77    sc_assert (h.valid());
78  }
79
80  sc_object* dynamic_proc_obj;
81
82  void dynamic_proc()
83  {
84    sc_process_handle h = sc_get_current_process_handle();
85    sc_assert (h.valid());
86    dynamic_proc_obj = h.get_process_object();
87    sc_assert (h.dynamic() == true);
88    sc_assert (h.get_parent_object() == T_obj);
89    std::vector<sc_object*> children = h.get_child_objects();
90    sc_assert (children.size() == 0);
91    children = h.get_process_object()->get_child_objects();
92    sc_assert (children.size() == 0);
93
94    Object obj("obj");
95    children = obj.get_child_objects();
96    sc_assert (children.size() == 0);
97    sc_assert (obj.get_parent_object() == dynamic_proc_obj);
98
99    children = h.get_child_objects();
100    sc_assert (children.size() == 1);
101    sc_assert (children[0] == &obj);
102    sc_assert (strcmp(children[0]->name(), "top.m.T.dynamic_proc.obj") == 0);
103    sc_assert (children[0]->get_parent_object() == dynamic_proc_obj);
104
105    Object obj2("obj2");
106    children = h.get_child_objects();
107    sc_assert (children.size() == 2);
108    sc_assert (children[0] == &obj);
109    sc_assert (children[1] == &obj2);
110    sc_assert (children[0]->get_parent_object() == dynamic_proc_obj);
111    sc_assert (children[1]->get_parent_object() == dynamic_proc_obj);
112
113    wait (1, SC_NS);
114    sc_process_handle h2 = sc_spawn(sc_bind(&M::dynamic_proc2, this), "dynamic_proc2");
115    wait (1, SC_NS);
116
117    children = h.get_child_objects();
118    sc_assert (children.size() == 3);
119    sc_assert (children[0] == &obj);
120    sc_assert (children[1] == &obj2);
121    sc_assert (children[2] == h2.get_process_object());
122    sc_assert (children[0]->get_parent_object() == dynamic_proc_obj);
123    sc_assert (children[1]->get_parent_object() == dynamic_proc_obj);
124    sc_assert (children[2]->get_parent_object() == dynamic_proc_obj);
125
126    sc_assert (h.valid());
127  }
128
129  void dynamic_proc2()
130  {
131    sc_process_handle h = sc_get_current_process_handle();
132    sc_assert (h.valid());
133    sc_assert (h.dynamic() == true);
134    sc_assert (h.get_parent_object() == dynamic_proc_obj);
135    std::vector<sc_object*> children = h.get_child_objects();
136    sc_assert (children.size() == 0);
137    children = h.get_process_object()->get_child_objects();
138    sc_assert (children.size() == 0);
139
140    Object obj("obj");
141    children = obj.get_child_objects();
142    sc_assert (children.size() == 0);
143    sc_assert (obj.get_parent_object() == h.get_process_object());
144
145    children = h.get_child_objects();
146    sc_assert (children.size() == 1);
147    sc_assert (children[0] == &obj);
148    sc_assert (strcmp(children[0]->name(), "top.m.T.dynamic_proc.dynamic_proc2.obj") == 0);
149    sc_assert (children[0]->get_parent_object() == h.get_process_object());
150
151    Object obj2("obj2");
152    children = h.get_child_objects();
153    sc_assert (children.size() == 2);
154    sc_assert (children[0] == &obj);
155    sc_assert (children[1] == &obj2);
156    sc_assert (children[0]->get_parent_object() == h.get_process_object());
157    sc_assert (children[1]->get_parent_object() == h.get_process_object());
158
159    wait(10, SC_NS);
160
161    sc_assert (h.valid());
162  }
163};
164
165void g(sc_object* obj)
166{
167  sc_process_handle h = sc_get_current_process_handle();
168  sc_object* this_process = h.get_process_object();
169  sc_assert(this_process->get_parent_object() == obj);
170}
171void f()
172{
173  sc_object* obj = sc_get_current_process_handle().get_process_object();
174  sc_process_handle h = sc_spawn(sc_bind(&g, obj));
175  std::vector<sc_object*> children = obj->get_child_objects();
176  sc_assert (children.size() == 1);
177  wait(1, SC_NS);
178}
179
180SC_MODULE(Top)
181{
182  sc_in_clk clk;
183  sc_port<sc_signal_in_if<int>, 1, SC_ZERO_OR_MORE_BOUND> p;
184  sc_export<sc_signal_in_if<int> > xp;
185  sc_signal<int> sig;
186
187  M *m;
188  SC_CTOR(Top)
189    : clk("clk"), p("p"), xp("xp"), sig("sig")
190  {
191    m = new M("m");
192    xp.bind(sig);
193
194    SC_THREAD(p1);
195    SC_CTHREAD(p2,clk);
196    SC_METHOD(p3);
197    sc_spawn(&f,"p4");
198
199    sc_object* parent = this->get_parent_object();
200    sc_assert (parent == 0);
201
202    std::vector<sc_object*> children = this->get_child_objects();
203    sc_assert (children.size() == 9);
204    sc_assert (strcmp(children[0]->name(), "top.clk") == 0);
205    sc_assert (strcmp(children[1]->name(), "top.p") == 0);
206    sc_assert (strcmp(children[2]->name(), "top.xp") == 0);
207    sc_assert (strcmp(children[3]->name(), "top.sig") == 0);
208    sc_assert (strcmp(children[4]->name(), "top.m") == 0);
209    sc_assert (strcmp(children[5]->name(), "top.p1") == 0);
210    sc_assert (strcmp(children[6]->name(), "top.p2") == 0);
211    sc_assert (strcmp(children[7]->name(), "top.p3") == 0);
212    sc_assert (strcmp(children[8]->name(), "top.p4") == 0);
213
214    for (unsigned i = 0; i < children.size(); i++)
215      sc_assert (children[i]->get_parent_object() == this);
216  }
217  void p1() {}
218  void p2() {}
219  void p3() {}
220};
221
222int sc_main(int argc, char* argv[])
223{
224  cout << "Should be silent..." << endl;
225
226  Object obj("obj");
227  std::vector<sc_object*> children = obj.get_child_objects();
228  sc_assert (children.size() == 0);
229  sc_assert (obj.get_parent_object() == 0);
230
231  sc_signal<bool> clk;
232  Top top("top");
233  top.clk(clk);
234  sc_start();
235
236  cout << endl << "Success" << endl;
237  return 0;
238}
239