#include #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& 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; }