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_process.cpp -- Base process implementation.
2312027Sjungma@eit.uni-kl.de
2412027Sjungma@eit.uni-kl.de  Original Authors: Andy Goodrich, Forte Design Systems, 17 June 2003
2512027Sjungma@eit.uni-kl.de                    Stuart Swan, Cadence
2612027Sjungma@eit.uni-kl.de                    Bishnupriya Bhattacharya, Cadence Design Systems,
2712027Sjungma@eit.uni-kl.de                    25 August, 2003
2812027Sjungma@eit.uni-kl.de
2912027Sjungma@eit.uni-kl.de CHANGE LOG AT THE END OF THE FILE
3012027Sjungma@eit.uni-kl.de *****************************************************************************/
3112027Sjungma@eit.uni-kl.de
3212027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_name_gen.h"
3312027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_cthread_process.h"
3412027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_method_process.h"
3512027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_thread_process.h"
3612027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_sensitive.h"
3712027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_process_handle.h"
3812027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_event.h"
3912027Sjungma@eit.uni-kl.de#include <sstream>
4012027Sjungma@eit.uni-kl.de
4112027Sjungma@eit.uni-kl.denamespace sc_core {
4212027Sjungma@eit.uni-kl.de
4312027Sjungma@eit.uni-kl.de// sc_process_handle entities that are returned for null pointer instances:
4412027Sjungma@eit.uni-kl.de//
4512027Sjungma@eit.uni-kl.de// Note the special name for 'non_event' - this makes sure it does not
4612027Sjungma@eit.uni-kl.de// appear as a named event.
4712027Sjungma@eit.uni-kl.de
4812027Sjungma@eit.uni-kl.destd::vector<sc_event*> sc_process_handle::empty_event_vector;
4912027Sjungma@eit.uni-kl.destd::vector<sc_object*> sc_process_handle::empty_object_vector;
5012027Sjungma@eit.uni-kl.desc_event                sc_process_handle::non_event(SC_KERNEL_EVENT_PREFIX);
5112027Sjungma@eit.uni-kl.de
5212027Sjungma@eit.uni-kl.de// Last process that was created:
5312027Sjungma@eit.uni-kl.de
5412027Sjungma@eit.uni-kl.desc_process_b* sc_process_b::m_last_created_process_p = 0;
5512027Sjungma@eit.uni-kl.de
5612027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------
5712027Sjungma@eit.uni-kl.de//"sc_process_b::add_static_event"
5812027Sjungma@eit.uni-kl.de//
5912027Sjungma@eit.uni-kl.de// This method adds an event to the list of static events, and sets the
6012027Sjungma@eit.uni-kl.de// event up to call back this process when it fires.
6112027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------
6212027Sjungma@eit.uni-kl.devoid sc_process_b::add_static_event( const sc_event& e )
6312027Sjungma@eit.uni-kl.de{
6412027Sjungma@eit.uni-kl.de    sc_method_handle method_h; // This process as a method.
6512027Sjungma@eit.uni-kl.de    sc_thread_handle thread_h; // This process as a thread.
6612027Sjungma@eit.uni-kl.de
6712027Sjungma@eit.uni-kl.de
6812027Sjungma@eit.uni-kl.de    // CHECK TO SEE IF WE ARE ALREADY REGISTERED WITH THE EVENT:
6912027Sjungma@eit.uni-kl.de
7012027Sjungma@eit.uni-kl.de    for( int i = m_static_events.size() - 1; i >= 0; -- i ) {
7112027Sjungma@eit.uni-kl.de        if( &e == m_static_events[i] ) {
7212027Sjungma@eit.uni-kl.de            return;
7312027Sjungma@eit.uni-kl.de        }
7412027Sjungma@eit.uni-kl.de    }
7512027Sjungma@eit.uni-kl.de
7612027Sjungma@eit.uni-kl.de    // REMEMBER THE EVENT AND THEN REGISTER OUR OBJECT INSTANCE WITH IT:
7712027Sjungma@eit.uni-kl.de
7812027Sjungma@eit.uni-kl.de    m_static_events.push_back( &e );
7912027Sjungma@eit.uni-kl.de
8012027Sjungma@eit.uni-kl.de    switch ( m_process_kind )
8112027Sjungma@eit.uni-kl.de    {
8212027Sjungma@eit.uni-kl.de      case SC_THREAD_PROC_:
8312027Sjungma@eit.uni-kl.de      case SC_CTHREAD_PROC_:
8412027Sjungma@eit.uni-kl.de        thread_h = SCAST<sc_thread_handle>( this );
8512027Sjungma@eit.uni-kl.de        e.add_static( thread_h );
8612027Sjungma@eit.uni-kl.de        break;
8712027Sjungma@eit.uni-kl.de      case SC_METHOD_PROC_:
8812027Sjungma@eit.uni-kl.de        method_h = SCAST<sc_method_handle>( this );
8912027Sjungma@eit.uni-kl.de        e.add_static( method_h );
9012027Sjungma@eit.uni-kl.de        break;
9112027Sjungma@eit.uni-kl.de      default:
9212027Sjungma@eit.uni-kl.de        assert( false );
9312027Sjungma@eit.uni-kl.de        break;
9412027Sjungma@eit.uni-kl.de    }
9512027Sjungma@eit.uni-kl.de}
9612027Sjungma@eit.uni-kl.de
9712027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------
9812027Sjungma@eit.uni-kl.de//"sc_process_b::disconnect_process"
9912027Sjungma@eit.uni-kl.de//
10012027Sjungma@eit.uni-kl.de// This method removes this object instance from use. It will be called by
10112027Sjungma@eit.uni-kl.de// the kill_process() methods of classes derived from it. This object instance
10212027Sjungma@eit.uni-kl.de// will be removed from any data structures it resides, other than existence.
10312027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------
10412027Sjungma@eit.uni-kl.devoid sc_process_b::disconnect_process()
10512027Sjungma@eit.uni-kl.de{
10612027Sjungma@eit.uni-kl.de    int               mon_n;      // monitor queue size.
10712027Sjungma@eit.uni-kl.de    sc_thread_handle  thread_h;   // This process as a thread.
10812027Sjungma@eit.uni-kl.de
10912027Sjungma@eit.uni-kl.de    // IF THIS OBJECT IS PINING FOR THE FJORDS WE ARE DONE:
11012027Sjungma@eit.uni-kl.de
11112027Sjungma@eit.uni-kl.de    if ( m_state & ps_bit_zombie ) return;
11212027Sjungma@eit.uni-kl.de
11312027Sjungma@eit.uni-kl.de    // IF THIS IS A THREAD SIGNAL ANY MONITORS WAITING FOR IT TO EXIT:
11412027Sjungma@eit.uni-kl.de
11512027Sjungma@eit.uni-kl.de    switch ( m_process_kind )
11612027Sjungma@eit.uni-kl.de    {
11712027Sjungma@eit.uni-kl.de      case SC_THREAD_PROC_:
11812027Sjungma@eit.uni-kl.de      case SC_CTHREAD_PROC_:
11912027Sjungma@eit.uni-kl.de        thread_h = SCAST<sc_thread_handle>(this);
12012027Sjungma@eit.uni-kl.de        mon_n = thread_h->m_monitor_q.size();
12112027Sjungma@eit.uni-kl.de        if ( mon_n )
12212027Sjungma@eit.uni-kl.de        {
12312027Sjungma@eit.uni-kl.de            for ( int mon_i = 0; mon_i < mon_n; mon_i++ )
12412027Sjungma@eit.uni-kl.de            {
12512027Sjungma@eit.uni-kl.de                thread_h->m_monitor_q[mon_i]->signal( thread_h,
12612027Sjungma@eit.uni-kl.de			      sc_process_monitor::spm_exit);
12712027Sjungma@eit.uni-kl.de            }
12812027Sjungma@eit.uni-kl.de        }
12912027Sjungma@eit.uni-kl.de        break;
13012027Sjungma@eit.uni-kl.de      default:
13112027Sjungma@eit.uni-kl.de        break;
13212027Sjungma@eit.uni-kl.de    }
13312027Sjungma@eit.uni-kl.de
13412027Sjungma@eit.uni-kl.de    // REMOVE EVENT WAITS, AND REMOVE THE PROCESS FROM ITS SC_RESET:
13512027Sjungma@eit.uni-kl.de
13612027Sjungma@eit.uni-kl.de    remove_dynamic_events();
13712027Sjungma@eit.uni-kl.de    remove_static_events();
13812027Sjungma@eit.uni-kl.de
13912027Sjungma@eit.uni-kl.de    for ( std::vector<sc_reset*>::size_type rst_i = 0; rst_i < m_resets.size(); rst_i++ )
14012027Sjungma@eit.uni-kl.de    {
14112027Sjungma@eit.uni-kl.de        m_resets[rst_i]->remove_process( this );
14212027Sjungma@eit.uni-kl.de    }
14312027Sjungma@eit.uni-kl.de    m_resets.resize(0);
14412027Sjungma@eit.uni-kl.de
14512027Sjungma@eit.uni-kl.de
14612027Sjungma@eit.uni-kl.de    // FIRE THE TERMINATION EVENT, MARK AS TERMINATED, AND DECREMENT THE COUNT:
14712027Sjungma@eit.uni-kl.de    //
14812027Sjungma@eit.uni-kl.de    // (1) We wait to set the process kind until after doing the removals
14912027Sjungma@eit.uni-kl.de    //     above.
15012027Sjungma@eit.uni-kl.de    // (2) Decrementing the reference count will result in actual object
15112027Sjungma@eit.uni-kl.de    //     deletion if we hit zero.
15212027Sjungma@eit.uni-kl.de
15312027Sjungma@eit.uni-kl.de    m_state = ps_bit_zombie;
15412027Sjungma@eit.uni-kl.de    if ( m_term_event_p ) m_term_event_p->notify();
15512027Sjungma@eit.uni-kl.de    reference_decrement();
15612027Sjungma@eit.uni-kl.de}
15712027Sjungma@eit.uni-kl.de
15812027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------
15912027Sjungma@eit.uni-kl.de//"sc_process_b::delete_process"
16012027Sjungma@eit.uni-kl.de//
16112027Sjungma@eit.uni-kl.de// This method deletes the current instance, if it is not the running
16212027Sjungma@eit.uni-kl.de// process. Otherwise, it is put in the simcontext's process deletion
16312027Sjungma@eit.uni-kl.de// queue.
16412027Sjungma@eit.uni-kl.de//
16512027Sjungma@eit.uni-kl.de// The reason for the two step deletion process is that the process from which
16612027Sjungma@eit.uni-kl.de// reference_decrement() is called may be the running process, so we may need
16712027Sjungma@eit.uni-kl.de// to wait until it goes idle.
16812027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------
16912027Sjungma@eit.uni-kl.devoid sc_process_b::delete_process()
17012027Sjungma@eit.uni-kl.de{
17112027Sjungma@eit.uni-kl.de    assert( m_references_n == 0 );
17212027Sjungma@eit.uni-kl.de
17312027Sjungma@eit.uni-kl.de    // Immediate deletion:
17412027Sjungma@eit.uni-kl.de
17512027Sjungma@eit.uni-kl.de    if ( this != sc_get_current_process_b() )
17612027Sjungma@eit.uni-kl.de    {
17712027Sjungma@eit.uni-kl.de        delete this;
17812027Sjungma@eit.uni-kl.de    }
17912027Sjungma@eit.uni-kl.de
18012027Sjungma@eit.uni-kl.de    // Deferred deletion: note we set the reference count to one  for the call
18112027Sjungma@eit.uni-kl.de    // to reference_decrement that occurs in sc_simcontext::crunch().
18212027Sjungma@eit.uni-kl.de
18312027Sjungma@eit.uni-kl.de    else
18412027Sjungma@eit.uni-kl.de    {
18512027Sjungma@eit.uni-kl.de	m_references_n = 1;
18612027Sjungma@eit.uni-kl.de        detach();
18712027Sjungma@eit.uni-kl.de        simcontext()->mark_to_collect_process( this );
18812027Sjungma@eit.uni-kl.de    }
18912027Sjungma@eit.uni-kl.de}
19012027Sjungma@eit.uni-kl.de
19112027Sjungma@eit.uni-kl.de
19212027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------
19312027Sjungma@eit.uni-kl.de//"sc_process_b::dont_initialize"
19412027Sjungma@eit.uni-kl.de//
19512027Sjungma@eit.uni-kl.de// This virtual method sets the initialization switch for this object instance.
19612027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------
19712027Sjungma@eit.uni-kl.devoid sc_process_b::dont_initialize( bool dont )
19812027Sjungma@eit.uni-kl.de{
19912027Sjungma@eit.uni-kl.de    m_dont_init = dont;
20012027Sjungma@eit.uni-kl.de}
20112027Sjungma@eit.uni-kl.de
20212027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------
20312027Sjungma@eit.uni-kl.de//"sc_process_b::dump_state"
20412027Sjungma@eit.uni-kl.de//
20512027Sjungma@eit.uni-kl.de// This method returns the process state as a string.
20612027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------
20712027Sjungma@eit.uni-kl.destd::string sc_process_b::dump_state() const
20812027Sjungma@eit.uni-kl.de{
20912027Sjungma@eit.uni-kl.de    std::string result;
21012027Sjungma@eit.uni-kl.de    result = "[";
21112027Sjungma@eit.uni-kl.de    if ( m_state == ps_normal )
21212027Sjungma@eit.uni-kl.de    {
21312027Sjungma@eit.uni-kl.de        result += " normal";
21412027Sjungma@eit.uni-kl.de    }
21512027Sjungma@eit.uni-kl.de    else
21612027Sjungma@eit.uni-kl.de    {
21712027Sjungma@eit.uni-kl.de        if ( m_state & ps_bit_disabled )
21812027Sjungma@eit.uni-kl.de            result += "disabled ";
21912027Sjungma@eit.uni-kl.de        if ( m_state & ps_bit_suspended )
22012027Sjungma@eit.uni-kl.de            result += "suspended ";
22112027Sjungma@eit.uni-kl.de        if ( m_state & ps_bit_ready_to_run )
22212027Sjungma@eit.uni-kl.de            result += "ready_to_run ";
22312027Sjungma@eit.uni-kl.de        if ( m_state & ps_bit_zombie )
22412027Sjungma@eit.uni-kl.de            result += "zombie ";
22512027Sjungma@eit.uni-kl.de    }
22612027Sjungma@eit.uni-kl.de    result += "]";
22712027Sjungma@eit.uni-kl.de    return result;
22812027Sjungma@eit.uni-kl.de}
22912027Sjungma@eit.uni-kl.de
23012027Sjungma@eit.uni-kl.de
23112027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------
23212027Sjungma@eit.uni-kl.de//"sc_process_b::gen_unique_name"
23312027Sjungma@eit.uni-kl.de//
23412027Sjungma@eit.uni-kl.de// This method generates a unique name within this object instance's namespace.
23512027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------
23612027Sjungma@eit.uni-kl.deconst char* sc_process_b::gen_unique_name( const char* basename_,
23712027Sjungma@eit.uni-kl.de    bool preserve_first )
23812027Sjungma@eit.uni-kl.de{
23912027Sjungma@eit.uni-kl.de    if ( ! m_name_gen_p ) m_name_gen_p = new sc_name_gen;
24012027Sjungma@eit.uni-kl.de    return m_name_gen_p->gen_unique_name( basename_, preserve_first );
24112027Sjungma@eit.uni-kl.de}
24212027Sjungma@eit.uni-kl.de
24312027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------
24412027Sjungma@eit.uni-kl.de//"sc_process_b::remove_dynamic_events"
24512027Sjungma@eit.uni-kl.de//
24612027Sjungma@eit.uni-kl.de// This method removes this object instance from the events in its dynamic
24712027Sjungma@eit.uni-kl.de// event lists.
24812027Sjungma@eit.uni-kl.de//
24912027Sjungma@eit.uni-kl.de// Arguments:
25012027Sjungma@eit.uni-kl.de//     skip_timeout = skip cleaning up the timeout event, it will be done
25112027Sjungma@eit.uni-kl.de//                    by sc_event_notify().
25212027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------
25312027Sjungma@eit.uni-kl.devoid
25412027Sjungma@eit.uni-kl.desc_process_b::remove_dynamic_events( bool skip_timeout )
25512027Sjungma@eit.uni-kl.de{
25612027Sjungma@eit.uni-kl.de    sc_method_handle  method_h;   // This process as a method.
25712027Sjungma@eit.uni-kl.de    sc_thread_handle  thread_h;   // This process as a thread.
25812027Sjungma@eit.uni-kl.de
25912027Sjungma@eit.uni-kl.de    m_trigger_type = STATIC;
26012027Sjungma@eit.uni-kl.de    switch ( m_process_kind )
26112027Sjungma@eit.uni-kl.de    {
26212027Sjungma@eit.uni-kl.de      case SC_THREAD_PROC_:
26312027Sjungma@eit.uni-kl.de      case SC_CTHREAD_PROC_:
26412027Sjungma@eit.uni-kl.de        thread_h = SCAST<sc_thread_handle>(this);
26512027Sjungma@eit.uni-kl.de	if ( thread_h->m_timeout_event_p && !skip_timeout ) {
26612027Sjungma@eit.uni-kl.de	    thread_h->m_timeout_event_p->remove_dynamic(thread_h);
26712027Sjungma@eit.uni-kl.de	    thread_h->m_timeout_event_p->cancel();
26812027Sjungma@eit.uni-kl.de	}
26912027Sjungma@eit.uni-kl.de        if ( m_event_p ) m_event_p->remove_dynamic( thread_h );
27012027Sjungma@eit.uni-kl.de        if ( m_event_list_p )
27112027Sjungma@eit.uni-kl.de        {
27212027Sjungma@eit.uni-kl.de            m_event_list_p->remove_dynamic( thread_h, 0 );
27312027Sjungma@eit.uni-kl.de            m_event_list_p->auto_delete();
27412027Sjungma@eit.uni-kl.de	    m_event_list_p = 0;
27512027Sjungma@eit.uni-kl.de        }
27612027Sjungma@eit.uni-kl.de        break;
27712027Sjungma@eit.uni-kl.de      case SC_METHOD_PROC_:
27812027Sjungma@eit.uni-kl.de        method_h = SCAST<sc_method_handle>(this);
27912027Sjungma@eit.uni-kl.de	if ( method_h->m_timeout_event_p && !skip_timeout ) {
28012027Sjungma@eit.uni-kl.de	    method_h->m_timeout_event_p->remove_dynamic(method_h);
28112027Sjungma@eit.uni-kl.de	    method_h->m_timeout_event_p->cancel();
28212027Sjungma@eit.uni-kl.de	}
28312027Sjungma@eit.uni-kl.de        if ( m_event_p ) m_event_p->remove_dynamic( method_h );
28412027Sjungma@eit.uni-kl.de        if ( m_event_list_p )
28512027Sjungma@eit.uni-kl.de        {
28612027Sjungma@eit.uni-kl.de            m_event_list_p->remove_dynamic( method_h, 0 );
28712027Sjungma@eit.uni-kl.de            m_event_list_p->auto_delete();
28812027Sjungma@eit.uni-kl.de	    m_event_list_p = 0;
28912027Sjungma@eit.uni-kl.de        }
29012027Sjungma@eit.uni-kl.de        break;
29112027Sjungma@eit.uni-kl.de      default: // Some other type, it needs to clean up itself.
29212027Sjungma@eit.uni-kl.de        // std::cout << "Check " << __FILE__ << ":" << __LINE__ << std::endl;
29312027Sjungma@eit.uni-kl.de        break;
29412027Sjungma@eit.uni-kl.de    }
29512027Sjungma@eit.uni-kl.de}
29612027Sjungma@eit.uni-kl.de
29712027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------
29812027Sjungma@eit.uni-kl.de//"sc_process_b::remove_static_events"
29912027Sjungma@eit.uni-kl.de//
30012027Sjungma@eit.uni-kl.de// This method removes this object instance from the events in its static
30112027Sjungma@eit.uni-kl.de// event list.
30212027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------
30312027Sjungma@eit.uni-kl.devoid
30412027Sjungma@eit.uni-kl.desc_process_b::remove_static_events()
30512027Sjungma@eit.uni-kl.de{
30612027Sjungma@eit.uni-kl.de    sc_method_handle method_h; // This process as a method.
30712027Sjungma@eit.uni-kl.de    sc_thread_handle thread_h; // This process as a thread.
30812027Sjungma@eit.uni-kl.de
30912027Sjungma@eit.uni-kl.de    switch ( m_process_kind )
31012027Sjungma@eit.uni-kl.de    {
31112027Sjungma@eit.uni-kl.de      case SC_THREAD_PROC_:
31212027Sjungma@eit.uni-kl.de      case SC_CTHREAD_PROC_:
31312027Sjungma@eit.uni-kl.de        thread_h = SCAST<sc_thread_handle>( this );
31412027Sjungma@eit.uni-kl.de        for( int i = m_static_events.size() - 1; i >= 0; -- i ) {
31512027Sjungma@eit.uni-kl.de            m_static_events[i]->remove_static( thread_h );
31612027Sjungma@eit.uni-kl.de        }
31712027Sjungma@eit.uni-kl.de        m_static_events.resize(0);
31812027Sjungma@eit.uni-kl.de        break;
31912027Sjungma@eit.uni-kl.de      case SC_METHOD_PROC_:
32012027Sjungma@eit.uni-kl.de        method_h = DCAST<sc_method_handle>( this );
32112027Sjungma@eit.uni-kl.de        assert( method_h != 0 );
32212027Sjungma@eit.uni-kl.de        for( int i = m_static_events.size() - 1; i >= 0; -- i ) {
32312027Sjungma@eit.uni-kl.de            m_static_events[i]->remove_static( method_h );
32412027Sjungma@eit.uni-kl.de        }
32512027Sjungma@eit.uni-kl.de        m_static_events.resize(0);
32612027Sjungma@eit.uni-kl.de        break;
32712027Sjungma@eit.uni-kl.de      default: // Some other type, it needs to clean up itself.
32812027Sjungma@eit.uni-kl.de        // std::cout << "Check " << __FILE__ << ":" << __LINE__ << std::endl;
32912027Sjungma@eit.uni-kl.de        break;
33012027Sjungma@eit.uni-kl.de    }
33112027Sjungma@eit.uni-kl.de}
33212027Sjungma@eit.uni-kl.de
33312027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------
33412027Sjungma@eit.uni-kl.de// "sc_process_b::report_error"
33512027Sjungma@eit.uni-kl.de//
33612027Sjungma@eit.uni-kl.de// This method can be used to issue a report from within a process.
33712027Sjungma@eit.uni-kl.de// The error of the given ID is reported with the given message and
33812027Sjungma@eit.uni-kl.de// the process' name() appended to the report.
33912027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------
34012027Sjungma@eit.uni-kl.devoid
34112027Sjungma@eit.uni-kl.desc_process_b::report_error( const char* msgid, const char* msg ) const
34212027Sjungma@eit.uni-kl.de{
34312027Sjungma@eit.uni-kl.de    std::stringstream sstr;
34412027Sjungma@eit.uni-kl.de    if( msg && msg[0] )
34512027Sjungma@eit.uni-kl.de        sstr << msg << ": ";
34612027Sjungma@eit.uni-kl.de    sstr << name();
34712027Sjungma@eit.uni-kl.de    SC_REPORT_ERROR( msgid, sstr.str().c_str() );
34812027Sjungma@eit.uni-kl.de}
34912027Sjungma@eit.uni-kl.de
35012027Sjungma@eit.uni-kl.de
35112027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------
35212027Sjungma@eit.uni-kl.de// "sc_process_b::report_immediate_self_notification"
35312027Sjungma@eit.uni-kl.de//
35412027Sjungma@eit.uni-kl.de// This method is used to report an immediate self-notification
35512027Sjungma@eit.uni-kl.de// that used to trigger the process before the clarification in 1666-2011.
35612027Sjungma@eit.uni-kl.de// The warning is only reported once.
35712027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------
35812027Sjungma@eit.uni-kl.devoid
35912027Sjungma@eit.uni-kl.desc_process_b::report_immediate_self_notification() const
36012027Sjungma@eit.uni-kl.de{
36112027Sjungma@eit.uni-kl.de    static bool once = false;
36212027Sjungma@eit.uni-kl.de    if( !once ) {
36312027Sjungma@eit.uni-kl.de      SC_REPORT_WARNING( SC_ID_IMMEDIATE_SELF_NOTIFICATION_, name() );
36412027Sjungma@eit.uni-kl.de      once = true;
36512027Sjungma@eit.uni-kl.de    }
36612027Sjungma@eit.uni-kl.de}
36712027Sjungma@eit.uni-kl.de
36812027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------
36912027Sjungma@eit.uni-kl.de//"sc_process_b::reset_changed"
37012027Sjungma@eit.uni-kl.de//
37112027Sjungma@eit.uni-kl.de// This method is called when there is a change in the value of the
37212027Sjungma@eit.uni-kl.de// signal that was specified via reset_signal_is, or the value of the
37312027Sjungma@eit.uni-kl.de// m_sticky_reset field. We get called any time m_sticky_reset changes
37412027Sjungma@eit.uni-kl.de// or a signal value changes since, since we may need to throw an exception
37512027Sjungma@eit.uni-kl.de// or clear one. Note that this method may be called when there is no
37612027Sjungma@eit.uni-kl.de// active process, but rather the main simulator is executing so we must
37712027Sjungma@eit.uni-kl.de// check for that case.
37812027Sjungma@eit.uni-kl.de//
37912027Sjungma@eit.uni-kl.de// Arguments:
38012027Sjungma@eit.uni-kl.de//     async    = true if this is an asynchronous reset.
38112027Sjungma@eit.uni-kl.de//     asserted = true if reset being asserted, false if being deasserted.
38212027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------
38312027Sjungma@eit.uni-kl.devoid sc_process_b::reset_changed( bool async, bool asserted )
38412027Sjungma@eit.uni-kl.de{
38512027Sjungma@eit.uni-kl.de
38612027Sjungma@eit.uni-kl.de    // Error out on the corner case:
38712027Sjungma@eit.uni-kl.de
38812027Sjungma@eit.uni-kl.de    if ( !sc_allow_process_control_corners && !async &&
38912027Sjungma@eit.uni-kl.de         (m_state & ps_bit_suspended) )
39012027Sjungma@eit.uni-kl.de    {
39112027Sjungma@eit.uni-kl.de	report_error( SC_ID_PROCESS_CONTROL_CORNER_CASE_,
39212027Sjungma@eit.uni-kl.de	              "synchronous reset changed on a suspended process" );
39312027Sjungma@eit.uni-kl.de    }
39412027Sjungma@eit.uni-kl.de
39512027Sjungma@eit.uni-kl.de    // IF THIS OBJECT IS PUSHING UP DAISIES WE ARE DONE:
39612027Sjungma@eit.uni-kl.de
39712027Sjungma@eit.uni-kl.de    if ( m_state & ps_bit_zombie ) return;
39812027Sjungma@eit.uni-kl.de
39912027Sjungma@eit.uni-kl.de    // Reset is being asserted:
40012027Sjungma@eit.uni-kl.de
40112027Sjungma@eit.uni-kl.de    if ( asserted )
40212027Sjungma@eit.uni-kl.de    {
40312027Sjungma@eit.uni-kl.de        // if ( m_reset_event_p ) m_reset_event_p->notify();
40412027Sjungma@eit.uni-kl.de        if ( async )
40512027Sjungma@eit.uni-kl.de	{
40612027Sjungma@eit.uni-kl.de	    m_active_areset_n++;
40712027Sjungma@eit.uni-kl.de	    if ( sc_is_running() ) throw_reset(true);
40812027Sjungma@eit.uni-kl.de	}
40912027Sjungma@eit.uni-kl.de	else
41012027Sjungma@eit.uni-kl.de	{
41112027Sjungma@eit.uni-kl.de	    m_active_reset_n++;
41212027Sjungma@eit.uni-kl.de	    if ( sc_is_running() ) throw_reset(false);
41312027Sjungma@eit.uni-kl.de	}
41412027Sjungma@eit.uni-kl.de    }
41512027Sjungma@eit.uni-kl.de
41612027Sjungma@eit.uni-kl.de    // Reset is being deasserted:
41712027Sjungma@eit.uni-kl.de
41812027Sjungma@eit.uni-kl.de    else
41912027Sjungma@eit.uni-kl.de    {
42012027Sjungma@eit.uni-kl.de        if ( async )
42112027Sjungma@eit.uni-kl.de	{
42212027Sjungma@eit.uni-kl.de	    m_active_areset_n--;
42312027Sjungma@eit.uni-kl.de	}
42412027Sjungma@eit.uni-kl.de	else
42512027Sjungma@eit.uni-kl.de	{
42612027Sjungma@eit.uni-kl.de	    m_active_reset_n--;
42712027Sjungma@eit.uni-kl.de	}
42812027Sjungma@eit.uni-kl.de    }
42912027Sjungma@eit.uni-kl.de
43012027Sjungma@eit.uni-kl.de    // Clear the throw type if there are no active resets.
43112027Sjungma@eit.uni-kl.de
43212027Sjungma@eit.uni-kl.de    if ( (m_throw_status == THROW_SYNC_RESET ||
43312027Sjungma@eit.uni-kl.de          m_throw_status == THROW_ASYNC_RESET) &&
43412027Sjungma@eit.uni-kl.de         m_active_areset_n == 0 && m_active_reset_n == 0 && !m_sticky_reset )
43512027Sjungma@eit.uni-kl.de    {
43612027Sjungma@eit.uni-kl.de        m_throw_status = THROW_NONE;
43712027Sjungma@eit.uni-kl.de    }
43812027Sjungma@eit.uni-kl.de}
43912027Sjungma@eit.uni-kl.de
44012027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------
44112027Sjungma@eit.uni-kl.de//"sc_process_b::reset_event"
44212027Sjungma@eit.uni-kl.de//
44312027Sjungma@eit.uni-kl.de// This method returns a reference to the reset event for this object
44412027Sjungma@eit.uni-kl.de// instance. If no event exists one is allocated.
44512027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------
44612027Sjungma@eit.uni-kl.desc_event& sc_process_b::reset_event()
44712027Sjungma@eit.uni-kl.de{
44812027Sjungma@eit.uni-kl.de    if ( !m_reset_event_p )
44912027Sjungma@eit.uni-kl.de    {
45012027Sjungma@eit.uni-kl.de        m_reset_event_p = new sc_event(
45112027Sjungma@eit.uni-kl.de	         (std::string(SC_KERNEL_EVENT_PREFIX)+"_reset_event").c_str() );
45212027Sjungma@eit.uni-kl.de    }
45312027Sjungma@eit.uni-kl.de    return *m_reset_event_p;
45412027Sjungma@eit.uni-kl.de}
45512027Sjungma@eit.uni-kl.de
45612027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------
45712027Sjungma@eit.uni-kl.de//"sc_process_b::reset_process"
45812027Sjungma@eit.uni-kl.de//
45912027Sjungma@eit.uni-kl.de// This inline method changes the reset state of this object instance and
46012027Sjungma@eit.uni-kl.de// conditionally its descendants.
46112027Sjungma@eit.uni-kl.de//
46212027Sjungma@eit.uni-kl.de// Notes:
46312027Sjungma@eit.uni-kl.de//   (1) It is called for sync_reset_on() and sync_reset_off(). It is not used
46412027Sjungma@eit.uni-kl.de//       for signal sensitive resets, though all reset flow ends up in
46512027Sjungma@eit.uni-kl.de//       reset_changed().
46612027Sjungma@eit.uni-kl.de//
46712027Sjungma@eit.uni-kl.de// Arguments:
46812027Sjungma@eit.uni-kl.de//     rt = source of the reset:
46912027Sjungma@eit.uni-kl.de//            * reset_asynchronous     - sc_process_handle::reset()
47012027Sjungma@eit.uni-kl.de//            * reset_synchronous_off  - sc_process_handle::sync_reset_off()
47112027Sjungma@eit.uni-kl.de//            * reset_synchronous_on   - sc_process_handle::sync_reset_on()
47212027Sjungma@eit.uni-kl.de//     descendants = indication of how to process descendants.
47312027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------
47412027Sjungma@eit.uni-kl.devoid sc_process_b::reset_process( reset_type rt,
47512027Sjungma@eit.uni-kl.de                                  sc_descendant_inclusion_info descendants )
47612027Sjungma@eit.uni-kl.de{
47712027Sjungma@eit.uni-kl.de
47812027Sjungma@eit.uni-kl.de    // PROCESS THIS OBJECT INSTANCE'S DESCENDANTS IF REQUESTED TO:
47912027Sjungma@eit.uni-kl.de
48012027Sjungma@eit.uni-kl.de    if ( descendants == SC_INCLUDE_DESCENDANTS )
48112027Sjungma@eit.uni-kl.de    {
48212027Sjungma@eit.uni-kl.de        const std::vector<sc_object*> children = get_child_objects();
48312027Sjungma@eit.uni-kl.de        int                           child_n  = children.size();
48412027Sjungma@eit.uni-kl.de
48512027Sjungma@eit.uni-kl.de        for ( int child_i = 0; child_i < child_n; child_i++ )
48612027Sjungma@eit.uni-kl.de        {
48712027Sjungma@eit.uni-kl.de            sc_process_b* child_p = DCAST<sc_process_b*>(children[child_i]);
48812027Sjungma@eit.uni-kl.de            if ( child_p ) child_p->reset_process(rt, descendants);
48912027Sjungma@eit.uni-kl.de        }
49012027Sjungma@eit.uni-kl.de    }
49112027Sjungma@eit.uni-kl.de
49212027Sjungma@eit.uni-kl.de    // PROCESS THIS OBJECT INSTANCE:
49312027Sjungma@eit.uni-kl.de
49412027Sjungma@eit.uni-kl.de    switch (rt)
49512027Sjungma@eit.uni-kl.de    {
49612027Sjungma@eit.uni-kl.de      // One-shot asynchronous reset: remove dynamic sensitivity and throw:
49712027Sjungma@eit.uni-kl.de      //
49812027Sjungma@eit.uni-kl.de      // If this is an sc_method only throw if it is active.
49912027Sjungma@eit.uni-kl.de
50012027Sjungma@eit.uni-kl.de      case reset_asynchronous:
50112027Sjungma@eit.uni-kl.de	if ( sc_get_status() != SC_RUNNING )
50212027Sjungma@eit.uni-kl.de	{
50312027Sjungma@eit.uni-kl.de	    report_error(SC_ID_RESET_PROCESS_WHILE_NOT_RUNNING_);
50412027Sjungma@eit.uni-kl.de	}
50512027Sjungma@eit.uni-kl.de	else
50612027Sjungma@eit.uni-kl.de	{
50712027Sjungma@eit.uni-kl.de	    remove_dynamic_events();
50812027Sjungma@eit.uni-kl.de	    throw_reset(true);
50912027Sjungma@eit.uni-kl.de	}
51012027Sjungma@eit.uni-kl.de        break;
51112027Sjungma@eit.uni-kl.de
51212027Sjungma@eit.uni-kl.de      // Turn on sticky synchronous reset: use standard reset mechanism.
51312027Sjungma@eit.uni-kl.de
51412027Sjungma@eit.uni-kl.de      case reset_synchronous_on:
51512027Sjungma@eit.uni-kl.de	if ( m_sticky_reset == false )
51612027Sjungma@eit.uni-kl.de	{
51712027Sjungma@eit.uni-kl.de	    m_sticky_reset = true;
51812027Sjungma@eit.uni-kl.de	    reset_changed( false, true );
51912027Sjungma@eit.uni-kl.de	}
52012027Sjungma@eit.uni-kl.de        break;
52112027Sjungma@eit.uni-kl.de
52212027Sjungma@eit.uni-kl.de      // Turn off sticky synchronous reset: use standard reset mechanism.
52312027Sjungma@eit.uni-kl.de
52412027Sjungma@eit.uni-kl.de      default:
52512027Sjungma@eit.uni-kl.de	if ( m_sticky_reset == true )
52612027Sjungma@eit.uni-kl.de	{
52712027Sjungma@eit.uni-kl.de	    m_sticky_reset = false;
52812027Sjungma@eit.uni-kl.de	    reset_changed( false, false );
52912027Sjungma@eit.uni-kl.de	}
53012027Sjungma@eit.uni-kl.de        break;
53112027Sjungma@eit.uni-kl.de    }
53212027Sjungma@eit.uni-kl.de}
53312027Sjungma@eit.uni-kl.de
53412027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------
53512027Sjungma@eit.uni-kl.de//"sc_process_b::sc_process_b"
53612027Sjungma@eit.uni-kl.de//
53712027Sjungma@eit.uni-kl.de// This is the object instance constructor for this class.
53812027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------
53912027Sjungma@eit.uni-kl.desc_process_b::sc_process_b( const char* name_p, bool is_thread, bool free_host,
54012027Sjungma@eit.uni-kl.de     SC_ENTRY_FUNC method_p, sc_process_host* host_p,
54112027Sjungma@eit.uni-kl.de     const sc_spawn_options* /* opt_p  */
54212027Sjungma@eit.uni-kl.de) :
54312027Sjungma@eit.uni-kl.de    sc_object( name_p ),
54412027Sjungma@eit.uni-kl.de    file(0),
54512027Sjungma@eit.uni-kl.de    lineno(0),
54612027Sjungma@eit.uni-kl.de    proc_id( simcontext()->next_proc_id()),
54712027Sjungma@eit.uni-kl.de    m_active_areset_n(0),
54812027Sjungma@eit.uni-kl.de    m_active_reset_n(0),
54912027Sjungma@eit.uni-kl.de    m_dont_init( false ),
55012027Sjungma@eit.uni-kl.de    m_dynamic_proc( simcontext()->elaboration_done() ),
55112027Sjungma@eit.uni-kl.de    m_event_p(0),
55212027Sjungma@eit.uni-kl.de    m_event_count(0),
55312027Sjungma@eit.uni-kl.de    m_event_list_p(0),
55412027Sjungma@eit.uni-kl.de    m_exist_p(0),
55512027Sjungma@eit.uni-kl.de    m_free_host( free_host ),
55612027Sjungma@eit.uni-kl.de    m_has_reset_signal( false ),
55712027Sjungma@eit.uni-kl.de    m_has_stack(false),
55812027Sjungma@eit.uni-kl.de    m_is_thread(is_thread),
55912027Sjungma@eit.uni-kl.de    m_last_report_p(0),
56012027Sjungma@eit.uni-kl.de    m_name_gen_p(0),
56112027Sjungma@eit.uni-kl.de    m_process_kind(SC_NO_PROC_),
56212027Sjungma@eit.uni-kl.de    m_references_n(1),
56312027Sjungma@eit.uni-kl.de    m_resets(),
56412027Sjungma@eit.uni-kl.de    m_reset_event_p(0),
56512027Sjungma@eit.uni-kl.de    m_resume_event_p(0),
56612027Sjungma@eit.uni-kl.de    m_runnable_p(0),
56712027Sjungma@eit.uni-kl.de    m_semantics_host_p( host_p ),
56812027Sjungma@eit.uni-kl.de    m_semantics_method_p ( method_p ),
56912027Sjungma@eit.uni-kl.de    m_state(ps_normal),
57012027Sjungma@eit.uni-kl.de    m_static_events(),
57112027Sjungma@eit.uni-kl.de    m_sticky_reset(false),
57212027Sjungma@eit.uni-kl.de    m_term_event_p(0),
57312027Sjungma@eit.uni-kl.de    m_throw_helper_p(0),
57412027Sjungma@eit.uni-kl.de    m_throw_status( THROW_NONE ),
57512027Sjungma@eit.uni-kl.de    m_timed_out(false),
57612027Sjungma@eit.uni-kl.de    m_timeout_event_p(0),
57712027Sjungma@eit.uni-kl.de    m_trigger_type(STATIC),
57812027Sjungma@eit.uni-kl.de    m_unwinding(false)
57912027Sjungma@eit.uni-kl.de{
58012027Sjungma@eit.uni-kl.de
58112027Sjungma@eit.uni-kl.de    // THIS OBJECT INSTANCE IS NOW THE LAST CREATED PROCESS:
58212027Sjungma@eit.uni-kl.de
58312027Sjungma@eit.uni-kl.de    m_last_created_process_p = this;
58412027Sjungma@eit.uni-kl.de    m_timeout_event_p = new sc_event(
58512027Sjungma@eit.uni-kl.de	          (std::string(SC_KERNEL_EVENT_PREFIX)+"_free_event").c_str() );
58612027Sjungma@eit.uni-kl.de}
58712027Sjungma@eit.uni-kl.de
58812027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------
58912027Sjungma@eit.uni-kl.de//"sc_process_b::~sc_process_b"
59012027Sjungma@eit.uni-kl.de//
59112027Sjungma@eit.uni-kl.de// This is the object instance destructor for this class.
59212027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------
59312027Sjungma@eit.uni-kl.desc_process_b::~sc_process_b()
59412027Sjungma@eit.uni-kl.de{
59512027Sjungma@eit.uni-kl.de
59612027Sjungma@eit.uni-kl.de    // REDIRECT ANY CHILDREN AS CHILDREN OF THE SIMULATION CONTEXT:
59712027Sjungma@eit.uni-kl.de
59812027Sjungma@eit.uni-kl.de    orphan_child_objects();
59912027Sjungma@eit.uni-kl.de
60012027Sjungma@eit.uni-kl.de
60112027Sjungma@eit.uni-kl.de    // DELETE SEMANTICS OBJECTS IF NEED BE:
60212027Sjungma@eit.uni-kl.de
60312027Sjungma@eit.uni-kl.de    if ( m_free_host ) delete m_semantics_host_p;
60412027Sjungma@eit.uni-kl.de#   if !defined(SC_USE_MEMBER_FUNC_PTR) // Remove invocation object.
60512027Sjungma@eit.uni-kl.de        delete m_semantics_method_p;
60612027Sjungma@eit.uni-kl.de#   endif
60712027Sjungma@eit.uni-kl.de
60812027Sjungma@eit.uni-kl.de
60912027Sjungma@eit.uni-kl.de    // REMOVE ANY STRUCTURES THAT MAY HAVE BEEN BUILT:
61012027Sjungma@eit.uni-kl.de
61112027Sjungma@eit.uni-kl.de    delete m_last_report_p;
61212027Sjungma@eit.uni-kl.de    delete m_name_gen_p;
61312027Sjungma@eit.uni-kl.de    delete m_reset_event_p;
61412027Sjungma@eit.uni-kl.de    delete m_resume_event_p;
61512027Sjungma@eit.uni-kl.de    delete m_term_event_p;
61612027Sjungma@eit.uni-kl.de    delete m_throw_helper_p;
61712027Sjungma@eit.uni-kl.de    delete m_timeout_event_p;
61812027Sjungma@eit.uni-kl.de
61912027Sjungma@eit.uni-kl.de}
62012027Sjungma@eit.uni-kl.de
62112027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------
62212027Sjungma@eit.uni-kl.de//"sc_process_b::terminated_event"
62312027Sjungma@eit.uni-kl.de//
62412027Sjungma@eit.uni-kl.de// This method returns a reference to the terminated event for this object
62512027Sjungma@eit.uni-kl.de// instance. If no event exists one is allocated.
62612027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------
62712027Sjungma@eit.uni-kl.desc_event& sc_process_b::terminated_event()
62812027Sjungma@eit.uni-kl.de{
62912027Sjungma@eit.uni-kl.de    if ( !m_term_event_p )
63012027Sjungma@eit.uni-kl.de    {
63112027Sjungma@eit.uni-kl.de        m_term_event_p = new sc_event(
63212027Sjungma@eit.uni-kl.de	          (std::string(SC_KERNEL_EVENT_PREFIX)+"_term_event").c_str() );
63312027Sjungma@eit.uni-kl.de    }
63412027Sjungma@eit.uni-kl.de    return *m_term_event_p;
63512027Sjungma@eit.uni-kl.de}
63612027Sjungma@eit.uni-kl.de
63712027Sjungma@eit.uni-kl.de// +----------------------------------------------------------------------------
63812027Sjungma@eit.uni-kl.de// |"sc_process_b::trigger_reset_event"
63912027Sjungma@eit.uni-kl.de// |
64012027Sjungma@eit.uni-kl.de// | This method triggers the notify event. It exists because we can't get
64112027Sjungma@eit.uni-kl.de// | sc_event context in sc_process.h because the includes would be
64212027Sjungma@eit.uni-kl.de// | circular... sigh...
64312027Sjungma@eit.uni-kl.de// +----------------------------------------------------------------------------
64412027Sjungma@eit.uni-kl.devoid sc_process_b::trigger_reset_event()
64512027Sjungma@eit.uni-kl.de{
64612027Sjungma@eit.uni-kl.de    if ( m_reset_event_p ) m_reset_event_p->notify();
64712027Sjungma@eit.uni-kl.de}
64812027Sjungma@eit.uni-kl.de
64912027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------
65012027Sjungma@eit.uni-kl.de//"sc_process_handle::operator sc_cthread_handle"
65112027Sjungma@eit.uni-kl.de//
65212027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------
65312027Sjungma@eit.uni-kl.desc_process_handle::operator sc_cthread_handle()
65412027Sjungma@eit.uni-kl.de{
65512027Sjungma@eit.uni-kl.de    return DCAST<sc_cthread_handle>(m_target_p);
65612027Sjungma@eit.uni-kl.de}
65712027Sjungma@eit.uni-kl.de
65812027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------
65912027Sjungma@eit.uni-kl.de//"sc_process_handle::sc_method_handle"
66012027Sjungma@eit.uni-kl.de//
66112027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------
66212027Sjungma@eit.uni-kl.desc_process_handle::operator sc_method_handle()
66312027Sjungma@eit.uni-kl.de{
66412027Sjungma@eit.uni-kl.de    return DCAST<sc_method_handle>(m_target_p);
66512027Sjungma@eit.uni-kl.de}
66612027Sjungma@eit.uni-kl.de
66712027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------
66812027Sjungma@eit.uni-kl.de//"sc_process_handle::sc_thread_handle"
66912027Sjungma@eit.uni-kl.de//
67012027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------
67112027Sjungma@eit.uni-kl.desc_process_handle::operator sc_thread_handle()
67212027Sjungma@eit.uni-kl.de{
67312027Sjungma@eit.uni-kl.de    return DCAST<sc_thread_handle>(m_target_p);
67412027Sjungma@eit.uni-kl.de}
67512027Sjungma@eit.uni-kl.de
67612027Sjungma@eit.uni-kl.de} // namespace sc_core
67712027Sjungma@eit.uni-kl.de
67812027Sjungma@eit.uni-kl.de
67912027Sjungma@eit.uni-kl.de/*****************************************************************************
68012027Sjungma@eit.uni-kl.de
68112027Sjungma@eit.uni-kl.de  MODIFICATION LOG - modifiers, enter your name, affiliation, date and
68212027Sjungma@eit.uni-kl.de  changes you are making here.
68312027Sjungma@eit.uni-kl.de
68412027Sjungma@eit.uni-kl.de      Name, Affiliation, Date: Andy Goodrich, Forte Design Systems, 12 Aug 05
68512027Sjungma@eit.uni-kl.de  Description of Modification: This is the rewrite of process support. It
68612027Sjungma@eit.uni-kl.de                               contains some code from the now-defunct
68712027Sjungma@eit.uni-kl.de                               sc_process_b.cpp, as well as the former
68812027Sjungma@eit.uni-kl.de                               version of sc_process_b.cpp.
68912027Sjungma@eit.uni-kl.de
69012027Sjungma@eit.uni-kl.de      Name, Affiliation, Date:
69112027Sjungma@eit.uni-kl.de  Description of Modification:
69212027Sjungma@eit.uni-kl.de
69312027Sjungma@eit.uni-kl.de *****************************************************************************/
69412027Sjungma@eit.uni-kl.de
69512027Sjungma@eit.uni-kl.de// $Log: sc_process.cpp,v $
69612027Sjungma@eit.uni-kl.de// Revision 1.37  2011/08/24 22:05:51  acg
69712027Sjungma@eit.uni-kl.de//  Torsten Maehne: initialization changes to remove warnings.
69812027Sjungma@eit.uni-kl.de//
69912027Sjungma@eit.uni-kl.de// Revision 1.36  2011/08/15 16:43:24  acg
70012027Sjungma@eit.uni-kl.de//  Torsten Maehne: changes to remove unused argument warnings.
70112027Sjungma@eit.uni-kl.de//
70212027Sjungma@eit.uni-kl.de// Revision 1.35  2011/08/07 19:08:04  acg
70312027Sjungma@eit.uni-kl.de//  Andy Goodrich: moved logs to end of file so line number synching works
70412027Sjungma@eit.uni-kl.de//  better between versions.
70512027Sjungma@eit.uni-kl.de//
70612027Sjungma@eit.uni-kl.de// Revision 1.34  2011/07/29 22:55:01  acg
70712027Sjungma@eit.uni-kl.de//  Philipp A. Hartmann: add missing include.
70812027Sjungma@eit.uni-kl.de//
70912027Sjungma@eit.uni-kl.de// Revision 1.33  2011/07/29 22:43:41  acg
71012027Sjungma@eit.uni-kl.de//   Philipp A. Hartmann: changes to handle case where a process control
71112027Sjungma@eit.uni-kl.de//   invocation on a child process causes the list of child processes to change.
71212027Sjungma@eit.uni-kl.de//
71312027Sjungma@eit.uni-kl.de// Revision 1.32  2011/07/24 11:20:03  acg
71412027Sjungma@eit.uni-kl.de//  Philipp A. Hartmann: process control error message improvements:
71512027Sjungma@eit.uni-kl.de//  (1) Downgrade error to warning for re-kills of processes.
71612027Sjungma@eit.uni-kl.de//  (2) Add process name to process messages.
71712027Sjungma@eit.uni-kl.de//  (3) drop some superfluous colons in messages.
71812027Sjungma@eit.uni-kl.de//
71912027Sjungma@eit.uni-kl.de// Revision 1.31  2011/04/19 15:04:27  acg
72012027Sjungma@eit.uni-kl.de//  Philipp A. Hartmann: clean up SC_ID messages.
72112027Sjungma@eit.uni-kl.de//
72212027Sjungma@eit.uni-kl.de// Revision 1.30  2011/04/14 22:33:43  acg
72312027Sjungma@eit.uni-kl.de//  Andy Goodrich: added missing checks for a process being a zombie.
72412027Sjungma@eit.uni-kl.de//
72512027Sjungma@eit.uni-kl.de// Revision 1.29  2011/04/13 05:00:43  acg
72612027Sjungma@eit.uni-kl.de//  Andy Goodrich: removed check for method process in termination_event()
72712027Sjungma@eit.uni-kl.de//  since with the new IEEE 1666 2011 its legal.
72812027Sjungma@eit.uni-kl.de//
72912027Sjungma@eit.uni-kl.de// Revision 1.28  2011/04/13 02:44:26  acg
73012027Sjungma@eit.uni-kl.de//  Andy Goodrich: added m_unwinding flag in place of THROW_NOW because the
73112027Sjungma@eit.uni-kl.de//  throw status will be set back to THROW_*_RESET if reset is active and
73212027Sjungma@eit.uni-kl.de//  the check for an unwind being complete was expecting THROW_NONE as the
73312027Sjungma@eit.uni-kl.de//  clearing of THROW_NOW.
73412027Sjungma@eit.uni-kl.de//
73512027Sjungma@eit.uni-kl.de// Revision 1.27  2011/04/10 22:17:35  acg
73612027Sjungma@eit.uni-kl.de//  Andy Goodrich: added trigger_reset_event() to allow sc_process.h to
73712027Sjungma@eit.uni-kl.de//  contain the run_process() inline method. sc_process.h cannot have
73812027Sjungma@eit.uni-kl.de//  sc_simcontext information because of recursive includes.
73912027Sjungma@eit.uni-kl.de//
74012027Sjungma@eit.uni-kl.de// Revision 1.26  2011/04/08 22:33:08  acg
74112027Sjungma@eit.uni-kl.de//  Andy Goodrich: moved the semantics() method to the header file and made
74212027Sjungma@eit.uni-kl.de//  it an inline method.
74312027Sjungma@eit.uni-kl.de//
74412027Sjungma@eit.uni-kl.de// Revision 1.25  2011/04/08 18:24:48  acg
74512027Sjungma@eit.uni-kl.de//  Andy Goodrich: moved reset_changed() to .cpp since it needs visibility
74612027Sjungma@eit.uni-kl.de//  to sc_simcontext.
74712027Sjungma@eit.uni-kl.de//
74812027Sjungma@eit.uni-kl.de// Revision 1.24  2011/04/05 20:50:57  acg
74912027Sjungma@eit.uni-kl.de//  Andy Goodrich:
75012027Sjungma@eit.uni-kl.de//    (1) changes to make sure that event(), posedge() and negedge() only
75112027Sjungma@eit.uni-kl.de//        return true if the clock has not moved.
75212027Sjungma@eit.uni-kl.de//    (2) fixes for method self-resumes.
75312027Sjungma@eit.uni-kl.de//    (3) added SC_PRERELEASE_VERSION
75412027Sjungma@eit.uni-kl.de//    (4) removed kernel events from the object hierarchy, added
75512027Sjungma@eit.uni-kl.de//        sc_hierarchy_name_exists().
75612027Sjungma@eit.uni-kl.de//
75712027Sjungma@eit.uni-kl.de// Revision 1.23  2011/04/05 06:25:38  acg
75812027Sjungma@eit.uni-kl.de//  Andy Goodrich: new checks for simulation running in reset_process().
75912027Sjungma@eit.uni-kl.de//
76012027Sjungma@eit.uni-kl.de// Revision 1.22  2011/03/20 13:43:23  acg
76112027Sjungma@eit.uni-kl.de//  Andy Goodrich: added async_signal_is() plus suspend() as a corner case.
76212027Sjungma@eit.uni-kl.de//
76312027Sjungma@eit.uni-kl.de// Revision 1.21  2011/03/12 21:07:51  acg
76412027Sjungma@eit.uni-kl.de//  Andy Goodrich: changes to kernel generated event support.
76512027Sjungma@eit.uni-kl.de//
76612027Sjungma@eit.uni-kl.de// Revision 1.20  2011/03/07 17:38:43  acg
76712027Sjungma@eit.uni-kl.de//  Andy Goodrich: tightening up of checks for undefined interaction between
76812027Sjungma@eit.uni-kl.de//  synchronous reset and suspend.
76912027Sjungma@eit.uni-kl.de//
77012027Sjungma@eit.uni-kl.de// Revision 1.19  2011/03/06 23:30:13  acg
77112027Sjungma@eit.uni-kl.de//  Andy Goodrich: refining suspend - sync reset corner case checking so that
77212027Sjungma@eit.uni-kl.de//  the following are error situations:
77312027Sjungma@eit.uni-kl.de//    (1) Calling suspend on a process with a reset_signal_is() specification
77412027Sjungma@eit.uni-kl.de//        or sync_reset_on() is active.
77512027Sjungma@eit.uni-kl.de//    (2) Calling sync_reset_on() on a suspended process.
77612027Sjungma@eit.uni-kl.de//
77712027Sjungma@eit.uni-kl.de// Revision 1.18  2011/03/06 19:57:11  acg
77812027Sjungma@eit.uni-kl.de//  Andy Goodrich: refinements for the illegal suspend - synchronous reset
77912027Sjungma@eit.uni-kl.de//  interaction.
78012027Sjungma@eit.uni-kl.de//
78112027Sjungma@eit.uni-kl.de// Revision 1.17  2011/03/06 16:47:09  acg
78212027Sjungma@eit.uni-kl.de//  Andy Goodrich: changes for testing sync_reset - suspend corner cases.
78312027Sjungma@eit.uni-kl.de//
78412027Sjungma@eit.uni-kl.de// Revision 1.16  2011/03/06 15:57:57  acg
78512027Sjungma@eit.uni-kl.de//  Andy Goodrich: added process control corner case checks. Changes for
78612027Sjungma@eit.uni-kl.de//  named events.
78712027Sjungma@eit.uni-kl.de//
78812027Sjungma@eit.uni-kl.de// Revision 1.15  2011/02/18 20:27:14  acg
78912027Sjungma@eit.uni-kl.de//  Andy Goodrich: Updated Copyrights.
79012027Sjungma@eit.uni-kl.de//
79112027Sjungma@eit.uni-kl.de// Revision 1.14  2011/02/17 19:52:13  acg
79212027Sjungma@eit.uni-kl.de//  Andy Goodrich:
79312027Sjungma@eit.uni-kl.de//    (1) Simplfied process control usage.
79412027Sjungma@eit.uni-kl.de//    (2) Changed dump_status() to dump_state with new signature.
79512027Sjungma@eit.uni-kl.de//
79612027Sjungma@eit.uni-kl.de// Revision 1.13  2011/02/13 21:47:37  acg
79712027Sjungma@eit.uni-kl.de//  Andy Goodrich: update copyright notice.
79812027Sjungma@eit.uni-kl.de//
79912027Sjungma@eit.uni-kl.de// Revision 1.12  2011/02/13 21:41:34  acg
80012027Sjungma@eit.uni-kl.de//  Andy Goodrich: get the log messages for the previous check in correct.
80112027Sjungma@eit.uni-kl.de//
80212027Sjungma@eit.uni-kl.de// Revision 1.11  2011/02/13 21:32:24  acg
80312027Sjungma@eit.uni-kl.de//  Andy Goodrich: moved sc_process_b::reset_process() from header file
80412027Sjungma@eit.uni-kl.de//  to cpp file. Added dump_status() to print out the status of a
80512027Sjungma@eit.uni-kl.de//  process.
80612027Sjungma@eit.uni-kl.de//
80712027Sjungma@eit.uni-kl.de// Revision 1.10  2011/02/04 15:27:36  acg
80812027Sjungma@eit.uni-kl.de//  Andy Goodrich: changes for suspend-resume semantics.
80912027Sjungma@eit.uni-kl.de//
81012027Sjungma@eit.uni-kl.de// Revision 1.9  2011/02/01 21:06:12  acg
81112027Sjungma@eit.uni-kl.de//  Andy Goodrich: new layout for the process_state enum.
81212027Sjungma@eit.uni-kl.de//
81312027Sjungma@eit.uni-kl.de// Revision 1.8  2011/01/25 20:50:37  acg
81412027Sjungma@eit.uni-kl.de//  Andy Goodrich: changes for IEEE 1666 2011.
81512027Sjungma@eit.uni-kl.de//
81612027Sjungma@eit.uni-kl.de// Revision 1.7  2011/01/19 23:21:50  acg
81712027Sjungma@eit.uni-kl.de//  Andy Goodrich: changes for IEEE 1666 2011
81812027Sjungma@eit.uni-kl.de//
81912027Sjungma@eit.uni-kl.de// Revision 1.6  2011/01/18 20:10:45  acg
82012027Sjungma@eit.uni-kl.de//  Andy Goodrich: changes for IEEE1666_2011 semantics.
82112027Sjungma@eit.uni-kl.de//
82212027Sjungma@eit.uni-kl.de// Revision 1.5  2010/07/22 20:02:33  acg
82312027Sjungma@eit.uni-kl.de//  Andy Goodrich: bug fixes.
82412027Sjungma@eit.uni-kl.de//
82512027Sjungma@eit.uni-kl.de// Revision 1.4  2009/05/22 16:06:29  acg
82612027Sjungma@eit.uni-kl.de//  Andy Goodrich: process control updates.
82712027Sjungma@eit.uni-kl.de//
82812027Sjungma@eit.uni-kl.de// Revision 1.3  2008/05/22 17:06:26  acg
82912027Sjungma@eit.uni-kl.de//  Andy Goodrich: updated copyright notice to include 2008.
83012027Sjungma@eit.uni-kl.de//
83112027Sjungma@eit.uni-kl.de// Revision 1.2  2007/09/20 20:32:35  acg
83212027Sjungma@eit.uni-kl.de//  Andy Goodrich: changes to the semantics of throw_it() to match the
83312027Sjungma@eit.uni-kl.de//  specification. A call to throw_it() will immediately suspend the calling
83412027Sjungma@eit.uni-kl.de//  thread until all the throwees have executed. At that point the calling
83512027Sjungma@eit.uni-kl.de//  thread will be restarted before the execution of any other threads.
83612027Sjungma@eit.uni-kl.de//
83712027Sjungma@eit.uni-kl.de// Revision 1.1.1.1  2006/12/15 20:20:05  acg
83812027Sjungma@eit.uni-kl.de// SystemC 2.3
83912027Sjungma@eit.uni-kl.de//
84012027Sjungma@eit.uni-kl.de// Revision 1.6  2006/04/20 17:08:17  acg
84112027Sjungma@eit.uni-kl.de//  Andy Goodrich: 3.0 style process changes.
84212027Sjungma@eit.uni-kl.de//
84312027Sjungma@eit.uni-kl.de// Revision 1.5  2006/04/11 23:13:21  acg
84412027Sjungma@eit.uni-kl.de//   Andy Goodrich: Changes for reduced reset support that only includes
84512027Sjungma@eit.uni-kl.de//   sc_cthread, but has preliminary hooks for expanding to method and thread
84612027Sjungma@eit.uni-kl.de//   processes also.
84712027Sjungma@eit.uni-kl.de//
84812027Sjungma@eit.uni-kl.de// Revision 1.4  2006/01/24 20:49:05  acg
84912027Sjungma@eit.uni-kl.de// Andy Goodrich: changes to remove the use of deprecated features within the
85012027Sjungma@eit.uni-kl.de// simulator, and to issue warning messages when deprecated features are used.
85112027Sjungma@eit.uni-kl.de//
85212027Sjungma@eit.uni-kl.de// Revision 1.3  2006/01/13 18:44:30  acg
85312027Sjungma@eit.uni-kl.de// Added $Log to record CVS changes into the source.
85412027Sjungma@eit.uni-kl.de//
855