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