diff options
Diffstat (limited to 'src/systemc/tests/systemc/kernel/dynamic_processes/test01')
-rw-r--r-- | src/systemc/tests/systemc/kernel/dynamic_processes/test01/golden/test01.log | 47 | ||||
-rw-r--r-- | src/systemc/tests/systemc/kernel/dynamic_processes/test01/test01.cpp | 169 |
2 files changed, 216 insertions, 0 deletions
diff --git a/src/systemc/tests/systemc/kernel/dynamic_processes/test01/golden/test01.log b/src/systemc/tests/systemc/kernel/dynamic_processes/test01/golden/test01.log new file mode 100644 index 000000000..c585cabd3 --- /dev/null +++ b/src/systemc/tests/systemc/kernel/dynamic_processes/test01/golden/test01.log @@ -0,0 +1,47 @@ +SystemC Simulation + +100 ns: Top1.main.t1: Round robin thread 1 +110 ns: Top1.main.t2: Round robin thread 2 +120 ns: Top1.main.t3: Round robin thread 3 +130 ns: Top1.main.t4: Round robin thread 4 +140 ns: Top1.main.t1: Round robin thread 1 +150 ns: Top1.main.t2: Round robin thread 2 +160 ns: Top1.main.t3: Round robin thread 3 +170 ns: Top1.main.t4: Round robin thread 4 +180 ns: Top1.main.t1: Round robin thread 1 +190 ns: Top1.main.t2: Round robin thread 2 +200 ns: Top1.main.t3: Round robin thread 3 +210 ns: Top1.main.t4: Round robin thread 4 +Returned int is 0 + + +221 ns: Top1.main.thread_p_0: Thread 0 ending. +222 ns: Top1.main.thread_p_1: Thread 1 ending. +223 ns: Top1.main.thread_p_2: Thread 2 ending. +224 ns: Top1.main.thread_p_3: Thread 3 ending. +225 ns: Top1.main.thread_p_4: Thread 4 ending. +226 ns: Top1.main.thread_p_5: Thread 5 ending. +227 ns: Top1.main.thread_p_6: Thread 6 ending. +228 ns: Top1.main.thread_p_7: Thread 7 ending. +229 ns: Top1.main.thread_p_8: Thread 8 ending. +230 ns: Top1.main.thread_p_9: Thread 9 ending. +241 ns: Top1.main.thread_p_10: Thread 0 ending. +242 ns: Top1.main.thread_p_11: Thread 1 ending. +243 ns: Top1.main.thread_p_12: Thread 2 ending. +244 ns: Top1.main.thread_p_13: Thread 3 ending. +245 ns: Top1.main.thread_p_14: Thread 4 ending. +246 ns: Top1.main.thread_p_15: Thread 5 ending. +247 ns: Top1.main.thread_p_16: Thread 6 ending. +248 ns: Top1.main.thread_p_17: Thread 7 ending. +249 ns: Top1.main.thread_p_18: Thread 8 ending. +250 ns: Top1.main.thread_p_19: Thread 9 ending. + +260 ns: Top1.main.thread_p_20: Test_function sees 3.14159 +Returned int is 3 + +260 ns: Top1.main.void_function: void_function sees 1.2345 + +260 ns: Top1.main.thread_p_21: ref_function sees 9.8765 +Returned int is 9 + +Done. diff --git a/src/systemc/tests/systemc/kernel/dynamic_processes/test01/test01.cpp b/src/systemc/tests/systemc/kernel/dynamic_processes/test01/test01.cpp new file mode 100644 index 000000000..098057691 --- /dev/null +++ b/src/systemc/tests/systemc/kernel/dynamic_processes/test01/test01.cpp @@ -0,0 +1,169 @@ +/***************************************************************************** + + Licensed to Accellera Systems Initiative Inc. (Accellera) under one or + more contributor license agreements. See the NOTICE file distributed + with this work for additional information regarding copyright ownership. + Accellera licenses this file to you under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with the + License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied. See the License for the specific language governing + permissions and limitations under the License. + + *****************************************************************************/ + +/***************************************************************************** + + Original Author: Stuart Swan, Cadence Design Systems, Inc., 2002-10-22 + + *****************************************************************************/ + +/***************************************************************************** + + MODIFICATION LOG - modifiers, enter your name, affiliation, date and + changes you are making here. + + Name, Affiliation, Date: + Description of Modification: + + *****************************************************************************/ +// $Log: test01.cpp,v $ +// Revision 1.3 2011/02/08 06:49:37 acg +// Andy Goodrich: removed carriage returns. +// +// Revision 1.2 2011/02/01 17:17:37 acg +// Andy Goodrich: update of copyright notice, added visible CVS logging. +// + +#define SC_INCLUDE_DYNAMIC_PROCESSES +#include <systemc.h> + + +int test_function(double d) +{ + cout << endl << sc_time_stamp() << ": " << sc_get_current_process_handle().name() + << ": Test_function sees " << d << endl; + return int(d); +} + +void void_function(double d) +{ + cout << endl << sc_time_stamp() << ": " << sc_get_current_process_handle().name() + << ": void_function sees " << d << endl; +} + +int ref_function(const double& d) +{ + cout << endl << sc_time_stamp() << ": " << sc_get_current_process_handle().name() + << ": ref_function sees " << d << endl; + return int(d); +} + + +class top : public sc_module +{ +public: + SC_HAS_PROCESS(top); + + top(sc_module_name name) : sc_module(name) + { + SC_THREAD(main); + } + + void main() + { + int r; + sc_event e1, e2, e3, e4; + + cout << endl; + + e1.notify(100, SC_NS); + + // Spawn several threads that co-operatively execute in round robin order + + SC_FORK + sc_spawn(&r, + sc_bind(&top::round_robin, this, "1", sc_ref(e1), sc_ref(e2), 3), "t1") , + sc_spawn(&r, + sc_bind(&top::round_robin, this, "2", sc_ref(e2), sc_ref(e3), 3), "t2") , + sc_spawn(&r, + sc_bind(&top::round_robin, this, "3", sc_ref(e3), sc_ref(e4), 3), "t3") , + sc_spawn(&r, + sc_bind(&top::round_robin, this, "4", sc_ref(e4), sc_ref(e1), 3), "t4") , + SC_JOIN + + cout << "Returned int is " << r << endl; + cout << endl << endl; + + // Test that threads in thread pool are successfully reused ... + + for (int i = 0 ; i < 10; i++) + sc_spawn(&r, sc_bind(&top::wait_and_end, this, i)); + + wait(20, SC_NS); + + // Test thread reuse + + for (int i = 0 ; i < 10; i++) + sc_spawn(&r, sc_bind(&top::wait_and_end, this, i)); + + wait(20, SC_NS); + + // Demo of a function rather than method call, & use return value ... + + wait( sc_spawn(&r, sc_bind(&test_function, 3.14159)).terminated_event() ); + + cout << "Returned int is " << r << endl; + + // demo sc_spawn_options usage + + sc_spawn_options ops; + ops.set_stack_size(0); + sc_process_handle handle1 = sc_spawn( + sc_bind(&void_function, 1.2345), "void_function", &ops + ); + wait(handle1.terminated_event()); + + double d = 9.8765; + wait( sc_spawn(&r, sc_bind(&ref_function, sc_cref(d))).terminated_event() ); + + cout << "Returned int is " << r << endl; + + cout << endl << "Done." << endl; + } + + int round_robin(const char *str, sc_event& receive, sc_event& send, int cnt) + { + while (--cnt >= 0) + { + wait(receive); + cout << sc_time_stamp() << ": " << sc_get_current_process_handle().name() + << ": Round robin thread " << str << endl; + wait(10, SC_NS); + send.notify(); + } + + return 0; + } + + int wait_and_end(int i) + { + wait( i + 1, SC_NS); + cout << sc_time_stamp() << ": " << sc_get_current_process_handle().name() + << ": Thread " << i << " ending." << endl; + return 0; + } +}; + +int sc_main (int argc , char *argv[]) +{ + top top1("Top1"); + sc_start(); + + return 0; +} |