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_method_process.h -- Method 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// $Log: sc_method_process.h,v $ 3112027Sjungma@eit.uni-kl.de// Revision 1.23 2011/09/05 21:20:22 acg 3212027Sjungma@eit.uni-kl.de// Andy Goodrich: result of automake invocation. 3312027Sjungma@eit.uni-kl.de// 3412027Sjungma@eit.uni-kl.de// Revision 1.22 2011/08/29 18:04:32 acg 3512027Sjungma@eit.uni-kl.de// Philipp A. Hartmann: miscellaneous clean ups. 3612027Sjungma@eit.uni-kl.de// 3712027Sjungma@eit.uni-kl.de// Revision 1.21 2011/08/26 20:46:10 acg 3812027Sjungma@eit.uni-kl.de// Andy Goodrich: moved the modification log to the end of the file to 3912027Sjungma@eit.uni-kl.de// eliminate source line number skew when check-ins are done. 4012027Sjungma@eit.uni-kl.de// 4112027Sjungma@eit.uni-kl.de 4212027Sjungma@eit.uni-kl.de#if !defined(sc_method_process_h_INCLUDED) 4312027Sjungma@eit.uni-kl.de#define sc_method_process_h_INCLUDED 4412027Sjungma@eit.uni-kl.de 4512027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_process.h" 4612027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_spawn_options.h" 4712027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_cor.h" 4812027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_event.h" 4912027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_except.h" 5012027Sjungma@eit.uni-kl.de 5112027Sjungma@eit.uni-kl.de 5212027Sjungma@eit.uni-kl.de// DEBUGGING MACROS: 5312027Sjungma@eit.uni-kl.de// 5412027Sjungma@eit.uni-kl.de// DEBUG_MSG(NAME,P,MSG) 5512027Sjungma@eit.uni-kl.de// MSG = message to print 5612027Sjungma@eit.uni-kl.de// NAME = name that must match the process for the message to print, or 5712027Sjungma@eit.uni-kl.de// null if the message should be printed unconditionally. 5812027Sjungma@eit.uni-kl.de// P = pointer to process message is for, or NULL in which case the 5912027Sjungma@eit.uni-kl.de// message will not print. 6012027Sjungma@eit.uni-kl.de#if 0 6112027Sjungma@eit.uni-kl.de# define DEBUG_NAME "" 6212027Sjungma@eit.uni-kl.de# define DEBUG_MSG(NAME,P,MSG) \ 6312027Sjungma@eit.uni-kl.de { \ 6412027Sjungma@eit.uni-kl.de if ( P && ( (strlen(NAME)==0) || !strcmp(NAME,P->name())) ) \ 6512027Sjungma@eit.uni-kl.de std::cout << "**** " << sc_time_stamp() << " (" \ 6612027Sjungma@eit.uni-kl.de << sc_get_current_process_name() << "): " << MSG \ 6712027Sjungma@eit.uni-kl.de << " - " << P->name() << std::endl; \ 6812027Sjungma@eit.uni-kl.de } 6912027Sjungma@eit.uni-kl.de#else 7012027Sjungma@eit.uni-kl.de# define DEBUG_MSG(NAME,P,MSG) 7112027Sjungma@eit.uni-kl.de#endif 7212027Sjungma@eit.uni-kl.de 7312027Sjungma@eit.uni-kl.de 7412027Sjungma@eit.uni-kl.denamespace sc_core { 7512027Sjungma@eit.uni-kl.de 7612027Sjungma@eit.uni-kl.de// forward function and class declarations: 7712027Sjungma@eit.uni-kl.de 7812027Sjungma@eit.uni-kl.devoid sc_method_cor_fn( void* ); 7912027Sjungma@eit.uni-kl.devoid sc_cmethod_cor_fn( void* ); 8012027Sjungma@eit.uni-kl.devoid sc_set_stack_size( sc_method_handle, std::size_t ); 8112027Sjungma@eit.uni-kl.declass sc_event; 8212027Sjungma@eit.uni-kl.declass sc_module; 8312027Sjungma@eit.uni-kl.declass sc_process_table; 8412027Sjungma@eit.uni-kl.declass sc_process_handle; 8512027Sjungma@eit.uni-kl.declass sc_simcontext; 8612027Sjungma@eit.uni-kl.declass sc_runnable; 8712027Sjungma@eit.uni-kl.de 8812027Sjungma@eit.uni-kl.devoid next_trigger( sc_simcontext* ); 8912027Sjungma@eit.uni-kl.devoid next_trigger( const sc_event&, sc_simcontext* ); 9012027Sjungma@eit.uni-kl.devoid next_trigger( const sc_event_or_list&, sc_simcontext* ); 9112027Sjungma@eit.uni-kl.devoid next_trigger( const sc_event_and_list&, sc_simcontext* ); 9212027Sjungma@eit.uni-kl.devoid next_trigger( const sc_time&, sc_simcontext* ); 9312027Sjungma@eit.uni-kl.devoid next_trigger( const sc_time&, const sc_event&, sc_simcontext* ); 9412027Sjungma@eit.uni-kl.devoid next_trigger( const sc_time&, const sc_event_or_list&, sc_simcontext* ); 9512027Sjungma@eit.uni-kl.devoid next_trigger( const sc_time&, const sc_event_and_list&, sc_simcontext* ); 9612027Sjungma@eit.uni-kl.de 9712027Sjungma@eit.uni-kl.destruct sc_invoke_method; 9812027Sjungma@eit.uni-kl.de//============================================================================== 9912027Sjungma@eit.uni-kl.de// sc_method_process - 10012027Sjungma@eit.uni-kl.de// 10112027Sjungma@eit.uni-kl.de//============================================================================== 10212027Sjungma@eit.uni-kl.declass sc_method_process : public sc_process_b { 10312027Sjungma@eit.uni-kl.de friend struct sc_invoke_method; 10412027Sjungma@eit.uni-kl.de friend void sc_method_cor_fn( void* ); 10512027Sjungma@eit.uni-kl.de friend void sc_cmethod_cor_fn( void* ); 10612027Sjungma@eit.uni-kl.de friend void sc_set_stack_size( sc_method_handle, std::size_t ); 10712027Sjungma@eit.uni-kl.de friend class sc_event; 10812027Sjungma@eit.uni-kl.de friend class sc_module; 10912027Sjungma@eit.uni-kl.de friend class sc_process_table; 11012027Sjungma@eit.uni-kl.de friend class sc_process_handle; 11112027Sjungma@eit.uni-kl.de friend class sc_simcontext; 11212027Sjungma@eit.uni-kl.de friend class sc_runnable; 11312027Sjungma@eit.uni-kl.de 11412027Sjungma@eit.uni-kl.de friend void next_trigger( sc_simcontext* ); 11512027Sjungma@eit.uni-kl.de friend void next_trigger( const sc_event&, 11612027Sjungma@eit.uni-kl.de sc_simcontext* ); 11712027Sjungma@eit.uni-kl.de friend void next_trigger( const sc_event_or_list&, 11812027Sjungma@eit.uni-kl.de sc_simcontext* ); 11912027Sjungma@eit.uni-kl.de friend void next_trigger( const sc_event_and_list&, 12012027Sjungma@eit.uni-kl.de sc_simcontext* ); 12112027Sjungma@eit.uni-kl.de friend void next_trigger( const sc_time&, 12212027Sjungma@eit.uni-kl.de sc_simcontext* ); 12312027Sjungma@eit.uni-kl.de friend void next_trigger( const sc_time&, const sc_event&, 12412027Sjungma@eit.uni-kl.de sc_simcontext* ); 12512027Sjungma@eit.uni-kl.de friend void next_trigger( const sc_time&, const sc_event_or_list&, 12612027Sjungma@eit.uni-kl.de sc_simcontext* ); 12712027Sjungma@eit.uni-kl.de friend void next_trigger( const sc_time&, const sc_event_and_list&, 12812027Sjungma@eit.uni-kl.de sc_simcontext* ); 12912027Sjungma@eit.uni-kl.de 13012027Sjungma@eit.uni-kl.de public: 13112027Sjungma@eit.uni-kl.de sc_method_process( const char* name_p, bool free_host, 13212027Sjungma@eit.uni-kl.de SC_ENTRY_FUNC method_p, sc_process_host* host_p, 13312027Sjungma@eit.uni-kl.de const sc_spawn_options* opt_p ); 13412027Sjungma@eit.uni-kl.de 13512027Sjungma@eit.uni-kl.de virtual const char* kind() const 13612027Sjungma@eit.uni-kl.de { return "sc_method_process"; } 13712027Sjungma@eit.uni-kl.de 13812027Sjungma@eit.uni-kl.de protected: 13912027Sjungma@eit.uni-kl.de void check_for_throws(); 14012027Sjungma@eit.uni-kl.de virtual void disable_process( 14112027Sjungma@eit.uni-kl.de sc_descendant_inclusion_info descendants = SC_NO_DESCENDANTS ); 14212027Sjungma@eit.uni-kl.de virtual void enable_process( 14312027Sjungma@eit.uni-kl.de sc_descendant_inclusion_info descendants = SC_NO_DESCENDANTS ); 14412027Sjungma@eit.uni-kl.de inline bool run_process(); 14512027Sjungma@eit.uni-kl.de virtual void kill_process( 14612027Sjungma@eit.uni-kl.de sc_descendant_inclusion_info descendants = SC_NO_DESCENDANTS ); 14712027Sjungma@eit.uni-kl.de sc_method_handle next_exist(); 14812027Sjungma@eit.uni-kl.de sc_method_handle next_runnable(); 14912027Sjungma@eit.uni-kl.de void clear_trigger(); 15012027Sjungma@eit.uni-kl.de void next_trigger( const sc_event& ); 15112027Sjungma@eit.uni-kl.de void next_trigger( const sc_event_or_list& ); 15212027Sjungma@eit.uni-kl.de void next_trigger( const sc_event_and_list& ); 15312027Sjungma@eit.uni-kl.de void next_trigger( const sc_time& ); 15412027Sjungma@eit.uni-kl.de void next_trigger( const sc_time&, const sc_event& ); 15512027Sjungma@eit.uni-kl.de void next_trigger( const sc_time&, const sc_event_or_list& ); 15612027Sjungma@eit.uni-kl.de void next_trigger( const sc_time&, const sc_event_and_list& ); 15712027Sjungma@eit.uni-kl.de virtual void resume_process( 15812027Sjungma@eit.uni-kl.de sc_descendant_inclusion_info descendants = SC_NO_DESCENDANTS ); 15912027Sjungma@eit.uni-kl.de void set_next_exist( sc_method_handle next_p ); 16012027Sjungma@eit.uni-kl.de void set_next_runnable( sc_method_handle next_p ); 16112027Sjungma@eit.uni-kl.de void set_stack_size( std::size_t size ); 16212027Sjungma@eit.uni-kl.de virtual void suspend_process( 16312027Sjungma@eit.uni-kl.de sc_descendant_inclusion_info descendants = SC_NO_DESCENDANTS ); 16412027Sjungma@eit.uni-kl.de virtual void throw_reset( bool async ); 16512027Sjungma@eit.uni-kl.de virtual void throw_user( const sc_throw_it_helper& helper, 16612027Sjungma@eit.uni-kl.de sc_descendant_inclusion_info descendants = SC_NO_DESCENDANTS ); 16712027Sjungma@eit.uni-kl.de bool trigger_dynamic( sc_event* ); 16812027Sjungma@eit.uni-kl.de inline void trigger_static(); 16912027Sjungma@eit.uni-kl.de 17012027Sjungma@eit.uni-kl.de protected: 17112027Sjungma@eit.uni-kl.de sc_cor* m_cor; // Thread's coroutine. 17212027Sjungma@eit.uni-kl.de std::size_t m_stack_size; // Thread stack size. 17312027Sjungma@eit.uni-kl.de std::vector<sc_process_monitor*> m_monitor_q; // Thread monitors. 17412027Sjungma@eit.uni-kl.de 17512027Sjungma@eit.uni-kl.de private: 17612027Sjungma@eit.uni-kl.de // may not be deleted manually (called from sc_process_b) 17712027Sjungma@eit.uni-kl.de virtual ~sc_method_process(); 17812027Sjungma@eit.uni-kl.de 17912027Sjungma@eit.uni-kl.de private: // disabled 18012027Sjungma@eit.uni-kl.de sc_method_process( const sc_method_process& ); 18112027Sjungma@eit.uni-kl.de const sc_method_process& operator = ( const sc_method_process& ); 18212027Sjungma@eit.uni-kl.de 18312027Sjungma@eit.uni-kl.de}; 18412027Sjungma@eit.uni-kl.de 18512027Sjungma@eit.uni-kl.deinline 18612027Sjungma@eit.uni-kl.devoid 18712027Sjungma@eit.uni-kl.desc_method_process::next_trigger( const sc_event& e ) 18812027Sjungma@eit.uni-kl.de{ 18912027Sjungma@eit.uni-kl.de clear_trigger(); 19012027Sjungma@eit.uni-kl.de e.add_dynamic( this ); 19112027Sjungma@eit.uni-kl.de m_event_p = &e; 19212027Sjungma@eit.uni-kl.de m_trigger_type = EVENT; 19312027Sjungma@eit.uni-kl.de} 19412027Sjungma@eit.uni-kl.de 19512027Sjungma@eit.uni-kl.deinline 19612027Sjungma@eit.uni-kl.devoid 19712027Sjungma@eit.uni-kl.desc_method_process::next_trigger( const sc_event_or_list& el ) 19812027Sjungma@eit.uni-kl.de{ 19912027Sjungma@eit.uni-kl.de clear_trigger(); 20012027Sjungma@eit.uni-kl.de el.add_dynamic( this ); 20112027Sjungma@eit.uni-kl.de m_event_list_p = ⪙ 20212027Sjungma@eit.uni-kl.de m_trigger_type = OR_LIST; 20312027Sjungma@eit.uni-kl.de} 20412027Sjungma@eit.uni-kl.de 20512027Sjungma@eit.uni-kl.deinline 20612027Sjungma@eit.uni-kl.devoid 20712027Sjungma@eit.uni-kl.desc_method_process::next_trigger( const sc_event_and_list& el ) 20812027Sjungma@eit.uni-kl.de{ 20912027Sjungma@eit.uni-kl.de clear_trigger(); 21012027Sjungma@eit.uni-kl.de el.add_dynamic( this ); 21112027Sjungma@eit.uni-kl.de m_event_list_p = ⪙ 21212027Sjungma@eit.uni-kl.de m_event_count = el.size(); 21312027Sjungma@eit.uni-kl.de m_trigger_type = AND_LIST; 21412027Sjungma@eit.uni-kl.de} 21512027Sjungma@eit.uni-kl.de 21612027Sjungma@eit.uni-kl.deinline 21712027Sjungma@eit.uni-kl.devoid 21812027Sjungma@eit.uni-kl.desc_method_process::next_trigger( const sc_time& t ) 21912027Sjungma@eit.uni-kl.de{ 22012027Sjungma@eit.uni-kl.de clear_trigger(); 22112027Sjungma@eit.uni-kl.de m_timeout_event_p->notify_internal( t ); 22212027Sjungma@eit.uni-kl.de m_timeout_event_p->add_dynamic( this ); 22312027Sjungma@eit.uni-kl.de m_trigger_type = TIMEOUT; 22412027Sjungma@eit.uni-kl.de} 22512027Sjungma@eit.uni-kl.de 22612027Sjungma@eit.uni-kl.deinline 22712027Sjungma@eit.uni-kl.devoid 22812027Sjungma@eit.uni-kl.desc_method_process::next_trigger( const sc_time& t, const sc_event& e ) 22912027Sjungma@eit.uni-kl.de{ 23012027Sjungma@eit.uni-kl.de clear_trigger(); 23112027Sjungma@eit.uni-kl.de m_timeout_event_p->notify_internal( t ); 23212027Sjungma@eit.uni-kl.de m_timeout_event_p->add_dynamic( this ); 23312027Sjungma@eit.uni-kl.de e.add_dynamic( this ); 23412027Sjungma@eit.uni-kl.de m_event_p = &e; 23512027Sjungma@eit.uni-kl.de m_trigger_type = EVENT_TIMEOUT; 23612027Sjungma@eit.uni-kl.de} 23712027Sjungma@eit.uni-kl.de 23812027Sjungma@eit.uni-kl.deinline 23912027Sjungma@eit.uni-kl.devoid 24012027Sjungma@eit.uni-kl.desc_method_process::next_trigger( const sc_time& t, const sc_event_or_list& el ) 24112027Sjungma@eit.uni-kl.de{ 24212027Sjungma@eit.uni-kl.de clear_trigger(); 24312027Sjungma@eit.uni-kl.de m_timeout_event_p->notify_internal( t ); 24412027Sjungma@eit.uni-kl.de m_timeout_event_p->add_dynamic( this ); 24512027Sjungma@eit.uni-kl.de el.add_dynamic( this ); 24612027Sjungma@eit.uni-kl.de m_event_list_p = ⪙ 24712027Sjungma@eit.uni-kl.de m_trigger_type = OR_LIST_TIMEOUT; 24812027Sjungma@eit.uni-kl.de} 24912027Sjungma@eit.uni-kl.de 25012027Sjungma@eit.uni-kl.deinline 25112027Sjungma@eit.uni-kl.devoid 25212027Sjungma@eit.uni-kl.desc_method_process::next_trigger( const sc_time& t, const sc_event_and_list& el ) 25312027Sjungma@eit.uni-kl.de{ 25412027Sjungma@eit.uni-kl.de clear_trigger(); 25512027Sjungma@eit.uni-kl.de m_timeout_event_p->notify_internal( t ); 25612027Sjungma@eit.uni-kl.de m_timeout_event_p->add_dynamic( this ); 25712027Sjungma@eit.uni-kl.de el.add_dynamic( this ); 25812027Sjungma@eit.uni-kl.de m_event_list_p = ⪙ 25912027Sjungma@eit.uni-kl.de m_event_count = el.size(); 26012027Sjungma@eit.uni-kl.de m_trigger_type = AND_LIST_TIMEOUT; 26112027Sjungma@eit.uni-kl.de} 26212027Sjungma@eit.uni-kl.de 26312027Sjungma@eit.uni-kl.deinline 26412027Sjungma@eit.uni-kl.devoid sc_method_process::set_next_exist(sc_method_handle next_p) 26512027Sjungma@eit.uni-kl.de{ 26612027Sjungma@eit.uni-kl.de m_exist_p = next_p; 26712027Sjungma@eit.uni-kl.de} 26812027Sjungma@eit.uni-kl.de 26912027Sjungma@eit.uni-kl.deinline 27012027Sjungma@eit.uni-kl.desc_method_handle sc_method_process::next_exist() 27112027Sjungma@eit.uni-kl.de{ 27212027Sjungma@eit.uni-kl.de return (sc_method_handle)m_exist_p; 27312027Sjungma@eit.uni-kl.de} 27412027Sjungma@eit.uni-kl.de 27512027Sjungma@eit.uni-kl.de 27612027Sjungma@eit.uni-kl.deinline 27712027Sjungma@eit.uni-kl.devoid sc_method_process::set_next_runnable(sc_method_handle next_p) 27812027Sjungma@eit.uni-kl.de{ 27912027Sjungma@eit.uni-kl.de m_runnable_p = next_p; 28012027Sjungma@eit.uni-kl.de} 28112027Sjungma@eit.uni-kl.de 28212027Sjungma@eit.uni-kl.deinline 28312027Sjungma@eit.uni-kl.desc_method_handle sc_method_process::next_runnable() 28412027Sjungma@eit.uni-kl.de{ 28512027Sjungma@eit.uni-kl.de return (sc_method_handle)m_runnable_p; 28612027Sjungma@eit.uni-kl.de} 28712027Sjungma@eit.uni-kl.de 28812027Sjungma@eit.uni-kl.de// +---------------------------------------------------------------------------- 28912027Sjungma@eit.uni-kl.de// |"sc_method_process::run_process" 29012027Sjungma@eit.uni-kl.de// | 29112027Sjungma@eit.uni-kl.de// | This method executes this object instance, including fielding exceptions. 29212027Sjungma@eit.uni-kl.de// | 29312027Sjungma@eit.uni-kl.de// | Result is false if an unfielded exception occurred, true if not. 29412027Sjungma@eit.uni-kl.de// +---------------------------------------------------------------------------- 29512027Sjungma@eit.uni-kl.deinline bool sc_method_process::run_process() 29612027Sjungma@eit.uni-kl.de{ 29712027Sjungma@eit.uni-kl.de // Execute this object instance's semantics and catch any exceptions that 29812027Sjungma@eit.uni-kl.de // are generated: 29912027Sjungma@eit.uni-kl.de 30012027Sjungma@eit.uni-kl.de bool restart = false; 30112027Sjungma@eit.uni-kl.de do { 30212027Sjungma@eit.uni-kl.de try { 30312027Sjungma@eit.uni-kl.de DEBUG_MSG(DEBUG_NAME,this,"executing method semantics"); 30412027Sjungma@eit.uni-kl.de semantics(); 30512027Sjungma@eit.uni-kl.de restart = false; 30612027Sjungma@eit.uni-kl.de } 30712027Sjungma@eit.uni-kl.de catch( sc_unwind_exception& ex ) { 30812027Sjungma@eit.uni-kl.de DEBUG_MSG(DEBUG_NAME,this,"caught unwind exception"); 30912027Sjungma@eit.uni-kl.de ex.clear(); 31012027Sjungma@eit.uni-kl.de restart = ex.is_reset(); 31112027Sjungma@eit.uni-kl.de } 31212027Sjungma@eit.uni-kl.de catch( ... ) { 31312027Sjungma@eit.uni-kl.de sc_report* err_p = sc_handle_exception(); 31412027Sjungma@eit.uni-kl.de simcontext()->set_error( err_p ); 31512027Sjungma@eit.uni-kl.de return false; 31612027Sjungma@eit.uni-kl.de } 31712027Sjungma@eit.uni-kl.de } while( restart ); 31812027Sjungma@eit.uni-kl.de 31912027Sjungma@eit.uni-kl.de return true; 32012027Sjungma@eit.uni-kl.de} 32112027Sjungma@eit.uni-kl.de 32212027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------ 32312027Sjungma@eit.uni-kl.de//"sc_method_process::trigger_static" 32412027Sjungma@eit.uni-kl.de// 32512027Sjungma@eit.uni-kl.de// This inline method adds the current method to the queue of runnable 32612027Sjungma@eit.uni-kl.de// processes, if required. This is the case if the following criteria 32712027Sjungma@eit.uni-kl.de// are met: 32812027Sjungma@eit.uni-kl.de// (1) The process is in a runnable state. 32912027Sjungma@eit.uni-kl.de// (2) The process is not already on the run queue. 33012027Sjungma@eit.uni-kl.de// (3) The process is expecting a static trigger, 33112027Sjungma@eit.uni-kl.de// dynamic event waits take priority. 33212027Sjungma@eit.uni-kl.de// 33312027Sjungma@eit.uni-kl.de// 33412027Sjungma@eit.uni-kl.de// If the triggering process is the same process, the trigger is 33512027Sjungma@eit.uni-kl.de// ignored as well, unless SC_ENABLE_IMMEDIATE_SELF_NOTIFICATIONS 33612027Sjungma@eit.uni-kl.de// is defined. 33712027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------ 33812027Sjungma@eit.uni-kl.deinline 33912027Sjungma@eit.uni-kl.devoid 34012027Sjungma@eit.uni-kl.desc_method_process::trigger_static() 34112027Sjungma@eit.uni-kl.de{ 34212027Sjungma@eit.uni-kl.de if ( (m_state & ps_bit_disabled) || is_runnable() || 34312027Sjungma@eit.uni-kl.de m_trigger_type != STATIC ) 34412027Sjungma@eit.uni-kl.de return; 34512027Sjungma@eit.uni-kl.de 34612027Sjungma@eit.uni-kl.de#if ! defined( SC_ENABLE_IMMEDIATE_SELF_NOTIFICATIONS ) 34712027Sjungma@eit.uni-kl.de if( SC_UNLIKELY_( sc_get_current_process_b() == this ) ) 34812027Sjungma@eit.uni-kl.de { 34912027Sjungma@eit.uni-kl.de report_immediate_self_notification(); 35012027Sjungma@eit.uni-kl.de return; 35112027Sjungma@eit.uni-kl.de } 35212027Sjungma@eit.uni-kl.de#endif // SC_ENABLE_IMMEDIATE_SELF_NOTIFICATIONS 35312027Sjungma@eit.uni-kl.de 35412027Sjungma@eit.uni-kl.de // If we get here then the method is has satisfied its wait, if its 35512027Sjungma@eit.uni-kl.de // suspended mark its state as ready to run. If its not suspended then 35612027Sjungma@eit.uni-kl.de // push it onto the runnable queue. 35712027Sjungma@eit.uni-kl.de 35812027Sjungma@eit.uni-kl.de if ( m_state & ps_bit_suspended ) 35912027Sjungma@eit.uni-kl.de { 36012027Sjungma@eit.uni-kl.de m_state = m_state | ps_bit_ready_to_run; 36112027Sjungma@eit.uni-kl.de } 36212027Sjungma@eit.uni-kl.de else 36312027Sjungma@eit.uni-kl.de { 36412027Sjungma@eit.uni-kl.de simcontext()->push_runnable_method(this); 36512027Sjungma@eit.uni-kl.de } 36612027Sjungma@eit.uni-kl.de} 36712027Sjungma@eit.uni-kl.de 36812027Sjungma@eit.uni-kl.de#undef DEBUG_MSG 36912027Sjungma@eit.uni-kl.de 37012027Sjungma@eit.uni-kl.de} // namespace sc_core 37112027Sjungma@eit.uni-kl.de 37212027Sjungma@eit.uni-kl.de// Revision 1.20 2011/08/24 22:05:50 acg 37312027Sjungma@eit.uni-kl.de// Torsten Maehne: initialization changes to remove warnings. 37412027Sjungma@eit.uni-kl.de// 37512027Sjungma@eit.uni-kl.de// Revision 1.19 2011/07/29 22:43:15 acg 37612027Sjungma@eit.uni-kl.de// Andy Goodrich: addition of check_for_throws() method. 37712027Sjungma@eit.uni-kl.de// 37812027Sjungma@eit.uni-kl.de// Revision 1.18 2011/07/24 11:18:09 acg 37912027Sjungma@eit.uni-kl.de// Philipp A. Hartmann: add code to restart a method process after a 38012027Sjungma@eit.uni-kl.de// self-reset. 38112027Sjungma@eit.uni-kl.de// 38212027Sjungma@eit.uni-kl.de// Revision 1.17 2011/05/09 04:07:48 acg 38312027Sjungma@eit.uni-kl.de// Philipp A. Hartmann: 38412027Sjungma@eit.uni-kl.de// (1) Restore hierarchy in all phase callbacks. 38512027Sjungma@eit.uni-kl.de// (2) Ensure calls to before_end_of_elaboration. 38612027Sjungma@eit.uni-kl.de// 38712027Sjungma@eit.uni-kl.de// Revision 1.16 2011/04/13 02:41:34 acg 38812027Sjungma@eit.uni-kl.de// Andy Goodrich: eliminate warning messages generated when the DEBUG_MSG 38912027Sjungma@eit.uni-kl.de// macro is used. 39012027Sjungma@eit.uni-kl.de// 39112027Sjungma@eit.uni-kl.de// Revision 1.15 2011/04/10 22:12:32 acg 39212027Sjungma@eit.uni-kl.de// Andy Goodrich: adding debugging macros. 39312027Sjungma@eit.uni-kl.de// 39412027Sjungma@eit.uni-kl.de// Revision 1.14 2011/04/08 22:31:21 acg 39512027Sjungma@eit.uni-kl.de// Andy Goodrich: added new inline method run_process() to hide the process 39612027Sjungma@eit.uni-kl.de// implementation for sc_simcontext. 39712027Sjungma@eit.uni-kl.de// 39812027Sjungma@eit.uni-kl.de// Revision 1.13 2011/04/05 20:50:56 acg 39912027Sjungma@eit.uni-kl.de// Andy Goodrich: 40012027Sjungma@eit.uni-kl.de// (1) changes to make sure that event(), posedge() and negedge() only 40112027Sjungma@eit.uni-kl.de// return true if the clock has not moved. 40212027Sjungma@eit.uni-kl.de// (2) fixes for method self-resumes. 40312027Sjungma@eit.uni-kl.de// (3) added SC_PRERELEASE_VERSION 40412027Sjungma@eit.uni-kl.de// (4) removed kernel events from the object hierarchy, added 40512027Sjungma@eit.uni-kl.de// sc_hierarchy_name_exists(). 40612027Sjungma@eit.uni-kl.de// 40712027Sjungma@eit.uni-kl.de// Revision 1.12 2011/04/01 21:24:57 acg 40812027Sjungma@eit.uni-kl.de// Andy Goodrich: removed unused code. 40912027Sjungma@eit.uni-kl.de// 41012027Sjungma@eit.uni-kl.de// Revision 1.11 2011/02/19 08:30:53 acg 41112027Sjungma@eit.uni-kl.de// Andy Goodrich: Moved process queueing into trigger_static from 41212027Sjungma@eit.uni-kl.de// sc_event::notify. 41312027Sjungma@eit.uni-kl.de// 41412027Sjungma@eit.uni-kl.de// Revision 1.10 2011/02/18 20:27:14 acg 41512027Sjungma@eit.uni-kl.de// Andy Goodrich: Updated Copyrights. 41612027Sjungma@eit.uni-kl.de// 41712027Sjungma@eit.uni-kl.de// Revision 1.9 2011/02/17 19:51:34 acg 41812027Sjungma@eit.uni-kl.de// Andy Goodrich: 41912027Sjungma@eit.uni-kl.de// (1) Changed the signature of trigger_dynamic back to a bool. 42012027Sjungma@eit.uni-kl.de// (2) Removed ready_to_run(). 42112027Sjungma@eit.uni-kl.de// (3) Simplified process control usage. 42212027Sjungma@eit.uni-kl.de// 42312027Sjungma@eit.uni-kl.de// Revision 1.8 2011/02/16 22:37:30 acg 42412027Sjungma@eit.uni-kl.de// Andy Goodrich: clean up to remove need for ps_disable_pending. 42512027Sjungma@eit.uni-kl.de// 42612027Sjungma@eit.uni-kl.de// Revision 1.7 2011/02/13 21:47:37 acg 42712027Sjungma@eit.uni-kl.de// Andy Goodrich: update copyright notice. 42812027Sjungma@eit.uni-kl.de// 42912027Sjungma@eit.uni-kl.de// Revision 1.6 2011/02/01 21:05:05 acg 43012027Sjungma@eit.uni-kl.de// Andy Goodrich: Changes in trigger_dynamic methods to handle new 43112027Sjungma@eit.uni-kl.de// process control rules about event sensitivity. 43212027Sjungma@eit.uni-kl.de// 43312027Sjungma@eit.uni-kl.de// Revision 1.5 2011/01/18 20:10:44 acg 43412027Sjungma@eit.uni-kl.de// Andy Goodrich: changes for IEEE1666_2011 semantics. 43512027Sjungma@eit.uni-kl.de// 43612027Sjungma@eit.uni-kl.de// Revision 1.4 2009/07/28 01:10:53 acg 43712027Sjungma@eit.uni-kl.de// Andy Goodrich: updates for 2.3 release candidate. 43812027Sjungma@eit.uni-kl.de// 43912027Sjungma@eit.uni-kl.de// Revision 1.3 2009/05/22 16:06:29 acg 44012027Sjungma@eit.uni-kl.de// Andy Goodrich: process control updates. 44112027Sjungma@eit.uni-kl.de// 44212027Sjungma@eit.uni-kl.de// Revision 1.2 2008/05/22 17:06:25 acg 44312027Sjungma@eit.uni-kl.de// Andy Goodrich: updated copyright notice to include 2008. 44412027Sjungma@eit.uni-kl.de// 44512027Sjungma@eit.uni-kl.de// Revision 1.1.1.1 2006/12/15 20:20:05 acg 44612027Sjungma@eit.uni-kl.de// SystemC 2.3 44712027Sjungma@eit.uni-kl.de// 44812027Sjungma@eit.uni-kl.de// Revision 1.7 2006/05/08 17:57:13 acg 44912027Sjungma@eit.uni-kl.de// Andy Goodrich: Added David Long's forward declarations for friend functions 45012027Sjungma@eit.uni-kl.de// to keep the Microsoft C++ compiler happy. 45112027Sjungma@eit.uni-kl.de// 45212027Sjungma@eit.uni-kl.de// Revision 1.6 2006/04/20 17:08:17 acg 45312027Sjungma@eit.uni-kl.de// Andy Goodrich: 3.0 style process changes. 45412027Sjungma@eit.uni-kl.de// 45512027Sjungma@eit.uni-kl.de// Revision 1.5 2006/04/11 23:13:21 acg 45612027Sjungma@eit.uni-kl.de// Andy Goodrich: Changes for reduced reset support that only includes 45712027Sjungma@eit.uni-kl.de// sc_cthread, but has preliminary hooks for expanding to method and thread 45812027Sjungma@eit.uni-kl.de// processes also. 45912027Sjungma@eit.uni-kl.de// 46012027Sjungma@eit.uni-kl.de// Revision 1.4 2006/01/24 20:49:05 acg 46112027Sjungma@eit.uni-kl.de// Andy Goodrich: changes to remove the use of deprecated features within the 46212027Sjungma@eit.uni-kl.de// simulator, and to issue warning messages when deprecated features are used. 46312027Sjungma@eit.uni-kl.de// 46412027Sjungma@eit.uni-kl.de// Revision 1.3 2006/01/13 18:44:29 acg 46512027Sjungma@eit.uni-kl.de// Added $Log to record CVS changes into the source. 46612027Sjungma@eit.uni-kl.de 46712027Sjungma@eit.uni-kl.de#endif // !defined(sc_method_process_h_INCLUDED) 468