summaryrefslogtreecommitdiff
path: root/src/systemc/tests/systemc/compliance_1666/test210/test210.cpp
blob: d328fbefbfa8828447a09ff944926c81ccaf5140 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#include <systemc>
#include <cstring>
using namespace sc_core;
using namespace sc_dt;
using std::cout;
using std::endl;

// 10) sc_find_object, sc_get_top_level_objects

static int object_count = 0;

void recurse_hierarchy(sc_object* obj)
{
  ++ object_count;
  std::vector<sc_object*> children = obj->get_child_objects();
  for (std::vector<sc_object*>::iterator i = children.begin(); i != children.end(); i++)
    recurse_hierarchy(*i);
}

SC_MODULE(M)
{
  SC_CTOR(M)
    : sig("sig")
  {
    SC_THREAD(T);
  }
  void T()
  {
  }
  sc_signal<int> sig;
};

SC_MODULE(Top)
{
  M *m;
  SC_CTOR(Top)
  {
    m = new M("m");

    sc_object* obj;
    obj = sc_find_object("");
    sc_assert(obj == 0);
    obj = sc_find_object("foo");
    sc_assert(obj == 0);
    obj = sc_find_object("top.m.foo");
    sc_assert(obj == 0);
    obj = sc_find_object("top");
    sc_assert(strcmp(obj->kind(), "sc_module") == 0);
    obj = sc_find_object("top.m");
    sc_assert(strcmp(obj->kind(), "sc_module") == 0);
    obj = sc_find_object("top.m.sig");
    sc_assert(strcmp(obj->kind(), "sc_signal") == 0);
    obj = sc_find_object("top.m.T");
    sc_assert(sc_process_handle(obj).valid());
    sc_assert(strcmp(sc_process_handle(obj).name(), "top.m.T") == 0);

    object_count = 0;
    recurse_hierarchy(m);
    sc_assert(object_count == 3);
  }
};

int sc_main(int argc, char* argv[])
{
  cout << "Should be silent..." << endl;

  std::vector<sc_object*> tops = sc_get_top_level_objects();
  sc_assert(tops.size() == 0);

  Top top("top");

  tops = sc_get_top_level_objects();
  sc_assert(tops.size() == 1);
  sc_assert(strcmp(tops[0]->name(), "top") == 0);

  M m2("m2");

  tops = sc_get_top_level_objects();
  sc_assert(tops.size() == 2);
  sc_assert(strcmp(tops[0]->name(), "top") == 0);
  sc_assert(strcmp(tops[1]->name(), "m2") == 0);

  sc_signal<int> sig("sig2");

  tops = sc_get_top_level_objects();
  sc_assert(tops.size() == 3);
  sc_assert(strcmp(tops[0]->name(), "top") == 0);
  sc_assert(strcmp(tops[1]->name(), "m2") == 0);
  sc_assert(strcmp(tops[2]->name(), "sig2") == 0);

  sc_object* obj;
  obj = sc_find_object("");
  sc_assert(obj == 0);
  obj = sc_find_object("foo");
  sc_assert(obj == 0);
  obj = sc_find_object("top.m.foo");
  sc_assert(obj == 0);
  obj = sc_find_object("top");
  sc_assert(strcmp(obj->kind(), "sc_module") == 0);
  obj = sc_find_object("sig2");
  sc_assert(strcmp(obj->kind(), "sc_signal") == 0);
  obj = sc_find_object("m2");
  sc_assert(strcmp(obj->kind(), "sc_module") == 0);
  obj = sc_find_object("top.m");
  sc_assert(strcmp(obj->kind(), "sc_module") == 0);
  obj = sc_find_object("top.m.sig");
  sc_assert(strcmp(obj->kind(), "sc_signal") == 0);
  obj = sc_find_object("top.m.T");
  sc_assert(sc_process_handle(obj).valid());
  sc_assert(strcmp(sc_process_handle(obj).name(), "top.m.T") == 0);

  object_count = 0;
  recurse_hierarchy(tops[0]);
  sc_assert(object_count == 4);

  sc_start();

  cout << endl << "Success" << endl;
  return 0;
}