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 = &el;
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 = &el;
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 = &el;
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 = &el;
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