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