summaryrefslogtreecommitdiff
path: root/src/systemc/tests/systemc/compliance_1666/test203a/test203a.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/systemc/tests/systemc/compliance_1666/test203a/test203a.cpp')
-rw-r--r--src/systemc/tests/systemc/compliance_1666/test203a/test203a.cpp265
1 files changed, 265 insertions, 0 deletions
diff --git a/src/systemc/tests/systemc/compliance_1666/test203a/test203a.cpp b/src/systemc/tests/systemc/compliance_1666/test203a/test203a.cpp
new file mode 100644
index 000000000..ad2a6b0f0
--- /dev/null
+++ b/src/systemc/tests/systemc/compliance_1666/test203a/test203a.cpp
@@ -0,0 +1,265 @@
+#define SC_INCLUDE_DYNAMIC_PROCESSES
+
+#include <systemc>
+#include <cstring>
+using namespace sc_core;
+using namespace sc_dt;
+using std::cout;
+using std::endl;
+
+// 3) Process handle methods, including invalid and terminated process
+
+void invalid_handle_check(sc_process_handle& h)
+{
+
+ sc_assert(h.valid() == false);
+ sc_assert(strcmp(h.name(), "") == 0);
+ sc_assert(h.proc_kind() == SC_NO_PROC_);
+ sc_assert(h.get_process_object() == 0);
+ std::vector<sc_object*> children = h.get_child_objects();
+ sc_assert(children.size() == 0);
+ sc_assert(h.get_parent_object() == 0);
+ sc_assert(h.terminated() == false);
+ sc_assert(h.dynamic() == false);
+ sc_assert( !(h == h) );
+ sc_assert(h != h);
+
+ cout << "There should be warning 11 messages" << endl;
+
+ h.disable();
+ h.enable();
+ h.is_unwinding();
+ h.kill();
+ h.reset();
+ h.resume();
+ h.suspend();
+ h.sync_reset_off();
+ h.sync_reset_on();
+ h.terminated_event();
+ h.throw_it(sc_user(), SC_NO_DESCENDANTS);
+
+ cout << "End of warning messages" << endl;
+}
+
+SC_MODULE(M)
+{
+ sc_in_clk clk;
+ SC_CTOR(M)
+ {
+ sc_process_handle h;
+ invalid_handle_check(h);
+
+ SC_THREAD(T);
+ SC_CTHREAD(CT, clk.pos());
+ SC_METHOD(ME);
+
+ sc_process_handle h3 = sc_spawn(sc_bind(&M::stat_thread, this), "stat_thread");
+ sc_spawn_options opt;
+ opt.spawn_method();
+ sc_process_handle h4 = sc_spawn(sc_bind(&M::stat_method, this), "stat_method", &opt);
+
+ std::vector<sc_object*> children = this->get_child_objects();
+ sc_assert(children.size() == 6);
+ }
+ void T()
+ {
+ sc_process_handle h;
+ invalid_handle_check(h);
+
+ sc_process_handle h2 = sc_get_current_process_handle();
+ sc_assert(h2.valid() == true);
+ sc_assert(strcmp(h2.name(), "top.m.T") == 0);
+ sc_assert(h2.proc_kind() == SC_THREAD_PROC_);
+ sc_assert(h2.get_process_object() != 0);
+ std::vector<sc_object*> children2 = h2.get_child_objects();
+ sc_assert(children2.size() == 0);
+ sc_assert(h2.get_parent_object() == this);
+ sc_assert(h2.terminated() == false);
+ sc_assert(h2.dynamic() == false);
+ sc_assert(h2 == h2);
+ sc_assert(h2 != h);
+
+ sc_process_handle h3 = sc_spawn(sc_bind(&M::dyn_thread, this), "dyn_thread");
+ wait(1, SC_NS);
+
+ if (h3.valid() == true)
+ {
+ sc_assert(strcmp(h3.name(), "top.m.T.dyn_thread") == 0);
+ sc_assert(h3.proc_kind() == SC_THREAD_PROC_);
+ sc_assert(h3.get_process_object() != 0);
+ std::vector<sc_object*> children3 = h3.get_child_objects();
+ sc_assert(children3.size() == 0);
+ sc_assert(h3.get_parent_object() == sc_get_current_process_handle().get_process_object());
+ sc_assert(h3.terminated() == true);
+ sc_assert(h3.dynamic() == true);
+ sc_assert(h3 == h3);
+ sc_assert( !(h3 != h3) );
+ }
+
+ sc_spawn_options opt;
+ opt.spawn_method();
+ sc_process_handle h4 = sc_spawn(sc_bind(&M::dyn_method, this), "dyn_method", &opt);
+ sc_assert(h4 != h3);
+
+ wait(10, SC_NS);
+ sc_stop();
+ }
+
+ void stat_thread()
+ {
+ sc_process_handle h;
+ invalid_handle_check(h);
+
+ wait(5, SC_NS);
+
+ sc_process_handle h3 = sc_get_current_process_handle();
+ sc_assert(h3.valid() == true);
+ sc_assert(strcmp(h3.name(), "top.m.stat_thread") == 0);
+ sc_assert(h3.proc_kind() == SC_THREAD_PROC_);
+ sc_assert(h3.get_process_object() != 0);
+ std::vector<sc_object*> children3 = h3.get_child_objects();
+ sc_assert(children3.size() == 0);
+ sc_assert(h3.get_parent_object() != 0);
+ sc_assert(h3.terminated() == false);
+ sc_assert(h3.dynamic() == false);
+ sc_assert(h3 == h3);
+ sc_assert(h3 != h);
+
+ sc_process_handle h4;
+ h4 = h3;
+ sc_assert(h4 == h3);
+ sc_assert(h4 != h);
+ }
+
+ void stat_method()
+ {
+ sc_process_handle h;
+ invalid_handle_check(h);
+
+ sc_process_handle h3 = sc_get_current_process_handle();
+ sc_assert(h3.valid() == true);
+ sc_assert(strcmp(h3.name(), "top.m.stat_method") == 0);
+ sc_assert(h3.proc_kind() == SC_METHOD_PROC_);
+ sc_assert(h3.get_process_object() != 0);
+ std::vector<sc_object*> children3 = h3.get_child_objects();
+ sc_assert(children3.size() == 0);
+ sc_assert(h3.get_parent_object() != 0);
+ sc_assert(h3.terminated() == false);
+ sc_assert(h3.dynamic() == false);
+ sc_assert(h3 == h3);
+ sc_assert(h3 != h);
+
+ sc_process_handle h4;
+ h4 = h3;
+ sc_assert(h4 == h3);
+ sc_assert(h4 != h);
+ }
+
+ void dyn_thread()
+ {
+ sc_process_handle h;
+ invalid_handle_check(h);
+
+ sc_process_handle h3 = sc_get_current_process_handle();
+ sc_assert(h3.valid() == true);
+ sc_assert(strcmp(h3.name(), "top.m.T.dyn_thread") == 0);
+ sc_assert(h3.proc_kind() == SC_THREAD_PROC_);
+ sc_assert(h3.get_process_object() != 0);
+ std::vector<sc_object*> children3 = h3.get_child_objects();
+ sc_assert(children3.size() == 0);
+ sc_assert(h3.get_parent_object() != 0);
+ sc_assert(h3.terminated() == false);
+ sc_assert(h3.dynamic() == true);
+ sc_assert(h3 == h3);
+ sc_assert(h3 != h);
+
+ sc_process_handle h4(h3);
+ sc_assert(h4 == h3);
+ }
+
+ void dyn_method()
+ {
+ sc_process_handle h;
+ invalid_handle_check(h);
+
+ sc_process_handle h3 = sc_get_current_process_handle();
+ sc_assert(h3.valid() == true);
+ sc_assert(strcmp(h3.name(), "top.m.T.dyn_method") == 0);
+ sc_assert(h3.proc_kind() == SC_METHOD_PROC_);
+ sc_assert(h3.get_process_object() != 0);
+ std::vector<sc_object*> children3 = h3.get_child_objects();
+ sc_assert(children3.size() == 0);
+ sc_assert(h3.get_parent_object() != 0);
+ sc_assert(h3.terminated() == false);
+ sc_assert(h3.dynamic() == true);
+ sc_assert(h3 == h3);
+ sc_assert(h3 != h);
+
+ sc_process_handle h4(h3);
+ sc_assert(h4 == h3);
+ }
+
+ void CT()
+ {
+ sc_process_handle h;
+ invalid_handle_check(h);
+
+ sc_process_handle h2 = sc_get_current_process_handle();
+ sc_assert(h2.valid() == true);
+ sc_assert(strcmp(h2.name(), "top.m.CT") == 0);
+ sc_assert(h2.proc_kind() == SC_CTHREAD_PROC_);
+ sc_assert(h2.get_process_object() != 0);
+ std::vector<sc_object*> children2 = h2.get_child_objects();
+ sc_assert(children2.size() == 0);
+ sc_assert(h2.get_parent_object() == this);
+ sc_assert(h2.terminated() == false);
+ sc_assert(h2.dynamic() == false);
+ sc_assert(h2 == h2);
+ sc_assert(h2 != h);
+ }
+
+ void ME()
+ {
+ sc_process_handle h;
+ invalid_handle_check(h);
+
+ sc_process_handle h2 = sc_get_current_process_handle();
+ sc_assert(h2.valid() == true);
+ sc_assert(strcmp(h2.name(), "top.m.ME") == 0);
+ sc_assert(h2.proc_kind() == SC_METHOD_PROC_);
+ sc_assert(h2.get_process_object() != 0);
+ std::vector<sc_object*> children2 = h2.get_child_objects();
+ sc_assert(children2.size() == 0);
+ sc_assert(h2.get_parent_object() == this);
+ sc_assert(h2.terminated() == false);
+ sc_assert(h2.dynamic() == false);
+ sc_assert(h2 == h2);
+ sc_assert(h2 != h);
+ }
+
+};
+
+struct Top: sc_module
+{
+ M *m;
+ sc_clock clk;
+ Top(sc_module_name)
+ {
+ m = new M("m");
+ m->clk(clk);
+ }
+};
+
+int sc_main(int argc, char* argv[])
+{
+ cout << "Should be silent except for warning messages" << endl;
+
+ sc_process_handle h;
+ invalid_handle_check(h);
+
+ Top top("top");
+ sc_start();
+
+ cout << endl << "Success" << endl;
+ return 0;
+}