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_thread_process.h -- Thread process declarations
2312027Sjungma@eit.uni-kl.de
2412027Sjungma@eit.uni-kl.de  Original Author: Andy Goodrich, Forte Design Systems, 4 August 2005
2512027Sjungma@eit.uni-kl.de
2612027Sjungma@eit.uni-kl.de
2712027Sjungma@eit.uni-kl.de  CHANGE LOG AT THE END OF THE FILE
2812027Sjungma@eit.uni-kl.de *****************************************************************************/
2912027Sjungma@eit.uni-kl.de
3012027Sjungma@eit.uni-kl.de
3112027Sjungma@eit.uni-kl.de#if !defined(sc_thread_process_h_INCLUDED)
3212027Sjungma@eit.uni-kl.de#define sc_thread_process_h_INCLUDED
3312027Sjungma@eit.uni-kl.de
3412027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_spawn_options.h"
3512027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_process.h"
3612027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_cor.h"
3712027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_event.h"
3812027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_except.h"
3912027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_reset.h"
4012027Sjungma@eit.uni-kl.de
4112027Sjungma@eit.uni-kl.de// DEBUGGING MACROS:
4212027Sjungma@eit.uni-kl.de//
4312027Sjungma@eit.uni-kl.de// DEBUG_MSG(NAME,P,MSG)
4412027Sjungma@eit.uni-kl.de//     MSG  = message to print
4512027Sjungma@eit.uni-kl.de//     NAME = name that must match the process for the message to print, or
4612027Sjungma@eit.uni-kl.de//            null if the message should be printed unconditionally.
4712027Sjungma@eit.uni-kl.de//     P    = pointer to process message is for, or NULL in which case the
4812027Sjungma@eit.uni-kl.de//            message will not print.
4912027Sjungma@eit.uni-kl.de#if 0
5012027Sjungma@eit.uni-kl.de#   define DEBUG_NAME ""
5112027Sjungma@eit.uni-kl.de#   define DEBUG_MSG(NAME,P,MSG) \
5212027Sjungma@eit.uni-kl.de    { \
5312027Sjungma@eit.uni-kl.de        if ( P && ( (strlen(NAME)==0) || !strcmp(NAME,P->name())) ) \
5412027Sjungma@eit.uni-kl.de          std::cout << "**** " << sc_time_stamp() << " ("  \
5512027Sjungma@eit.uni-kl.de	            << sc_get_current_process_name() << "): " << MSG \
5612027Sjungma@eit.uni-kl.de		    << " - " << P->name() << std::endl; \
5712027Sjungma@eit.uni-kl.de    }
5812027Sjungma@eit.uni-kl.de#else
5912027Sjungma@eit.uni-kl.de#   define DEBUG_MSG(NAME,P,MSG)
6012027Sjungma@eit.uni-kl.de#endif
6112027Sjungma@eit.uni-kl.de
6212027Sjungma@eit.uni-kl.de
6312027Sjungma@eit.uni-kl.denamespace sc_core {
6412027Sjungma@eit.uni-kl.de
6512027Sjungma@eit.uni-kl.de// forward references:
6612027Sjungma@eit.uni-kl.declass sc_event_and_list;
6712027Sjungma@eit.uni-kl.declass sc_event_or_list;
6812027Sjungma@eit.uni-kl.declass sc_reset;
6912027Sjungma@eit.uni-kl.devoid sc_thread_cor_fn( void* );
7012027Sjungma@eit.uni-kl.devoid sc_set_stack_size( sc_thread_handle, std::size_t );
7112027Sjungma@eit.uni-kl.declass sc_event;
7212027Sjungma@eit.uni-kl.declass sc_join;
7312027Sjungma@eit.uni-kl.declass sc_module;
7412027Sjungma@eit.uni-kl.declass sc_process_handle;
7512027Sjungma@eit.uni-kl.declass sc_process_table;
7612027Sjungma@eit.uni-kl.declass sc_simcontext;
7712027Sjungma@eit.uni-kl.declass sc_runnable;
7812027Sjungma@eit.uni-kl.de
7912027Sjungma@eit.uni-kl.desc_cor* get_cor_pointer( sc_process_b* process_p );
8012027Sjungma@eit.uni-kl.devoid sc_set_stack_size( sc_thread_handle thread_h, std::size_t size );
8112027Sjungma@eit.uni-kl.devoid wait( sc_simcontext* );
8212027Sjungma@eit.uni-kl.devoid wait( const sc_event&, sc_simcontext* );
8312027Sjungma@eit.uni-kl.devoid wait( const sc_event_or_list&, sc_simcontext* );
8412027Sjungma@eit.uni-kl.devoid wait( const sc_event_and_list&, sc_simcontext* );
8512027Sjungma@eit.uni-kl.devoid wait( const sc_time&, sc_simcontext* );
8612027Sjungma@eit.uni-kl.devoid wait( const sc_time&, const sc_event&, sc_simcontext* );
8712027Sjungma@eit.uni-kl.devoid wait( const sc_time&, const sc_event_or_list&, sc_simcontext* );
8812027Sjungma@eit.uni-kl.devoid wait( const sc_time&, const sc_event_and_list&, sc_simcontext* );
8912027Sjungma@eit.uni-kl.de
9012027Sjungma@eit.uni-kl.de//==============================================================================
9112027Sjungma@eit.uni-kl.de// sc_thread_process -
9212027Sjungma@eit.uni-kl.de//
9312027Sjungma@eit.uni-kl.de//==============================================================================
9412027Sjungma@eit.uni-kl.declass sc_thread_process : public sc_process_b {
9512027Sjungma@eit.uni-kl.de    friend void sc_thread_cor_fn( void* );
9612027Sjungma@eit.uni-kl.de    friend void sc_set_stack_size( sc_thread_handle, std::size_t );
9712027Sjungma@eit.uni-kl.de    friend class sc_event;
9812027Sjungma@eit.uni-kl.de    friend class sc_join;
9912027Sjungma@eit.uni-kl.de    friend class sc_module;
10012027Sjungma@eit.uni-kl.de    friend class sc_process_b;
10112027Sjungma@eit.uni-kl.de    friend class sc_process_handle;
10212027Sjungma@eit.uni-kl.de    friend class sc_process_table;
10312027Sjungma@eit.uni-kl.de    friend class sc_simcontext;
10412027Sjungma@eit.uni-kl.de    friend class sc_runnable;
10512027Sjungma@eit.uni-kl.de    friend sc_cor* get_cor_pointer( sc_process_b* process_p );
10612027Sjungma@eit.uni-kl.de
10712027Sjungma@eit.uni-kl.de    friend void wait( sc_simcontext* );
10812027Sjungma@eit.uni-kl.de    friend void wait( const sc_event&, sc_simcontext* );
10912027Sjungma@eit.uni-kl.de    friend void wait( const sc_event_or_list&, sc_simcontext* );
11012027Sjungma@eit.uni-kl.de    friend void wait( const sc_event_and_list&, sc_simcontext* );
11112027Sjungma@eit.uni-kl.de    friend void wait( const sc_time&, sc_simcontext* );
11212027Sjungma@eit.uni-kl.de    friend void wait( const sc_time&, const sc_event&, sc_simcontext* );
11312027Sjungma@eit.uni-kl.de    friend void wait( const sc_time&, const sc_event_or_list&, sc_simcontext* );
11412027Sjungma@eit.uni-kl.de    friend void wait( const sc_time&, const sc_event_and_list&, sc_simcontext*);
11512027Sjungma@eit.uni-kl.de  public:
11612027Sjungma@eit.uni-kl.de    sc_thread_process( const char* name_p, bool free_host,
11712027Sjungma@eit.uni-kl.de        SC_ENTRY_FUNC method_p, sc_process_host* host_p,
11812027Sjungma@eit.uni-kl.de        const sc_spawn_options* opt_p );
11912027Sjungma@eit.uni-kl.de
12012027Sjungma@eit.uni-kl.de    virtual const char* kind() const
12112027Sjungma@eit.uni-kl.de        { return "sc_thread_process"; }
12212027Sjungma@eit.uni-kl.de
12312027Sjungma@eit.uni-kl.de  protected:
12412027Sjungma@eit.uni-kl.de    // may not be deleted manually (called from sc_process_b)
12512027Sjungma@eit.uni-kl.de    virtual ~sc_thread_process();
12612027Sjungma@eit.uni-kl.de
12712027Sjungma@eit.uni-kl.de    virtual void disable_process(
12812027Sjungma@eit.uni-kl.de        sc_descendant_inclusion_info descendants = SC_NO_DESCENDANTS );
12912027Sjungma@eit.uni-kl.de    virtual void enable_process(
13012027Sjungma@eit.uni-kl.de        sc_descendant_inclusion_info descendants = SC_NO_DESCENDANTS );
13112027Sjungma@eit.uni-kl.de    virtual void kill_process(
13212027Sjungma@eit.uni-kl.de        sc_descendant_inclusion_info descendants = SC_NO_DESCENDANTS );
13312027Sjungma@eit.uni-kl.de    sc_thread_handle next_exist();
13412027Sjungma@eit.uni-kl.de    sc_thread_handle next_runnable();
13512027Sjungma@eit.uni-kl.de    virtual void prepare_for_simulation();
13612027Sjungma@eit.uni-kl.de    virtual void resume_process(
13712027Sjungma@eit.uni-kl.de        sc_descendant_inclusion_info descendants = SC_NO_DESCENDANTS );
13812027Sjungma@eit.uni-kl.de    void set_next_exist( sc_thread_handle next_p );
13912027Sjungma@eit.uni-kl.de    void set_next_runnable( sc_thread_handle next_p );
14012027Sjungma@eit.uni-kl.de
14112027Sjungma@eit.uni-kl.de    void set_stack_size( std::size_t size );
14212027Sjungma@eit.uni-kl.de    inline void suspend_me();
14312027Sjungma@eit.uni-kl.de    virtual void suspend_process(
14412027Sjungma@eit.uni-kl.de        sc_descendant_inclusion_info descendants = SC_NO_DESCENDANTS );
14512027Sjungma@eit.uni-kl.de    virtual void throw_reset( bool async );
14612027Sjungma@eit.uni-kl.de    virtual void throw_user( const sc_throw_it_helper& helper,
14712027Sjungma@eit.uni-kl.de        sc_descendant_inclusion_info descendants = SC_NO_DESCENDANTS );
14812027Sjungma@eit.uni-kl.de
14912027Sjungma@eit.uni-kl.de    bool trigger_dynamic( sc_event* );
15012027Sjungma@eit.uni-kl.de    inline void trigger_static();
15112027Sjungma@eit.uni-kl.de
15212027Sjungma@eit.uni-kl.de    void wait( const sc_event& );
15312027Sjungma@eit.uni-kl.de    void wait( const sc_event_or_list& );
15412027Sjungma@eit.uni-kl.de    void wait( const sc_event_and_list& );
15512027Sjungma@eit.uni-kl.de    void wait( const sc_time& );
15612027Sjungma@eit.uni-kl.de    void wait( const sc_time&, const sc_event& );
15712027Sjungma@eit.uni-kl.de    void wait( const sc_time&, const sc_event_or_list& );
15812027Sjungma@eit.uni-kl.de    void wait( const sc_time&, const sc_event_and_list& );
15912027Sjungma@eit.uni-kl.de    void wait_cycles( int n=1 );
16012027Sjungma@eit.uni-kl.de
16112027Sjungma@eit.uni-kl.de  protected:
16212027Sjungma@eit.uni-kl.de    void add_monitor( sc_process_monitor* monitor_p );
16312027Sjungma@eit.uni-kl.de    void remove_monitor( sc_process_monitor* monitor_p);
16412027Sjungma@eit.uni-kl.de    void signal_monitors( int type = 0 );
16512027Sjungma@eit.uni-kl.de
16612027Sjungma@eit.uni-kl.de  protected:
16712027Sjungma@eit.uni-kl.de    sc_cor*                          m_cor_p;        // Thread's coroutine.
16812027Sjungma@eit.uni-kl.de    std::vector<sc_process_monitor*> m_monitor_q;    // Thread monitors.
16912027Sjungma@eit.uni-kl.de    std::size_t                      m_stack_size;   // Thread stack size.
17012027Sjungma@eit.uni-kl.de    int                              m_wait_cycle_n; // # of waits to be done.
17112027Sjungma@eit.uni-kl.de
17212027Sjungma@eit.uni-kl.de  private: // disabled
17312027Sjungma@eit.uni-kl.de    sc_thread_process( const sc_thread_process& );
17412027Sjungma@eit.uni-kl.de    const sc_thread_process& operator = ( const sc_thread_process& );
17512027Sjungma@eit.uni-kl.de
17612027Sjungma@eit.uni-kl.de};
17712027Sjungma@eit.uni-kl.de
17812027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------
17912027Sjungma@eit.uni-kl.de//"sc_thread_process::set_stack_size"
18012027Sjungma@eit.uni-kl.de//
18112027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------
18212027Sjungma@eit.uni-kl.deinline void sc_thread_process::set_stack_size( std::size_t size )
18312027Sjungma@eit.uni-kl.de{
18412027Sjungma@eit.uni-kl.de    assert( size );
18512027Sjungma@eit.uni-kl.de    m_stack_size = size;
18612027Sjungma@eit.uni-kl.de}
18712027Sjungma@eit.uni-kl.de
18812027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------
18912027Sjungma@eit.uni-kl.de//"sc_thread_process::suspend_me"
19012027Sjungma@eit.uni-kl.de//
19112027Sjungma@eit.uni-kl.de// This method suspends this object instance in favor of the next runnable
19212027Sjungma@eit.uni-kl.de// process. Upon awakening we check to see if an exception should be thrown.
19312027Sjungma@eit.uni-kl.de// There are two types of exceptions that can be thrown, synchronous reset
19412027Sjungma@eit.uni-kl.de// and asynchronous reset. At a future time there may be more asynchronous
19512027Sjungma@eit.uni-kl.de// exceptions.  If an asynchronous reset is seen and there is not static reset
19612027Sjungma@eit.uni-kl.de// specified, or the static reset is not active then clear the throw
19712027Sjungma@eit.uni-kl.de// type for the next time this method is called.
19812027Sjungma@eit.uni-kl.de//
19912027Sjungma@eit.uni-kl.de// Notes:
20012027Sjungma@eit.uni-kl.de//   (1) For an explanation of how the reset mechanism works see the top of
20112027Sjungma@eit.uni-kl.de//       the file sc_reset.cpp.
20212027Sjungma@eit.uni-kl.de//   (2) The m_sticky_reset field is used to handle synchronous resets that
20312027Sjungma@eit.uni-kl.de//       are enabled via the sc_process_handle::sync_reset_on() method. These
20412027Sjungma@eit.uni-kl.de//       resets are not generated by a signal, but rather are modal by
20512027Sjungma@eit.uni-kl.de//       method call: sync_reset_on() - sync_reset_off().
20612027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------
20712027Sjungma@eit.uni-kl.deinline void sc_thread_process::suspend_me()
20812027Sjungma@eit.uni-kl.de{
20912027Sjungma@eit.uni-kl.de    // remember, if we're currently unwinding
21012027Sjungma@eit.uni-kl.de
21112027Sjungma@eit.uni-kl.de    bool unwinding_preempted = m_unwinding;
21212027Sjungma@eit.uni-kl.de
21312027Sjungma@eit.uni-kl.de    sc_simcontext* simc_p = simcontext();
21412027Sjungma@eit.uni-kl.de    sc_cor*         cor_p = simc_p->next_cor();
21512027Sjungma@eit.uni-kl.de
21612027Sjungma@eit.uni-kl.de    // do not switch, if we're about to execute next (e.g. suicide)
21712027Sjungma@eit.uni-kl.de
21812027Sjungma@eit.uni-kl.de    if( m_cor_p != cor_p )
21912027Sjungma@eit.uni-kl.de    {
22012027Sjungma@eit.uni-kl.de        DEBUG_MSG( DEBUG_NAME , this, "suspending thread");
22112027Sjungma@eit.uni-kl.de        simc_p->cor_pkg()->yield( cor_p );
22212027Sjungma@eit.uni-kl.de        DEBUG_MSG( DEBUG_NAME , this, "resuming thread");
22312027Sjungma@eit.uni-kl.de    }
22412027Sjungma@eit.uni-kl.de
22512027Sjungma@eit.uni-kl.de    // IF THERE IS A THROW TO BE DONE FOR THIS PROCESS DO IT NOW:
22612027Sjungma@eit.uni-kl.de    //
22712027Sjungma@eit.uni-kl.de    // (1) Optimize THROW_NONE for speed as it is the normal case.
22812027Sjungma@eit.uni-kl.de    // (2) If this thread is already unwinding then suspend_me() was
22912027Sjungma@eit.uni-kl.de    //     called from the catch clause to throw an exception on another
23012027Sjungma@eit.uni-kl.de    //     process, so just go back to the catch clause.
23112027Sjungma@eit.uni-kl.de
23212027Sjungma@eit.uni-kl.de    if ( m_throw_status == THROW_NONE ) return;
23312027Sjungma@eit.uni-kl.de
23412027Sjungma@eit.uni-kl.de    if ( m_unwinding ) return;
23512027Sjungma@eit.uni-kl.de
23612027Sjungma@eit.uni-kl.de    switch( m_throw_status )
23712027Sjungma@eit.uni-kl.de    {
23812027Sjungma@eit.uni-kl.de      case THROW_ASYNC_RESET:
23912027Sjungma@eit.uni-kl.de      case THROW_SYNC_RESET:
24012027Sjungma@eit.uni-kl.de        DEBUG_MSG( DEBUG_NAME , this, "throwing reset for");
24112027Sjungma@eit.uni-kl.de	if ( m_reset_event_p ) m_reset_event_p->notify();
24212027Sjungma@eit.uni-kl.de        throw sc_unwind_exception( this, true );
24312027Sjungma@eit.uni-kl.de
24412027Sjungma@eit.uni-kl.de      case THROW_USER:
24512027Sjungma@eit.uni-kl.de        DEBUG_MSG( DEBUG_NAME, this, "invoking throw_it for");
24612027Sjungma@eit.uni-kl.de	m_throw_status = m_active_areset_n ? THROW_ASYNC_RESET :
24712027Sjungma@eit.uni-kl.de	                                  (m_active_reset_n ? THROW_SYNC_RESET :
24812027Sjungma@eit.uni-kl.de			                  THROW_NONE);
24912027Sjungma@eit.uni-kl.de        m_throw_helper_p->throw_it();
25012027Sjungma@eit.uni-kl.de	break;
25112027Sjungma@eit.uni-kl.de
25212027Sjungma@eit.uni-kl.de      case THROW_KILL:
25312027Sjungma@eit.uni-kl.de        DEBUG_MSG( DEBUG_NAME, this, "throwing kill for");
25412027Sjungma@eit.uni-kl.de	throw sc_unwind_exception( this, false );
25512027Sjungma@eit.uni-kl.de
25612027Sjungma@eit.uni-kl.de      default: // THROWING_NOW
25712027Sjungma@eit.uni-kl.de        sc_assert( unwinding_preempted );
25812027Sjungma@eit.uni-kl.de        DEBUG_MSG( DEBUG_NAME, this, "restarting thread");
25912027Sjungma@eit.uni-kl.de        break;
26012027Sjungma@eit.uni-kl.de    }
26112027Sjungma@eit.uni-kl.de}
26212027Sjungma@eit.uni-kl.de
26312027Sjungma@eit.uni-kl.de
26412027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------
26512027Sjungma@eit.uni-kl.de//"sc_thread_process::wait"
26612027Sjungma@eit.uni-kl.de//
26712027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------
26812027Sjungma@eit.uni-kl.deinline
26912027Sjungma@eit.uni-kl.devoid
27012027Sjungma@eit.uni-kl.desc_thread_process::wait( const sc_event& e )
27112027Sjungma@eit.uni-kl.de{
27212027Sjungma@eit.uni-kl.de    if( m_unwinding )
27312027Sjungma@eit.uni-kl.de        SC_REPORT_ERROR( SC_ID_WAIT_DURING_UNWINDING_, name() );
27412027Sjungma@eit.uni-kl.de
27512027Sjungma@eit.uni-kl.de    m_event_p = &e; // for cleanup.
27612027Sjungma@eit.uni-kl.de    e.add_dynamic( this );
27712027Sjungma@eit.uni-kl.de    m_trigger_type = EVENT;
27812027Sjungma@eit.uni-kl.de    suspend_me();
27912027Sjungma@eit.uni-kl.de}
28012027Sjungma@eit.uni-kl.de
28112027Sjungma@eit.uni-kl.deinline
28212027Sjungma@eit.uni-kl.devoid
28312027Sjungma@eit.uni-kl.desc_thread_process::wait( const sc_event_or_list& el )
28412027Sjungma@eit.uni-kl.de{
28512027Sjungma@eit.uni-kl.de    if( m_unwinding )
28612027Sjungma@eit.uni-kl.de        SC_REPORT_ERROR( SC_ID_WAIT_DURING_UNWINDING_, name() );
28712027Sjungma@eit.uni-kl.de
28812027Sjungma@eit.uni-kl.de    el.add_dynamic( this );
28912027Sjungma@eit.uni-kl.de    m_event_list_p = &el;
29012027Sjungma@eit.uni-kl.de    m_trigger_type = OR_LIST;
29112027Sjungma@eit.uni-kl.de    suspend_me();
29212027Sjungma@eit.uni-kl.de}
29312027Sjungma@eit.uni-kl.de
29412027Sjungma@eit.uni-kl.deinline
29512027Sjungma@eit.uni-kl.devoid
29612027Sjungma@eit.uni-kl.desc_thread_process::wait( const sc_event_and_list& el )
29712027Sjungma@eit.uni-kl.de{
29812027Sjungma@eit.uni-kl.de    if( m_unwinding )
29912027Sjungma@eit.uni-kl.de        SC_REPORT_ERROR( SC_ID_WAIT_DURING_UNWINDING_, name() );
30012027Sjungma@eit.uni-kl.de
30112027Sjungma@eit.uni-kl.de    el.add_dynamic( this );
30212027Sjungma@eit.uni-kl.de    m_event_list_p = &el;
30312027Sjungma@eit.uni-kl.de    m_event_count = el.size();
30412027Sjungma@eit.uni-kl.de    m_trigger_type = AND_LIST;
30512027Sjungma@eit.uni-kl.de    suspend_me();
30612027Sjungma@eit.uni-kl.de}
30712027Sjungma@eit.uni-kl.de
30812027Sjungma@eit.uni-kl.deinline
30912027Sjungma@eit.uni-kl.devoid
31012027Sjungma@eit.uni-kl.desc_thread_process::wait( const sc_time& t )
31112027Sjungma@eit.uni-kl.de{
31212027Sjungma@eit.uni-kl.de    if( m_unwinding )
31312027Sjungma@eit.uni-kl.de        SC_REPORT_ERROR( SC_ID_WAIT_DURING_UNWINDING_, name() );
31412027Sjungma@eit.uni-kl.de
31512027Sjungma@eit.uni-kl.de    m_timeout_event_p->notify_internal( t );
31612027Sjungma@eit.uni-kl.de    m_timeout_event_p->add_dynamic( this );
31712027Sjungma@eit.uni-kl.de    m_trigger_type = TIMEOUT;
31812027Sjungma@eit.uni-kl.de    suspend_me();
31912027Sjungma@eit.uni-kl.de}
32012027Sjungma@eit.uni-kl.de
32112027Sjungma@eit.uni-kl.deinline
32212027Sjungma@eit.uni-kl.devoid
32312027Sjungma@eit.uni-kl.desc_thread_process::wait( const sc_time& t, const sc_event& e )
32412027Sjungma@eit.uni-kl.de{
32512027Sjungma@eit.uni-kl.de    if( m_unwinding )
32612027Sjungma@eit.uni-kl.de        SC_REPORT_ERROR( SC_ID_WAIT_DURING_UNWINDING_, name() );
32712027Sjungma@eit.uni-kl.de
32812027Sjungma@eit.uni-kl.de    m_timeout_event_p->notify_internal( t );
32912027Sjungma@eit.uni-kl.de    m_timeout_event_p->add_dynamic( this );
33012027Sjungma@eit.uni-kl.de    e.add_dynamic( this );
33112027Sjungma@eit.uni-kl.de    m_event_p = &e;
33212027Sjungma@eit.uni-kl.de    m_trigger_type = EVENT_TIMEOUT;
33312027Sjungma@eit.uni-kl.de    suspend_me();
33412027Sjungma@eit.uni-kl.de}
33512027Sjungma@eit.uni-kl.de
33612027Sjungma@eit.uni-kl.deinline
33712027Sjungma@eit.uni-kl.devoid
33812027Sjungma@eit.uni-kl.desc_thread_process::wait( const sc_time& t, const sc_event_or_list& el )
33912027Sjungma@eit.uni-kl.de{
34012027Sjungma@eit.uni-kl.de    if( m_unwinding )
34112027Sjungma@eit.uni-kl.de        SC_REPORT_ERROR( SC_ID_WAIT_DURING_UNWINDING_, name() );
34212027Sjungma@eit.uni-kl.de
34312027Sjungma@eit.uni-kl.de    m_timeout_event_p->notify_internal( t );
34412027Sjungma@eit.uni-kl.de    m_timeout_event_p->add_dynamic( this );
34512027Sjungma@eit.uni-kl.de    el.add_dynamic( this );
34612027Sjungma@eit.uni-kl.de    m_event_list_p = &el;
34712027Sjungma@eit.uni-kl.de    m_trigger_type = OR_LIST_TIMEOUT;
34812027Sjungma@eit.uni-kl.de    suspend_me();
34912027Sjungma@eit.uni-kl.de}
35012027Sjungma@eit.uni-kl.de
35112027Sjungma@eit.uni-kl.deinline
35212027Sjungma@eit.uni-kl.devoid
35312027Sjungma@eit.uni-kl.desc_thread_process::wait( const sc_time& t, const sc_event_and_list& el )
35412027Sjungma@eit.uni-kl.de{
35512027Sjungma@eit.uni-kl.de    if( m_unwinding )
35612027Sjungma@eit.uni-kl.de        SC_REPORT_ERROR( SC_ID_WAIT_DURING_UNWINDING_, name() );
35712027Sjungma@eit.uni-kl.de
35812027Sjungma@eit.uni-kl.de    m_timeout_event_p->notify_internal( t );
35912027Sjungma@eit.uni-kl.de    m_timeout_event_p->add_dynamic( this );
36012027Sjungma@eit.uni-kl.de    el.add_dynamic( this );
36112027Sjungma@eit.uni-kl.de    m_event_list_p = &el;
36212027Sjungma@eit.uni-kl.de    m_event_count = el.size();
36312027Sjungma@eit.uni-kl.de    m_trigger_type = AND_LIST_TIMEOUT;
36412027Sjungma@eit.uni-kl.de    suspend_me();
36512027Sjungma@eit.uni-kl.de}
36612027Sjungma@eit.uni-kl.de
36712027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------
36812027Sjungma@eit.uni-kl.de//"sc_thread_process::wait_cycles"
36912027Sjungma@eit.uni-kl.de//
37012027Sjungma@eit.uni-kl.de// This method suspends this object instance for the specified number of cycles.
37112027Sjungma@eit.uni-kl.de// A cycle is defined as the event the thread is set up to staticly wait on.
37212027Sjungma@eit.uni-kl.de// The field m_wait_cycle_n is set to one less than the number of cycles to
37312027Sjungma@eit.uni-kl.de// be waited for, since the value is tested before being decremented in
37412027Sjungma@eit.uni-kl.de// the simulation kernel.
37512027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------
37612027Sjungma@eit.uni-kl.deinline
37712027Sjungma@eit.uni-kl.devoid
37812027Sjungma@eit.uni-kl.desc_thread_process::wait_cycles( int n )
37912027Sjungma@eit.uni-kl.de{
38012027Sjungma@eit.uni-kl.de    if( m_unwinding )
38112027Sjungma@eit.uni-kl.de        SC_REPORT_ERROR( SC_ID_WAIT_DURING_UNWINDING_, name() );
38212027Sjungma@eit.uni-kl.de
38312027Sjungma@eit.uni-kl.de    m_wait_cycle_n = n-1;
38412027Sjungma@eit.uni-kl.de    suspend_me();
38512027Sjungma@eit.uni-kl.de}
38612027Sjungma@eit.uni-kl.de
38712027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------
38812027Sjungma@eit.uni-kl.de//"sc_thread_process::miscellaneous support"
38912027Sjungma@eit.uni-kl.de//
39012027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------
39112027Sjungma@eit.uni-kl.deinline
39212027Sjungma@eit.uni-kl.devoid sc_thread_process::add_monitor(sc_process_monitor* monitor_p)
39312027Sjungma@eit.uni-kl.de{
39412027Sjungma@eit.uni-kl.de    m_monitor_q.push_back(monitor_p);
39512027Sjungma@eit.uni-kl.de}
39612027Sjungma@eit.uni-kl.de
39712027Sjungma@eit.uni-kl.de
39812027Sjungma@eit.uni-kl.deinline
39912027Sjungma@eit.uni-kl.devoid sc_thread_process::remove_monitor(sc_process_monitor* monitor_p)
40012027Sjungma@eit.uni-kl.de{
40112027Sjungma@eit.uni-kl.de    int mon_n = m_monitor_q.size();
40212027Sjungma@eit.uni-kl.de
40312027Sjungma@eit.uni-kl.de    for ( int mon_i = 0; mon_i < mon_n; mon_i++ )
40412027Sjungma@eit.uni-kl.de    {
40512027Sjungma@eit.uni-kl.de    if  ( m_monitor_q[mon_i] == monitor_p )
40612027Sjungma@eit.uni-kl.de        {
40712027Sjungma@eit.uni-kl.de            m_monitor_q[mon_i] = m_monitor_q[mon_n-1];
40812027Sjungma@eit.uni-kl.de            m_monitor_q.resize(mon_n-1);
40912027Sjungma@eit.uni-kl.de        }
41012027Sjungma@eit.uni-kl.de    }
41112027Sjungma@eit.uni-kl.de}
41212027Sjungma@eit.uni-kl.de
41312027Sjungma@eit.uni-kl.deinline
41412027Sjungma@eit.uni-kl.devoid sc_thread_process::set_next_exist(sc_thread_handle next_p)
41512027Sjungma@eit.uni-kl.de{
41612027Sjungma@eit.uni-kl.de    m_exist_p = next_p;
41712027Sjungma@eit.uni-kl.de}
41812027Sjungma@eit.uni-kl.de
41912027Sjungma@eit.uni-kl.deinline
42012027Sjungma@eit.uni-kl.desc_thread_handle sc_thread_process::next_exist()
42112027Sjungma@eit.uni-kl.de{
42212027Sjungma@eit.uni-kl.de    return (sc_thread_handle)m_exist_p;
42312027Sjungma@eit.uni-kl.de}
42412027Sjungma@eit.uni-kl.de
42512027Sjungma@eit.uni-kl.deinline
42612027Sjungma@eit.uni-kl.devoid sc_thread_process::set_next_runnable(sc_thread_handle next_p)
42712027Sjungma@eit.uni-kl.de{
42812027Sjungma@eit.uni-kl.de    m_runnable_p = next_p;
42912027Sjungma@eit.uni-kl.de}
43012027Sjungma@eit.uni-kl.de
43112027Sjungma@eit.uni-kl.deinline
43212027Sjungma@eit.uni-kl.desc_thread_handle sc_thread_process::next_runnable()
43312027Sjungma@eit.uni-kl.de{
43412027Sjungma@eit.uni-kl.de    return (sc_thread_handle)m_runnable_p;
43512027Sjungma@eit.uni-kl.de}
43612027Sjungma@eit.uni-kl.de
43712027Sjungma@eit.uni-kl.deinline sc_cor* get_cor_pointer( sc_process_b* process_p )
43812027Sjungma@eit.uni-kl.de{
43912027Sjungma@eit.uni-kl.de    sc_thread_handle thread_p = DCAST<sc_thread_handle>(process_p);
44012027Sjungma@eit.uni-kl.de    return thread_p->m_cor_p;
44112027Sjungma@eit.uni-kl.de}
44212027Sjungma@eit.uni-kl.de
44312027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------
44412027Sjungma@eit.uni-kl.de//"sc_thread_process::trigger_static"
44512027Sjungma@eit.uni-kl.de//
44612027Sjungma@eit.uni-kl.de// This inline method adds the current thread to the queue of runnable
44712027Sjungma@eit.uni-kl.de// processes, if required.  This is the case if the following criteria
44812027Sjungma@eit.uni-kl.de// are met:
44912027Sjungma@eit.uni-kl.de//   (1) The process is in a runnable state.
45012027Sjungma@eit.uni-kl.de//   (2) The process is not already on the run queue.
45112027Sjungma@eit.uni-kl.de//   (3) The process is expecting a static trigger,
45212027Sjungma@eit.uni-kl.de//       dynamic event waits take priority.
45312027Sjungma@eit.uni-kl.de//   (4) The process' static wait count is zero.
45412027Sjungma@eit.uni-kl.de//
45512027Sjungma@eit.uni-kl.de// If the triggering process is the same process, the trigger is
45612027Sjungma@eit.uni-kl.de// ignored as well, unless SC_ENABLE_IMMEDIATE_SELF_NOTIFICATIONS
45712027Sjungma@eit.uni-kl.de// is defined.
45812027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------
45912027Sjungma@eit.uni-kl.deinline
46012027Sjungma@eit.uni-kl.devoid
46112027Sjungma@eit.uni-kl.desc_thread_process::trigger_static()
46212027Sjungma@eit.uni-kl.de{
46312027Sjungma@eit.uni-kl.de    // No need to try queueing this thread if one of the following is true:
46412027Sjungma@eit.uni-kl.de    //    (a) its disabled
46512027Sjungma@eit.uni-kl.de    //    (b) its already queued for execution
46612027Sjungma@eit.uni-kl.de    //    (c) its waiting on a dynamic event
46712027Sjungma@eit.uni-kl.de    //    (d) its wait count is not satisfied
46812027Sjungma@eit.uni-kl.de
46912027Sjungma@eit.uni-kl.de    if ( (m_state & ps_bit_disabled) || is_runnable() ||
47012027Sjungma@eit.uni-kl.de          m_trigger_type != STATIC )
47112027Sjungma@eit.uni-kl.de        return;
47212027Sjungma@eit.uni-kl.de
47312027Sjungma@eit.uni-kl.de#if ! defined( SC_ENABLE_IMMEDIATE_SELF_NOTIFICATIONS )
47412027Sjungma@eit.uni-kl.de    if( SC_UNLIKELY_( sc_get_current_process_b() == this ) )
47512027Sjungma@eit.uni-kl.de    {
47612027Sjungma@eit.uni-kl.de        report_immediate_self_notification();
47712027Sjungma@eit.uni-kl.de        return;
47812027Sjungma@eit.uni-kl.de    }
47912027Sjungma@eit.uni-kl.de#endif // SC_ENABLE_IMMEDIATE_SELF_NOTIFICATIONS
48012027Sjungma@eit.uni-kl.de
48112027Sjungma@eit.uni-kl.de    if ( m_wait_cycle_n > 0 )
48212027Sjungma@eit.uni-kl.de    {
48312027Sjungma@eit.uni-kl.de        --m_wait_cycle_n;
48412027Sjungma@eit.uni-kl.de        return;
48512027Sjungma@eit.uni-kl.de    }
48612027Sjungma@eit.uni-kl.de
48712027Sjungma@eit.uni-kl.de    // If we get here then the thread is has satisfied its wait criteria, if
48812027Sjungma@eit.uni-kl.de    // its suspended mark its state as ready to run. If its not suspended then
48912027Sjungma@eit.uni-kl.de    // push it onto the runnable queue.
49012027Sjungma@eit.uni-kl.de
49112027Sjungma@eit.uni-kl.de    if ( m_state & ps_bit_suspended )
49212027Sjungma@eit.uni-kl.de    {
49312027Sjungma@eit.uni-kl.de        m_state = m_state | ps_bit_ready_to_run;
49412027Sjungma@eit.uni-kl.de    }
49512027Sjungma@eit.uni-kl.de    else
49612027Sjungma@eit.uni-kl.de    {
49712027Sjungma@eit.uni-kl.de	simcontext()->push_runnable_thread(this);
49812027Sjungma@eit.uni-kl.de    }
49912027Sjungma@eit.uni-kl.de}
50012027Sjungma@eit.uni-kl.de
50112027Sjungma@eit.uni-kl.de#undef DEBUG_MSG
50212027Sjungma@eit.uni-kl.de#undef DEBUG_NAME
50312027Sjungma@eit.uni-kl.de
50412027Sjungma@eit.uni-kl.de} // namespace sc_core
50512027Sjungma@eit.uni-kl.de
50612027Sjungma@eit.uni-kl.de// $Log: sc_thread_process.h,v $
50712027Sjungma@eit.uni-kl.de// Revision 1.30  2011/08/26 20:46:11  acg
50812027Sjungma@eit.uni-kl.de//  Andy Goodrich: moved the modification log to the end of the file to
50912027Sjungma@eit.uni-kl.de//  eliminate source line number skew when check-ins are done.
51012027Sjungma@eit.uni-kl.de//
51112027Sjungma@eit.uni-kl.de// Revision 1.29  2011/08/24 23:36:12  acg
51212027Sjungma@eit.uni-kl.de//  Andy Goodrich: removed break statements that can never be reached and
51312027Sjungma@eit.uni-kl.de//  which causes warnings in the Greenhills C++ compiler.
51412027Sjungma@eit.uni-kl.de//
51512027Sjungma@eit.uni-kl.de// Revision 1.28  2011/04/14 22:34:27  acg
51612027Sjungma@eit.uni-kl.de//  Andy Goodrich: removed dead code.
51712027Sjungma@eit.uni-kl.de//
51812027Sjungma@eit.uni-kl.de// Revision 1.27  2011/04/13 05:02:18  acg
51912027Sjungma@eit.uni-kl.de//  Andy Goodrich: added missing check to the wake up code in suspend_me()
52012027Sjungma@eit.uni-kl.de//  so that we just return if the call to suspend_me() was issued from a
52112027Sjungma@eit.uni-kl.de//  stack unwinding.
52212027Sjungma@eit.uni-kl.de//
52312027Sjungma@eit.uni-kl.de// Revision 1.26  2011/04/13 02:44:26  acg
52412027Sjungma@eit.uni-kl.de//  Andy Goodrich: added m_unwinding flag in place of THROW_NOW because the
52512027Sjungma@eit.uni-kl.de//  throw status will be set back to THROW_*_RESET if reset is active and
52612027Sjungma@eit.uni-kl.de//  the check for an unwind being complete was expecting THROW_NONE as the
52712027Sjungma@eit.uni-kl.de//  clearing of THROW_NOW.
52812027Sjungma@eit.uni-kl.de//
52912027Sjungma@eit.uni-kl.de// Revision 1.25  2011/04/11 22:05:14  acg
53012027Sjungma@eit.uni-kl.de//  Andy Goodrich: use the DEBUG_NAME macro in DEBUG_MSG invocations.
53112027Sjungma@eit.uni-kl.de//
53212027Sjungma@eit.uni-kl.de// Revision 1.24  2011/04/10 22:12:32  acg
53312027Sjungma@eit.uni-kl.de//  Andy Goodrich: adding debugging macros.
53412027Sjungma@eit.uni-kl.de//
53512027Sjungma@eit.uni-kl.de// Revision 1.23  2011/04/08 22:41:28  acg
53612027Sjungma@eit.uni-kl.de//  Andy Goodrich: added comment pointing to the description of the reset
53712027Sjungma@eit.uni-kl.de//  mechanism in sc_reset.cpp.
53812027Sjungma@eit.uni-kl.de//
53912027Sjungma@eit.uni-kl.de// Revision 1.22  2011/04/08 18:27:33  acg
54012027Sjungma@eit.uni-kl.de//  Andy Goodrich: added check to make sure we don't schedule a running process
54112027Sjungma@eit.uni-kl.de//  because of it issues a notify() it is sensitive to.
54212027Sjungma@eit.uni-kl.de//
54312027Sjungma@eit.uni-kl.de// Revision 1.21  2011/04/05 06:22:38  acg
54412027Sjungma@eit.uni-kl.de//  Andy Goodrich: expanded comment for trigger_static() initial vetting.
54512027Sjungma@eit.uni-kl.de//
54612027Sjungma@eit.uni-kl.de// Revision 1.20  2011/04/01 21:24:57  acg
54712027Sjungma@eit.uni-kl.de//  Andy Goodrich: removed unused code.
54812027Sjungma@eit.uni-kl.de//
54912027Sjungma@eit.uni-kl.de// Revision 1.19  2011/02/19 08:30:53  acg
55012027Sjungma@eit.uni-kl.de//  Andy Goodrich: Moved process queueing into trigger_static from
55112027Sjungma@eit.uni-kl.de//  sc_event::notify.
55212027Sjungma@eit.uni-kl.de//
55312027Sjungma@eit.uni-kl.de// Revision 1.18  2011/02/18 20:27:14  acg
55412027Sjungma@eit.uni-kl.de//  Andy Goodrich: Updated Copyrights.
55512027Sjungma@eit.uni-kl.de//
55612027Sjungma@eit.uni-kl.de// Revision 1.17  2011/02/17 19:55:58  acg
55712027Sjungma@eit.uni-kl.de//  Andy Goodrich:
55812027Sjungma@eit.uni-kl.de//    (1) Changed signature of trigger_dynamic() back to a bool.
55912027Sjungma@eit.uni-kl.de//    (2) Simplified process control usage.
56012027Sjungma@eit.uni-kl.de//    (3) Changed trigger_static() to recognize process controls and to
56112027Sjungma@eit.uni-kl.de//        do the down-count on wait(N), allowing the elimination of
56212027Sjungma@eit.uni-kl.de//        ready_to_run().
56312027Sjungma@eit.uni-kl.de//
56412027Sjungma@eit.uni-kl.de// Revision 1.16  2011/02/16 22:37:31  acg
56512027Sjungma@eit.uni-kl.de//  Andy Goodrich: clean up to remove need for ps_disable_pending.
56612027Sjungma@eit.uni-kl.de//
56712027Sjungma@eit.uni-kl.de// Revision 1.15  2011/02/13 21:47:38  acg
56812027Sjungma@eit.uni-kl.de//  Andy Goodrich: update copyright notice.
56912027Sjungma@eit.uni-kl.de//
57012027Sjungma@eit.uni-kl.de// Revision 1.14  2011/02/13 21:35:54  acg
57112027Sjungma@eit.uni-kl.de//  Andy Goodrich: added error for performing a wait() during unwinding.
57212027Sjungma@eit.uni-kl.de//
57312027Sjungma@eit.uni-kl.de// Revision 1.13  2011/02/11 13:25:24  acg
57412027Sjungma@eit.uni-kl.de//  Andy Goodrich: Philipp A. Hartmann's changes:
57512027Sjungma@eit.uni-kl.de//    (1) Removal of SC_CTHREAD method overloads.
57612027Sjungma@eit.uni-kl.de//    (2) New exception processing code.
57712027Sjungma@eit.uni-kl.de//
57812027Sjungma@eit.uni-kl.de// Revision 1.12  2011/02/01 23:01:53  acg
57912027Sjungma@eit.uni-kl.de//  Andy Goodrich: removed dead code.
58012027Sjungma@eit.uni-kl.de//
58112027Sjungma@eit.uni-kl.de// Revision 1.11  2011/02/01 21:18:01  acg
58212027Sjungma@eit.uni-kl.de//  Andy Goodrich:
58312027Sjungma@eit.uni-kl.de//  (1) Changes in throw processing for new process control rules.
58412027Sjungma@eit.uni-kl.de//  (2) Support of new process_state enum values.
58512027Sjungma@eit.uni-kl.de//
58612027Sjungma@eit.uni-kl.de// Revision 1.10  2011/01/25 20:50:37  acg
58712027Sjungma@eit.uni-kl.de//  Andy Goodrich: changes for IEEE 1666 2011.
58812027Sjungma@eit.uni-kl.de//
58912027Sjungma@eit.uni-kl.de// Revision 1.9  2011/01/19 23:21:50  acg
59012027Sjungma@eit.uni-kl.de//  Andy Goodrich: changes for IEEE 1666 2011
59112027Sjungma@eit.uni-kl.de//
59212027Sjungma@eit.uni-kl.de// Revision 1.8  2011/01/18 20:10:45  acg
59312027Sjungma@eit.uni-kl.de//  Andy Goodrich: changes for IEEE1666_2011 semantics.
59412027Sjungma@eit.uni-kl.de//
59512027Sjungma@eit.uni-kl.de// Revision 1.7  2011/01/06 17:59:58  acg
59612027Sjungma@eit.uni-kl.de//  Andy Goodrich: removed debugging output.
59712027Sjungma@eit.uni-kl.de//
59812027Sjungma@eit.uni-kl.de// Revision 1.6  2010/07/22 20:02:33  acg
59912027Sjungma@eit.uni-kl.de//  Andy Goodrich: bug fixes.
60012027Sjungma@eit.uni-kl.de//
60112027Sjungma@eit.uni-kl.de// Revision 1.5  2009/07/28 01:10:53  acg
60212027Sjungma@eit.uni-kl.de//  Andy Goodrich: updates for 2.3 release candidate.
60312027Sjungma@eit.uni-kl.de//
60412027Sjungma@eit.uni-kl.de// Revision 1.4  2009/05/22 16:06:29  acg
60512027Sjungma@eit.uni-kl.de//  Andy Goodrich: process control updates.
60612027Sjungma@eit.uni-kl.de//
60712027Sjungma@eit.uni-kl.de// Revision 1.3  2009/03/12 22:59:58  acg
60812027Sjungma@eit.uni-kl.de//  Andy Goodrich: updates for 2.4 stuff.
60912027Sjungma@eit.uni-kl.de//
61012027Sjungma@eit.uni-kl.de// Revision 1.2  2008/05/22 17:06:06  acg
61112027Sjungma@eit.uni-kl.de//  Andy Goodrich: formatting and comments.
61212027Sjungma@eit.uni-kl.de//
61312027Sjungma@eit.uni-kl.de// Revision 1.1.1.1  2006/12/15 20:20:05  acg
61412027Sjungma@eit.uni-kl.de// SystemC 2.3
61512027Sjungma@eit.uni-kl.de//
61612027Sjungma@eit.uni-kl.de// Revision 1.7  2006/05/08 17:57:13  acg
61712027Sjungma@eit.uni-kl.de//  Andy Goodrich: Added David Long's forward declarations for friend functions
61812027Sjungma@eit.uni-kl.de//  to keep the Microsoft C++ compiler happy.
61912027Sjungma@eit.uni-kl.de//
62012027Sjungma@eit.uni-kl.de// Revision 1.6  2006/04/20 17:08:17  acg
62112027Sjungma@eit.uni-kl.de//  Andy Goodrich: 3.0 style process changes.
62212027Sjungma@eit.uni-kl.de//
62312027Sjungma@eit.uni-kl.de// Revision 1.5  2006/04/11 23:13:21  acg
62412027Sjungma@eit.uni-kl.de//   Andy Goodrich: Changes for reduced reset support that only includes
62512027Sjungma@eit.uni-kl.de//   sc_cthread, but has preliminary hooks for expanding to method and thread
62612027Sjungma@eit.uni-kl.de//   processes also.
62712027Sjungma@eit.uni-kl.de//
62812027Sjungma@eit.uni-kl.de// Revision 1.4  2006/01/24 20:49:05  acg
62912027Sjungma@eit.uni-kl.de// Andy Goodrich: changes to remove the use of deprecated features within the
63012027Sjungma@eit.uni-kl.de// simulator, and to issue warning messages when deprecated features are used.
63112027Sjungma@eit.uni-kl.de//
63212027Sjungma@eit.uni-kl.de// Revision 1.3  2006/01/13 18:44:30  acg
63312027Sjungma@eit.uni-kl.de// Added $Log to record CVS changes into the source.
63412027Sjungma@eit.uni-kl.de
63512027Sjungma@eit.uni-kl.de#endif // !defined(sc_thread_process_h_INCLUDED)
636