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_phase_callback_registry.h -- Definition of the simulation phase callbacks
2312027Sjungma@eit.uni-kl.de
2412027Sjungma@eit.uni-kl.de  The most critical functions are defined inline in this file.  Only active,
2512027Sjungma@eit.uni-kl.de  if SC_ENABLE_SIMULATION_PHASE_CALLBACKS[_TRACING] is defined during the
2612027Sjungma@eit.uni-kl.de  SystemC library build.
2712027Sjungma@eit.uni-kl.de
2812027Sjungma@eit.uni-kl.de  Original Author: Philipp A. Hartmann, OFFIS, 2013-02-15
2912027Sjungma@eit.uni-kl.de
3012027Sjungma@eit.uni-kl.de  CHANGE LOG AT END OF FILE
3112027Sjungma@eit.uni-kl.de *****************************************************************************/
3212027Sjungma@eit.uni-kl.de
3312027Sjungma@eit.uni-kl.de#ifndef SC_PHASE_CALLBACK_REGISTRY_H_INCLUDED_
3412027Sjungma@eit.uni-kl.de#define SC_PHASE_CALLBACK_REGISTRY_H_INCLUDED_
3512027Sjungma@eit.uni-kl.de
3612027Sjungma@eit.uni-kl.de#if defined( SC_ENABLE_SIMULATION_PHASE_CALLBACKS ) \
3712027Sjungma@eit.uni-kl.de || defined( SC_ENABLE_SIMULATION_PHASE_CALLBACKS_TRACING )
3812027Sjungma@eit.uni-kl.de#  define SC_HAS_PHASE_CALLBACKS_ 1
3912027Sjungma@eit.uni-kl.de#else
4012027Sjungma@eit.uni-kl.de#  define SC_HAS_PHASE_CALLBACKS_ 0
4112027Sjungma@eit.uni-kl.de#endif
4212027Sjungma@eit.uni-kl.de
4312027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_simcontext.h"
4412027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_object_int.h"
4512027Sjungma@eit.uni-kl.de#include "sysc/kernel/sc_status.h"
4612027Sjungma@eit.uni-kl.de
4712027Sjungma@eit.uni-kl.de#include <vector>
4812027Sjungma@eit.uni-kl.de
4912027Sjungma@eit.uni-kl.denamespace sc_core {
5012027Sjungma@eit.uni-kl.de
5112027Sjungma@eit.uni-kl.declass sc_simcontext;
5212027Sjungma@eit.uni-kl.declass sc_object;
5312027Sjungma@eit.uni-kl.de
5412027Sjungma@eit.uni-kl.declass sc_phase_callback_registry
5512027Sjungma@eit.uni-kl.de{
5612027Sjungma@eit.uni-kl.depublic:
5712027Sjungma@eit.uni-kl.de    typedef sc_phase_callback_registry this_type;
5812027Sjungma@eit.uni-kl.de    typedef sc_object                  cb_type;
5912027Sjungma@eit.uni-kl.de    typedef cb_type::phase_cb_mask     mask_type;
6012027Sjungma@eit.uni-kl.de
6112027Sjungma@eit.uni-kl.de    struct entry
6212027Sjungma@eit.uni-kl.de    {
6312027Sjungma@eit.uni-kl.de        cb_type*  target;
6412027Sjungma@eit.uni-kl.de        mask_type mask;
6512027Sjungma@eit.uni-kl.de    };
6612027Sjungma@eit.uni-kl.de
6712027Sjungma@eit.uni-kl.de    friend class sc_simcontext;
6812027Sjungma@eit.uni-kl.de    friend class sc_object;
6912027Sjungma@eit.uni-kl.de
7012027Sjungma@eit.uni-kl.deprivate: // interface completely internal
7112027Sjungma@eit.uni-kl.de
7212027Sjungma@eit.uni-kl.de    explicit
7312027Sjungma@eit.uni-kl.de    sc_phase_callback_registry( sc_simcontext& simc );
7412027Sjungma@eit.uni-kl.de
7512027Sjungma@eit.uni-kl.de    ~sc_phase_callback_registry();
7612027Sjungma@eit.uni-kl.de
7712027Sjungma@eit.uni-kl.de    // --- callback forwarders
7812027Sjungma@eit.uni-kl.de
7912027Sjungma@eit.uni-kl.de    bool construction_done()   const; //< returns false
8012027Sjungma@eit.uni-kl.de    void elaboration_done()    const;
8112027Sjungma@eit.uni-kl.de    void initialization_done() const;
8212027Sjungma@eit.uni-kl.de    void start_simulation()    const;
8312027Sjungma@eit.uni-kl.de
8412027Sjungma@eit.uni-kl.de    void evaluation_done()     const;
8512027Sjungma@eit.uni-kl.de    void update_done()         const;
8612027Sjungma@eit.uni-kl.de    void before_timestep()     const;
8712027Sjungma@eit.uni-kl.de
8812027Sjungma@eit.uni-kl.de    void simulation_paused()   const;
8912027Sjungma@eit.uni-kl.de    void simulation_stopped()  const;
9012027Sjungma@eit.uni-kl.de    void simulation_done()     const;
9112027Sjungma@eit.uni-kl.de
9212027Sjungma@eit.uni-kl.de
9312027Sjungma@eit.uni-kl.de    // --- callback registration and implementation
9412027Sjungma@eit.uni-kl.de
9512027Sjungma@eit.uni-kl.de    mask_type register_callback( cb_type&, mask_type mask );
9612027Sjungma@eit.uni-kl.de    mask_type unregister_callback( cb_type&, mask_type mask );
9712027Sjungma@eit.uni-kl.de
9812027Sjungma@eit.uni-kl.de    // generic caller
9912027Sjungma@eit.uni-kl.de    void do_callback( sc_status ) const;
10012027Sjungma@eit.uni-kl.de
10112027Sjungma@eit.uni-kl.deprivate:
10212027Sjungma@eit.uni-kl.de    typedef std::vector<entry>    storage_type;
10312027Sjungma@eit.uni-kl.de    typedef std::vector<cb_type*> single_storage_type;
10412027Sjungma@eit.uni-kl.de
10512027Sjungma@eit.uni-kl.de#if SC_HAS_PHASE_CALLBACKS_
10612027Sjungma@eit.uni-kl.de
10712027Sjungma@eit.uni-kl.de    // set and restore simulation status
10812027Sjungma@eit.uni-kl.de    struct scoped_status
10912027Sjungma@eit.uni-kl.de    {
11012027Sjungma@eit.uni-kl.de        scoped_status( sc_status& ref, sc_status s )
11112027Sjungma@eit.uni-kl.de          : ref_(ref), prev_(ref) { ref_ = s;}
11212027Sjungma@eit.uni-kl.de        ~scoped_status() { ref_ = prev_; }
11312027Sjungma@eit.uni-kl.de    private:
11412027Sjungma@eit.uni-kl.de        sc_status& ref_;
11512027Sjungma@eit.uni-kl.de        sc_status  prev_;
11612027Sjungma@eit.uni-kl.de    }; // scoped_status
11712027Sjungma@eit.uni-kl.de
11812027Sjungma@eit.uni-kl.de    mask_type validate_mask( cb_type&, mask_type, bool warn );
11912027Sjungma@eit.uni-kl.de
12012027Sjungma@eit.uni-kl.deprivate:
12112027Sjungma@eit.uni-kl.de
12212027Sjungma@eit.uni-kl.de    sc_simcontext*        m_simc;
12312027Sjungma@eit.uni-kl.de    storage_type          m_cb_vec;            // all callbacks
12412027Sjungma@eit.uni-kl.de#if 0
12512027Sjungma@eit.uni-kl.de    single_storage_type   m_cb_eval_vec;     //  - eval cb shortcut
12612027Sjungma@eit.uni-kl.de#endif
12712027Sjungma@eit.uni-kl.de    single_storage_type   m_cb_update_vec;   //  - update cb shortcut
12812027Sjungma@eit.uni-kl.de    single_storage_type   m_cb_timestep_vec; //  - timestep cb shortcut
12912027Sjungma@eit.uni-kl.de
13012027Sjungma@eit.uni-kl.de#endif // SC_HAS_PHASE_CALLBACKS_
13112027Sjungma@eit.uni-kl.de
13212027Sjungma@eit.uni-kl.deprivate:
13312027Sjungma@eit.uni-kl.de    // disabled
13412027Sjungma@eit.uni-kl.de    sc_phase_callback_registry( const this_type& );
13512027Sjungma@eit.uni-kl.de    this_type& operator=(const this_type&);
13612027Sjungma@eit.uni-kl.de
13712027Sjungma@eit.uni-kl.de}; // sc_phase_callback_registry
13812027Sjungma@eit.uni-kl.de
13912027Sjungma@eit.uni-kl.de
14012027Sjungma@eit.uni-kl.de// -------------------- callback implementations --------------------
14112027Sjungma@eit.uni-kl.de//                   (empty, if feature is disabled)
14212027Sjungma@eit.uni-kl.de
14312027Sjungma@eit.uni-kl.deinline bool
14412027Sjungma@eit.uni-kl.desc_phase_callback_registry::construction_done() const
14512027Sjungma@eit.uni-kl.de{
14612027Sjungma@eit.uni-kl.de#if SC_HAS_PHASE_CALLBACKS_
14712027Sjungma@eit.uni-kl.de    do_callback( SC_BEFORE_END_OF_ELABORATION );
14812027Sjungma@eit.uni-kl.de#endif
14912027Sjungma@eit.uni-kl.de    return false;
15012027Sjungma@eit.uni-kl.de}
15112027Sjungma@eit.uni-kl.de
15212027Sjungma@eit.uni-kl.deinline void
15312027Sjungma@eit.uni-kl.desc_phase_callback_registry::elaboration_done() const
15412027Sjungma@eit.uni-kl.de{
15512027Sjungma@eit.uni-kl.de#if SC_HAS_PHASE_CALLBACKS_
15612027Sjungma@eit.uni-kl.de    do_callback( SC_END_OF_ELABORATION );
15712027Sjungma@eit.uni-kl.de#endif
15812027Sjungma@eit.uni-kl.de}
15912027Sjungma@eit.uni-kl.de
16012027Sjungma@eit.uni-kl.deinline void
16112027Sjungma@eit.uni-kl.desc_phase_callback_registry::start_simulation() const
16212027Sjungma@eit.uni-kl.de{
16312027Sjungma@eit.uni-kl.de#if SC_HAS_PHASE_CALLBACKS_
16412027Sjungma@eit.uni-kl.de    do_callback( SC_START_OF_SIMULATION );
16512027Sjungma@eit.uni-kl.de#endif
16612027Sjungma@eit.uni-kl.de}
16712027Sjungma@eit.uni-kl.de
16812027Sjungma@eit.uni-kl.deinline void
16912027Sjungma@eit.uni-kl.desc_phase_callback_registry::initialization_done() const
17012027Sjungma@eit.uni-kl.de{
17112027Sjungma@eit.uni-kl.de#if SC_HAS_PHASE_CALLBACKS_
17212027Sjungma@eit.uni-kl.de    scoped_status scope( m_simc->m_simulation_status
17312027Sjungma@eit.uni-kl.de                       , SC_END_OF_INITIALIZATION );
17412027Sjungma@eit.uni-kl.de
17512027Sjungma@eit.uni-kl.de    do_callback( SC_END_OF_INITIALIZATION );
17612027Sjungma@eit.uni-kl.de#endif
17712027Sjungma@eit.uni-kl.de}
17812027Sjungma@eit.uni-kl.de
17912027Sjungma@eit.uni-kl.deinline void
18012027Sjungma@eit.uni-kl.desc_phase_callback_registry::simulation_paused() const
18112027Sjungma@eit.uni-kl.de{
18212027Sjungma@eit.uni-kl.de#if SC_HAS_PHASE_CALLBACKS_
18312027Sjungma@eit.uni-kl.de    do_callback( SC_PAUSED );
18412027Sjungma@eit.uni-kl.de#endif
18512027Sjungma@eit.uni-kl.de}
18612027Sjungma@eit.uni-kl.de
18712027Sjungma@eit.uni-kl.deinline void
18812027Sjungma@eit.uni-kl.desc_phase_callback_registry::simulation_stopped() const
18912027Sjungma@eit.uni-kl.de{
19012027Sjungma@eit.uni-kl.de#if SC_HAS_PHASE_CALLBACKS_
19112027Sjungma@eit.uni-kl.de    do_callback( SC_STOPPED );
19212027Sjungma@eit.uni-kl.de#endif
19312027Sjungma@eit.uni-kl.de}
19412027Sjungma@eit.uni-kl.de
19512027Sjungma@eit.uni-kl.deinline void
19612027Sjungma@eit.uni-kl.desc_phase_callback_registry::simulation_done() const
19712027Sjungma@eit.uni-kl.de{
19812027Sjungma@eit.uni-kl.de#if SC_HAS_PHASE_CALLBACKS_
19912027Sjungma@eit.uni-kl.de    do_callback( SC_END_OF_SIMULATION );
20012027Sjungma@eit.uni-kl.de#endif
20112027Sjungma@eit.uni-kl.de}
20212027Sjungma@eit.uni-kl.de
20312027Sjungma@eit.uni-kl.de// -------------- specialized callback implementations --------------
20412027Sjungma@eit.uni-kl.de
20512027Sjungma@eit.uni-kl.de#if 0
20612027Sjungma@eit.uni-kl.deinline void
20712027Sjungma@eit.uni-kl.desc_phase_callback_registry::evaluation_done() const
20812027Sjungma@eit.uni-kl.de{
20912027Sjungma@eit.uni-kl.de#if SC_HAS_PHASE_CALLBACKS_
21012027Sjungma@eit.uni-kl.de
21112027Sjungma@eit.uni-kl.de    if( !m_cb_eval_vec.size() ) return;
21212027Sjungma@eit.uni-kl.de
21312027Sjungma@eit.uni-kl.de    typedef single_storage_type::const_iterator it_type;
21412027Sjungma@eit.uni-kl.de    single_storage_type const & vec = m_cb_eval_vec;
21512027Sjungma@eit.uni-kl.de
21612027Sjungma@eit.uni-kl.de    scoped_status scope( m_simc->m_simulation_status
21712027Sjungma@eit.uni-kl.de                       , SC_END_OF_EVALUATION );
21812027Sjungma@eit.uni-kl.de
21912027Sjungma@eit.uni-kl.de    for(it_type it = vec.begin(), end = vec.end(); it != end; ++it)
22012027Sjungma@eit.uni-kl.de        (*it)->do_simulation_phase_callback();
22112027Sjungma@eit.uni-kl.de#endif
22212027Sjungma@eit.uni-kl.de}
22312027Sjungma@eit.uni-kl.de#endif
22412027Sjungma@eit.uni-kl.de
22512027Sjungma@eit.uni-kl.deinline void
22612027Sjungma@eit.uni-kl.desc_phase_callback_registry::update_done() const
22712027Sjungma@eit.uni-kl.de{
22812027Sjungma@eit.uni-kl.de#if SC_HAS_PHASE_CALLBACKS_
22912027Sjungma@eit.uni-kl.de
23012027Sjungma@eit.uni-kl.de    if( !m_cb_update_vec.size() ) return;
23112027Sjungma@eit.uni-kl.de
23212027Sjungma@eit.uni-kl.de    typedef single_storage_type::const_iterator it_type;
23312027Sjungma@eit.uni-kl.de    single_storage_type const & vec = m_cb_update_vec;
23412027Sjungma@eit.uni-kl.de
23512027Sjungma@eit.uni-kl.de    scoped_status scope( m_simc->m_simulation_status
23612027Sjungma@eit.uni-kl.de                       , SC_END_OF_UPDATE );
23712027Sjungma@eit.uni-kl.de
23812027Sjungma@eit.uni-kl.de    for(it_type it = vec.begin(), end = vec.end(); it != end; ++it)
23912027Sjungma@eit.uni-kl.de        (*it)->do_simulation_phase_callback();
24012027Sjungma@eit.uni-kl.de#endif
24112027Sjungma@eit.uni-kl.de}
24212027Sjungma@eit.uni-kl.de
24312027Sjungma@eit.uni-kl.deinline void
24412027Sjungma@eit.uni-kl.desc_phase_callback_registry::before_timestep() const
24512027Sjungma@eit.uni-kl.de{
24612027Sjungma@eit.uni-kl.de#if SC_HAS_PHASE_CALLBACKS_
24712027Sjungma@eit.uni-kl.de
24812027Sjungma@eit.uni-kl.de    if( !m_cb_timestep_vec.size() ) return;
24912027Sjungma@eit.uni-kl.de
25012027Sjungma@eit.uni-kl.de    typedef single_storage_type::const_iterator it_type;
25112027Sjungma@eit.uni-kl.de    single_storage_type const & vec = m_cb_timestep_vec;
25212027Sjungma@eit.uni-kl.de
25312027Sjungma@eit.uni-kl.de    scoped_status scope( m_simc->m_simulation_status
25412027Sjungma@eit.uni-kl.de                       , SC_BEFORE_TIMESTEP );
25512027Sjungma@eit.uni-kl.de
25612027Sjungma@eit.uni-kl.de    for(it_type it = vec.begin(), end = vec.end(); it != end; ++it)
25712027Sjungma@eit.uni-kl.de        (*it)->do_simulation_phase_callback();
25812027Sjungma@eit.uni-kl.de#endif
25912027Sjungma@eit.uni-kl.de}
26012027Sjungma@eit.uni-kl.de
26112027Sjungma@eit.uni-kl.de// ------------------------------------------------------------------
26212027Sjungma@eit.uni-kl.de
26312027Sjungma@eit.uni-kl.de} // namespace sc_core
26412027Sjungma@eit.uni-kl.de
26512027Sjungma@eit.uni-kl.de/*****************************************************************************
26612027Sjungma@eit.uni-kl.de
26712027Sjungma@eit.uni-kl.de  MODIFICATION LOG - modifiers, enter your name, affiliation, date and
26812027Sjungma@eit.uni-kl.de  changes you are making here.
26912027Sjungma@eit.uni-kl.de
27012027Sjungma@eit.uni-kl.de      Name, Affiliation, Date:
27112027Sjungma@eit.uni-kl.de  Description of Modification:
27212027Sjungma@eit.uni-kl.de
27312027Sjungma@eit.uni-kl.de *****************************************************************************/
27412027Sjungma@eit.uni-kl.de#endif /* SC_PHASE_CALLBACK_REGISTRY_H_INCLUDED_ */
27512027Sjungma@eit.uni-kl.de// Taf!
27612027Sjungma@eit.uni-kl.de
277