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 = ⪙ 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 = ⪙ 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 = ⪙ 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 = ⪙ 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