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