diff options
Diffstat (limited to 'src/systemc/tests/systemc/kernel/dynamic_processes/sc_spawn_options/test01/test01.cpp')
-rw-r--r-- | src/systemc/tests/systemc/kernel/dynamic_processes/sc_spawn_options/test01/test01.cpp | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/src/systemc/tests/systemc/kernel/dynamic_processes/sc_spawn_options/test01/test01.cpp b/src/systemc/tests/systemc/kernel/dynamic_processes/sc_spawn_options/test01/test01.cpp new file mode 100644 index 000000000..67d18e210 --- /dev/null +++ b/src/systemc/tests/systemc/kernel/dynamic_processes/sc_spawn_options/test01/test01.cpp @@ -0,0 +1,139 @@ +/***************************************************************************** + + 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. + + *****************************************************************************/ + +/***************************************************************************** + + test01.cpp -- Demo "new" dynamic method support. + + + See the README file for a description of these capabilities. This demo + excercises all of the major capabilities. + + 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: Andy Goodrich, Forte Design Systems, 30 July 03 + Description of Modification: Converted thread demo to method demo. + + *****************************************************************************/ + + +#define SC_INCLUDE_DYNAMIC_PROCESSES +#include <systemc.h> + + +int test_function(double d) +{ + cout << endl << "Test_function sees " << d << endl; + return int(d); +} + +void void_function(double d) +{ + cout << endl << "void_function sees " << d << endl; +} + +int ref_function(const double& d) +{ + cout << endl << "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() + { + sc_event e1, e2, e3, e4; + sc_spawn_options options1, options2, options3, options4; + int r; + + cout << endl; + + e1.notify(100, SC_NS); + + // Spawn several methods that co-operatively execute in round robin order + + options1.spawn_method(); + options1.dont_initialize(); + options1.set_sensitivity(&e1); + sc_spawn(&r, + sc_bind(&top::round_robin, this, "1", sc_ref(e1), sc_ref(e2), 3), + "1", &options1 + ); + + options2.spawn_method(); + options2.dont_initialize(); + options2.set_sensitivity(&e2); + sc_spawn(&r, + sc_bind(&top::round_robin, this, "2", sc_ref(e2), sc_ref(e3), 3), + "2", &options2 + ); + + options3.spawn_method(); + options3.dont_initialize(); + options3.set_sensitivity(&e3); + sc_spawn(&r, + sc_bind(&top::round_robin, this, "3", sc_ref(e3), sc_ref(e4), 3), + "3", &options3 + ); + + options4.spawn_method(); + options4.dont_initialize(); + options4.set_sensitivity(&e4); + sc_spawn(&r, + sc_bind(&top::round_robin, this, "4", sc_ref(e4), sc_ref(e1), 3), + "4", &options4 + ); + wait(295, SC_NS); + cout << endl << "Done." << endl; + sc_stop(); + } + + int round_robin(const char *str, sc_event& receive, sc_event& send, int cnt) + { + cout << "Round robin method " << str << + " at time " << sc_time_stamp() << endl; + next_trigger(receive); + send.notify(10, SC_NS); + return 0; + } +}; + +int sc_main (int argc , char *argv[]) +{ + top top1("Top1"); + sc_start(); + + return 0; +} |