summaryrefslogtreecommitdiff
path: root/src/systemc/tests/systemc/kernel/phase_callbacks/test03/test03.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/systemc/tests/systemc/kernel/phase_callbacks/test03/test03.cpp')
-rw-r--r--src/systemc/tests/systemc/kernel/phase_callbacks/test03/test03.cpp148
1 files changed, 148 insertions, 0 deletions
diff --git a/src/systemc/tests/systemc/kernel/phase_callbacks/test03/test03.cpp b/src/systemc/tests/systemc/kernel/phase_callbacks/test03/test03.cpp
new file mode 100644
index 000000000..d34109cb7
--- /dev/null
+++ b/src/systemc/tests/systemc/kernel/phase_callbacks/test03/test03.cpp
@@ -0,0 +1,148 @@
+/*****************************************************************************
+
+ 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.
+
+ *****************************************************************************/
+
+// test03.cpp -- test for delayed before end of elaboration.
+//
+// Original Author: Philipp A. Hartmann, OFFIS Institute for Information
+// Technology
+//
+// MODIFICATION LOG - modifiers, enter your name, affiliation, date and
+//
+// $Log: test03.cpp,v $
+// Revision 1.2 2011/07/24 13:05:30 acg
+// Alan Fitch: added return 0 to sc_main that was missing.
+//
+// Revision 1.1 2011/05/08 17:55:36 acg
+// Philipp A. Hartmann: first check in of test.
+//
+
+#include <systemc>
+
+using namespace sc_core;
+
+#define PRINT_CALL( CallBack, Condition ) \
+ std::cout << this->name() \
+ << "->" #CallBack "()" \
+ << ( ( Condition ) ? " " : " NOT " ) \
+ << "called" \
+ << std::endl
+
+SC_MODULE(in_port_module)
+{
+ SC_CTOR(in_port_module) : beoe_called(false) {}
+
+ void before_end_of_elaboration()
+ { beoe_called = true; }
+
+ void end_of_elaboration()
+ { PRINT_CALL(before_end_of_elaboration,beoe_called); }
+
+ bool beoe_called;
+};
+
+struct my_port : sc_in<bool>
+{
+ typedef sc_in<bool> base_type;
+
+ explicit my_port( const char* nm )
+ : base_type(nm)
+ , direct_mod( (std::string(nm)+"_direct_mod").c_str() )
+ , beoe_called(false) {}
+
+ void before_end_of_elaboration()
+ {
+ beoe_called = true;
+ std::string nm = std::string(basename()) + "_delayed_mod";
+ delayed_mod = new in_port_module( nm.c_str() );
+ }
+
+ void end_of_elaboration()
+ { PRINT_CALL(before_end_of_elaboration,beoe_called); }
+
+ in_port_module direct_mod;
+ in_port_module* delayed_mod;
+ bool beoe_called;
+};
+
+SC_MODULE(sub_module)
+{
+ my_port direct_port;
+ my_port* delayed_port;
+
+ SC_CTOR(sub_module)
+ : direct_port("direct_port")
+ , delayed_port(0)
+ , beoe_called(false)
+ {}
+
+ void before_end_of_elaboration()
+ {
+ delayed_port = new my_port( "delayed_port" );
+ (*delayed_port)( direct_port );
+ beoe_called = true;
+ }
+
+ void end_of_elaboration()
+ { PRINT_CALL(before_end_of_elaboration,beoe_called); }
+
+ bool beoe_called;
+};
+
+SC_MODULE(module)
+{
+ sub_module direct_mod;
+ my_port direct_port;
+ sub_module* delayed_mod;
+ my_port* delayed_port;
+
+ SC_CTOR(module)
+ : direct_mod("direct_mod")
+ , direct_port("direct_port")
+ , delayed_mod(0)
+ , delayed_port(0)
+ , beoe_called(false)
+ {
+ direct_mod.direct_port( direct_port );
+ }
+
+ void before_end_of_elaboration()
+ {
+ delayed_port = new my_port( "delayed_port" );
+ (*delayed_port)( direct_port );
+
+ delayed_mod = new sub_module( "delayed_mod" );
+ delayed_mod->direct_port( *delayed_port );
+ beoe_called = true;
+ }
+
+ void end_of_elaboration()
+ { PRINT_CALL(before_end_of_elaboration,beoe_called); }
+
+ bool beoe_called;
+};
+
+int sc_main( int, char*[] )
+{
+ module mod("top");
+ sc_signal<bool> sig("sig");
+ mod.direct_port( sig );
+
+ sc_start();
+ return 0;
+}