112027Sjungma@eit.uni-kl.de/***************************************************************************** 212027Sjungma@eit.uni-kl.de 312027Sjungma@eit.uni-kl.de Licensed to Accellera Systems Initiative Inc. (Accellera) under one or 412027Sjungma@eit.uni-kl.de more contributor license agreements. See the NOTICE file distributed 512027Sjungma@eit.uni-kl.de with this work for additional information regarding copyright ownership. 612027Sjungma@eit.uni-kl.de Accellera licenses this file to you under the Apache License, Version 2.0 712027Sjungma@eit.uni-kl.de (the "License"); you may not use this file except in compliance with the 812027Sjungma@eit.uni-kl.de License. You may obtain a copy of the License at 912027Sjungma@eit.uni-kl.de 1012027Sjungma@eit.uni-kl.de http://www.apache.org/licenses/LICENSE-2.0 1112027Sjungma@eit.uni-kl.de 1212027Sjungma@eit.uni-kl.de Unless required by applicable law or agreed to in writing, software 1312027Sjungma@eit.uni-kl.de distributed under the License is distributed on an "AS IS" BASIS, 1412027Sjungma@eit.uni-kl.de WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 1512027Sjungma@eit.uni-kl.de implied. See the License for the specific language governing 1612027Sjungma@eit.uni-kl.de permissions and limitations under the License. 1712027Sjungma@eit.uni-kl.de 1812027Sjungma@eit.uni-kl.de *****************************************************************************/ 1912027Sjungma@eit.uni-kl.de 2012027Sjungma@eit.uni-kl.de/***************************************************************************** 2112027Sjungma@eit.uni-kl.de 2212027Sjungma@eit.uni-kl.de sc_port.cpp -- Base classes of all port classes. 2312027Sjungma@eit.uni-kl.de 2412027Sjungma@eit.uni-kl.de Original Author: Martin Janssen, Synopsys, Inc., 2001-05-21 2512027Sjungma@eit.uni-kl.de 2612027Sjungma@eit.uni-kl.de CHANGE LOG AT THE END OF THE FILE 2712027Sjungma@eit.uni-kl.de *****************************************************************************/ 2812027Sjungma@eit.uni-kl.de 2912027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_simcontext.h" 3012027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_module.h" 3112027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_object_int.h" 3212027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_method_process.h" 3312027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_thread_process.h" 3412027Sjungma@eit.uni-kl.de#include "sysc/communication/sc_communication_ids.h" 3512027Sjungma@eit.uni-kl.de#include "sysc/utils/sc_utils_ids.h" 3612027Sjungma@eit.uni-kl.de#include "sysc/communication/sc_event_finder.h" 3712027Sjungma@eit.uni-kl.de#include "sysc/communication/sc_port.h" 3812027Sjungma@eit.uni-kl.de#include "sysc/communication/sc_signal_ifs.h" 3912027Sjungma@eit.uni-kl.de 4012027Sjungma@eit.uni-kl.denamespace sc_core { 4112027Sjungma@eit.uni-kl.de 4212027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 4312027Sjungma@eit.uni-kl.de// STRUCT : sc_bind_elem 4412027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 4512027Sjungma@eit.uni-kl.de 4612027Sjungma@eit.uni-kl.destruct sc_bind_elem 4712027Sjungma@eit.uni-kl.de{ 4812027Sjungma@eit.uni-kl.de // constructors 4912027Sjungma@eit.uni-kl.de sc_bind_elem(); 5012027Sjungma@eit.uni-kl.de explicit sc_bind_elem( sc_interface* interface_ ); 5112027Sjungma@eit.uni-kl.de explicit sc_bind_elem( sc_port_base* parent_ ); 5212027Sjungma@eit.uni-kl.de 5312027Sjungma@eit.uni-kl.de sc_interface* iface; 5412027Sjungma@eit.uni-kl.de sc_port_base* parent; 5512027Sjungma@eit.uni-kl.de}; 5612027Sjungma@eit.uni-kl.de 5712027Sjungma@eit.uni-kl.de 5812027Sjungma@eit.uni-kl.de// IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 5912027Sjungma@eit.uni-kl.de 6012027Sjungma@eit.uni-kl.de// constructors 6112027Sjungma@eit.uni-kl.de 6212027Sjungma@eit.uni-kl.desc_bind_elem::sc_bind_elem() 6312027Sjungma@eit.uni-kl.de: iface( 0 ), 6412027Sjungma@eit.uni-kl.de parent( 0 ) 6512027Sjungma@eit.uni-kl.de{} 6612027Sjungma@eit.uni-kl.de 6712027Sjungma@eit.uni-kl.desc_bind_elem::sc_bind_elem( sc_interface* interface_ ) 6812027Sjungma@eit.uni-kl.de: iface( interface_ ), 6912027Sjungma@eit.uni-kl.de parent( 0 ) 7012027Sjungma@eit.uni-kl.de{} 7112027Sjungma@eit.uni-kl.de 7212027Sjungma@eit.uni-kl.desc_bind_elem::sc_bind_elem( sc_port_base* parent_ ) 7312027Sjungma@eit.uni-kl.de: iface( 0 ), 7412027Sjungma@eit.uni-kl.de parent( parent_ ) 7512027Sjungma@eit.uni-kl.de{} 7612027Sjungma@eit.uni-kl.de 7712027Sjungma@eit.uni-kl.de 7812027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 7912027Sjungma@eit.uni-kl.de// STRUCT : sc_bind_ef 8012027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 8112027Sjungma@eit.uni-kl.de 8212027Sjungma@eit.uni-kl.destruct sc_bind_ef 8312027Sjungma@eit.uni-kl.de{ 8412027Sjungma@eit.uni-kl.de // constructor 8512027Sjungma@eit.uni-kl.de sc_bind_ef( sc_process_b* , sc_event_finder* ); 8612027Sjungma@eit.uni-kl.de 8712027Sjungma@eit.uni-kl.de // destructor 8812027Sjungma@eit.uni-kl.de ~sc_bind_ef(); 8912027Sjungma@eit.uni-kl.de 9012027Sjungma@eit.uni-kl.de sc_process_b* handle; 9112027Sjungma@eit.uni-kl.de sc_event_finder* event_finder; 9212027Sjungma@eit.uni-kl.de}; 9312027Sjungma@eit.uni-kl.de 9412027Sjungma@eit.uni-kl.de 9512027Sjungma@eit.uni-kl.de// IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 9612027Sjungma@eit.uni-kl.de 9712027Sjungma@eit.uni-kl.de// constructor 9812027Sjungma@eit.uni-kl.de 9912027Sjungma@eit.uni-kl.desc_bind_ef::sc_bind_ef( sc_process_b* handle_, 10012027Sjungma@eit.uni-kl.de sc_event_finder* event_finder_ ) 10112027Sjungma@eit.uni-kl.de: handle( handle_ ), 10212027Sjungma@eit.uni-kl.de event_finder( event_finder_ ) 10312027Sjungma@eit.uni-kl.de{} 10412027Sjungma@eit.uni-kl.de 10512027Sjungma@eit.uni-kl.de 10612027Sjungma@eit.uni-kl.de// destructor 10712027Sjungma@eit.uni-kl.de 10812027Sjungma@eit.uni-kl.desc_bind_ef::~sc_bind_ef() 10912027Sjungma@eit.uni-kl.de{ 11012027Sjungma@eit.uni-kl.de} 11112027Sjungma@eit.uni-kl.de 11212027Sjungma@eit.uni-kl.de 11312027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 11412027Sjungma@eit.uni-kl.de// STRUCT : sc_bind_info 11512027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 11612027Sjungma@eit.uni-kl.de 11712027Sjungma@eit.uni-kl.destruct sc_bind_info 11812027Sjungma@eit.uni-kl.de{ 11912027Sjungma@eit.uni-kl.de // constructor 12012027Sjungma@eit.uni-kl.de explicit sc_bind_info( int max_size_, 12112027Sjungma@eit.uni-kl.de sc_port_policy policy_=SC_ONE_OR_MORE_BOUND ); 12212027Sjungma@eit.uni-kl.de 12312027Sjungma@eit.uni-kl.de // destructor 12412027Sjungma@eit.uni-kl.de ~sc_bind_info(); 12512027Sjungma@eit.uni-kl.de 12612027Sjungma@eit.uni-kl.de int max_size() const; 12712027Sjungma@eit.uni-kl.de sc_port_policy policy() const; 12812027Sjungma@eit.uni-kl.de int size() const; 12912027Sjungma@eit.uni-kl.de 13012027Sjungma@eit.uni-kl.de int m_max_size; 13112027Sjungma@eit.uni-kl.de sc_port_policy m_policy; 13212027Sjungma@eit.uni-kl.de std::vector<sc_bind_elem*> vec; 13312027Sjungma@eit.uni-kl.de bool has_parent; 13412027Sjungma@eit.uni-kl.de int last_add; 13512027Sjungma@eit.uni-kl.de bool is_leaf; 13612027Sjungma@eit.uni-kl.de bool complete; 13712027Sjungma@eit.uni-kl.de 13812027Sjungma@eit.uni-kl.de std::vector<sc_bind_ef*> thread_vec; 13912027Sjungma@eit.uni-kl.de std::vector<sc_bind_ef*> method_vec; 14012027Sjungma@eit.uni-kl.de}; 14112027Sjungma@eit.uni-kl.de 14212027Sjungma@eit.uni-kl.de 14312027Sjungma@eit.uni-kl.de// IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 14412027Sjungma@eit.uni-kl.de 14512027Sjungma@eit.uni-kl.de// constructor 14612027Sjungma@eit.uni-kl.de 14712027Sjungma@eit.uni-kl.desc_bind_info::sc_bind_info( int max_size_, sc_port_policy policy_ ) 14812027Sjungma@eit.uni-kl.de: m_max_size( max_size_ ), 14912027Sjungma@eit.uni-kl.de m_policy( policy_ ), 15012027Sjungma@eit.uni-kl.de vec(), 15112027Sjungma@eit.uni-kl.de has_parent( false ), 15212027Sjungma@eit.uni-kl.de last_add( -1 ), 15312027Sjungma@eit.uni-kl.de is_leaf( true ), 15412027Sjungma@eit.uni-kl.de complete( false ), 15512027Sjungma@eit.uni-kl.de thread_vec(), 15612027Sjungma@eit.uni-kl.de method_vec() 15712027Sjungma@eit.uni-kl.de{} 15812027Sjungma@eit.uni-kl.de 15912027Sjungma@eit.uni-kl.de 16012027Sjungma@eit.uni-kl.de// destructor 16112027Sjungma@eit.uni-kl.de 16212027Sjungma@eit.uni-kl.desc_bind_info::~sc_bind_info() 16312027Sjungma@eit.uni-kl.de{ 16412027Sjungma@eit.uni-kl.de for( int i = size() - 1; i >= 0; -- i ) { 16512027Sjungma@eit.uni-kl.de delete vec[i]; 16612027Sjungma@eit.uni-kl.de } 16712027Sjungma@eit.uni-kl.de} 16812027Sjungma@eit.uni-kl.de 16912027Sjungma@eit.uni-kl.de 17012027Sjungma@eit.uni-kl.deint 17112027Sjungma@eit.uni-kl.desc_bind_info::max_size() const 17212027Sjungma@eit.uni-kl.de{ 17312027Sjungma@eit.uni-kl.de return m_max_size ? m_max_size : (int) vec.size(); 17412027Sjungma@eit.uni-kl.de} 17512027Sjungma@eit.uni-kl.de 17612027Sjungma@eit.uni-kl.desc_port_policy 17712027Sjungma@eit.uni-kl.desc_bind_info::policy() const 17812027Sjungma@eit.uni-kl.de{ 17912027Sjungma@eit.uni-kl.de return m_policy; 18012027Sjungma@eit.uni-kl.de} 18112027Sjungma@eit.uni-kl.de 18212027Sjungma@eit.uni-kl.deint 18312027Sjungma@eit.uni-kl.desc_bind_info::size() const 18412027Sjungma@eit.uni-kl.de{ 18512027Sjungma@eit.uni-kl.de return vec.size(); 18612027Sjungma@eit.uni-kl.de} 18712027Sjungma@eit.uni-kl.de 18812027Sjungma@eit.uni-kl.de 18912027Sjungma@eit.uni-kl.de 19012027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 19112027Sjungma@eit.uni-kl.de// CLASS : sc_port_base 19212027Sjungma@eit.uni-kl.de// 19312027Sjungma@eit.uni-kl.de// Abstract base class for class sc_port_b. 19412027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 19512027Sjungma@eit.uni-kl.de 19612027Sjungma@eit.uni-kl.de// This method exists to get around a problem in VCC 6.0 where you cannot 19712027Sjungma@eit.uni-kl.de// have a friend class that is templated. So sc_port_b<IF> calls this class 19812027Sjungma@eit.uni-kl.de// instead of sc_process_b::add_static_event. 19912027Sjungma@eit.uni-kl.de 20012027Sjungma@eit.uni-kl.devoid sc_port_base::add_static_event( 20112027Sjungma@eit.uni-kl.de sc_method_handle process_p, const sc_event& event ) const 20212027Sjungma@eit.uni-kl.de{ 20312027Sjungma@eit.uni-kl.de process_p->add_static_event( event ); 20412027Sjungma@eit.uni-kl.de} 20512027Sjungma@eit.uni-kl.de 20612027Sjungma@eit.uni-kl.devoid sc_port_base::add_static_event( 20712027Sjungma@eit.uni-kl.de sc_thread_handle process_p, const sc_event& event ) const 20812027Sjungma@eit.uni-kl.de{ 20912027Sjungma@eit.uni-kl.de process_p->add_static_event( event ); 21012027Sjungma@eit.uni-kl.de} 21112027Sjungma@eit.uni-kl.de 21212027Sjungma@eit.uni-kl.de// return number of interfaces that will be bound, or are bound: 21312027Sjungma@eit.uni-kl.de 21412027Sjungma@eit.uni-kl.deint sc_port_base::bind_count() 21512027Sjungma@eit.uni-kl.de{ 21612027Sjungma@eit.uni-kl.de if ( m_bind_info ) 21712027Sjungma@eit.uni-kl.de return m_bind_info->size(); 21812027Sjungma@eit.uni-kl.de else 21912027Sjungma@eit.uni-kl.de return interface_count(); 22012027Sjungma@eit.uni-kl.de} 22112027Sjungma@eit.uni-kl.de 22212027Sjungma@eit.uni-kl.de// error reporting 22312027Sjungma@eit.uni-kl.de 22412027Sjungma@eit.uni-kl.devoid 22512027Sjungma@eit.uni-kl.desc_port_base::report_error( const char* id, const char* add_msg ) const 22612027Sjungma@eit.uni-kl.de{ 22712027Sjungma@eit.uni-kl.de char msg[BUFSIZ]; 22812027Sjungma@eit.uni-kl.de if( add_msg != 0 ) { 22912027Sjungma@eit.uni-kl.de std::sprintf( msg, "%s: port '%s' (%s)", add_msg, name(), kind() ); 23012027Sjungma@eit.uni-kl.de } else { 23112027Sjungma@eit.uni-kl.de std::sprintf( msg, "port '%s' (%s)", name(), kind() ); 23212027Sjungma@eit.uni-kl.de } 23312027Sjungma@eit.uni-kl.de SC_REPORT_ERROR( id, msg ); 23412027Sjungma@eit.uni-kl.de} 23512027Sjungma@eit.uni-kl.de 23612027Sjungma@eit.uni-kl.de 23712027Sjungma@eit.uni-kl.de// constructors 23812027Sjungma@eit.uni-kl.de 23912027Sjungma@eit.uni-kl.desc_port_base::sc_port_base( 24012027Sjungma@eit.uni-kl.de int max_size_, sc_port_policy policy 24112027Sjungma@eit.uni-kl.de) : 24212027Sjungma@eit.uni-kl.de sc_object( sc_gen_unique_name( "port" ) ), 24312027Sjungma@eit.uni-kl.de m_bind_info(NULL) 24412027Sjungma@eit.uni-kl.de{ 24512027Sjungma@eit.uni-kl.de simcontext()->get_port_registry()->insert( this ); 24612027Sjungma@eit.uni-kl.de m_bind_info = new sc_bind_info( max_size_, policy ); 24712027Sjungma@eit.uni-kl.de} 24812027Sjungma@eit.uni-kl.de 24912027Sjungma@eit.uni-kl.desc_port_base::sc_port_base( 25012027Sjungma@eit.uni-kl.de const char* name_, int max_size_, sc_port_policy policy 25112027Sjungma@eit.uni-kl.de) : 25212027Sjungma@eit.uni-kl.de sc_object( name_ ), 25312027Sjungma@eit.uni-kl.de m_bind_info(NULL) 25412027Sjungma@eit.uni-kl.de{ 25512027Sjungma@eit.uni-kl.de simcontext()->get_port_registry()->insert( this ); 25612027Sjungma@eit.uni-kl.de m_bind_info = new sc_bind_info( max_size_, policy ); 25712027Sjungma@eit.uni-kl.de} 25812027Sjungma@eit.uni-kl.de 25912027Sjungma@eit.uni-kl.de 26012027Sjungma@eit.uni-kl.de// destructor 26112027Sjungma@eit.uni-kl.de 26212027Sjungma@eit.uni-kl.desc_port_base::~sc_port_base() 26312027Sjungma@eit.uni-kl.de{ 26412027Sjungma@eit.uni-kl.de simcontext()->get_port_registry()->remove( this ); 26512027Sjungma@eit.uni-kl.de delete m_bind_info; 26612027Sjungma@eit.uni-kl.de} 26712027Sjungma@eit.uni-kl.de 26812027Sjungma@eit.uni-kl.de 26912027Sjungma@eit.uni-kl.de// bind interface to this port 27012027Sjungma@eit.uni-kl.de 27112027Sjungma@eit.uni-kl.devoid 27212027Sjungma@eit.uni-kl.desc_port_base::bind( sc_interface& interface_ ) 27312027Sjungma@eit.uni-kl.de{ 27412027Sjungma@eit.uni-kl.de if( m_bind_info == 0 ) { 27512027Sjungma@eit.uni-kl.de // cannot bind an interface after elaboration 27612027Sjungma@eit.uni-kl.de report_error( SC_ID_BIND_IF_TO_PORT_, "simulation running" ); 27712027Sjungma@eit.uni-kl.de } 27812027Sjungma@eit.uni-kl.de 27912027Sjungma@eit.uni-kl.de m_bind_info->vec.push_back( new sc_bind_elem( &interface_ ) ); 28012027Sjungma@eit.uni-kl.de 28112027Sjungma@eit.uni-kl.de if( ! m_bind_info->has_parent ) { 28212027Sjungma@eit.uni-kl.de // add (cache) the interface 28312027Sjungma@eit.uni-kl.de add_interface( &interface_ ); 28412027Sjungma@eit.uni-kl.de m_bind_info->last_add ++; 28512027Sjungma@eit.uni-kl.de } 28612027Sjungma@eit.uni-kl.de} 28712027Sjungma@eit.uni-kl.de 28812027Sjungma@eit.uni-kl.de 28912027Sjungma@eit.uni-kl.de// bind parent port to this port 29012027Sjungma@eit.uni-kl.de 29112027Sjungma@eit.uni-kl.devoid 29212027Sjungma@eit.uni-kl.desc_port_base::bind( this_type& parent_ ) 29312027Sjungma@eit.uni-kl.de{ 29412027Sjungma@eit.uni-kl.de if( m_bind_info == 0 ) { 29512027Sjungma@eit.uni-kl.de // cannot bind a parent port after elaboration 29612027Sjungma@eit.uni-kl.de report_error( SC_ID_BIND_PORT_TO_PORT_, "simulation running" ); 29712027Sjungma@eit.uni-kl.de } 29812027Sjungma@eit.uni-kl.de 29912027Sjungma@eit.uni-kl.de if( &parent_ == this ) { 30012027Sjungma@eit.uni-kl.de report_error( SC_ID_BIND_PORT_TO_PORT_, "same port" ); 30112027Sjungma@eit.uni-kl.de } 30212027Sjungma@eit.uni-kl.de 30312027Sjungma@eit.uni-kl.de // check if parent port is already bound to this port 30412027Sjungma@eit.uni-kl.de#if 0 30512027Sjungma@eit.uni-kl.de for( int i = m_bind_info->size() - 1; i >= 0; -- i ) { 30612027Sjungma@eit.uni-kl.de if( &parent_ == m_bind_info->vec[i]->parent ) { 30712027Sjungma@eit.uni-kl.de report_error( SC_ID_BIND_PORT_TO_PORT_, "already bound" ); 30812027Sjungma@eit.uni-kl.de } 30912027Sjungma@eit.uni-kl.de } 31012027Sjungma@eit.uni-kl.de#endif // 31112027Sjungma@eit.uni-kl.de 31212027Sjungma@eit.uni-kl.de m_bind_info->vec.push_back( new sc_bind_elem( &parent_ ) ); 31312027Sjungma@eit.uni-kl.de m_bind_info->has_parent = true; 31412027Sjungma@eit.uni-kl.de parent_.m_bind_info->is_leaf = false; 31512027Sjungma@eit.uni-kl.de} 31612027Sjungma@eit.uni-kl.de 31712027Sjungma@eit.uni-kl.de// called by construction_done (null by default) 31812027Sjungma@eit.uni-kl.de 31912027Sjungma@eit.uni-kl.devoid sc_port_base::before_end_of_elaboration() 32012027Sjungma@eit.uni-kl.de{} 32112027Sjungma@eit.uni-kl.de 32212027Sjungma@eit.uni-kl.de// called by elaboration_done (does nothing) 32312027Sjungma@eit.uni-kl.de 32412027Sjungma@eit.uni-kl.devoid 32512027Sjungma@eit.uni-kl.desc_port_base::end_of_elaboration() 32612027Sjungma@eit.uni-kl.de{} 32712027Sjungma@eit.uni-kl.de 32812027Sjungma@eit.uni-kl.de// called by sc_port_registry::start_simulation (does nothing by default) 32912027Sjungma@eit.uni-kl.de 33012027Sjungma@eit.uni-kl.devoid sc_port_base::start_of_simulation() 33112027Sjungma@eit.uni-kl.de{} 33212027Sjungma@eit.uni-kl.de 33312027Sjungma@eit.uni-kl.de// called by sc_port_registry::simulation_done (does nothing by default) 33412027Sjungma@eit.uni-kl.de 33512027Sjungma@eit.uni-kl.devoid sc_port_base::end_of_simulation() 33612027Sjungma@eit.uni-kl.de{} 33712027Sjungma@eit.uni-kl.de 33812027Sjungma@eit.uni-kl.de 33912027Sjungma@eit.uni-kl.de// called by class sc_module for positional binding 34012027Sjungma@eit.uni-kl.de 34112027Sjungma@eit.uni-kl.deint 34212027Sjungma@eit.uni-kl.desc_port_base::pbind( sc_interface& interface_ ) 34312027Sjungma@eit.uni-kl.de{ 34412027Sjungma@eit.uni-kl.de if( m_bind_info == 0 ) { 34512027Sjungma@eit.uni-kl.de // cannot bind an interface after elaboration 34612027Sjungma@eit.uni-kl.de report_error( SC_ID_BIND_IF_TO_PORT_, "simulation running" ); 34712027Sjungma@eit.uni-kl.de } 34812027Sjungma@eit.uni-kl.de 34912027Sjungma@eit.uni-kl.de if( m_bind_info->size() != 0 ) { 35012027Sjungma@eit.uni-kl.de // first interface already bound 35112027Sjungma@eit.uni-kl.de return 1; 35212027Sjungma@eit.uni-kl.de } 35312027Sjungma@eit.uni-kl.de 35412027Sjungma@eit.uni-kl.de return vbind( interface_ ); 35512027Sjungma@eit.uni-kl.de} 35612027Sjungma@eit.uni-kl.de 35712027Sjungma@eit.uni-kl.deint 35812027Sjungma@eit.uni-kl.desc_port_base::pbind( sc_port_base& parent_ ) 35912027Sjungma@eit.uni-kl.de{ 36012027Sjungma@eit.uni-kl.de if( m_bind_info == 0 ) { 36112027Sjungma@eit.uni-kl.de // cannot bind a parent port after elaboration 36212027Sjungma@eit.uni-kl.de report_error( SC_ID_BIND_PORT_TO_PORT_, "simulation running" ); 36312027Sjungma@eit.uni-kl.de } 36412027Sjungma@eit.uni-kl.de 36512027Sjungma@eit.uni-kl.de if( m_bind_info->size() != 0 ) { 36612027Sjungma@eit.uni-kl.de // first interface already bound 36712027Sjungma@eit.uni-kl.de return 1; 36812027Sjungma@eit.uni-kl.de } 36912027Sjungma@eit.uni-kl.de 37012027Sjungma@eit.uni-kl.de return vbind( parent_ ); 37112027Sjungma@eit.uni-kl.de} 37212027Sjungma@eit.uni-kl.de 37312027Sjungma@eit.uni-kl.de 37412027Sjungma@eit.uni-kl.de// called by the sc_sensitive* classes 37512027Sjungma@eit.uni-kl.de 37612027Sjungma@eit.uni-kl.devoid 37712027Sjungma@eit.uni-kl.desc_port_base::make_sensitive( sc_thread_handle handle_, 37812027Sjungma@eit.uni-kl.de sc_event_finder* event_finder_ ) const 37912027Sjungma@eit.uni-kl.de{ 38012027Sjungma@eit.uni-kl.de assert( m_bind_info != 0 ); 38112027Sjungma@eit.uni-kl.de m_bind_info->thread_vec.push_back( 38212027Sjungma@eit.uni-kl.de new sc_bind_ef( (sc_process_b*)handle_, event_finder_ ) ); 38312027Sjungma@eit.uni-kl.de} 38412027Sjungma@eit.uni-kl.de 38512027Sjungma@eit.uni-kl.devoid 38612027Sjungma@eit.uni-kl.desc_port_base::make_sensitive( sc_method_handle handle_, 38712027Sjungma@eit.uni-kl.de sc_event_finder* event_finder_ ) const 38812027Sjungma@eit.uni-kl.de{ 38912027Sjungma@eit.uni-kl.de assert( m_bind_info != 0 ); 39012027Sjungma@eit.uni-kl.de m_bind_info->method_vec.push_back( 39112027Sjungma@eit.uni-kl.de new sc_bind_ef( (sc_process_b*)handle_, event_finder_ ) ); 39212027Sjungma@eit.uni-kl.de} 39312027Sjungma@eit.uni-kl.de 39412027Sjungma@eit.uni-kl.de 39512027Sjungma@eit.uni-kl.de// support methods 39612027Sjungma@eit.uni-kl.de 39712027Sjungma@eit.uni-kl.deint 39812027Sjungma@eit.uni-kl.desc_port_base::first_parent() 39912027Sjungma@eit.uni-kl.de{ 40012027Sjungma@eit.uni-kl.de for( int i = 0; i < m_bind_info->size(); ++ i ) { 40112027Sjungma@eit.uni-kl.de if( m_bind_info->vec[i]->parent != 0 ) { 40212027Sjungma@eit.uni-kl.de return i; 40312027Sjungma@eit.uni-kl.de } 40412027Sjungma@eit.uni-kl.de } 40512027Sjungma@eit.uni-kl.de return -1; 40612027Sjungma@eit.uni-kl.de} 40712027Sjungma@eit.uni-kl.de 40812027Sjungma@eit.uni-kl.devoid 40912027Sjungma@eit.uni-kl.desc_port_base::insert_parent( int i ) 41012027Sjungma@eit.uni-kl.de{ 41112027Sjungma@eit.uni-kl.de std::vector<sc_bind_elem*>& vec = m_bind_info->vec; 41212027Sjungma@eit.uni-kl.de 41312027Sjungma@eit.uni-kl.de this_type* parent = vec[i]->parent; 41412027Sjungma@eit.uni-kl.de 41512027Sjungma@eit.uni-kl.de 41612027Sjungma@eit.uni-kl.de // IF OUR PARENT HAS NO BINDING THEN IGNORE IT: 41712027Sjungma@eit.uni-kl.de // 41812027Sjungma@eit.uni-kl.de // Note that the zeroing of the parent pointer must occur before this 41912027Sjungma@eit.uni-kl.de // test 42012027Sjungma@eit.uni-kl.de 42112027Sjungma@eit.uni-kl.de vec[i]->parent = 0; 42212027Sjungma@eit.uni-kl.de if ( parent->m_bind_info->vec.size() == 0 ) return; 42312027Sjungma@eit.uni-kl.de 42412027Sjungma@eit.uni-kl.de vec[i]->iface = parent->m_bind_info->vec[0]->iface; 42512027Sjungma@eit.uni-kl.de int n = parent->m_bind_info->size() - 1; 42612027Sjungma@eit.uni-kl.de if( n > 0 ) { 42712027Sjungma@eit.uni-kl.de // resize the bind vector (by adding new elements) 42812027Sjungma@eit.uni-kl.de for( int k = 0; k < n; ++ k ) { 42912027Sjungma@eit.uni-kl.de vec.push_back( new sc_bind_elem() ); 43012027Sjungma@eit.uni-kl.de } 43112027Sjungma@eit.uni-kl.de // move elements in the bind vector 43212027Sjungma@eit.uni-kl.de for( int k = m_bind_info->size() - n - 1; k > i; -- k ) { 43312027Sjungma@eit.uni-kl.de vec[k + n]->iface = vec[k]->iface; 43412027Sjungma@eit.uni-kl.de vec[k + n]->parent = vec[k]->parent; 43512027Sjungma@eit.uni-kl.de } 43612027Sjungma@eit.uni-kl.de // insert parent interfaces into the bind vector 43712027Sjungma@eit.uni-kl.de for( int k = i + 1; k <= i + n; ++ k ) { 43812027Sjungma@eit.uni-kl.de vec[k]->iface = parent->m_bind_info->vec[k - i]->iface; 43912027Sjungma@eit.uni-kl.de vec[k]->parent = 0; 44012027Sjungma@eit.uni-kl.de } 44112027Sjungma@eit.uni-kl.de } 44212027Sjungma@eit.uni-kl.de} 44312027Sjungma@eit.uni-kl.de 44412027Sjungma@eit.uni-kl.de 44512027Sjungma@eit.uni-kl.de// called when elaboration is done 44612027Sjungma@eit.uni-kl.de 44712027Sjungma@eit.uni-kl.devoid 44812027Sjungma@eit.uni-kl.desc_port_base::complete_binding() 44912027Sjungma@eit.uni-kl.de{ 45012027Sjungma@eit.uni-kl.de char msg_buffer[128]; // For error message construction. 45112027Sjungma@eit.uni-kl.de 45212027Sjungma@eit.uni-kl.de // IF BINDING HAS ALREADY BEEN COMPLETED IGNORE THIS CALL: 45312027Sjungma@eit.uni-kl.de 45412027Sjungma@eit.uni-kl.de assert( m_bind_info != 0 ); 45512027Sjungma@eit.uni-kl.de if( m_bind_info->complete ) { 45612027Sjungma@eit.uni-kl.de return; 45712027Sjungma@eit.uni-kl.de } 45812027Sjungma@eit.uni-kl.de 45912027Sjungma@eit.uni-kl.de // COMPLETE BINDING OF OUR PARENT PORTS SO THAT WE CAN USE THAT INFORMATION: 46012027Sjungma@eit.uni-kl.de 46112027Sjungma@eit.uni-kl.de int i = first_parent(); 46212027Sjungma@eit.uni-kl.de while( i >= 0 ) { 46312027Sjungma@eit.uni-kl.de m_bind_info->vec[i]->parent->complete_binding(); 46412027Sjungma@eit.uni-kl.de insert_parent( i ); 46512027Sjungma@eit.uni-kl.de i = first_parent(); 46612027Sjungma@eit.uni-kl.de } 46712027Sjungma@eit.uni-kl.de 46812027Sjungma@eit.uni-kl.de // LOOP OVER BINDING INFORMATION TO COMPLETE THE BINDING PROCESS: 46912027Sjungma@eit.uni-kl.de 47012027Sjungma@eit.uni-kl.de int size; 47112027Sjungma@eit.uni-kl.de for( int j = 0; j < m_bind_info->size(); ++ j ) { 47212027Sjungma@eit.uni-kl.de sc_interface* iface = m_bind_info->vec[j]->iface; 47312027Sjungma@eit.uni-kl.de 47412027Sjungma@eit.uni-kl.de // if the interface is zero this was for an unbound port. 47512027Sjungma@eit.uni-kl.de if ( iface == 0 ) continue; 47612027Sjungma@eit.uni-kl.de 47712027Sjungma@eit.uni-kl.de // add (cache) the interface 47812027Sjungma@eit.uni-kl.de if( j > m_bind_info->last_add ) { 47912027Sjungma@eit.uni-kl.de add_interface( iface ); 48012027Sjungma@eit.uni-kl.de } 48112027Sjungma@eit.uni-kl.de 48212027Sjungma@eit.uni-kl.de // only register "leaf" ports (ports without children) 48312027Sjungma@eit.uni-kl.de if( m_bind_info->is_leaf ) { 48412027Sjungma@eit.uni-kl.de iface->register_port( *this, if_typename() ); 48512027Sjungma@eit.uni-kl.de } 48612027Sjungma@eit.uni-kl.de 48712027Sjungma@eit.uni-kl.de // complete static sensitivity for methods 48812027Sjungma@eit.uni-kl.de size = m_bind_info->method_vec.size(); 48912027Sjungma@eit.uni-kl.de for( int k = 0; k < size; ++ k ) { 49012027Sjungma@eit.uni-kl.de sc_bind_ef* p = m_bind_info->method_vec[k]; 49112027Sjungma@eit.uni-kl.de const sc_event& event = ( p->event_finder != 0 ) 49212027Sjungma@eit.uni-kl.de ? p->event_finder->find_event(iface) 49312027Sjungma@eit.uni-kl.de : iface->default_event(); 49412027Sjungma@eit.uni-kl.de p->handle->add_static_event( event ); 49512027Sjungma@eit.uni-kl.de } 49612027Sjungma@eit.uni-kl.de 49712027Sjungma@eit.uni-kl.de // complete static sensitivity for threads 49812027Sjungma@eit.uni-kl.de size = m_bind_info->thread_vec.size(); 49912027Sjungma@eit.uni-kl.de for( int k = 0; k < size; ++ k ) { 50012027Sjungma@eit.uni-kl.de sc_bind_ef* p = m_bind_info->thread_vec[k]; 50112027Sjungma@eit.uni-kl.de const sc_event& event = ( p->event_finder != 0 ) 50212027Sjungma@eit.uni-kl.de ? p->event_finder->find_event(iface) 50312027Sjungma@eit.uni-kl.de : iface->default_event(); 50412027Sjungma@eit.uni-kl.de p->handle->add_static_event( event ); 50512027Sjungma@eit.uni-kl.de } 50612027Sjungma@eit.uni-kl.de 50712027Sjungma@eit.uni-kl.de } 50812027Sjungma@eit.uni-kl.de 50912027Sjungma@eit.uni-kl.de // MAKE SURE THE PROPER NUMBER OF BINDINGS OCCURRED: 51012027Sjungma@eit.uni-kl.de // 51112027Sjungma@eit.uni-kl.de // Make sure there are enough bindings, and not too many. 51212027Sjungma@eit.uni-kl.de 51312027Sjungma@eit.uni-kl.de int actual_binds = interface_count(); 51412027Sjungma@eit.uni-kl.de 51512027Sjungma@eit.uni-kl.de if ( actual_binds > m_bind_info->max_size() ) 51612027Sjungma@eit.uni-kl.de { 51712027Sjungma@eit.uni-kl.de sprintf(msg_buffer, "%d binds exceeds maximum of %d allowed", 51812027Sjungma@eit.uni-kl.de actual_binds, m_bind_info->max_size() ); 51912027Sjungma@eit.uni-kl.de report_error( SC_ID_COMPLETE_BINDING_, msg_buffer ); 52012027Sjungma@eit.uni-kl.de } 52112027Sjungma@eit.uni-kl.de switch ( m_bind_info->policy() ) 52212027Sjungma@eit.uni-kl.de { 52312027Sjungma@eit.uni-kl.de case SC_ONE_OR_MORE_BOUND: 52412027Sjungma@eit.uni-kl.de if ( actual_binds < 1 ) { 52512027Sjungma@eit.uni-kl.de report_error( SC_ID_COMPLETE_BINDING_, "port not bound" ); 52612027Sjungma@eit.uni-kl.de } 52712027Sjungma@eit.uni-kl.de break; 52812027Sjungma@eit.uni-kl.de case SC_ALL_BOUND: 52912027Sjungma@eit.uni-kl.de if ( actual_binds < m_bind_info->max_size() || actual_binds < 1 ) { 53012027Sjungma@eit.uni-kl.de sprintf(msg_buffer, "%d actual binds is less than required %d", 53112027Sjungma@eit.uni-kl.de actual_binds, m_bind_info->max_size() ); 53212027Sjungma@eit.uni-kl.de report_error( SC_ID_COMPLETE_BINDING_, msg_buffer ); 53312027Sjungma@eit.uni-kl.de } 53412027Sjungma@eit.uni-kl.de break; 53512027Sjungma@eit.uni-kl.de default: // SC_ZERO_OR_MORE_BOUND: 53612027Sjungma@eit.uni-kl.de break; 53712027Sjungma@eit.uni-kl.de } 53812027Sjungma@eit.uni-kl.de 53912027Sjungma@eit.uni-kl.de 54012027Sjungma@eit.uni-kl.de // CLEAN UP: FREE BINDING STORAGE: 54112027Sjungma@eit.uni-kl.de 54212027Sjungma@eit.uni-kl.de size = m_bind_info->method_vec.size(); 54312027Sjungma@eit.uni-kl.de for( int k = 0; k < size; ++ k ) { 54412027Sjungma@eit.uni-kl.de delete m_bind_info->method_vec[k]; 54512027Sjungma@eit.uni-kl.de } 54612027Sjungma@eit.uni-kl.de m_bind_info->method_vec.resize(0); 54712027Sjungma@eit.uni-kl.de 54812027Sjungma@eit.uni-kl.de size = m_bind_info->thread_vec.size(); 54912027Sjungma@eit.uni-kl.de for( int k = 0; k < size; ++ k ) { 55012027Sjungma@eit.uni-kl.de delete m_bind_info->thread_vec[k]; 55112027Sjungma@eit.uni-kl.de } 55212027Sjungma@eit.uni-kl.de m_bind_info->thread_vec.resize(0); 55312027Sjungma@eit.uni-kl.de 55412027Sjungma@eit.uni-kl.de m_bind_info->complete = true; 55512027Sjungma@eit.uni-kl.de} 55612027Sjungma@eit.uni-kl.de 55712027Sjungma@eit.uni-kl.devoid 55812027Sjungma@eit.uni-kl.desc_port_base::construction_done() 55912027Sjungma@eit.uni-kl.de{ 56012027Sjungma@eit.uni-kl.de sc_module* parent = static_cast<sc_module*>( get_parent_object() ); 56112027Sjungma@eit.uni-kl.de sc_object::hierarchy_scope scope( parent ); 56212027Sjungma@eit.uni-kl.de before_end_of_elaboration(); 56312027Sjungma@eit.uni-kl.de} 56412027Sjungma@eit.uni-kl.de 56512027Sjungma@eit.uni-kl.devoid 56612027Sjungma@eit.uni-kl.desc_port_base::elaboration_done() 56712027Sjungma@eit.uni-kl.de{ 56812027Sjungma@eit.uni-kl.de assert( m_bind_info != 0 && m_bind_info->complete ); 56912027Sjungma@eit.uni-kl.de delete m_bind_info; 57012027Sjungma@eit.uni-kl.de m_bind_info = 0; 57112027Sjungma@eit.uni-kl.de 57212027Sjungma@eit.uni-kl.de sc_module* parent = static_cast<sc_module*>( get_parent_object() ); 57312027Sjungma@eit.uni-kl.de sc_object::hierarchy_scope scope( parent ); 57412027Sjungma@eit.uni-kl.de end_of_elaboration(); 57512027Sjungma@eit.uni-kl.de} 57612027Sjungma@eit.uni-kl.de 57712027Sjungma@eit.uni-kl.devoid 57812027Sjungma@eit.uni-kl.desc_port_base::start_simulation() 57912027Sjungma@eit.uni-kl.de{ 58012027Sjungma@eit.uni-kl.de sc_module* parent = static_cast<sc_module*>( get_parent_object() ); 58112027Sjungma@eit.uni-kl.de sc_object::hierarchy_scope scope( parent ); 58212027Sjungma@eit.uni-kl.de start_of_simulation(); 58312027Sjungma@eit.uni-kl.de} 58412027Sjungma@eit.uni-kl.de 58512027Sjungma@eit.uni-kl.devoid 58612027Sjungma@eit.uni-kl.desc_port_base::simulation_done() 58712027Sjungma@eit.uni-kl.de{ 58812027Sjungma@eit.uni-kl.de sc_module* parent = static_cast<sc_module*>( get_parent_object() ); 58912027Sjungma@eit.uni-kl.de sc_object::hierarchy_scope scope( parent ); 59012027Sjungma@eit.uni-kl.de end_of_simulation(); 59112027Sjungma@eit.uni-kl.de} 59212027Sjungma@eit.uni-kl.de 59312027Sjungma@eit.uni-kl.de 59412027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 59512027Sjungma@eit.uni-kl.de// CLASS : sc_port_registry 59612027Sjungma@eit.uni-kl.de// 59712027Sjungma@eit.uni-kl.de// Registry for all ports. 59812027Sjungma@eit.uni-kl.de// FOR INTERNAL USE ONLY! 59912027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 60012027Sjungma@eit.uni-kl.de 60112027Sjungma@eit.uni-kl.devoid 60212027Sjungma@eit.uni-kl.desc_port_registry::insert( sc_port_base* port_ ) 60312027Sjungma@eit.uni-kl.de{ 60412027Sjungma@eit.uni-kl.de if( sc_is_running() ) { 60512027Sjungma@eit.uni-kl.de port_->report_error( SC_ID_INSERT_PORT_, "simulation running" ); 60612027Sjungma@eit.uni-kl.de } 60712027Sjungma@eit.uni-kl.de 60812027Sjungma@eit.uni-kl.de if( m_simc->elaboration_done() ) { 60912027Sjungma@eit.uni-kl.de port_->report_error( SC_ID_INSERT_PORT_, "elaboration done" ); 61012027Sjungma@eit.uni-kl.de } 61112027Sjungma@eit.uni-kl.de 61212027Sjungma@eit.uni-kl.de#if defined(DEBUG_SYSTEMC) 61312027Sjungma@eit.uni-kl.de // check if port_ is already inserted 61412027Sjungma@eit.uni-kl.de for( int i = size() - 1; i >= 0; -- i ) { 61512027Sjungma@eit.uni-kl.de if( port_ == m_port_vec[i] ) { 61612027Sjungma@eit.uni-kl.de port_->report_error( SC_ID_INSERT_PORT_, "port already inserted" ); 61712027Sjungma@eit.uni-kl.de } 61812027Sjungma@eit.uni-kl.de } 61912027Sjungma@eit.uni-kl.de#endif 62012027Sjungma@eit.uni-kl.de 62112027Sjungma@eit.uni-kl.de // append the port to the current module's vector of ports 62212027Sjungma@eit.uni-kl.de sc_module* curr_module = m_simc->hierarchy_curr(); 62312027Sjungma@eit.uni-kl.de if( curr_module == 0 ) { 62412027Sjungma@eit.uni-kl.de port_->report_error( SC_ID_PORT_OUTSIDE_MODULE_ ); 62512027Sjungma@eit.uni-kl.de } 62612027Sjungma@eit.uni-kl.de curr_module->append_port( port_ ); 62712027Sjungma@eit.uni-kl.de 62812027Sjungma@eit.uni-kl.de // insert 62912027Sjungma@eit.uni-kl.de m_port_vec.push_back( port_ ); 63012027Sjungma@eit.uni-kl.de} 63112027Sjungma@eit.uni-kl.de 63212027Sjungma@eit.uni-kl.devoid 63312027Sjungma@eit.uni-kl.desc_port_registry::remove( sc_port_base* port_ ) 63412027Sjungma@eit.uni-kl.de{ 63512027Sjungma@eit.uni-kl.de int i; 63612027Sjungma@eit.uni-kl.de for( i = size() - 1; i >= 0; -- i ) { 63712027Sjungma@eit.uni-kl.de if( port_ == m_port_vec[i] ) { 63812027Sjungma@eit.uni-kl.de break; 63912027Sjungma@eit.uni-kl.de } 64012027Sjungma@eit.uni-kl.de } 64112027Sjungma@eit.uni-kl.de if( i == -1 ) { 64212027Sjungma@eit.uni-kl.de port_->report_error( SC_ID_REMOVE_PORT_, "port not registered" ); 64312027Sjungma@eit.uni-kl.de } 64412027Sjungma@eit.uni-kl.de 64512027Sjungma@eit.uni-kl.de // remove 64612027Sjungma@eit.uni-kl.de m_port_vec[i] = m_port_vec[size() - 1]; 64712027Sjungma@eit.uni-kl.de m_port_vec.resize(size()-1); 64812027Sjungma@eit.uni-kl.de} 64912027Sjungma@eit.uni-kl.de 65012027Sjungma@eit.uni-kl.de 65112027Sjungma@eit.uni-kl.de// constructor 65212027Sjungma@eit.uni-kl.de 65312027Sjungma@eit.uni-kl.desc_port_registry::sc_port_registry( sc_simcontext& simc_ ) 65412027Sjungma@eit.uni-kl.de: m_construction_done(0), 65512027Sjungma@eit.uni-kl.de m_port_vec(), 65612027Sjungma@eit.uni-kl.de m_simc( &simc_ ) 65712027Sjungma@eit.uni-kl.de{ 65812027Sjungma@eit.uni-kl.de} 65912027Sjungma@eit.uni-kl.de 66012027Sjungma@eit.uni-kl.de 66112027Sjungma@eit.uni-kl.de// destructor 66212027Sjungma@eit.uni-kl.de 66312027Sjungma@eit.uni-kl.desc_port_registry::~sc_port_registry() 66412027Sjungma@eit.uni-kl.de{ 66512027Sjungma@eit.uni-kl.de} 66612027Sjungma@eit.uni-kl.de 66712027Sjungma@eit.uni-kl.de// called when construction is done 66812027Sjungma@eit.uni-kl.de 66912027Sjungma@eit.uni-kl.debool 67012027Sjungma@eit.uni-kl.desc_port_registry::construction_done() 67112027Sjungma@eit.uni-kl.de{ 67212027Sjungma@eit.uni-kl.de if( size() == m_construction_done ) 67312027Sjungma@eit.uni-kl.de // nothing has been updated 67412027Sjungma@eit.uni-kl.de return true; 67512027Sjungma@eit.uni-kl.de 67612027Sjungma@eit.uni-kl.de for( int i = size()-1; i >= m_construction_done; --i ) { 67712027Sjungma@eit.uni-kl.de m_port_vec[i]->construction_done(); 67812027Sjungma@eit.uni-kl.de } 67912027Sjungma@eit.uni-kl.de 68012027Sjungma@eit.uni-kl.de m_construction_done = size(); 68112027Sjungma@eit.uni-kl.de return false; 68212027Sjungma@eit.uni-kl.de} 68312027Sjungma@eit.uni-kl.de 68412027Sjungma@eit.uni-kl.de// called when when elaboration is done 68512027Sjungma@eit.uni-kl.de 68612027Sjungma@eit.uni-kl.devoid 68712027Sjungma@eit.uni-kl.desc_port_registry::complete_binding() 68812027Sjungma@eit.uni-kl.de{ 68912027Sjungma@eit.uni-kl.de for( int i = size() - 1; i >= 0; -- i ) { 69012027Sjungma@eit.uni-kl.de m_port_vec[i]->complete_binding(); 69112027Sjungma@eit.uni-kl.de } 69212027Sjungma@eit.uni-kl.de} 69312027Sjungma@eit.uni-kl.de 69412027Sjungma@eit.uni-kl.de 69512027Sjungma@eit.uni-kl.de// called when elaboration is done 69612027Sjungma@eit.uni-kl.de 69712027Sjungma@eit.uni-kl.devoid 69812027Sjungma@eit.uni-kl.desc_port_registry::elaboration_done() 69912027Sjungma@eit.uni-kl.de{ 70012027Sjungma@eit.uni-kl.de complete_binding(); 70112027Sjungma@eit.uni-kl.de 70212027Sjungma@eit.uni-kl.de for( int i = size() - 1; i >= 0; -- i ) { 70312027Sjungma@eit.uni-kl.de m_port_vec[i]->elaboration_done(); 70412027Sjungma@eit.uni-kl.de } 70512027Sjungma@eit.uni-kl.de} 70612027Sjungma@eit.uni-kl.de 70712027Sjungma@eit.uni-kl.de// called before simulation begins 70812027Sjungma@eit.uni-kl.de 70912027Sjungma@eit.uni-kl.devoid 71012027Sjungma@eit.uni-kl.desc_port_registry::start_simulation() 71112027Sjungma@eit.uni-kl.de{ 71212027Sjungma@eit.uni-kl.de for( int i = size() - 1; i >= 0; -- i ) { 71312027Sjungma@eit.uni-kl.de m_port_vec[i]->start_simulation(); 71412027Sjungma@eit.uni-kl.de } 71512027Sjungma@eit.uni-kl.de} 71612027Sjungma@eit.uni-kl.de 71712027Sjungma@eit.uni-kl.de// called after simulation ends 71812027Sjungma@eit.uni-kl.de 71912027Sjungma@eit.uni-kl.devoid 72012027Sjungma@eit.uni-kl.desc_port_registry::simulation_done() 72112027Sjungma@eit.uni-kl.de{ 72212027Sjungma@eit.uni-kl.de for( int i = size() - 1; i >= 0; -- i ) { 72312027Sjungma@eit.uni-kl.de m_port_vec[i]->simulation_done(); 72412027Sjungma@eit.uni-kl.de } 72512027Sjungma@eit.uni-kl.de} 72612027Sjungma@eit.uni-kl.de 72712027Sjungma@eit.uni-kl.de// This is a static member function. 72812027Sjungma@eit.uni-kl.de 72912027Sjungma@eit.uni-kl.devoid 73012027Sjungma@eit.uni-kl.desc_port_registry::replace_port( sc_port_registry* /* registry */ ) 73112027Sjungma@eit.uni-kl.de{ 73212027Sjungma@eit.uni-kl.de} 73312027Sjungma@eit.uni-kl.de 73412027Sjungma@eit.uni-kl.devoid sc_warn_port_constructor() 73512027Sjungma@eit.uni-kl.de{ 73612027Sjungma@eit.uni-kl.de static bool warn_port_constructor=true; 73712027Sjungma@eit.uni-kl.de if ( warn_port_constructor ) 73812027Sjungma@eit.uni-kl.de { 73912027Sjungma@eit.uni-kl.de warn_port_constructor = false; 74012027Sjungma@eit.uni-kl.de SC_REPORT_INFO(SC_ID_IEEE_1666_DEPRECATION_, 74112027Sjungma@eit.uni-kl.de "interface and/or port binding in port constructors is deprecated" 74212027Sjungma@eit.uni-kl.de ); 74312027Sjungma@eit.uni-kl.de } 74412027Sjungma@eit.uni-kl.de} 74512027Sjungma@eit.uni-kl.de 74612027Sjungma@eit.uni-kl.de} // namespace sc_core 74712027Sjungma@eit.uni-kl.de 74812027Sjungma@eit.uni-kl.de 74912027Sjungma@eit.uni-kl.de/***************************************************************************** 75012027Sjungma@eit.uni-kl.de 75112027Sjungma@eit.uni-kl.de MODIFICATION LOG - modifiers, enter your name, affiliation, date and 75212027Sjungma@eit.uni-kl.de changes you are making here. 75312027Sjungma@eit.uni-kl.de 75412027Sjungma@eit.uni-kl.de Name, Affiliation, Date: Andy Goodrich, Forte Design Systems 75512027Sjungma@eit.uni-kl.de Bishnupriya Bhattacharya, Cadence Design Systems, 75612027Sjungma@eit.uni-kl.de 25 August, 2003 75712027Sjungma@eit.uni-kl.de Description of Modification: phase callbacks 75812027Sjungma@eit.uni-kl.de 75912027Sjungma@eit.uni-kl.de Name, Affiliation, Date: Andy Goodrich, Forte Design Systems 76012027Sjungma@eit.uni-kl.de 12 December, 2005 76112027Sjungma@eit.uni-kl.de Description of Modification: multiport binding policy changes 76212027Sjungma@eit.uni-kl.de 76312027Sjungma@eit.uni-kl.de *****************************************************************************/ 76412027Sjungma@eit.uni-kl.de 76512027Sjungma@eit.uni-kl.de 76612027Sjungma@eit.uni-kl.de// $Log: sc_port.cpp,v $ 76712027Sjungma@eit.uni-kl.de// Revision 1.8 2011/08/24 22:05:36 acg 76812027Sjungma@eit.uni-kl.de// Torsten Maehne: initialization changes to remove warnings. 76912027Sjungma@eit.uni-kl.de// 77012027Sjungma@eit.uni-kl.de// Revision 1.7 2011/08/15 16:43:24 acg 77112027Sjungma@eit.uni-kl.de// Torsten Maehne: changes to remove unused argument warnings. 77212027Sjungma@eit.uni-kl.de// 77312027Sjungma@eit.uni-kl.de// Revision 1.6 2011/08/07 19:08:01 acg 77412027Sjungma@eit.uni-kl.de// Andy Goodrich: moved logs to end of file so line number synching works 77512027Sjungma@eit.uni-kl.de// better between versions. 77612027Sjungma@eit.uni-kl.de// 77712027Sjungma@eit.uni-kl.de// Revision 1.5 2011/08/07 18:53:09 acg 77812027Sjungma@eit.uni-kl.de// Philipp A. Hartmann: add virtual instances of the bind function for 77912027Sjungma@eit.uni-kl.de// base classes to eliminate warning messages for clang platforms. 78012027Sjungma@eit.uni-kl.de// 78112027Sjungma@eit.uni-kl.de// Revision 1.4 2011/05/09 04:07:37 acg 78212027Sjungma@eit.uni-kl.de// Philipp A. Hartmann: 78312027Sjungma@eit.uni-kl.de// (1) Restore hierarchy in all phase callbacks. 78412027Sjungma@eit.uni-kl.de// (2) Ensure calls to before_end_of_elaboration. 78512027Sjungma@eit.uni-kl.de// 78612027Sjungma@eit.uni-kl.de// Revision 1.3 2011/02/18 20:23:45 acg 78712027Sjungma@eit.uni-kl.de// Andy Goodrich: Copyright update. 78812027Sjungma@eit.uni-kl.de// 78912027Sjungma@eit.uni-kl.de// Revision 1.2 2011/02/14 17:50:16 acg 79012027Sjungma@eit.uni-kl.de// Andy Goodrich: testing for sc_port and sc_export instantiations during 79112027Sjungma@eit.uni-kl.de// end of elaboration and issuing appropriate error messages. 79212027Sjungma@eit.uni-kl.de// 79312027Sjungma@eit.uni-kl.de// Revision 1.1.1.1 2006/12/15 20:20:04 acg 79412027Sjungma@eit.uni-kl.de// SystemC 2.3 79512027Sjungma@eit.uni-kl.de// 79612027Sjungma@eit.uni-kl.de// Revision 1.11 2006/08/29 23:34:59 acg 79712027Sjungma@eit.uni-kl.de// Andy Goodrich: added bind_count() method to allow users to determine which 79812027Sjungma@eit.uni-kl.de// ports are connected in before_end_of_elaboration(). 79912027Sjungma@eit.uni-kl.de// 80012027Sjungma@eit.uni-kl.de// Revision 1.10 2006/05/08 17:52:47 acg 80112027Sjungma@eit.uni-kl.de// Andy Goodrich: 80212027Sjungma@eit.uni-kl.de// (1) added David Long's forward declarations for friend functions, 80312027Sjungma@eit.uni-kl.de// methods, and operators to keep the Microsoft compiler happy. 80412027Sjungma@eit.uni-kl.de// (2) Added delta_count() method to sc_prim_channel for use by 80512027Sjungma@eit.uni-kl.de// sc_signal so that the friend declaration in sc_simcontext.h 80612027Sjungma@eit.uni-kl.de// can be for a non-templated class (i.e., sc_prim_channel.) 80712027Sjungma@eit.uni-kl.de// 80812027Sjungma@eit.uni-kl.de// Revision 1.9 2006/02/02 20:43:09 acg 80912027Sjungma@eit.uni-kl.de// Andy Goodrich: Added an existence linked list to sc_event_finder so that 81012027Sjungma@eit.uni-kl.de// the dynamically allocated instances can be freed after port binding 81112027Sjungma@eit.uni-kl.de// completes. This replaces the individual deletions in ~sc_bind_ef, as these 81212027Sjungma@eit.uni-kl.de// caused an exception if an sc_event_finder instance was used more than 81312027Sjungma@eit.uni-kl.de// once, due to a double freeing of the instance. 81412027Sjungma@eit.uni-kl.de// 81512027Sjungma@eit.uni-kl.de// Revision 1.7 2006/01/26 21:00:50 acg 81612027Sjungma@eit.uni-kl.de// Andy Goodrich: conversion to use sc_event::notify(SC_ZERO_TIME) instead of 81712027Sjungma@eit.uni-kl.de// sc_event::notify_delayed() 81812027Sjungma@eit.uni-kl.de// 81912027Sjungma@eit.uni-kl.de// Revision 1.6 2006/01/25 00:31:11 acg 82012027Sjungma@eit.uni-kl.de// Andy Goodrich: Changed over to use a standard message id of 82112027Sjungma@eit.uni-kl.de// SC_ID_IEEE_1666_DEPRECATION for all deprecation messages. 82212027Sjungma@eit.uni-kl.de// 82312027Sjungma@eit.uni-kl.de// Revision 1.5 2006/01/24 20:46:31 acg 82412027Sjungma@eit.uni-kl.de// Andy Goodrich: changes to eliminate use of deprecated features. For instance, 82512027Sjungma@eit.uni-kl.de// using notify(SC_ZERO_TIME) in place of notify_delayed(). 82612027Sjungma@eit.uni-kl.de// 82712027Sjungma@eit.uni-kl.de// Revision 1.4 2006/01/13 20:41:59 acg 82812027Sjungma@eit.uni-kl.de// Andy Goodrich: Changes to add port registration to the things that are 82912027Sjungma@eit.uni-kl.de// checked when SC_NO_WRITE_CHECK is not defined. 83012027Sjungma@eit.uni-kl.de// 83112027Sjungma@eit.uni-kl.de// Revision 1.3 2006/01/13 18:47:42 acg 83212027Sjungma@eit.uni-kl.de// Added $Log command so that CVS comments are reproduced in the source. 83312027Sjungma@eit.uni-kl.de// 83412027Sjungma@eit.uni-kl.de 83512027Sjungma@eit.uni-kl.de// Taf! 836