From 16fa8d7cc8c92f5ab879e4cf9c6c0bbb3567860f Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Thu, 24 May 2018 01:37:55 -0700 Subject: systemc: Import tests from the Accellera systemc distribution. Change-Id: Iad76b398949a55d768a34d027a2d8e3739953da6 Reviewed-on: https://gem5-review.googlesource.com/10845 Reviewed-by: Giacomo Travaglini Maintainer: Gabe Black --- .../systemc/compliance_1666/test208/test208.cpp | 238 +++++++++++++++++++++ 1 file changed, 238 insertions(+) create mode 100644 src/systemc/tests/systemc/compliance_1666/test208/test208.cpp (limited to 'src/systemc/tests/systemc/compliance_1666/test208/test208.cpp') diff --git a/src/systemc/tests/systemc/compliance_1666/test208/test208.cpp b/src/systemc/tests/systemc/compliance_1666/test208/test208.cpp new file mode 100644 index 000000000..1b526484a --- /dev/null +++ b/src/systemc/tests/systemc/compliance_1666/test208/test208.cpp @@ -0,0 +1,238 @@ +#define SC_INCLUDE_DYNAMIC_PROCESSES + +#include +#include +using namespace sc_core; +using namespace sc_dt; +using sc_core::wait; +using std::cout; +using std::endl; + +// 8) get_parent_object, get_child_objects + +struct Object: sc_object +{ + Object(const char* _n) : sc_object(_n) {} +}; + +SC_MODULE(M) +{ + sc_signal sig; + sc_object* T_obj; + + SC_CTOR(M) + { + std::vector children = sig.get_child_objects(); + sc_assert (children.size() == 0); + SC_THREAD(T); + sc_process_handle h = sc_get_current_process_handle(); + sc_assert (h.valid()); + T_obj = h.get_process_object(); + children = h.get_child_objects(); + sc_assert (children.size() == 0); + children = h.get_process_object()->get_child_objects(); + sc_assert (children.size() == 0); + + Object obj("obj"); + children = obj.get_child_objects(); + sc_assert (children.size() == 0); + sc_assert (obj.get_parent_object() == this); + } + + void T() + { + sc_process_handle h = sc_get_current_process_handle(); + sc_assert (h.valid()); + sc_assert (h.dynamic() == false); + sc_assert (h.get_process_object() == T_obj); + sc_assert (h.get_parent_object() == this); + std::vector children = h.get_child_objects(); + sc_assert (children.size() == 0); + children = h.get_process_object()->get_child_objects(); + sc_assert (children.size() == 0); + + Object obj("obj"); + children = obj.get_child_objects(); + sc_assert (children.size() == 0); + sc_assert (obj.get_parent_object() == h.get_process_object()); + + children = h.get_child_objects(); + sc_assert (children.size() == 1); + sc_assert (children[0] == &obj); + sc_assert (strcmp(children[0]->name(), "top.m.T.obj") == 0); + sc_assert (children[0]->get_parent_object() == h.get_process_object()); + + Object obj2("obj2"); + children = h.get_child_objects(); + sc_assert (children.size() == 2); + sc_assert (children[0] == &obj); + sc_assert (children[1] == &obj2); + sc_assert (children[0]->get_parent_object() == h.get_process_object()); + sc_assert (children[1]->get_parent_object() == h.get_process_object()); + + wait (1, SC_NS); + sc_spawn(sc_bind(&M::dynamic_proc, this), "dynamic_proc"); + wait (1, SC_NS); + + sc_assert (h.valid()); + } + + sc_object* dynamic_proc_obj; + + void dynamic_proc() + { + sc_process_handle h = sc_get_current_process_handle(); + sc_assert (h.valid()); + dynamic_proc_obj = h.get_process_object(); + sc_assert (h.dynamic() == true); + sc_assert (h.get_parent_object() == T_obj); + std::vector children = h.get_child_objects(); + sc_assert (children.size() == 0); + children = h.get_process_object()->get_child_objects(); + sc_assert (children.size() == 0); + + Object obj("obj"); + children = obj.get_child_objects(); + sc_assert (children.size() == 0); + sc_assert (obj.get_parent_object() == dynamic_proc_obj); + + children = h.get_child_objects(); + sc_assert (children.size() == 1); + sc_assert (children[0] == &obj); + sc_assert (strcmp(children[0]->name(), "top.m.T.dynamic_proc.obj") == 0); + sc_assert (children[0]->get_parent_object() == dynamic_proc_obj); + + Object obj2("obj2"); + children = h.get_child_objects(); + sc_assert (children.size() == 2); + sc_assert (children[0] == &obj); + sc_assert (children[1] == &obj2); + sc_assert (children[0]->get_parent_object() == dynamic_proc_obj); + sc_assert (children[1]->get_parent_object() == dynamic_proc_obj); + + wait (1, SC_NS); + sc_process_handle h2 = sc_spawn(sc_bind(&M::dynamic_proc2, this), "dynamic_proc2"); + wait (1, SC_NS); + + children = h.get_child_objects(); + sc_assert (children.size() == 3); + sc_assert (children[0] == &obj); + sc_assert (children[1] == &obj2); + sc_assert (children[2] == h2.get_process_object()); + sc_assert (children[0]->get_parent_object() == dynamic_proc_obj); + sc_assert (children[1]->get_parent_object() == dynamic_proc_obj); + sc_assert (children[2]->get_parent_object() == dynamic_proc_obj); + + sc_assert (h.valid()); + } + + void dynamic_proc2() + { + sc_process_handle h = sc_get_current_process_handle(); + sc_assert (h.valid()); + sc_assert (h.dynamic() == true); + sc_assert (h.get_parent_object() == dynamic_proc_obj); + std::vector children = h.get_child_objects(); + sc_assert (children.size() == 0); + children = h.get_process_object()->get_child_objects(); + sc_assert (children.size() == 0); + + Object obj("obj"); + children = obj.get_child_objects(); + sc_assert (children.size() == 0); + sc_assert (obj.get_parent_object() == h.get_process_object()); + + children = h.get_child_objects(); + sc_assert (children.size() == 1); + sc_assert (children[0] == &obj); + sc_assert (strcmp(children[0]->name(), "top.m.T.dynamic_proc.dynamic_proc2.obj") == 0); + sc_assert (children[0]->get_parent_object() == h.get_process_object()); + + Object obj2("obj2"); + children = h.get_child_objects(); + sc_assert (children.size() == 2); + sc_assert (children[0] == &obj); + sc_assert (children[1] == &obj2); + sc_assert (children[0]->get_parent_object() == h.get_process_object()); + sc_assert (children[1]->get_parent_object() == h.get_process_object()); + + wait(10, SC_NS); + + sc_assert (h.valid()); + } +}; + +void g(sc_object* obj) +{ + sc_process_handle h = sc_get_current_process_handle(); + sc_object* this_process = h.get_process_object(); + sc_assert(this_process->get_parent_object() == obj); +} +void f() +{ + sc_object* obj = sc_get_current_process_handle().get_process_object(); + sc_process_handle h = sc_spawn(sc_bind(&g, obj)); + std::vector children = obj->get_child_objects(); + sc_assert (children.size() == 1); + wait(1, SC_NS); +} + +SC_MODULE(Top) +{ + sc_in_clk clk; + sc_port, 1, SC_ZERO_OR_MORE_BOUND> p; + sc_export > xp; + sc_signal sig; + + M *m; + SC_CTOR(Top) + : clk("clk"), p("p"), xp("xp"), sig("sig") + { + m = new M("m"); + xp.bind(sig); + + SC_THREAD(p1); + SC_CTHREAD(p2,clk); + SC_METHOD(p3); + sc_spawn(&f,"p4"); + + sc_object* parent = this->get_parent_object(); + sc_assert (parent == 0); + + std::vector children = this->get_child_objects(); + sc_assert (children.size() == 9); + sc_assert (strcmp(children[0]->name(), "top.clk") == 0); + sc_assert (strcmp(children[1]->name(), "top.p") == 0); + sc_assert (strcmp(children[2]->name(), "top.xp") == 0); + sc_assert (strcmp(children[3]->name(), "top.sig") == 0); + sc_assert (strcmp(children[4]->name(), "top.m") == 0); + sc_assert (strcmp(children[5]->name(), "top.p1") == 0); + sc_assert (strcmp(children[6]->name(), "top.p2") == 0); + sc_assert (strcmp(children[7]->name(), "top.p3") == 0); + sc_assert (strcmp(children[8]->name(), "top.p4") == 0); + + for (unsigned i = 0; i < children.size(); i++) + sc_assert (children[i]->get_parent_object() == this); + } + void p1() {} + void p2() {} + void p3() {} +}; + +int sc_main(int argc, char* argv[]) +{ + cout << "Should be silent..." << endl; + + Object obj("obj"); + std::vector children = obj.get_child_objects(); + sc_assert (children.size() == 0); + sc_assert (obj.get_parent_object() == 0); + + sc_signal clk; + Top top("top"); + top.clk(clk); + sc_start(); + + cout << endl << "Success" << endl; + return 0; +} -- cgit v1.2.3