test210.cpp revision 12855:588919e0e4aa
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