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