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
|
#include <systemc>
#include "utils/log.h"
using sc_core::sc_module;
using sc_core::sc_module_name;
using sc_core::sc_object;
struct leaf_a : public sc_module {
explicit leaf_a(sc_module_name nm) : sc_module(nm) {}
};
struct leaf_b : public sc_module {
explicit leaf_b(sc_module_name nm) : sc_module(nm) {}
};
struct processor : public sc_module {
explicit processor(sc_module_name nm) : sc_module(nm), m_a("a"), m_b("b") {}
leaf_a m_a;
leaf_b m_b;
};
struct memory : public sc_module {
explicit memory(sc_module_name nm) : sc_module(nm), m_a("a") {}
leaf_a m_a;
};
struct soc : public sc_module {
explicit soc(sc_module_name nm)
: sc_module(nm),
m_mem0{"mem0"},
m_mem1{"mem1"},
m_mem2{"mem2"},
m_mem3{"mem3"},
m_proc0{"proc0"},
m_proc1{"proc1"} {}
memory m_mem0, m_mem1, m_mem2, m_mem3;
processor m_proc0, m_proc1;
};
// -- WALKER -------------------------------------------------------------------
void walk(const std::vector<sc_object*>& objs, unsigned indent = 0) {
for (const auto* obj : objs) {
if (indent) {
printf("%*c", indent, ' ');
}
printf("BASENAME=" YELLOW "%s" RESET " NAME=" MAGENTA "%s" RESET
" HAS_PARENT=%d\n",
obj->basename(), obj->name(), obj->get_parent_object() != nullptr);
walk(obj->get_child_objects(), indent + 2);
}
}
// -- SC_MAIN ------------------------------------------------------------------
extern "C" int sc_main(int, char*[]) {
soc s("soc");
walk(sc_core::sc_get_top_level_objects());
const auto* obj = sc_core::sc_find_object("soc.mem0");
if (obj != nullptr) {
puts(obj->name());
}
std::cout << sc_core::sc_hierarchical_name_exists("soc") << std::endl;
std::cout << sc_core::sc_hierarchical_name_exists(obj, "a") << std::endl;
return 0;
}
|