diff options
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.cpp | 148 |
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; +} |