1#include <systemc> 2#include <cstring> 3using namespace sc_core; 4using namespace sc_dt; 5using std::cout; 6using std::endl; 7 8// 10) sc_find_object, sc_get_top_level_objects 9 10static int object_count = 0; 11 12void recurse_hierarchy(sc_object* obj) 13{ 14 ++ object_count; 15 std::vector<sc_object*> children = obj->get_child_objects(); 16 for (std::vector<sc_object*>::iterator i = children.begin(); i != children.end(); i++) 17 recurse_hierarchy(*i); 18} 19 20SC_MODULE(M) 21{ 22 SC_CTOR(M) 23 : sig("sig") 24 { 25 SC_THREAD(T); 26 } 27 void T() 28 { 29 } 30 sc_signal<int> sig; 31}; 32 33SC_MODULE(Top) 34{ 35 M *m; 36 SC_CTOR(Top) 37 { 38 m = new M("m"); 39 40 sc_object* obj; 41 obj = sc_find_object(""); 42 sc_assert(obj == 0); 43 obj = sc_find_object("foo"); 44 sc_assert(obj == 0); 45 obj = sc_find_object("top.m.foo"); 46 sc_assert(obj == 0); 47 obj = sc_find_object("top"); 48 sc_assert(strcmp(obj->kind(), "sc_module") == 0); 49 obj = sc_find_object("top.m"); 50 sc_assert(strcmp(obj->kind(), "sc_module") == 0); 51 obj = sc_find_object("top.m.sig"); 52 sc_assert(strcmp(obj->kind(), "sc_signal") == 0); 53 obj = sc_find_object("top.m.T"); 54 sc_assert(sc_process_handle(obj).valid()); 55 sc_assert(strcmp(sc_process_handle(obj).name(), "top.m.T") == 0); 56 57 object_count = 0; 58 recurse_hierarchy(m); 59 sc_assert(object_count == 3); 60 } 61}; 62 63int sc_main(int argc, char* argv[]) 64{ 65 cout << "Should be silent..." << endl; 66 67 std::vector<sc_object*> tops = sc_get_top_level_objects(); 68 sc_assert(tops.size() == 0); 69 70 Top top("top"); 71 72 tops = sc_get_top_level_objects(); 73 sc_assert(tops.size() == 1); 74 sc_assert(strcmp(tops[0]->name(), "top") == 0); 75 76 M m2("m2"); 77 78 tops = sc_get_top_level_objects(); 79 sc_assert(tops.size() == 2); 80 sc_assert(strcmp(tops[0]->name(), "top") == 0); 81 sc_assert(strcmp(tops[1]->name(), "m2") == 0); 82 83 sc_signal<int> sig("sig2"); 84 85 tops = sc_get_top_level_objects(); 86 sc_assert(tops.size() == 3); 87 sc_assert(strcmp(tops[0]->name(), "top") == 0); 88 sc_assert(strcmp(tops[1]->name(), "m2") == 0); 89 sc_assert(strcmp(tops[2]->name(), "sig2") == 0); 90 91 sc_object* obj; 92 obj = sc_find_object(""); 93 sc_assert(obj == 0); 94 obj = sc_find_object("foo"); 95 sc_assert(obj == 0); 96 obj = sc_find_object("top.m.foo"); 97 sc_assert(obj == 0); 98 obj = sc_find_object("top"); 99 sc_assert(strcmp(obj->kind(), "sc_module") == 0); 100 obj = sc_find_object("sig2"); 101 sc_assert(strcmp(obj->kind(), "sc_signal") == 0); 102 obj = sc_find_object("m2"); 103 sc_assert(strcmp(obj->kind(), "sc_module") == 0); 104 obj = sc_find_object("top.m"); 105 sc_assert(strcmp(obj->kind(), "sc_module") == 0); 106 obj = sc_find_object("top.m.sig"); 107 sc_assert(strcmp(obj->kind(), "sc_signal") == 0); 108 obj = sc_find_object("top.m.T"); 109 sc_assert(sc_process_handle(obj).valid()); 110 sc_assert(strcmp(sc_process_handle(obj).name(), "top.m.T") == 0); 111 112 object_count = 0; 113 recurse_hierarchy(tops[0]); 114 sc_assert(object_count == 4); 115 116 sc_start(); 117 118 cout << endl << "Success" << endl; 119 return 0; 120} 121