summaryrefslogtreecommitdiff
path: root/src/systemc/tests/systemc/kernel/process_control/test06/test06.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/systemc/tests/systemc/kernel/process_control/test06/test06.cpp')
-rw-r--r--src/systemc/tests/systemc/kernel/process_control/test06/test06.cpp130
1 files changed, 130 insertions, 0 deletions
diff --git a/src/systemc/tests/systemc/kernel/process_control/test06/test06.cpp b/src/systemc/tests/systemc/kernel/process_control/test06/test06.cpp
new file mode 100644
index 000000000..616e3acf7
--- /dev/null
+++ b/src/systemc/tests/systemc/kernel/process_control/test06/test06.cpp
@@ -0,0 +1,130 @@
+//----------------------------------------------------------------------
+// Copyright 2009 Cadence Design Systems, Inc.
+// All Rights Reserved Worldwide
+// Copyright 2009 Forte Design Systems, Inc.
+// Copyright 2010 OFFIS Institute for Information technology
+//
+// test06: test hierarchical kills
+//----------------------------------------------------------------------
+
+#define SC_INCLUDE_DYNAMIC_PROCESSES
+#include <systemc.h>
+
+SC_MODULE(top) {
+public:
+ SC_CTOR(top) {
+ SC_THREAD(parent);
+ sensitive << clk.pos();
+ dont_initialize();
+ }
+
+ void proc_tree( unsigned depth, unsigned width, bool as_method, bool spawn_only )
+ {
+ unsigned w = width;
+ if (sc_time_stamp() == SC_ZERO_TIME || spawn_only )
+ while( depth && w --> 0 )
+ {
+ sc_spawn_options sp;
+ sp.set_sensitivity( &clk.pos() );
+
+ if(as_method) // we are spawned as method, spawn a thread
+ {
+ sc_spawn( sc_bind( &top::proc_tree, this, depth-1, width, !as_method, false )
+ , sc_gen_unique_name("thread"), &sp );
+ }
+ else // we are spawned as thread, spawn a method
+ {
+ sp.spawn_method();
+ sc_spawn( sc_bind( &top::proc_tree, this, depth-1, width, !as_method, false )
+ , sc_gen_unique_name("method"), &sp );
+ }
+ }
+
+ if(spawn_only) return;
+
+ std::cout << sc_get_current_process_handle().name()
+ << " triggered "
+ << "(" << sc_time_stamp() << " @ " << sc_delta_count() << ")"
+ << std::endl;
+
+ // start thread
+ if( !as_method ) thread_loop();
+ }
+
+ void thread_loop()
+ {
+ struct local_ {
+ ~local_(){
+ std::cout
+ << sc_get_current_process_handle().name()
+ << " local deleted "
+ << "(" << sc_time_stamp() << " @ " << sc_delta_count() << ")"
+ << std::endl;
+ }
+ } l; l=l;
+
+ unsigned rounds = 5;
+ while( rounds --> 0 )
+ {
+ wait();
+ std::cout << sc_get_current_process_handle().name()
+ << " triggered "
+ << "(" << sc_time_stamp() << " @ " << sc_delta_count() << ")"
+ << std::endl;
+ }
+ std::cout << sc_get_current_process_handle().name()
+ << " ended "
+ << "(" << sc_time_stamp() << " @ " << sc_delta_count() << ")"
+ << std::endl;
+ }
+
+ void parent()
+ {
+ proc_tree( 3, 1, true , true );
+ proc_tree( 3, 1, false, true );
+
+ wait();
+
+ // copy children (needed, since children may get reordered)
+ std::vector< sc_object* > children =
+ sc_get_current_process_handle().get_child_objects();
+
+ std::vector< sc_object* >::const_iterator it = children.begin();
+
+ while( it != children.end() )
+ {
+ sc_process_handle h( *it++ );
+ sc_assert( h.valid() );
+
+ std::cout << h.name() << " "
+ << "kill requested "
+ << "(" << h.get_process_object()->kind() << ") "
+ << "(" << sc_time_stamp() << " @ " << sc_delta_count() << ")"
+ << std::endl;
+
+ h.kill( SC_INCLUDE_DESCENDANTS );
+ }
+
+ wait();
+
+ std::cout << sc_get_current_process_handle().name()
+ << " ended "
+ << "(" << sc_time_stamp() << " @ " << sc_delta_count() << ")"
+ << std::endl;
+
+ wait();
+ sc_stop();
+ while(true) wait();
+ }
+
+ sc_in<bool> clk;
+};
+
+int sc_main (int argc, char *argv[])
+{
+ sc_clock clk("clk", 10, SC_NS, 0.5);
+ top t("top");
+ t.clk(clk);
+ sc_start();
+ return 0;
+}