summaryrefslogtreecommitdiff
path: root/ext/systemc/src/sysc/kernel/sc_phase_callback_registry.h
diff options
context:
space:
mode:
Diffstat (limited to 'ext/systemc/src/sysc/kernel/sc_phase_callback_registry.h')
-rw-r--r--ext/systemc/src/sysc/kernel/sc_phase_callback_registry.h276
1 files changed, 276 insertions, 0 deletions
diff --git a/ext/systemc/src/sysc/kernel/sc_phase_callback_registry.h b/ext/systemc/src/sysc/kernel/sc_phase_callback_registry.h
new file mode 100644
index 000000000..9510c0d3f
--- /dev/null
+++ b/ext/systemc/src/sysc/kernel/sc_phase_callback_registry.h
@@ -0,0 +1,276 @@
+/*****************************************************************************
+
+ Licensed to Accellera Systems Initiative Inc. (Accellera) under one or
+ more contributor license agreements. See the NOTICE file distributed
+ with this work for additional information regarding copyright ownership.
+ Accellera licenses this file to you under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with the
+ License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied. See the License for the specific language governing
+ permissions and limitations under the License.
+
+ *****************************************************************************/
+
+/*****************************************************************************
+
+ sc_phase_callback_registry.h -- Definition of the simulation phase callbacks
+
+ The most critical functions are defined inline in this file. Only active,
+ if SC_ENABLE_SIMULATION_PHASE_CALLBACKS[_TRACING] is defined during the
+ SystemC library build.
+
+ Original Author: Philipp A. Hartmann, OFFIS, 2013-02-15
+
+ CHANGE LOG AT END OF FILE
+ *****************************************************************************/
+
+#ifndef SC_PHASE_CALLBACK_REGISTRY_H_INCLUDED_
+#define SC_PHASE_CALLBACK_REGISTRY_H_INCLUDED_
+
+#if defined( SC_ENABLE_SIMULATION_PHASE_CALLBACKS ) \
+ || defined( SC_ENABLE_SIMULATION_PHASE_CALLBACKS_TRACING )
+# define SC_HAS_PHASE_CALLBACKS_ 1
+#else
+# define SC_HAS_PHASE_CALLBACKS_ 0
+#endif
+
+#include "sysc/kernel/sc_simcontext.h"
+#include "sysc/kernel/sc_object_int.h"
+#include "sysc/kernel/sc_status.h"
+
+#include <vector>
+
+namespace sc_core {
+
+class sc_simcontext;
+class sc_object;
+
+class sc_phase_callback_registry
+{
+public:
+ typedef sc_phase_callback_registry this_type;
+ typedef sc_object cb_type;
+ typedef cb_type::phase_cb_mask mask_type;
+
+ struct entry
+ {
+ cb_type* target;
+ mask_type mask;
+ };
+
+ friend class sc_simcontext;
+ friend class sc_object;
+
+private: // interface completely internal
+
+ explicit
+ sc_phase_callback_registry( sc_simcontext& simc );
+
+ ~sc_phase_callback_registry();
+
+ // --- callback forwarders
+
+ bool construction_done() const; //< returns false
+ void elaboration_done() const;
+ void initialization_done() const;
+ void start_simulation() const;
+
+ void evaluation_done() const;
+ void update_done() const;
+ void before_timestep() const;
+
+ void simulation_paused() const;
+ void simulation_stopped() const;
+ void simulation_done() const;
+
+
+ // --- callback registration and implementation
+
+ mask_type register_callback( cb_type&, mask_type mask );
+ mask_type unregister_callback( cb_type&, mask_type mask );
+
+ // generic caller
+ void do_callback( sc_status ) const;
+
+private:
+ typedef std::vector<entry> storage_type;
+ typedef std::vector<cb_type*> single_storage_type;
+
+#if SC_HAS_PHASE_CALLBACKS_
+
+ // set and restore simulation status
+ struct scoped_status
+ {
+ scoped_status( sc_status& ref, sc_status s )
+ : ref_(ref), prev_(ref) { ref_ = s;}
+ ~scoped_status() { ref_ = prev_; }
+ private:
+ sc_status& ref_;
+ sc_status prev_;
+ }; // scoped_status
+
+ mask_type validate_mask( cb_type&, mask_type, bool warn );
+
+private:
+
+ sc_simcontext* m_simc;
+ storage_type m_cb_vec; // all callbacks
+#if 0
+ single_storage_type m_cb_eval_vec; // - eval cb shortcut
+#endif
+ single_storage_type m_cb_update_vec; // - update cb shortcut
+ single_storage_type m_cb_timestep_vec; // - timestep cb shortcut
+
+#endif // SC_HAS_PHASE_CALLBACKS_
+
+private:
+ // disabled
+ sc_phase_callback_registry( const this_type& );
+ this_type& operator=(const this_type&);
+
+}; // sc_phase_callback_registry
+
+
+// -------------------- callback implementations --------------------
+// (empty, if feature is disabled)
+
+inline bool
+sc_phase_callback_registry::construction_done() const
+{
+#if SC_HAS_PHASE_CALLBACKS_
+ do_callback( SC_BEFORE_END_OF_ELABORATION );
+#endif
+ return false;
+}
+
+inline void
+sc_phase_callback_registry::elaboration_done() const
+{
+#if SC_HAS_PHASE_CALLBACKS_
+ do_callback( SC_END_OF_ELABORATION );
+#endif
+}
+
+inline void
+sc_phase_callback_registry::start_simulation() const
+{
+#if SC_HAS_PHASE_CALLBACKS_
+ do_callback( SC_START_OF_SIMULATION );
+#endif
+}
+
+inline void
+sc_phase_callback_registry::initialization_done() const
+{
+#if SC_HAS_PHASE_CALLBACKS_
+ scoped_status scope( m_simc->m_simulation_status
+ , SC_END_OF_INITIALIZATION );
+
+ do_callback( SC_END_OF_INITIALIZATION );
+#endif
+}
+
+inline void
+sc_phase_callback_registry::simulation_paused() const
+{
+#if SC_HAS_PHASE_CALLBACKS_
+ do_callback( SC_PAUSED );
+#endif
+}
+
+inline void
+sc_phase_callback_registry::simulation_stopped() const
+{
+#if SC_HAS_PHASE_CALLBACKS_
+ do_callback( SC_STOPPED );
+#endif
+}
+
+inline void
+sc_phase_callback_registry::simulation_done() const
+{
+#if SC_HAS_PHASE_CALLBACKS_
+ do_callback( SC_END_OF_SIMULATION );
+#endif
+}
+
+// -------------- specialized callback implementations --------------
+
+#if 0
+inline void
+sc_phase_callback_registry::evaluation_done() const
+{
+#if SC_HAS_PHASE_CALLBACKS_
+
+ if( !m_cb_eval_vec.size() ) return;
+
+ typedef single_storage_type::const_iterator it_type;
+ single_storage_type const & vec = m_cb_eval_vec;
+
+ scoped_status scope( m_simc->m_simulation_status
+ , SC_END_OF_EVALUATION );
+
+ for(it_type it = vec.begin(), end = vec.end(); it != end; ++it)
+ (*it)->do_simulation_phase_callback();
+#endif
+}
+#endif
+
+inline void
+sc_phase_callback_registry::update_done() const
+{
+#if SC_HAS_PHASE_CALLBACKS_
+
+ if( !m_cb_update_vec.size() ) return;
+
+ typedef single_storage_type::const_iterator it_type;
+ single_storage_type const & vec = m_cb_update_vec;
+
+ scoped_status scope( m_simc->m_simulation_status
+ , SC_END_OF_UPDATE );
+
+ for(it_type it = vec.begin(), end = vec.end(); it != end; ++it)
+ (*it)->do_simulation_phase_callback();
+#endif
+}
+
+inline void
+sc_phase_callback_registry::before_timestep() const
+{
+#if SC_HAS_PHASE_CALLBACKS_
+
+ if( !m_cb_timestep_vec.size() ) return;
+
+ typedef single_storage_type::const_iterator it_type;
+ single_storage_type const & vec = m_cb_timestep_vec;
+
+ scoped_status scope( m_simc->m_simulation_status
+ , SC_BEFORE_TIMESTEP );
+
+ for(it_type it = vec.begin(), end = vec.end(); it != end; ++it)
+ (*it)->do_simulation_phase_callback();
+#endif
+}
+
+// ------------------------------------------------------------------
+
+} // namespace sc_core
+
+/*****************************************************************************
+
+ MODIFICATION LOG - modifiers, enter your name, affiliation, date and
+ changes you are making here.
+
+ Name, Affiliation, Date:
+ Description of Modification:
+
+ *****************************************************************************/
+#endif /* SC_PHASE_CALLBACK_REGISTRY_H_INCLUDED_ */
+// Taf!
+