sc_process_handle.h revision 12027
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_handle.h -- Process access support. 2312027Sjungma@eit.uni-kl.de 2412027Sjungma@eit.uni-kl.de Original Author: Andy Goodrich, Forte Design Systems, 17 June 2003 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_process_handle.h,v $ 3112027Sjungma@eit.uni-kl.de// Revision 1.21 2011/08/26 21:54:04 acg 3212027Sjungma@eit.uni-kl.de// Torsten Maehne: Simplify use of dynamic_cast<> for initializing m_target. 3312027Sjungma@eit.uni-kl.de// 3412027Sjungma@eit.uni-kl.de// Revision 1.20 2011/08/26 20:46:10 acg 3512027Sjungma@eit.uni-kl.de// Andy Goodrich: moved the modification log to the end of the file to 3612027Sjungma@eit.uni-kl.de// eliminate source line number skew when check-ins are done. 3712027Sjungma@eit.uni-kl.de// 3812027Sjungma@eit.uni-kl.de 3912027Sjungma@eit.uni-kl.de#if !defined(sc_process_handle_h_INCLUDED) 4012027Sjungma@eit.uni-kl.de#define sc_process_handle_h_INCLUDED 4112027Sjungma@eit.uni-kl.de 4212027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_module.h" 4312027Sjungma@eit.uni-kl.de 4412027Sjungma@eit.uni-kl.denamespace sc_core { 4512027Sjungma@eit.uni-kl.de 4612027Sjungma@eit.uni-kl.de// forward operator declarations: 4712027Sjungma@eit.uni-kl.de 4812027Sjungma@eit.uni-kl.declass sc_process_handle; 4912027Sjungma@eit.uni-kl.debool 5012027Sjungma@eit.uni-kl.deoperator == ( const sc_process_handle& left, const sc_process_handle& right ); 5112027Sjungma@eit.uni-kl.debool 5212027Sjungma@eit.uni-kl.deoperator != ( const sc_process_handle& left, const sc_process_handle& right ); 5312027Sjungma@eit.uni-kl.debool 5412027Sjungma@eit.uni-kl.deoperator < ( const sc_process_handle& left, const sc_process_handle& right ); 5512027Sjungma@eit.uni-kl.de 5612027Sjungma@eit.uni-kl.de 5712027Sjungma@eit.uni-kl.de 5812027Sjungma@eit.uni-kl.de//============================================================================= 5912027Sjungma@eit.uni-kl.de// CLASS sc_process_handle 6012027Sjungma@eit.uni-kl.de// 6112027Sjungma@eit.uni-kl.de// This class provides access to an sc_process_b object instance in a 6212027Sjungma@eit.uni-kl.de// manner which allows some persistence after the deletion of the actual 6312027Sjungma@eit.uni-kl.de// process. 6412027Sjungma@eit.uni-kl.de//============================================================================= 6512027Sjungma@eit.uni-kl.declass sc_simcontext; 6612027Sjungma@eit.uni-kl.declass sc_process_handle { 6712027Sjungma@eit.uni-kl.de typedef sc_process_handle this_type; 6812027Sjungma@eit.uni-kl.de 6912027Sjungma@eit.uni-kl.de friend bool operator == ( const this_type& left, const this_type& right ); 7012027Sjungma@eit.uni-kl.de friend bool operator != ( const this_type& left, const this_type& right ); 7112027Sjungma@eit.uni-kl.de friend bool operator < ( const this_type& left, const this_type& right ); 7212027Sjungma@eit.uni-kl.de friend class sc_object; 7312027Sjungma@eit.uni-kl.de friend class sc_join; 7412027Sjungma@eit.uni-kl.de friend class sc_module; 7512027Sjungma@eit.uni-kl.de friend class sc_reset; 7612027Sjungma@eit.uni-kl.de friend class sc_sensitive; 7712027Sjungma@eit.uni-kl.de friend class sc_sensitive_pos; 7812027Sjungma@eit.uni-kl.de friend class sc_sensitive_neg; 7912027Sjungma@eit.uni-kl.de friend class sc_thread_process; 8012027Sjungma@eit.uni-kl.de 8112027Sjungma@eit.uni-kl.de public: 8212027Sjungma@eit.uni-kl.de inline sc_process_handle(); 8312027Sjungma@eit.uni-kl.de inline explicit sc_process_handle( sc_object* object_p ); 8412027Sjungma@eit.uni-kl.de inline explicit sc_process_handle( sc_process_b* process_p ); 8512027Sjungma@eit.uni-kl.de inline sc_process_handle( const sc_process_handle& orig ); 8612027Sjungma@eit.uni-kl.de inline ~sc_process_handle(); 8712027Sjungma@eit.uni-kl.de inline sc_process_handle& operator = ( sc_process_handle src ); 8812027Sjungma@eit.uni-kl.de inline void swap( sc_process_handle& other ); 8912027Sjungma@eit.uni-kl.de 9012027Sjungma@eit.uni-kl.de public: 9112027Sjungma@eit.uni-kl.de inline void disable( 9212027Sjungma@eit.uni-kl.de sc_descendant_inclusion_info descendants=SC_NO_DESCENDANTS ); 9312027Sjungma@eit.uni-kl.de inline bool dynamic() const; 9412027Sjungma@eit.uni-kl.de inline void enable( 9512027Sjungma@eit.uni-kl.de sc_descendant_inclusion_info descendants=SC_NO_DESCENDANTS ); 9612027Sjungma@eit.uni-kl.de inline const std::vector<sc_event*>& get_child_events() const; 9712027Sjungma@eit.uni-kl.de inline const std::vector<sc_object*>& get_child_objects() const; 9812027Sjungma@eit.uni-kl.de inline sc_object* get_parent_object() const; 9912027Sjungma@eit.uni-kl.de inline sc_object* get_process_object() const; 10012027Sjungma@eit.uni-kl.de inline bool is_unwinding() const; 10112027Sjungma@eit.uni-kl.de inline void kill( 10212027Sjungma@eit.uni-kl.de sc_descendant_inclusion_info descendants=SC_NO_DESCENDANTS ); 10312027Sjungma@eit.uni-kl.de inline const char* name() const; 10412027Sjungma@eit.uni-kl.de inline sc_curr_proc_kind proc_kind() const; 10512027Sjungma@eit.uni-kl.de inline void reset( 10612027Sjungma@eit.uni-kl.de sc_descendant_inclusion_info descendants=SC_NO_DESCENDANTS ); 10712027Sjungma@eit.uni-kl.de inline sc_event& reset_event() const; 10812027Sjungma@eit.uni-kl.de inline void resume( 10912027Sjungma@eit.uni-kl.de sc_descendant_inclusion_info descendants=SC_NO_DESCENDANTS ); 11012027Sjungma@eit.uni-kl.de inline void suspend( 11112027Sjungma@eit.uni-kl.de sc_descendant_inclusion_info descendants=SC_NO_DESCENDANTS ); 11212027Sjungma@eit.uni-kl.de inline void sync_reset_off( 11312027Sjungma@eit.uni-kl.de sc_descendant_inclusion_info descendants=SC_NO_DESCENDANTS ); 11412027Sjungma@eit.uni-kl.de inline void sync_reset_on( 11512027Sjungma@eit.uni-kl.de sc_descendant_inclusion_info descendants=SC_NO_DESCENDANTS ); 11612027Sjungma@eit.uni-kl.de inline sc_event& terminated_event(); 11712027Sjungma@eit.uni-kl.de inline bool terminated() const; 11812027Sjungma@eit.uni-kl.de template<typename EXCEPT> 11912027Sjungma@eit.uni-kl.de inline void throw_it( const EXCEPT& exception, 12012027Sjungma@eit.uni-kl.de sc_descendant_inclusion_info descendants=SC_NO_DESCENDANTS ); 12112027Sjungma@eit.uni-kl.de inline bool valid() const; 12212027Sjungma@eit.uni-kl.de 12312027Sjungma@eit.uni-kl.de public: // implementation specific methods: 12412027Sjungma@eit.uni-kl.de inline std::string dump_state() const; 12512027Sjungma@eit.uni-kl.de 12612027Sjungma@eit.uni-kl.de protected: 12712027Sjungma@eit.uni-kl.de inline bool dont_initialize() const 12812027Sjungma@eit.uni-kl.de { return m_target_p ? m_target_p->dont_initialize() : false; } 12912027Sjungma@eit.uni-kl.de inline void dont_initialize( bool dont ); 13012027Sjungma@eit.uni-kl.de 13112027Sjungma@eit.uni-kl.de public: 13212027Sjungma@eit.uni-kl.de operator sc_process_b* () 13312027Sjungma@eit.uni-kl.de { return m_target_p; } 13412027Sjungma@eit.uni-kl.de operator sc_cthread_handle (); 13512027Sjungma@eit.uni-kl.de operator sc_method_handle (); 13612027Sjungma@eit.uni-kl.de operator sc_thread_handle (); 13712027Sjungma@eit.uni-kl.de 13812027Sjungma@eit.uni-kl.de protected: 13912027Sjungma@eit.uni-kl.de sc_process_b* m_target_p; // Target for this object instance. 14012027Sjungma@eit.uni-kl.de 14112027Sjungma@eit.uni-kl.de protected: 14212027Sjungma@eit.uni-kl.de static std::vector<sc_event*> empty_event_vector; // If m_target_p == 0. 14312027Sjungma@eit.uni-kl.de static std::vector<sc_object*> empty_object_vector; // If m_target_p == 0. 14412027Sjungma@eit.uni-kl.de static sc_event non_event; // If m_target_p == 0. 14512027Sjungma@eit.uni-kl.de}; 14612027Sjungma@eit.uni-kl.de 14712027Sjungma@eit.uni-kl.deinline bool operator == ( 14812027Sjungma@eit.uni-kl.de const sc_process_handle& left, const sc_process_handle& right ) 14912027Sjungma@eit.uni-kl.de{ 15012027Sjungma@eit.uni-kl.de return (left.m_target_p != 0) && (right.m_target_p != 0) && 15112027Sjungma@eit.uni-kl.de (left.m_target_p == right.m_target_p); 15212027Sjungma@eit.uni-kl.de} 15312027Sjungma@eit.uni-kl.de 15412027Sjungma@eit.uni-kl.deinline bool operator != ( 15512027Sjungma@eit.uni-kl.de const sc_process_handle& left, const sc_process_handle& right ) 15612027Sjungma@eit.uni-kl.de{ 15712027Sjungma@eit.uni-kl.de return (left.m_target_p == 0) || (right.m_target_p == 0) || 15812027Sjungma@eit.uni-kl.de (left.m_target_p != right.m_target_p); 15912027Sjungma@eit.uni-kl.de} 16012027Sjungma@eit.uni-kl.de 16112027Sjungma@eit.uni-kl.deinline bool operator < ( 16212027Sjungma@eit.uni-kl.de const sc_process_handle& left, const sc_process_handle& right ) 16312027Sjungma@eit.uni-kl.de{ 16412027Sjungma@eit.uni-kl.de return left.m_target_p < right.m_target_p; 16512027Sjungma@eit.uni-kl.de} 16612027Sjungma@eit.uni-kl.de 16712027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------ 16812027Sjungma@eit.uni-kl.de//"sc_process_handle::sc_process_handle - non-pointer constructor" 16912027Sjungma@eit.uni-kl.de// 17012027Sjungma@eit.uni-kl.de// This version of the object instance constructor for this class creates 17112027Sjungma@eit.uni-kl.de// an object instance whose target needs to be supplied via an assignment. 17212027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------ 17312027Sjungma@eit.uni-kl.deinline sc_process_handle::sc_process_handle() : m_target_p(0) 17412027Sjungma@eit.uni-kl.de{ 17512027Sjungma@eit.uni-kl.de} 17612027Sjungma@eit.uni-kl.de 17712027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------ 17812027Sjungma@eit.uni-kl.de//"sc_process_handle::sc_process_handle - pointer constructor" 17912027Sjungma@eit.uni-kl.de// 18012027Sjungma@eit.uni-kl.de// This version of the object instance constructor for this class creates 18112027Sjungma@eit.uni-kl.de// an object instance whose target is the supplied sc_object instance. 18212027Sjungma@eit.uni-kl.de// The supplied sc_object must in fact be an sc_process_b instance. 18312027Sjungma@eit.uni-kl.de// object_p -> sc_object instance this is handle for. 18412027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------ 18512027Sjungma@eit.uni-kl.deinline sc_process_handle::sc_process_handle( sc_object* object_p ) : 18612027Sjungma@eit.uni-kl.de m_target_p(DCAST<sc_process_b*>(object_p)) 18712027Sjungma@eit.uni-kl.de{ 18812027Sjungma@eit.uni-kl.de if ( m_target_p ) m_target_p->reference_increment(); 18912027Sjungma@eit.uni-kl.de} 19012027Sjungma@eit.uni-kl.de 19112027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------ 19212027Sjungma@eit.uni-kl.de//"sc_process_handle::sc_process_handle - pointer constructor" 19312027Sjungma@eit.uni-kl.de// 19412027Sjungma@eit.uni-kl.de// This version of the object instance constructor for this class creates 19512027Sjungma@eit.uni-kl.de// an object instance whose target is the supplied sc_process_b instance. 19612027Sjungma@eit.uni-kl.de// This saves a dynamic cast compared to the sc_object* case. 19712027Sjungma@eit.uni-kl.de// process_p -> process instance this is handle for. 19812027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------ 19912027Sjungma@eit.uni-kl.deinline sc_process_handle::sc_process_handle( sc_process_b* process_p ) : 20012027Sjungma@eit.uni-kl.de m_target_p(process_p) 20112027Sjungma@eit.uni-kl.de{ 20212027Sjungma@eit.uni-kl.de if ( m_target_p ) m_target_p->reference_increment(); 20312027Sjungma@eit.uni-kl.de} 20412027Sjungma@eit.uni-kl.de 20512027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------ 20612027Sjungma@eit.uni-kl.de//"sc_process_handle::sc_process_handle - copy constructor" 20712027Sjungma@eit.uni-kl.de// 20812027Sjungma@eit.uni-kl.de// This version of the object instance constructor for this class provides 20912027Sjungma@eit.uni-kl.de// the copy constructor for the class. It clones the supplied original 21012027Sjungma@eit.uni-kl.de// handle and increments the references to its target. 21112027Sjungma@eit.uni-kl.de// orig = sc_process_handle object instance to be copied from. 21212027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------ 21312027Sjungma@eit.uni-kl.deinline sc_process_handle::sc_process_handle( const sc_process_handle& orig ) : 21412027Sjungma@eit.uni-kl.de m_target_p(orig.m_target_p) 21512027Sjungma@eit.uni-kl.de{ 21612027Sjungma@eit.uni-kl.de if ( m_target_p ) m_target_p->reference_increment(); 21712027Sjungma@eit.uni-kl.de} 21812027Sjungma@eit.uni-kl.de 21912027Sjungma@eit.uni-kl.de 22012027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------ 22112027Sjungma@eit.uni-kl.de//"sc_process_handle::operator =" 22212027Sjungma@eit.uni-kl.de// 22312027Sjungma@eit.uni-kl.de// This assignment operator signature is call by value rather than reference. 22412027Sjungma@eit.uni-kl.de// This means that an sc_process_handle instance will be created and the 22512027Sjungma@eit.uni-kl.de// target for that instance will be incremented before the assignment is done. 22612027Sjungma@eit.uni-kl.de// The assignment is done using the swap() method, which simply swaps the 22712027Sjungma@eit.uni-kl.de// targets of 'orig' and this object instance. We don't need to increment 22812027Sjungma@eit.uni-kl.de// the reference count for our new target since that was done when 'orig' 22912027Sjungma@eit.uni-kl.de// was created. Our old target's reference count will be decremented when 23012027Sjungma@eit.uni-kl.de// 'orig' is deleted. 23112027Sjungma@eit.uni-kl.de// orig = sc_process_handle object instance to be copied from. 23212027Sjungma@eit.uni-kl.de// Result is a reference for this object instance. 23312027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------ 23412027Sjungma@eit.uni-kl.deinline sc_process_handle& 23512027Sjungma@eit.uni-kl.desc_process_handle::operator = ( sc_process_handle orig ) 23612027Sjungma@eit.uni-kl.de{ 23712027Sjungma@eit.uni-kl.de swap( orig ); 23812027Sjungma@eit.uni-kl.de return *this; 23912027Sjungma@eit.uni-kl.de} 24012027Sjungma@eit.uni-kl.de 24112027Sjungma@eit.uni-kl.de 24212027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------ 24312027Sjungma@eit.uni-kl.de//"sc_process_handle::~sc_process_handle" 24412027Sjungma@eit.uni-kl.de// 24512027Sjungma@eit.uni-kl.de// This is the object instance destructor for this class. It decrements 24612027Sjungma@eit.uni-kl.de// the reference count for its target. 24712027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------ 24812027Sjungma@eit.uni-kl.deinline sc_process_handle::~sc_process_handle() 24912027Sjungma@eit.uni-kl.de{ 25012027Sjungma@eit.uni-kl.de if ( m_target_p ) m_target_p->reference_decrement(); 25112027Sjungma@eit.uni-kl.de} 25212027Sjungma@eit.uni-kl.de 25312027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------ 25412027Sjungma@eit.uni-kl.de//"sc_process_handle::inline methods" 25512027Sjungma@eit.uni-kl.de// 25612027Sjungma@eit.uni-kl.de// These are short inline methods. 25712027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------ 25812027Sjungma@eit.uni-kl.de 25912027Sjungma@eit.uni-kl.de// disable this object instance's target. 26012027Sjungma@eit.uni-kl.de 26112027Sjungma@eit.uni-kl.deinline void sc_process_handle::disable(sc_descendant_inclusion_info descendants) 26212027Sjungma@eit.uni-kl.de{ 26312027Sjungma@eit.uni-kl.de if ( m_target_p ) 26412027Sjungma@eit.uni-kl.de m_target_p->disable_process(descendants); 26512027Sjungma@eit.uni-kl.de else 26612027Sjungma@eit.uni-kl.de SC_REPORT_WARNING( SC_ID_EMPTY_PROCESS_HANDLE_, "disable()"); 26712027Sjungma@eit.uni-kl.de} 26812027Sjungma@eit.uni-kl.de 26912027Sjungma@eit.uni-kl.de// call dont_initialize() on this object instance's target. 27012027Sjungma@eit.uni-kl.de 27112027Sjungma@eit.uni-kl.deinline void sc_process_handle::dont_initialize( bool dont ) 27212027Sjungma@eit.uni-kl.de{ 27312027Sjungma@eit.uni-kl.de if ( m_target_p ) 27412027Sjungma@eit.uni-kl.de m_target_p->dont_initialize( dont ); 27512027Sjungma@eit.uni-kl.de else 27612027Sjungma@eit.uni-kl.de SC_REPORT_WARNING( SC_ID_EMPTY_PROCESS_HANDLE_, "dont_initialize()"); 27712027Sjungma@eit.uni-kl.de} 27812027Sjungma@eit.uni-kl.de 27912027Sjungma@eit.uni-kl.de// dump the status of this object instance's target: 28012027Sjungma@eit.uni-kl.de 28112027Sjungma@eit.uni-kl.deinline std::string sc_process_handle::dump_state() const 28212027Sjungma@eit.uni-kl.de{ 28312027Sjungma@eit.uni-kl.de return m_target_p ? m_target_p->dump_state() : std::string("NO TARGET"); 28412027Sjungma@eit.uni-kl.de} 28512027Sjungma@eit.uni-kl.de 28612027Sjungma@eit.uni-kl.de// return whether this object instance's target is dynamic or not. 28712027Sjungma@eit.uni-kl.de 28812027Sjungma@eit.uni-kl.deinline bool sc_process_handle::dynamic() const 28912027Sjungma@eit.uni-kl.de{ 29012027Sjungma@eit.uni-kl.de return m_target_p ? m_target_p->dynamic() : false; 29112027Sjungma@eit.uni-kl.de} 29212027Sjungma@eit.uni-kl.de 29312027Sjungma@eit.uni-kl.de// enable this object instance's target. 29412027Sjungma@eit.uni-kl.de 29512027Sjungma@eit.uni-kl.deinline void sc_process_handle::enable(sc_descendant_inclusion_info descendants) 29612027Sjungma@eit.uni-kl.de{ 29712027Sjungma@eit.uni-kl.de if ( m_target_p ) 29812027Sjungma@eit.uni-kl.de m_target_p->enable_process(descendants); 29912027Sjungma@eit.uni-kl.de else 30012027Sjungma@eit.uni-kl.de SC_REPORT_WARNING( SC_ID_EMPTY_PROCESS_HANDLE_, "enable()"); 30112027Sjungma@eit.uni-kl.de} 30212027Sjungma@eit.uni-kl.de 30312027Sjungma@eit.uni-kl.de// return the child objects for this object instance's target. 30412027Sjungma@eit.uni-kl.de 30512027Sjungma@eit.uni-kl.deinline 30612027Sjungma@eit.uni-kl.deconst std::vector<sc_event*>& sc_process_handle::get_child_events() const 30712027Sjungma@eit.uni-kl.de{ 30812027Sjungma@eit.uni-kl.de return m_target_p ? m_target_p->get_child_events() : empty_event_vector; 30912027Sjungma@eit.uni-kl.de} 31012027Sjungma@eit.uni-kl.de 31112027Sjungma@eit.uni-kl.de// return the child objects for this object instance's target. 31212027Sjungma@eit.uni-kl.de 31312027Sjungma@eit.uni-kl.deinline 31412027Sjungma@eit.uni-kl.deconst std::vector<sc_object*>& sc_process_handle::get_child_objects() const 31512027Sjungma@eit.uni-kl.de{ 31612027Sjungma@eit.uni-kl.de return m_target_p ? m_target_p->get_child_objects() : empty_object_vector; 31712027Sjungma@eit.uni-kl.de} 31812027Sjungma@eit.uni-kl.de 31912027Sjungma@eit.uni-kl.de// return the parent object for this object instance's target. 32012027Sjungma@eit.uni-kl.de 32112027Sjungma@eit.uni-kl.deinline sc_object* sc_process_handle::get_parent_object() const 32212027Sjungma@eit.uni-kl.de{ 32312027Sjungma@eit.uni-kl.de return m_target_p ? m_target_p->get_parent_object() : NULL; 32412027Sjungma@eit.uni-kl.de} 32512027Sjungma@eit.uni-kl.de 32612027Sjungma@eit.uni-kl.de// return this object instance's target. 32712027Sjungma@eit.uni-kl.de 32812027Sjungma@eit.uni-kl.deinline sc_object* sc_process_handle::get_process_object() const 32912027Sjungma@eit.uni-kl.de{ 33012027Sjungma@eit.uni-kl.de return m_target_p; 33112027Sjungma@eit.uni-kl.de} 33212027Sjungma@eit.uni-kl.de 33312027Sjungma@eit.uni-kl.de// return whether this object instance is unwinding or not. 33412027Sjungma@eit.uni-kl.de 33512027Sjungma@eit.uni-kl.deinline bool sc_process_handle::is_unwinding() const 33612027Sjungma@eit.uni-kl.de{ 33712027Sjungma@eit.uni-kl.de if ( m_target_p ) 33812027Sjungma@eit.uni-kl.de return m_target_p->is_unwinding(); 33912027Sjungma@eit.uni-kl.de else { 34012027Sjungma@eit.uni-kl.de SC_REPORT_WARNING( SC_ID_EMPTY_PROCESS_HANDLE_, "is_unwinding()"); 34112027Sjungma@eit.uni-kl.de return false; 34212027Sjungma@eit.uni-kl.de } 34312027Sjungma@eit.uni-kl.de} 34412027Sjungma@eit.uni-kl.de 34512027Sjungma@eit.uni-kl.de// kill this object instance's target. 34612027Sjungma@eit.uni-kl.de 34712027Sjungma@eit.uni-kl.deinline void sc_process_handle::kill( sc_descendant_inclusion_info descendants ) 34812027Sjungma@eit.uni-kl.de{ 34912027Sjungma@eit.uni-kl.de if ( m_target_p ) 35012027Sjungma@eit.uni-kl.de m_target_p->kill_process( descendants ); 35112027Sjungma@eit.uni-kl.de else 35212027Sjungma@eit.uni-kl.de SC_REPORT_WARNING( SC_ID_EMPTY_PROCESS_HANDLE_, "kill()"); 35312027Sjungma@eit.uni-kl.de} 35412027Sjungma@eit.uni-kl.de 35512027Sjungma@eit.uni-kl.de// return the name of this object instance's target. 35612027Sjungma@eit.uni-kl.de 35712027Sjungma@eit.uni-kl.deinline const char* sc_process_handle::name() const 35812027Sjungma@eit.uni-kl.de{ 35912027Sjungma@eit.uni-kl.de return m_target_p ? m_target_p->name() : ""; 36012027Sjungma@eit.uni-kl.de} 36112027Sjungma@eit.uni-kl.de 36212027Sjungma@eit.uni-kl.de// return the process kind for this object instance's target. 36312027Sjungma@eit.uni-kl.de 36412027Sjungma@eit.uni-kl.deinline sc_curr_proc_kind sc_process_handle::proc_kind() const 36512027Sjungma@eit.uni-kl.de{ 36612027Sjungma@eit.uni-kl.de return m_target_p ? m_target_p->proc_kind() : SC_NO_PROC_; 36712027Sjungma@eit.uni-kl.de} 36812027Sjungma@eit.uni-kl.de 36912027Sjungma@eit.uni-kl.de// reset this object instance's target. 37012027Sjungma@eit.uni-kl.de 37112027Sjungma@eit.uni-kl.deinline void sc_process_handle::reset( sc_descendant_inclusion_info descendants ) 37212027Sjungma@eit.uni-kl.de{ 37312027Sjungma@eit.uni-kl.de if ( m_target_p ) 37412027Sjungma@eit.uni-kl.de m_target_p->reset_process( sc_process_b::reset_asynchronous, 37512027Sjungma@eit.uni-kl.de descendants ); 37612027Sjungma@eit.uni-kl.de else 37712027Sjungma@eit.uni-kl.de SC_REPORT_WARNING( SC_ID_EMPTY_PROCESS_HANDLE_, "reset()"); 37812027Sjungma@eit.uni-kl.de} 37912027Sjungma@eit.uni-kl.de 38012027Sjungma@eit.uni-kl.de// return the reset event for this object instance's target. 38112027Sjungma@eit.uni-kl.de 38212027Sjungma@eit.uni-kl.deinline sc_event& sc_process_handle::reset_event() const 38312027Sjungma@eit.uni-kl.de{ 38412027Sjungma@eit.uni-kl.de if ( m_target_p ) 38512027Sjungma@eit.uni-kl.de return m_target_p->reset_event(); 38612027Sjungma@eit.uni-kl.de else 38712027Sjungma@eit.uni-kl.de { 38812027Sjungma@eit.uni-kl.de SC_REPORT_WARNING( SC_ID_EMPTY_PROCESS_HANDLE_, "reset()"); 38912027Sjungma@eit.uni-kl.de return sc_process_handle::non_event; 39012027Sjungma@eit.uni-kl.de } 39112027Sjungma@eit.uni-kl.de} 39212027Sjungma@eit.uni-kl.de 39312027Sjungma@eit.uni-kl.de// resume this object instance's target. 39412027Sjungma@eit.uni-kl.de 39512027Sjungma@eit.uni-kl.deinline void sc_process_handle::resume(sc_descendant_inclusion_info descendants) 39612027Sjungma@eit.uni-kl.de{ 39712027Sjungma@eit.uni-kl.de if ( m_target_p ) 39812027Sjungma@eit.uni-kl.de m_target_p->resume_process(descendants); 39912027Sjungma@eit.uni-kl.de else 40012027Sjungma@eit.uni-kl.de SC_REPORT_WARNING( SC_ID_EMPTY_PROCESS_HANDLE_, "resume()"); 40112027Sjungma@eit.uni-kl.de} 40212027Sjungma@eit.uni-kl.de 40312027Sjungma@eit.uni-kl.de// suspend this object instance's target. 40412027Sjungma@eit.uni-kl.de 40512027Sjungma@eit.uni-kl.deinline void sc_process_handle::suspend(sc_descendant_inclusion_info descendants) 40612027Sjungma@eit.uni-kl.de{ 40712027Sjungma@eit.uni-kl.de if ( m_target_p ) 40812027Sjungma@eit.uni-kl.de m_target_p->suspend_process(descendants); 40912027Sjungma@eit.uni-kl.de else 41012027Sjungma@eit.uni-kl.de SC_REPORT_WARNING( SC_ID_EMPTY_PROCESS_HANDLE_, "suspend()"); 41112027Sjungma@eit.uni-kl.de} 41212027Sjungma@eit.uni-kl.de 41312027Sjungma@eit.uni-kl.de// swap targets of this process handle with the supplied one. 41412027Sjungma@eit.uni-kl.de 41512027Sjungma@eit.uni-kl.deinline void sc_process_handle::swap( sc_process_handle& other ) 41612027Sjungma@eit.uni-kl.de{ 41712027Sjungma@eit.uni-kl.de sc_process_b* tmp = m_target_p; 41812027Sjungma@eit.uni-kl.de m_target_p = other.m_target_p; 41912027Sjungma@eit.uni-kl.de other.m_target_p = tmp; 42012027Sjungma@eit.uni-kl.de} 42112027Sjungma@eit.uni-kl.de 42212027Sjungma@eit.uni-kl.de// turn sync_reset off for this object instance's target. 42312027Sjungma@eit.uni-kl.de 42412027Sjungma@eit.uni-kl.deinline void sc_process_handle::sync_reset_off( 42512027Sjungma@eit.uni-kl.de sc_descendant_inclusion_info descendants) 42612027Sjungma@eit.uni-kl.de{ 42712027Sjungma@eit.uni-kl.de if ( m_target_p ) 42812027Sjungma@eit.uni-kl.de m_target_p->reset_process( sc_process_b::reset_synchronous_off, 42912027Sjungma@eit.uni-kl.de descendants); 43012027Sjungma@eit.uni-kl.de else 43112027Sjungma@eit.uni-kl.de SC_REPORT_WARNING( SC_ID_EMPTY_PROCESS_HANDLE_, "sync_reset_off()"); 43212027Sjungma@eit.uni-kl.de} 43312027Sjungma@eit.uni-kl.de 43412027Sjungma@eit.uni-kl.de// turn sync_reset on for this object instance's target. 43512027Sjungma@eit.uni-kl.de 43612027Sjungma@eit.uni-kl.deinline void sc_process_handle::sync_reset_on( 43712027Sjungma@eit.uni-kl.de sc_descendant_inclusion_info descendants) 43812027Sjungma@eit.uni-kl.de{ 43912027Sjungma@eit.uni-kl.de if ( m_target_p ) 44012027Sjungma@eit.uni-kl.de { 44112027Sjungma@eit.uni-kl.de m_target_p->reset_process(sc_process_b::reset_synchronous_on, 44212027Sjungma@eit.uni-kl.de descendants); 44312027Sjungma@eit.uni-kl.de } 44412027Sjungma@eit.uni-kl.de else 44512027Sjungma@eit.uni-kl.de { 44612027Sjungma@eit.uni-kl.de SC_REPORT_WARNING( SC_ID_EMPTY_PROCESS_HANDLE_, "sync_reset_on()"); 44712027Sjungma@eit.uni-kl.de } 44812027Sjungma@eit.uni-kl.de} 44912027Sjungma@eit.uni-kl.de 45012027Sjungma@eit.uni-kl.de// terminate this object instance's target. 45112027Sjungma@eit.uni-kl.de 45212027Sjungma@eit.uni-kl.deinline bool sc_process_handle::terminated() const 45312027Sjungma@eit.uni-kl.de{ 45412027Sjungma@eit.uni-kl.de return m_target_p ? m_target_p->terminated() : false; 45512027Sjungma@eit.uni-kl.de} 45612027Sjungma@eit.uni-kl.de 45712027Sjungma@eit.uni-kl.de// return the termination event for this object instance's target. 45812027Sjungma@eit.uni-kl.de 45912027Sjungma@eit.uni-kl.deinline sc_event& sc_process_handle::terminated_event() 46012027Sjungma@eit.uni-kl.de{ 46112027Sjungma@eit.uni-kl.de if ( m_target_p ) 46212027Sjungma@eit.uni-kl.de return m_target_p->terminated_event(); 46312027Sjungma@eit.uni-kl.de else 46412027Sjungma@eit.uni-kl.de { 46512027Sjungma@eit.uni-kl.de SC_REPORT_WARNING( SC_ID_EMPTY_PROCESS_HANDLE_, "terminated_event()"); 46612027Sjungma@eit.uni-kl.de return sc_process_handle::non_event; 46712027Sjungma@eit.uni-kl.de } 46812027Sjungma@eit.uni-kl.de} 46912027Sjungma@eit.uni-kl.de 47012027Sjungma@eit.uni-kl.de// return true if this object instance has a target, false it not. 47112027Sjungma@eit.uni-kl.de 47212027Sjungma@eit.uni-kl.deinline bool sc_process_handle::valid() const 47312027Sjungma@eit.uni-kl.de{ 47412027Sjungma@eit.uni-kl.de return m_target_p ? true : false; 47512027Sjungma@eit.uni-kl.de} 47612027Sjungma@eit.uni-kl.de 47712027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------ 47812027Sjungma@eit.uni-kl.de//"sc_process_handle::sc_throw_it" 47912027Sjungma@eit.uni-kl.de// 48012027Sjungma@eit.uni-kl.de// This method throws the supplied exception to the process whose handle this 48112027Sjungma@eit.uni-kl.de// object instance is, and optionally to the process' descendants. Once the 48212027Sjungma@eit.uni-kl.de// exception is thrown the currently executed process will suspend to allow 48312027Sjungma@eit.uni-kl.de// the exception to be propagated. Once the propagation has occurred the 48412027Sjungma@eit.uni-kl.de// current process will be resumed. 48512027Sjungma@eit.uni-kl.de// 48612027Sjungma@eit.uni-kl.de// Notes: 48712027Sjungma@eit.uni-kl.de// (1) We allocate the helper function on the stack, see the description of 48812027Sjungma@eit.uni-kl.de// sc_throw_it<EXCEPT>, in sc_process.h, for why. 48912027Sjungma@eit.uni-kl.de// 49012027Sjungma@eit.uni-kl.de// Arguments: 49112027Sjungma@eit.uni-kl.de// exception = exception to be thrown 49212027Sjungma@eit.uni-kl.de// descendants = indication of whether descendant processes should also 49312027Sjungma@eit.uni-kl.de// receive the throw. 49412027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------ 49512027Sjungma@eit.uni-kl.detemplate<typename EXCEPT> 49612027Sjungma@eit.uni-kl.deinline void sc_process_handle::throw_it( const EXCEPT& exception, 49712027Sjungma@eit.uni-kl.de sc_descendant_inclusion_info descendants) 49812027Sjungma@eit.uni-kl.de{ 49912027Sjungma@eit.uni-kl.de sc_throw_it<EXCEPT> helper(exception); // helper to throw the exception. 50012027Sjungma@eit.uni-kl.de 50112027Sjungma@eit.uni-kl.de if ( !m_target_p ) 50212027Sjungma@eit.uni-kl.de { 50312027Sjungma@eit.uni-kl.de SC_REPORT_WARNING( SC_ID_EMPTY_PROCESS_HANDLE_, "throw_it()"); 50412027Sjungma@eit.uni-kl.de return; 50512027Sjungma@eit.uni-kl.de } 50612027Sjungma@eit.uni-kl.de m_target_p->throw_user(helper, descendants); 50712027Sjungma@eit.uni-kl.de} 50812027Sjungma@eit.uni-kl.de 50912027Sjungma@eit.uni-kl.de 51012027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------ 51112027Sjungma@eit.uni-kl.de//"sc_process_b::last_created_process_handle" 51212027Sjungma@eit.uni-kl.de// 51312027Sjungma@eit.uni-kl.de// This method returns the kind of this process. 51412027Sjungma@eit.uni-kl.de//------------------------------------------------------------------------------ 51512027Sjungma@eit.uni-kl.deinline sc_process_handle sc_process_b::last_created_process_handle() 51612027Sjungma@eit.uni-kl.de{ 51712027Sjungma@eit.uni-kl.de return sc_process_handle(m_last_created_process_p); 51812027Sjungma@eit.uni-kl.de} 51912027Sjungma@eit.uni-kl.de 52012027Sjungma@eit.uni-kl.deinline sc_process_handle sc_get_last_created_process_handle() 52112027Sjungma@eit.uni-kl.de{ 52212027Sjungma@eit.uni-kl.de return sc_process_b::last_created_process_handle(); 52312027Sjungma@eit.uni-kl.de} 52412027Sjungma@eit.uni-kl.de 52512027Sjungma@eit.uni-kl.de} // namespace sc_core 52612027Sjungma@eit.uni-kl.de 52712027Sjungma@eit.uni-kl.de// Revision 1.19 2011/08/24 22:05:51 acg 52812027Sjungma@eit.uni-kl.de// Torsten Maehne: initialization changes to remove warnings. 52912027Sjungma@eit.uni-kl.de// 53012027Sjungma@eit.uni-kl.de// Revision 1.18 2011/04/01 22:08:26 acg 53112027Sjungma@eit.uni-kl.de// Andy Goodrich: remove unused variable. 53212027Sjungma@eit.uni-kl.de// 53312027Sjungma@eit.uni-kl.de// Revision 1.17 2011/03/12 21:07:51 acg 53412027Sjungma@eit.uni-kl.de// Andy Goodrich: changes to kernel generated event support. 53512027Sjungma@eit.uni-kl.de// 53612027Sjungma@eit.uni-kl.de// Revision 1.16 2011/02/18 20:27:14 acg 53712027Sjungma@eit.uni-kl.de// Andy Goodrich: Updated Copyrights. 53812027Sjungma@eit.uni-kl.de// 53912027Sjungma@eit.uni-kl.de// Revision 1.15 2011/02/17 19:53:03 acg 54012027Sjungma@eit.uni-kl.de// Andy Goodrich: changed dump_status() to dump_state() with new signature. 54112027Sjungma@eit.uni-kl.de// 54212027Sjungma@eit.uni-kl.de// Revision 1.14 2011/02/13 21:47:37 acg 54312027Sjungma@eit.uni-kl.de// Andy Goodrich: update copyright notice. 54412027Sjungma@eit.uni-kl.de// 54512027Sjungma@eit.uni-kl.de// Revision 1.13 2011/02/13 21:33:30 acg 54612027Sjungma@eit.uni-kl.de// Andy Goodrich: added dump_status() to allow the dumping of the status 54712027Sjungma@eit.uni-kl.de// of a process handle's target. 54812027Sjungma@eit.uni-kl.de// 54912027Sjungma@eit.uni-kl.de// Revision 1.12 2011/02/01 23:01:53 acg 55012027Sjungma@eit.uni-kl.de// Andy Goodrich: removed dead code. 55112027Sjungma@eit.uni-kl.de// 55212027Sjungma@eit.uni-kl.de// Revision 1.11 2011/02/01 21:07:36 acg 55312027Sjungma@eit.uni-kl.de// Andy Goodrich: defering of run queue manipulations to the 55412027Sjungma@eit.uni-kl.de// sc_thread_process::throw_it() method. 55512027Sjungma@eit.uni-kl.de// 55612027Sjungma@eit.uni-kl.de// Revision 1.10 2011/01/25 20:50:37 acg 55712027Sjungma@eit.uni-kl.de// Andy Goodrich: changes for IEEE 1666 2011. 55812027Sjungma@eit.uni-kl.de// 55912027Sjungma@eit.uni-kl.de// Revision 1.9 2011/01/20 16:52:20 acg 56012027Sjungma@eit.uni-kl.de// Andy Goodrich: changes for IEEE 1666 2011. 56112027Sjungma@eit.uni-kl.de// 56212027Sjungma@eit.uni-kl.de// Revision 1.8 2011/01/19 23:21:50 acg 56312027Sjungma@eit.uni-kl.de// Andy Goodrich: changes for IEEE 1666 2011 56412027Sjungma@eit.uni-kl.de// 56512027Sjungma@eit.uni-kl.de// Revision 1.7 2011/01/18 20:10:45 acg 56612027Sjungma@eit.uni-kl.de// Andy Goodrich: changes for IEEE1666_2011 semantics. 56712027Sjungma@eit.uni-kl.de// 56812027Sjungma@eit.uni-kl.de// Revision 1.6 2010/07/30 05:21:22 acg 56912027Sjungma@eit.uni-kl.de// Andy Goodrich: release 2.3 fixes. 57012027Sjungma@eit.uni-kl.de// 57112027Sjungma@eit.uni-kl.de// Revision 1.5 2010/07/22 20:02:33 acg 57212027Sjungma@eit.uni-kl.de// Andy Goodrich: bug fixes. 57312027Sjungma@eit.uni-kl.de// 57412027Sjungma@eit.uni-kl.de// Revision 1.4 2009/05/22 16:06:29 acg 57512027Sjungma@eit.uni-kl.de// Andy Goodrich: process control updates. 57612027Sjungma@eit.uni-kl.de// 57712027Sjungma@eit.uni-kl.de// Revision 1.3 2008/05/22 17:06:26 acg 57812027Sjungma@eit.uni-kl.de// Andy Goodrich: updated copyright notice to include 2008. 57912027Sjungma@eit.uni-kl.de// 58012027Sjungma@eit.uni-kl.de// Revision 1.2 2007/09/20 20:32:35 acg 58112027Sjungma@eit.uni-kl.de// Andy Goodrich: changes to the semantics of throw_it() to match the 58212027Sjungma@eit.uni-kl.de// specification. A call to throw_it() will immediately suspend the calling 58312027Sjungma@eit.uni-kl.de// thread until all the throwees have executed. At that point the calling 58412027Sjungma@eit.uni-kl.de// thread will be restarted before the execution of any other threads. 58512027Sjungma@eit.uni-kl.de// 58612027Sjungma@eit.uni-kl.de// Revision 1.1.1.1 2006/12/15 20:20:05 acg 58712027Sjungma@eit.uni-kl.de// SystemC 2.3 58812027Sjungma@eit.uni-kl.de// 58912027Sjungma@eit.uni-kl.de// Revision 1.7 2006/05/08 17:58:24 acg 59012027Sjungma@eit.uni-kl.de// Andy Goodrich: added David Long's forward declarations for friend 59112027Sjungma@eit.uni-kl.de// functions, methods, and operators to keep the Microsoft compiler happy. 59212027Sjungma@eit.uni-kl.de// 59312027Sjungma@eit.uni-kl.de// Revision 1.6 2006/04/20 17:08:17 acg 59412027Sjungma@eit.uni-kl.de// Andy Goodrich: 3.0 style process changes. 59512027Sjungma@eit.uni-kl.de// 59612027Sjungma@eit.uni-kl.de// Revision 1.5 2006/04/11 23:13:21 acg 59712027Sjungma@eit.uni-kl.de// Andy Goodrich: Changes for reduced reset support that only includes 59812027Sjungma@eit.uni-kl.de// sc_cthread, but has preliminary hooks for expanding to method and thread 59912027Sjungma@eit.uni-kl.de// processes also. 60012027Sjungma@eit.uni-kl.de// 60112027Sjungma@eit.uni-kl.de// Revision 1.4 2006/01/24 20:49:05 acg 60212027Sjungma@eit.uni-kl.de// Andy Goodrich: changes to remove the use of deprecated features within the 60312027Sjungma@eit.uni-kl.de// simulator, and to issue warning messages when deprecated features are used. 60412027Sjungma@eit.uni-kl.de// 60512027Sjungma@eit.uni-kl.de// Revision 1.3 2006/01/13 18:44:30 acg 60612027Sjungma@eit.uni-kl.de// Added $Log to record CVS changes into the source. 60712027Sjungma@eit.uni-kl.de 60812027Sjungma@eit.uni-kl.de#endif // !defined(sc_spawn_h_INCLUDED) 609