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_simcontext_int.h -- For inline definitions of some utility functions. 2312027Sjungma@eit.uni-kl.de DO NOT EXPORT THIS INCLUDE FILE. Include this file 2412027Sjungma@eit.uni-kl.de after "sc_process_int.h" so that we can get the base 2512027Sjungma@eit.uni-kl.de class right. 2612027Sjungma@eit.uni-kl.de 2712027Sjungma@eit.uni-kl.de Original Author: Stan Y. Liao, Synopsys, Inc. 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#ifndef SC_SIMCONTEXT_INT_H 3312027Sjungma@eit.uni-kl.de#define SC_SIMCONTEXT_INT_H 3412027Sjungma@eit.uni-kl.de 3512027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_simcontext.h" 3612027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_runnable.h" 3712027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_runnable_int.h" 3812027Sjungma@eit.uni-kl.de 3912027Sjungma@eit.uni-kl.de// DEBUGGING MACROS: 4012027Sjungma@eit.uni-kl.de// 4112027Sjungma@eit.uni-kl.de// DEBUG_MSG(NAME,P,MSG) 4212027Sjungma@eit.uni-kl.de// MSG = message to print 4312027Sjungma@eit.uni-kl.de// NAME = name that must match the process for the message to print, or 4412027Sjungma@eit.uni-kl.de// null if the message should be printed unconditionally. 4512027Sjungma@eit.uni-kl.de// P = pointer to process message is for, or NULL in which case the 4612027Sjungma@eit.uni-kl.de// message will not print. 4712027Sjungma@eit.uni-kl.de#if 0 4812027Sjungma@eit.uni-kl.de# define DEBUG_NAME "" 4912027Sjungma@eit.uni-kl.de# define DEBUG_MSG(NAME,P,MSG) \ 5012027Sjungma@eit.uni-kl.de { \ 5112027Sjungma@eit.uni-kl.de if ( P && ( (strlen(NAME)==0) || !strcmp(NAME,P->name())) ) \ 5212027Sjungma@eit.uni-kl.de std::cout << "**** " << sc_time_stamp() << " (" \ 5312027Sjungma@eit.uni-kl.de << sc_get_current_process_name() << "): " << MSG \ 5412027Sjungma@eit.uni-kl.de << " - " << P->name() << std::endl; \ 5512027Sjungma@eit.uni-kl.de } 5612027Sjungma@eit.uni-kl.de#else 5712027Sjungma@eit.uni-kl.de# define DEBUG_MSG(NAME,P,MSG) 5812027Sjungma@eit.uni-kl.de#endif 5912027Sjungma@eit.uni-kl.de 6012027Sjungma@eit.uni-kl.de 6112027Sjungma@eit.uni-kl.denamespace sc_core { 6212027Sjungma@eit.uni-kl.de 6312027Sjungma@eit.uni-kl.deinline 6412027Sjungma@eit.uni-kl.deconst char* 6512027Sjungma@eit.uni-kl.desc_get_current_process_name() 6612027Sjungma@eit.uni-kl.de{ 6712027Sjungma@eit.uni-kl.de sc_process_b* active_p; // active process to get name of. 6812027Sjungma@eit.uni-kl.de const char* result; // name of active process. 6912027Sjungma@eit.uni-kl.de 7012027Sjungma@eit.uni-kl.de active_p = sc_get_curr_simcontext()->get_curr_proc_info()->process_handle; 7112027Sjungma@eit.uni-kl.de if ( active_p ) 7212027Sjungma@eit.uni-kl.de result = active_p->name(); 7312027Sjungma@eit.uni-kl.de else 7412027Sjungma@eit.uni-kl.de result = "** NONE **"; 7512027Sjungma@eit.uni-kl.de return result; 7612027Sjungma@eit.uni-kl.de} 7712027Sjungma@eit.uni-kl.de 7812027Sjungma@eit.uni-kl.de// We use m_current_writer rather than m_curr_proc_info.process_handle to 7912027Sjungma@eit.uni-kl.de// return the active process for sc_signal<T>::check_write since that lets 8012027Sjungma@eit.uni-kl.de// us turn it off a library compile time, and only incur the overhead at 8112027Sjungma@eit.uni-kl.de// the time of process switches rather than having to interrogate an 8212027Sjungma@eit.uni-kl.de// additional switch every time a signal is written. 8312027Sjungma@eit.uni-kl.de 8412027Sjungma@eit.uni-kl.deinline 8512027Sjungma@eit.uni-kl.devoid 8612027Sjungma@eit.uni-kl.desc_simcontext::set_curr_proc( sc_process_b* process_h ) 8712027Sjungma@eit.uni-kl.de{ 8812027Sjungma@eit.uni-kl.de m_curr_proc_info.process_handle = process_h; 8912027Sjungma@eit.uni-kl.de m_curr_proc_info.kind = process_h->proc_kind(); 9012027Sjungma@eit.uni-kl.de m_current_writer = m_write_check ? process_h : (sc_object*)0; 9112027Sjungma@eit.uni-kl.de} 9212027Sjungma@eit.uni-kl.de 9312027Sjungma@eit.uni-kl.deinline 9412027Sjungma@eit.uni-kl.devoid 9512027Sjungma@eit.uni-kl.desc_simcontext::reset_curr_proc() 9612027Sjungma@eit.uni-kl.de{ 9712027Sjungma@eit.uni-kl.de m_curr_proc_info.process_handle = 0; 9812027Sjungma@eit.uni-kl.de m_curr_proc_info.kind = SC_NO_PROC_; 9912027Sjungma@eit.uni-kl.de m_current_writer = 0; 10012027Sjungma@eit.uni-kl.de sc_process_b::m_last_created_process_p = 0; 10112027Sjungma@eit.uni-kl.de} 10212027Sjungma@eit.uni-kl.de 10312027Sjungma@eit.uni-kl.deinline 10412027Sjungma@eit.uni-kl.devoid 10512027Sjungma@eit.uni-kl.desc_simcontext::execute_method_next( sc_method_handle method_h ) 10612027Sjungma@eit.uni-kl.de{ 10712027Sjungma@eit.uni-kl.de m_runnable->execute_method_next( method_h ); 10812027Sjungma@eit.uni-kl.de} 10912027Sjungma@eit.uni-kl.de 11012027Sjungma@eit.uni-kl.deinline 11112027Sjungma@eit.uni-kl.devoid 11212027Sjungma@eit.uni-kl.desc_simcontext::execute_thread_next( sc_thread_handle thread_h ) 11312027Sjungma@eit.uni-kl.de{ 11412027Sjungma@eit.uni-kl.de m_runnable->execute_thread_next( thread_h ); 11512027Sjungma@eit.uni-kl.de} 11612027Sjungma@eit.uni-kl.de 11712027Sjungma@eit.uni-kl.de// +---------------------------------------------------------------------------- 11812027Sjungma@eit.uni-kl.de// |"sc_simcontext::preempt_with" 11912027Sjungma@eit.uni-kl.de// | 12012027Sjungma@eit.uni-kl.de// | This method executes the supplied thread immediately, suspending the 12112027Sjungma@eit.uni-kl.de// | caller. After executing the supplied thread the caller's execution will 12212027Sjungma@eit.uni-kl.de// | be restored. It is used to allow a thread to immediately throw an 12312027Sjungma@eit.uni-kl.de// | exception, e.g., when the thread's kill_process() method was called. 12412027Sjungma@eit.uni-kl.de// | There are three cases to consider: 12512027Sjungma@eit.uni-kl.de// | (1) The caller is a method, e.g., murder by method. 12612027Sjungma@eit.uni-kl.de// | (2) The caller is another thread instance, e.g., murder by thread. 12712027Sjungma@eit.uni-kl.de// | (3) The caller is this thread instance, e.g., suicide. 12812027Sjungma@eit.uni-kl.de// | 12912027Sjungma@eit.uni-kl.de// | Arguments: 13012027Sjungma@eit.uni-kl.de// | thread_h -> thread to be executed. 13112027Sjungma@eit.uni-kl.de// +---------------------------------------------------------------------------- 13212027Sjungma@eit.uni-kl.deinline 13312027Sjungma@eit.uni-kl.devoid 13412027Sjungma@eit.uni-kl.desc_simcontext::preempt_with( sc_thread_handle thread_h ) 13512027Sjungma@eit.uni-kl.de{ 13612027Sjungma@eit.uni-kl.de sc_thread_handle active_p; // active thread or null. 13712027Sjungma@eit.uni-kl.de sc_curr_proc_info caller_info; // process info for caller. 13812027Sjungma@eit.uni-kl.de 13912027Sjungma@eit.uni-kl.de // Determine the active process and take the thread to be run off the 14012027Sjungma@eit.uni-kl.de // run queue, if its there, since we will be explicitly causing its 14112027Sjungma@eit.uni-kl.de // execution. 14212027Sjungma@eit.uni-kl.de 14312027Sjungma@eit.uni-kl.de active_p = DCAST<sc_thread_handle>(sc_get_current_process_b()); 14412027Sjungma@eit.uni-kl.de if ( thread_h->next_runnable() != NULL ) 14512027Sjungma@eit.uni-kl.de remove_runnable_thread( thread_h ); 14612027Sjungma@eit.uni-kl.de 14712027Sjungma@eit.uni-kl.de // THE CALLER IS A METHOD: 14812027Sjungma@eit.uni-kl.de // 14912027Sjungma@eit.uni-kl.de // (a) Set the current process information to our thread. 15012027Sjungma@eit.uni-kl.de // (b) If the method was called by an invoker thread push that thread 15112027Sjungma@eit.uni-kl.de // onto the front of the run queue, this will cause the method 15212027Sjungma@eit.uni-kl.de // to be resumed after this thread waits. 15312027Sjungma@eit.uni-kl.de // (c) Invoke our thread directly by-passing the run queue. 15412027Sjungma@eit.uni-kl.de // (d) Restore the process info to the caller. 15512027Sjungma@eit.uni-kl.de // (e) Check to see if the calling method should throw an exception 15612027Sjungma@eit.uni-kl.de // because of activity that occurred during the preemption. 15712027Sjungma@eit.uni-kl.de 15812027Sjungma@eit.uni-kl.de if ( active_p == NULL ) 15912027Sjungma@eit.uni-kl.de { 16012027Sjungma@eit.uni-kl.de std::vector<sc_thread_handle>* invokers_p; // active invokers stack. 16112027Sjungma@eit.uni-kl.de sc_thread_handle invoke_thread_p; // latest invocation thread. 16212027Sjungma@eit.uni-kl.de sc_method_handle method_p; // active method. 16312027Sjungma@eit.uni-kl.de 16412027Sjungma@eit.uni-kl.de method_p = DCAST<sc_method_handle>(sc_get_current_process_b()); 16512027Sjungma@eit.uni-kl.de invokers_p = &get_active_invokers(); 16612027Sjungma@eit.uni-kl.de caller_info = m_curr_proc_info; 16712027Sjungma@eit.uni-kl.de if ( invokers_p->size() != 0 ) 16812027Sjungma@eit.uni-kl.de { 16912027Sjungma@eit.uni-kl.de invoke_thread_p = invokers_p->back(); 17012027Sjungma@eit.uni-kl.de DEBUG_MSG( DEBUG_NAME, invoke_thread_p, 17112027Sjungma@eit.uni-kl.de "queueing invocation thread to execute next" ); 17212027Sjungma@eit.uni-kl.de execute_thread_next(invoke_thread_p); 17312027Sjungma@eit.uni-kl.de } 17412027Sjungma@eit.uni-kl.de DEBUG_MSG( DEBUG_NAME, thread_h, "preempting method with thread" ); 17512027Sjungma@eit.uni-kl.de set_curr_proc( (sc_process_b*)thread_h ); 17612027Sjungma@eit.uni-kl.de m_cor_pkg->yield( thread_h->m_cor_p ); 17712027Sjungma@eit.uni-kl.de m_curr_proc_info = caller_info; 17812027Sjungma@eit.uni-kl.de DEBUG_MSG(DEBUG_NAME, thread_h, "back from preempting method w/thread"); 17912027Sjungma@eit.uni-kl.de method_p->check_for_throws(); 18012027Sjungma@eit.uni-kl.de } 18112027Sjungma@eit.uni-kl.de 18212027Sjungma@eit.uni-kl.de // CALLER IS A THREAD, BUT NOT THE THREAD TO BE RUN: 18312027Sjungma@eit.uni-kl.de // 18412027Sjungma@eit.uni-kl.de // (a) Push the calling thread onto the front of the runnable queue 18512027Sjungma@eit.uni-kl.de // so it be the first thread to be run after this thread. 18612027Sjungma@eit.uni-kl.de // (b) Push the thread to be run onto the front of the runnable queue so 18712027Sjungma@eit.uni-kl.de // it will execute when we suspend the calling thread. 18812027Sjungma@eit.uni-kl.de // (c) Suspend the active thread. 18912027Sjungma@eit.uni-kl.de 19012027Sjungma@eit.uni-kl.de else if ( active_p != thread_h ) 19112027Sjungma@eit.uni-kl.de { 19212027Sjungma@eit.uni-kl.de DEBUG_MSG( DEBUG_NAME, thread_h, 19312027Sjungma@eit.uni-kl.de "preempting active thread with thread" ); 19412027Sjungma@eit.uni-kl.de execute_thread_next( active_p ); 19512027Sjungma@eit.uni-kl.de execute_thread_next( thread_h ); 19612027Sjungma@eit.uni-kl.de active_p->suspend_me(); 19712027Sjungma@eit.uni-kl.de } 19812027Sjungma@eit.uni-kl.de 19912027Sjungma@eit.uni-kl.de // CALLER IS THE THREAD TO BE RUN: 20012027Sjungma@eit.uni-kl.de // 20112027Sjungma@eit.uni-kl.de // (a) Push the thread to be run onto the front of the runnable queue so 20212027Sjungma@eit.uni-kl.de // it will execute when we suspend the calling thread. 20312027Sjungma@eit.uni-kl.de // (b) Suspend the active thread. 20412027Sjungma@eit.uni-kl.de 20512027Sjungma@eit.uni-kl.de else 20612027Sjungma@eit.uni-kl.de { 20712027Sjungma@eit.uni-kl.de DEBUG_MSG(DEBUG_NAME,thread_h,"self preemption of active thread"); 20812027Sjungma@eit.uni-kl.de execute_thread_next( thread_h ); 20912027Sjungma@eit.uni-kl.de active_p->suspend_me(); 21012027Sjungma@eit.uni-kl.de } 21112027Sjungma@eit.uni-kl.de} 21212027Sjungma@eit.uni-kl.de 21312027Sjungma@eit.uni-kl.de 21412027Sjungma@eit.uni-kl.deinline 21512027Sjungma@eit.uni-kl.devoid 21612027Sjungma@eit.uni-kl.desc_simcontext::push_runnable_method( sc_method_handle method_h ) 21712027Sjungma@eit.uni-kl.de{ 21812027Sjungma@eit.uni-kl.de m_runnable->push_back_method( method_h ); 21912027Sjungma@eit.uni-kl.de} 22012027Sjungma@eit.uni-kl.de 22112027Sjungma@eit.uni-kl.deinline 22212027Sjungma@eit.uni-kl.devoid 22312027Sjungma@eit.uni-kl.desc_simcontext::push_runnable_method_front( sc_method_handle method_h ) 22412027Sjungma@eit.uni-kl.de{ 22512027Sjungma@eit.uni-kl.de m_runnable->push_front_method( method_h ); 22612027Sjungma@eit.uni-kl.de} 22712027Sjungma@eit.uni-kl.de 22812027Sjungma@eit.uni-kl.deinline 22912027Sjungma@eit.uni-kl.devoid 23012027Sjungma@eit.uni-kl.desc_simcontext::push_runnable_thread( sc_thread_handle thread_h ) 23112027Sjungma@eit.uni-kl.de{ 23212027Sjungma@eit.uni-kl.de m_runnable->push_back_thread( thread_h ); 23312027Sjungma@eit.uni-kl.de} 23412027Sjungma@eit.uni-kl.de 23512027Sjungma@eit.uni-kl.deinline 23612027Sjungma@eit.uni-kl.devoid 23712027Sjungma@eit.uni-kl.desc_simcontext::push_runnable_thread_front( sc_thread_handle thread_h ) 23812027Sjungma@eit.uni-kl.de{ 23912027Sjungma@eit.uni-kl.de m_runnable->push_front_thread( thread_h ); 24012027Sjungma@eit.uni-kl.de} 24112027Sjungma@eit.uni-kl.de 24212027Sjungma@eit.uni-kl.de 24312027Sjungma@eit.uni-kl.deinline 24412027Sjungma@eit.uni-kl.desc_method_handle 24512027Sjungma@eit.uni-kl.desc_simcontext::pop_runnable_method() 24612027Sjungma@eit.uni-kl.de{ 24712027Sjungma@eit.uni-kl.de sc_method_handle method_h = m_runnable->pop_method(); 24812027Sjungma@eit.uni-kl.de if( method_h == 0 ) { 24912027Sjungma@eit.uni-kl.de reset_curr_proc(); 25012027Sjungma@eit.uni-kl.de return 0; 25112027Sjungma@eit.uni-kl.de } 25212027Sjungma@eit.uni-kl.de set_curr_proc( (sc_process_b*)method_h ); 25312027Sjungma@eit.uni-kl.de return method_h; 25412027Sjungma@eit.uni-kl.de} 25512027Sjungma@eit.uni-kl.de 25612027Sjungma@eit.uni-kl.deinline 25712027Sjungma@eit.uni-kl.desc_thread_handle 25812027Sjungma@eit.uni-kl.desc_simcontext::pop_runnable_thread() 25912027Sjungma@eit.uni-kl.de{ 26012027Sjungma@eit.uni-kl.de sc_thread_handle thread_h = m_runnable->pop_thread(); 26112027Sjungma@eit.uni-kl.de if( thread_h == 0 ) { 26212027Sjungma@eit.uni-kl.de reset_curr_proc(); 26312027Sjungma@eit.uni-kl.de return 0; 26412027Sjungma@eit.uni-kl.de } 26512027Sjungma@eit.uni-kl.de set_curr_proc( (sc_process_b*)thread_h ); 26612027Sjungma@eit.uni-kl.de return thread_h; 26712027Sjungma@eit.uni-kl.de} 26812027Sjungma@eit.uni-kl.de 26912027Sjungma@eit.uni-kl.deinline 27012027Sjungma@eit.uni-kl.devoid 27112027Sjungma@eit.uni-kl.desc_simcontext::remove_runnable_method( sc_method_handle method_h ) 27212027Sjungma@eit.uni-kl.de{ 27312027Sjungma@eit.uni-kl.de m_runnable->remove_method( method_h ); 27412027Sjungma@eit.uni-kl.de} 27512027Sjungma@eit.uni-kl.de 27612027Sjungma@eit.uni-kl.deinline 27712027Sjungma@eit.uni-kl.devoid 27812027Sjungma@eit.uni-kl.desc_simcontext::remove_runnable_thread( sc_thread_handle thread_h ) 27912027Sjungma@eit.uni-kl.de{ 28012027Sjungma@eit.uni-kl.de m_runnable->remove_thread( thread_h ); 28112027Sjungma@eit.uni-kl.de} 28212027Sjungma@eit.uni-kl.de 28312027Sjungma@eit.uni-kl.deinline 28412027Sjungma@eit.uni-kl.destd::vector<sc_thread_handle>& 28512027Sjungma@eit.uni-kl.desc_simcontext::get_active_invokers() 28612027Sjungma@eit.uni-kl.de{ 28712027Sjungma@eit.uni-kl.de return m_active_invokers; 28812027Sjungma@eit.uni-kl.de} 28912027Sjungma@eit.uni-kl.de 29012027Sjungma@eit.uni-kl.de// ---------------------------------------------------------------------------- 29112027Sjungma@eit.uni-kl.de 29212027Sjungma@eit.uni-kl.deextern void sc_defunct_process_function( sc_module* ); 29312027Sjungma@eit.uni-kl.de 29412027Sjungma@eit.uni-kl.de 29512027Sjungma@eit.uni-kl.de} // namespace sc_core 29612027Sjungma@eit.uni-kl.de 29712027Sjungma@eit.uni-kl.de#undef DEBUG_MSG 29812027Sjungma@eit.uni-kl.de#undef DEBUG_NAME 29912027Sjungma@eit.uni-kl.de 30012027Sjungma@eit.uni-kl.de// $Log: sc_simcontext_int.h,v $ 30112027Sjungma@eit.uni-kl.de// Revision 1.14 2011/08/29 18:04:32 acg 30212027Sjungma@eit.uni-kl.de// Philipp A. Hartmann: miscellaneous clean ups. 30312027Sjungma@eit.uni-kl.de// 30412027Sjungma@eit.uni-kl.de// Revision 1.13 2011/08/26 20:46:11 acg 30512027Sjungma@eit.uni-kl.de// Andy Goodrich: moved the modification log to the end of the file to 30612027Sjungma@eit.uni-kl.de// eliminate source line number skew when check-ins are done. 30712027Sjungma@eit.uni-kl.de// 30812027Sjungma@eit.uni-kl.de// Revision 1.12 2011/07/29 22:45:06 acg 30912027Sjungma@eit.uni-kl.de// Andy Goodrich: added invocation of sc_method_process::check_for_throws() 31012027Sjungma@eit.uni-kl.de// to the preempt_with() code to handle case where the preempting process 31112027Sjungma@eit.uni-kl.de// causes a throw on the invoking method process. 31212027Sjungma@eit.uni-kl.de// 31312027Sjungma@eit.uni-kl.de// Revision 1.11 2011/04/13 02:45:11 acg 31412027Sjungma@eit.uni-kl.de// Andy Goodrich: eliminated warning message that occurred if the DEBUG_MSG 31512027Sjungma@eit.uni-kl.de// macro was used. 31612027Sjungma@eit.uni-kl.de// 31712027Sjungma@eit.uni-kl.de// Revision 1.10 2011/04/11 22:05:48 acg 31812027Sjungma@eit.uni-kl.de// Andy Goodrich: use the DEBUG_NAME macro in DEBUG_MSG invocations. 31912027Sjungma@eit.uni-kl.de// 32012027Sjungma@eit.uni-kl.de// Revision 1.9 2011/04/10 22:12:32 acg 32112027Sjungma@eit.uni-kl.de// Andy Goodrich: adding debugging macros. 32212027Sjungma@eit.uni-kl.de// 32312027Sjungma@eit.uni-kl.de// Revision 1.8 2011/04/08 18:26:07 acg 32412027Sjungma@eit.uni-kl.de// Andy Goodrich: added execute_method_next() to handle method dispatch 32512027Sjungma@eit.uni-kl.de// for asynchronous notifications that occur outside the evaluation phase. 32612027Sjungma@eit.uni-kl.de// 32712027Sjungma@eit.uni-kl.de// Revision 1.7 2011/02/18 20:27:14 acg 32812027Sjungma@eit.uni-kl.de// Andy Goodrich: Updated Copyrights. 32912027Sjungma@eit.uni-kl.de// 33012027Sjungma@eit.uni-kl.de// Revision 1.6 2011/02/13 21:47:38 acg 33112027Sjungma@eit.uni-kl.de// Andy Goodrich: update copyright notice. 33212027Sjungma@eit.uni-kl.de// 33312027Sjungma@eit.uni-kl.de// Revision 1.5 2011/02/08 08:17:50 acg 33412027Sjungma@eit.uni-kl.de// Andy Goodrich: fixed bug in preempt_with() where I was resetting the 33512027Sjungma@eit.uni-kl.de// process context rather than saving and restoring it. 33612027Sjungma@eit.uni-kl.de// 33712027Sjungma@eit.uni-kl.de// Revision 1.4 2011/02/01 21:12:56 acg 33812027Sjungma@eit.uni-kl.de// Andy Goodrich: addition of preempt_with() method to allow immediate 33912027Sjungma@eit.uni-kl.de// execution of threads for throws. 34012027Sjungma@eit.uni-kl.de// 34112027Sjungma@eit.uni-kl.de// Revision 1.3 2011/01/25 20:50:37 acg 34212027Sjungma@eit.uni-kl.de// Andy Goodrich: changes for IEEE 1666 2011. 34312027Sjungma@eit.uni-kl.de// 34412027Sjungma@eit.uni-kl.de// Revision 1.2 2008/05/22 17:06:26 acg 34512027Sjungma@eit.uni-kl.de// Andy Goodrich: updated copyright notice to include 2008. 34612027Sjungma@eit.uni-kl.de// 34712027Sjungma@eit.uni-kl.de// Revision 1.1.1.1 2006/12/15 20:20:05 acg 34812027Sjungma@eit.uni-kl.de// SystemC 2.3 34912027Sjungma@eit.uni-kl.de// 35012027Sjungma@eit.uni-kl.de// Revision 1.6 2006/05/26 20:33:16 acg 35112027Sjungma@eit.uni-kl.de// Andy Goodrich: changes required by additional platform compilers (i.e., 35212027Sjungma@eit.uni-kl.de// Microsoft VC++, Sun Forte, HP aCC). 35312027Sjungma@eit.uni-kl.de// 35412027Sjungma@eit.uni-kl.de// Revision 1.5 2006/01/19 00:29:52 acg 35512027Sjungma@eit.uni-kl.de// Andy Goodrich: Yet another implementation for signal write checking. This 35612027Sjungma@eit.uni-kl.de// one uses an environment variable SC_SIGNAL_WRITE_CHECK, that when set to 35712027Sjungma@eit.uni-kl.de// DISABLE will disable write checking on signals. 35812027Sjungma@eit.uni-kl.de// 35912027Sjungma@eit.uni-kl.de// Revision 1.4 2006/01/18 21:42:37 acg 36012027Sjungma@eit.uni-kl.de// Andy Goodrich: Changes for check writer support. 36112027Sjungma@eit.uni-kl.de// 36212027Sjungma@eit.uni-kl.de// Revision 1.3 2006/01/13 18:44:30 acg 36312027Sjungma@eit.uni-kl.de// Added $Log to record CVS changes into the source. 36412027Sjungma@eit.uni-kl.de 36512027Sjungma@eit.uni-kl.de#endif 366