summaryrefslogtreecommitdiff
path: root/ext/systemc/src/sysc/kernel/sc_simcontext.h
diff options
context:
space:
mode:
Diffstat (limited to 'ext/systemc/src/sysc/kernel/sc_simcontext.h')
-rw-r--r--ext/systemc/src/sysc/kernel/sc_simcontext.h903
1 files changed, 903 insertions, 0 deletions
diff --git a/ext/systemc/src/sysc/kernel/sc_simcontext.h b/ext/systemc/src/sysc/kernel/sc_simcontext.h
new file mode 100644
index 000000000..997a3f49c
--- /dev/null
+++ b/ext/systemc/src/sysc/kernel/sc_simcontext.h
@@ -0,0 +1,903 @@
+/*****************************************************************************
+
+ 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_simcontext.h -- Definition of the simulation context class.
+
+ Original Author: Stan Y. Liao, Synopsys, Inc.
+ Martin Janssen, Synopsys, Inc.
+
+ CHANGE LOG AT THE END OF THE FILE
+ *****************************************************************************/
+
+#ifndef SC_SIMCONTEXT_H
+#define SC_SIMCONTEXT_H
+
+#include "sysc/kernel/sc_cmnhdr.h"
+#include "sysc/kernel/sc_process.h"
+#include "sysc/kernel/sc_status.h"
+#include "sysc/kernel/sc_time.h"
+#include "sysc/utils/sc_hash.h"
+#include "sysc/utils/sc_pq.h"
+
+namespace sc_core {
+
+// forward declarations
+
+class sc_cor;
+class sc_cor_pkg;
+class sc_event;
+class sc_event_timed;
+class sc_export_registry;
+class sc_module;
+class sc_module_name;
+class sc_module_registry;
+class sc_name_gen;
+class sc_object;
+class sc_object_manager;
+class sc_phase_callback_registry;
+class sc_process_handle;
+class sc_port_registry;
+class sc_prim_channel_registry;
+class sc_process_table;
+class sc_signal_bool_deval;
+class sc_trace_file;
+class sc_runnable;
+class sc_process_host;
+class sc_method_process;
+class sc_cthread_process;
+class sc_thread_process;
+
+template< typename > class sc_plist;
+typedef sc_plist< sc_process_b* > sc_process_list;
+
+struct sc_curr_proc_info
+{
+ sc_process_b* process_handle;
+ sc_curr_proc_kind kind;
+ sc_curr_proc_info() : process_handle( 0 ), kind( SC_NO_PROC_ ) {}
+};
+
+typedef const sc_curr_proc_info* sc_curr_proc_handle;
+
+enum sc_stop_mode { // sc_stop modes:
+ SC_STOP_FINISH_DELTA,
+ SC_STOP_IMMEDIATE
+};
+extern void sc_set_stop_mode( sc_stop_mode mode );
+extern sc_stop_mode sc_get_stop_mode();
+
+enum sc_starvation_policy
+{
+ SC_EXIT_ON_STARVATION,
+ SC_RUN_TO_TIME
+};
+extern void sc_start();
+extern void sc_start( const sc_time& duration,
+ sc_starvation_policy p=SC_RUN_TO_TIME );
+inline void sc_start( int duration, sc_time_unit unit,
+ sc_starvation_policy p=SC_RUN_TO_TIME )
+{
+ sc_start( sc_time((double)duration,unit), p );
+}
+
+inline void sc_start( double duration, sc_time_unit unit,
+ sc_starvation_policy p=SC_RUN_TO_TIME )
+{
+ sc_start( sc_time(duration,unit), p );
+}
+
+extern void sc_stop();
+
+// friend function declarations
+
+sc_dt::uint64 sc_delta_count();
+const std::vector<sc_event*>& sc_get_top_level_events(
+ const sc_simcontext* simc_p);
+const std::vector<sc_object*>& sc_get_top_level_objects(
+ const sc_simcontext* simc_p);
+bool sc_is_running( const sc_simcontext* simc_p );
+void sc_pause();
+bool sc_end_of_simulation_invoked();
+void sc_start( const sc_time&, sc_starvation_policy );
+bool sc_start_of_simulation_invoked();
+void sc_set_time_resolution( double, sc_time_unit );
+sc_time sc_get_time_resolution();
+void sc_set_default_time_unit( double, sc_time_unit );
+sc_time sc_get_default_time_unit();
+bool sc_pending_activity_at_current_time( const sc_simcontext* );
+bool sc_pending_activity_at_future_time( const sc_simcontext* );
+sc_time sc_time_to_pending_activity( const sc_simcontext* );
+
+struct sc_invoke_method;
+
+// ----------------------------------------------------------------------------
+// CLASS : sc_simcontext
+//
+// The simulation context.
+// ----------------------------------------------------------------------------
+
+class sc_simcontext
+{
+ friend struct sc_invoke_method;
+ friend class sc_event;
+ friend class sc_module;
+ friend class sc_object;
+ friend class sc_time;
+ friend class sc_clock;
+ friend class sc_method_process;
+ friend class sc_phase_callback_registry;
+ friend class sc_process_b;
+ friend class sc_process_handle;
+ friend class sc_prim_channel;
+ friend class sc_cthread_process;
+ friend class sc_thread_process;
+ friend sc_dt::uint64 sc_delta_count();
+ friend const std::vector<sc_event*>& sc_get_top_level_events(
+ const sc_simcontext* simc_p);
+ friend const std::vector<sc_object*>& sc_get_top_level_objects(
+ const sc_simcontext* simc_p);
+ friend bool sc_is_running( const sc_simcontext* simc_p );
+ friend void sc_pause();
+ friend bool sc_end_of_simulation_invoked();
+ friend void sc_start( const sc_time&, sc_starvation_policy );
+ friend bool sc_start_of_simulation_invoked();
+ friend void sc_thread_cor_fn(void*);
+ friend sc_time sc_time_to_pending_activity( const sc_simcontext* );
+ friend bool sc_pending_activity_at_current_time( const sc_simcontext* );
+ friend bool sc_pending_activity_at_future_time( const sc_simcontext* );
+
+
+ void init();
+ void clean();
+
+public:
+
+ sc_simcontext();
+ ~sc_simcontext();
+
+ void initialize( bool = false );
+ void cycle( const sc_time& );
+ void simulate( const sc_time& duration );
+ void stop();
+ void end();
+ void reset();
+
+ int sim_status() const;
+ bool elaboration_done() const;
+
+ std::vector<sc_thread_handle>& get_active_invokers();
+
+ sc_object_manager* get_object_manager();
+
+ inline sc_status get_status() const;
+
+ sc_object* active_object();
+
+ void hierarchy_push( sc_module* );
+ sc_module* hierarchy_pop();
+ sc_module* hierarchy_curr() const;
+ sc_object* first_object();
+ sc_object* next_object();
+ sc_object* find_object( const char* name );
+
+ sc_module_registry* get_module_registry();
+ sc_port_registry* get_port_registry();
+ sc_export_registry* get_export_registry();
+ sc_prim_channel_registry* get_prim_channel_registry();
+
+ // to generate unique names for objects in an MT-Safe way
+ const char* gen_unique_name( const char* basename_,
+ bool preserve_first = false
+ );
+
+ // process creation
+ sc_process_handle create_cthread_process(
+ const char* name_p, bool free_host, SC_ENTRY_FUNC method_p,
+ sc_process_host* host_p, const sc_spawn_options* opt_p );
+
+ sc_process_handle create_method_process(
+ const char* name_p, bool free_host, SC_ENTRY_FUNC method_p,
+ sc_process_host* host_p, const sc_spawn_options* opt_p );
+
+ sc_process_handle create_thread_process(
+ const char* name_p, bool free_host, SC_ENTRY_FUNC method_p,
+ sc_process_host* host_p, const sc_spawn_options* opt_p );
+
+ sc_curr_proc_handle get_curr_proc_info();
+ sc_object* get_current_writer() const;
+ bool write_check() const;
+ void set_curr_proc( sc_process_b* );
+ void reset_curr_proc();
+
+ int next_proc_id();
+
+ void add_trace_file( sc_trace_file* );
+ void remove_trace_file( sc_trace_file* );
+
+ friend void sc_set_time_resolution( double, sc_time_unit );
+ friend sc_time sc_get_time_resolution();
+ friend void sc_set_default_time_unit( double, sc_time_unit );
+ friend sc_time sc_get_default_time_unit();
+
+ const sc_time& max_time() const;
+ const sc_time& time_stamp() const;
+
+ sc_dt::uint64 change_stamp() const;
+ sc_dt::uint64 delta_count() const;
+ bool event_occurred( sc_dt::uint64 last_change_count ) const;
+ bool evaluation_phase() const;
+ bool is_running() const;
+ bool update_phase() const;
+ bool notify_phase() const;
+ bool get_error();
+ void set_error( sc_report* );
+
+ sc_cor_pkg* cor_pkg()
+ { return m_cor_pkg; }
+ sc_cor* next_cor();
+
+ const ::std::vector<sc_object*>& get_child_objects() const;
+
+ void elaborate();
+ void prepare_to_simulate();
+ inline void initial_crunch( bool no_crunch );
+ bool next_time( sc_time& t ) const;
+ bool pending_activity_at_current_time() const;
+
+private:
+
+ void add_child_event( sc_event* );
+ void add_child_object( sc_object* );
+ void remove_child_event( sc_event* );
+ void remove_child_object( sc_object* );
+
+ void crunch( bool once=false );
+
+ int add_delta_event( sc_event* );
+ void remove_delta_event( sc_event* );
+ void add_timed_event( sc_event_timed* );
+
+ void trace_cycle( bool delta_cycle );
+
+ const ::std::vector<sc_event*>& get_child_events_internal() const;
+ const ::std::vector<sc_object*>& get_child_objects_internal() const;
+
+ void execute_method_next( sc_method_handle );
+ void execute_thread_next( sc_thread_handle );
+
+ sc_method_handle pop_runnable_method();
+ sc_thread_handle pop_runnable_thread();
+
+ void preempt_with( sc_method_handle );
+ inline void preempt_with( sc_thread_handle );
+
+ void push_runnable_method( sc_method_handle );
+ void push_runnable_thread( sc_thread_handle );
+
+ void push_runnable_method_front( sc_method_handle );
+ void push_runnable_thread_front( sc_thread_handle );
+
+ void remove_runnable_method( sc_method_handle );
+ void remove_runnable_thread( sc_thread_handle );
+
+ void requeue_current_process();
+ void suspend_current_process();
+
+ void do_sc_stop_action();
+ void mark_to_collect_process( sc_process_b* zombie_p );
+
+private:
+
+ enum execution_phases {
+ phase_initialize = 0,
+ phase_evaluate,
+ phase_update,
+ phase_notify
+ };
+ sc_object_manager* m_object_manager;
+
+ sc_module_registry* m_module_registry;
+ sc_port_registry* m_port_registry;
+ sc_export_registry* m_export_registry;
+ sc_prim_channel_registry* m_prim_channel_registry;
+ sc_phase_callback_registry* m_phase_cb_registry;
+
+ sc_name_gen* m_name_gen;
+
+ sc_process_table* m_process_table;
+ sc_curr_proc_info m_curr_proc_info;
+ sc_object* m_current_writer;
+ bool m_write_check;
+ int m_next_proc_id;
+
+ std::vector<sc_thread_handle> m_active_invokers;
+
+ std::vector<sc_event*> m_child_events;
+ std::vector<sc_object*> m_child_objects;
+
+ std::vector<sc_event*> m_delta_events;
+ sc_ppq<sc_event_timed*>* m_timed_events;
+
+ std::vector<sc_trace_file*> m_trace_files;
+ bool m_something_to_trace;
+
+ sc_runnable* m_runnable;
+ sc_process_list* m_collectable;
+
+ sc_time_params* m_time_params;
+ sc_time m_curr_time;
+ mutable sc_time m_max_time;
+
+ sc_invoke_method* m_method_invoker_p;
+ sc_dt::uint64 m_change_stamp; // "time" change occurred.
+ sc_dt::uint64 m_delta_count;
+ bool m_forced_stop;
+ bool m_paused;
+ bool m_ready_to_simulate;
+ bool m_elaboration_done;
+ execution_phases m_execution_phase;
+ sc_report* m_error;
+ bool m_in_simulator_control;
+ bool m_end_of_simulation_called;
+ sc_status m_simulation_status;
+ bool m_start_of_simulation_called;
+
+ sc_cor_pkg* m_cor_pkg; // the simcontext's coroutine package
+ sc_cor* m_cor; // the simcontext's coroutine
+
+private:
+
+ // disabled
+ sc_simcontext( const sc_simcontext& );
+ sc_simcontext& operator = ( const sc_simcontext& );
+};
+
+// IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
+
+// Not MT safe.
+
+#if 1
+extern sc_simcontext* sc_curr_simcontext;
+extern sc_simcontext* sc_default_global_context;
+
+inline sc_simcontext*
+sc_get_curr_simcontext()
+{
+ if( sc_curr_simcontext == 0 ) {
+ sc_default_global_context = new sc_simcontext;
+ sc_curr_simcontext = sc_default_global_context;
+ }
+ return sc_curr_simcontext;
+}
+#else
+ extern sc_simcontext* sc_get_curr_simcontext();
+#endif // 0
+inline sc_status sc_get_status()
+{
+ return sc_get_curr_simcontext()->get_status();
+}
+
+
+// IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
+
+inline
+bool
+sc_simcontext::elaboration_done() const
+{
+ return m_elaboration_done;
+}
+
+
+inline sc_status sc_simcontext::get_status() const
+{
+ return m_simulation_status != SC_RUNNING ?
+ m_simulation_status :
+ (m_in_simulator_control ? SC_RUNNING : SC_PAUSED);
+}
+
+inline
+int
+sc_simcontext::sim_status() const
+{
+ if( m_error ) {
+ return SC_SIM_ERROR;
+ }
+ if( m_forced_stop ) {
+ return SC_SIM_USER_STOP;
+ }
+ return SC_SIM_OK;
+}
+
+
+inline
+sc_object_manager*
+sc_simcontext::get_object_manager()
+{
+ return m_object_manager;
+}
+
+inline
+sc_module_registry*
+sc_simcontext::get_module_registry()
+{
+ return m_module_registry;
+}
+
+inline
+sc_port_registry*
+sc_simcontext::get_port_registry()
+{
+ return m_port_registry;
+}
+
+inline
+sc_export_registry*
+sc_simcontext::get_export_registry()
+{
+ return m_export_registry;
+}
+
+inline
+sc_prim_channel_registry*
+sc_simcontext::get_prim_channel_registry()
+{
+ return m_prim_channel_registry;
+}
+
+
+inline
+sc_curr_proc_handle
+sc_simcontext::get_curr_proc_info()
+{
+ return &m_curr_proc_info;
+}
+
+
+inline
+int
+sc_simcontext::next_proc_id()
+{
+ return ( ++ m_next_proc_id );
+}
+
+
+inline
+const sc_time&
+sc_simcontext::max_time() const
+{
+ if ( m_max_time == SC_ZERO_TIME )
+ {
+ m_max_time = sc_time::from_value( ~sc_dt::UINT64_ZERO );
+ }
+ return m_max_time;
+}
+
+inline
+sc_dt::uint64
+sc_simcontext::change_stamp() const
+{
+ return m_change_stamp;
+}
+
+inline
+const sc_time&
+sc_simcontext::time_stamp() const
+{
+ return m_curr_time;
+}
+
+
+inline
+bool
+sc_simcontext::event_occurred(sc_dt::uint64 last_change_stamp) const
+{
+ return m_change_stamp == last_change_stamp;
+}
+
+inline
+bool
+sc_simcontext::evaluation_phase() const
+{
+ return (m_execution_phase == phase_evaluate) &&
+ m_ready_to_simulate;
+}
+
+inline
+bool
+sc_simcontext::update_phase() const
+{
+ return m_execution_phase == phase_update;
+}
+
+inline
+bool
+sc_simcontext::notify_phase() const
+{
+ return m_execution_phase == phase_notify;
+}
+
+inline
+void
+sc_simcontext::set_error( sc_report* err )
+{
+ delete m_error;
+ m_error = err;
+}
+
+
+inline
+bool
+sc_simcontext::get_error()
+{
+ return m_error != NULL;
+}
+
+inline
+int
+sc_simcontext::add_delta_event( sc_event* e )
+{
+ m_delta_events.push_back( e );
+ return ( m_delta_events.size() - 1 );
+}
+
+inline
+void
+sc_simcontext::add_timed_event( sc_event_timed* et )
+{
+ m_timed_events->insert( et );
+}
+
+inline sc_object*
+sc_simcontext::get_current_writer() const
+{
+ return m_current_writer;
+}
+
+inline bool
+sc_simcontext::write_check() const
+{
+ return m_write_check;
+}
+
+// ----------------------------------------------------------------------------
+
+class sc_process_handle;
+sc_process_handle sc_get_current_process_handle();
+
+// Get the current object hierarchy context
+//
+// Returns a pointer the the sc_object (module or process) that
+// would become the parent object of a newly created element
+// of the SystemC object hierarchy, or NULL.
+//
+inline sc_object*
+sc_get_current_object()
+{
+ return sc_get_curr_simcontext()->active_object();
+}
+
+inline
+sc_process_b*
+sc_get_current_process_b()
+{
+ return sc_get_curr_simcontext()->get_curr_proc_info()->process_handle;
+}
+
+// THE FOLLOWING FUNCTION IS DEPRECATED IN 2.1
+extern sc_process_b* sc_get_curr_process_handle();
+
+inline
+sc_curr_proc_kind
+sc_get_curr_process_kind()
+{
+ return sc_get_curr_simcontext()->get_curr_proc_info()->kind;
+}
+
+
+inline int sc_get_simulator_status()
+{
+ return sc_get_curr_simcontext()->sim_status();
+}
+
+
+// Generates unique names within each module.
+extern
+const char*
+sc_gen_unique_name( const char* basename_, bool preserve_first = false );
+
+
+// Set the random seed for controlled randomization -- not yet implemented
+extern
+void
+sc_set_random_seed( unsigned int seed_ );
+
+
+extern void sc_initialize();
+
+extern const sc_time& sc_max_time(); // Get maximum time value.
+extern const sc_time& sc_time_stamp(); // Current simulation time.
+extern double sc_simulation_time(); // Current time in default time units.
+
+inline
+const std::vector<sc_event*>& sc_get_top_level_events(
+ const sc_simcontext* simc_p = sc_get_curr_simcontext() )
+{
+ return simc_p->m_child_events;
+}
+
+inline
+const std::vector<sc_object*>& sc_get_top_level_objects(
+ const sc_simcontext* simc_p = sc_get_curr_simcontext() )
+{
+ return simc_p->m_child_objects;
+}
+
+extern sc_event* sc_find_event( const char* name );
+
+extern sc_object* sc_find_object( const char* name );
+
+inline
+sc_dt::uint64 sc_delta_count()
+{
+ return sc_get_curr_simcontext()->m_delta_count;
+}
+
+inline
+bool sc_is_running( const sc_simcontext* simc_p = sc_get_curr_simcontext() )
+{
+ return simc_p->m_ready_to_simulate;
+}
+
+bool sc_is_unwinding();
+
+inline void sc_pause()
+{
+ sc_get_curr_simcontext()->m_paused = true;
+}
+
+// Return indication if there are more processes to execute in this delta phase
+
+inline bool sc_pending_activity_at_current_time
+ ( const sc_simcontext* simc_p = sc_get_curr_simcontext() )
+{
+ return simc_p->pending_activity_at_current_time();
+}
+
+// Return indication if there are timed notifications in the future
+
+inline bool sc_pending_activity_at_future_time
+ ( const sc_simcontext* simc_p = sc_get_curr_simcontext() )
+{
+ sc_time ignored;
+ return simc_p->next_time( ignored );
+}
+
+// Return indication if there are processes to run,
+// or notifications in the future
+
+inline bool sc_pending_activity
+ ( const sc_simcontext* simc_p = sc_get_curr_simcontext() )
+{
+ return sc_pending_activity_at_current_time( simc_p )
+ || sc_pending_activity_at_future_time( simc_p );
+}
+
+sc_time
+sc_time_to_pending_activity
+ ( const sc_simcontext* simc_p = sc_get_curr_simcontext() );
+
+
+inline
+bool
+sc_end_of_simulation_invoked()
+{
+ return sc_get_curr_simcontext()->m_end_of_simulation_called;
+}
+
+inline bool sc_hierarchical_name_exists( const char* name )
+{
+ return sc_find_object(name) || sc_find_event(name);
+}
+
+inline
+bool
+sc_start_of_simulation_invoked()
+{
+ return sc_get_curr_simcontext()->m_start_of_simulation_called;
+}
+
+// The following variable controls whether process control corners should
+// be considered errors or not. See sc_simcontext.cpp for details on what
+// happens if this value is set to true.
+
+extern bool sc_allow_process_control_corners;
+
+} // namespace sc_core
+
+/*****************************************************************************
+
+ MODIFICATION LOG - modifiers, enter your name, affiliation, date and
+ changes you are making here.
+
+ Name, Affiliation, Date: Andy Goodrich, Forte Design Systems 20 May 2003
+ Description of Modification: - phase callbacks
+ - sc_stop mode
+
+ Name, Affiliation, Date: Bishnupriya Bhattacharya, Cadence Design Systems,
+ 25 August, 2003
+ Description of Modification: - support for dynamic process
+ - support for sc export registry
+ - new member methods elaborate(),
+ prepare_to_simulate(), and initial_crunch()
+ that are invoked by initialize() in that order
+ - add sc_get_last_created_process_handle() for
+ use before simulation starts
+
+ Name, Affiliation, Date: Bishnupriya Bhattacharya, Cadence Design Systems,
+ 3 March, 2004
+ Description of Modification: add sc_get_curr_process_kind()
+
+ Name, Affiliation, Date:
+ Description of Modification:
+
+ *****************************************************************************/
+// $Log: sc_simcontext.h,v $
+// Revision 1.26 2011/09/05 21:20:22 acg
+// Andy Goodrich: result of automake invocation.
+//
+// Revision 1.25 2011/09/01 15:28:10 acg
+// Andy Goodrich: the aftermath of automake.
+//
+// Revision 1.24 2011/08/29 18:04:32 acg
+// Philipp A. Hartmann: miscellaneous clean ups.
+//
+// Revision 1.23 2011/08/26 20:46:10 acg
+// Andy Goodrich: moved the modification log to the end of the file to
+// eliminate source line number skew when check-ins are done.
+//
+// Revision 1.22 2011/08/24 22:05:51 acg
+// Torsten Maehne: initialization changes to remove warnings.
+//
+// Revision 1.21 2011/05/09 04:07:49 acg
+// Philipp A. Hartmann:
+// (1) Restore hierarchy in all phase callbacks.
+// (2) Ensure calls to before_end_of_elaboration.
+//
+// Revision 1.20 2011/04/08 18:26:07 acg
+// Andy Goodrich: added execute_method_next() to handle method dispatch
+// for asynchronous notifications that occur outside the evaluation phase.
+//
+// Revision 1.19 2011/04/05 20:50:57 acg
+// Andy Goodrich:
+// (1) changes to make sure that event(), posedge() and negedge() only
+// return true if the clock has not moved.
+// (2) fixes for method self-resumes.
+// (3) added SC_PRERELEASE_VERSION
+// (4) removed kernel events from the object hierarchy, added
+// sc_hierarchical_name_exists().
+//
+// Revision 1.18 2011/03/20 13:43:23 acg
+// Andy Goodrich: added async_signal_is() plus suspend() as a corner case.
+//
+// Revision 1.17 2011/03/07 18:25:19 acg
+// Andy Goodrich: tightening of check for resume on a disabled process to
+// only produce an error if it is ready to run.
+//
+// Revision 1.16 2011/03/06 15:58:50 acg
+// Andy Goodrich: added escape to turn off process control corner case
+// checks.
+//
+// Revision 1.15 2011/03/05 04:45:16 acg
+// Andy Goodrich: moved active process calculation to the sc_simcontext class.
+//
+// Revision 1.14 2011/03/05 01:39:21 acg
+// Andy Goodrich: changes for named events.
+//
+// Revision 1.13 2011/02/18 20:27:14 acg
+// Andy Goodrich: Updated Copyrights.
+//
+// Revision 1.12 2011/02/13 21:47:38 acg
+// Andy Goodrich: update copyright notice.
+//
+// Revision 1.11 2011/02/13 21:34:35 acg
+// Andy Goodrich: added SC_UNITIALIZED enum value to process status so
+// its possible to detect throws before initialization.
+//
+// Revision 1.10 2011/02/11 13:25:24 acg
+// Andy Goodrich: Philipp A. Hartmann's changes:
+// (1) Removal of SC_CTHREAD method overloads.
+// (2) New exception processing code.
+//
+// Revision 1.9 2011/02/01 21:18:56 acg
+// Andy Goodrich: addition of new preempt_with() method used to immediately
+// throw exceptions from threads.
+//
+// Revision 1.8 2011/01/25 20:50:37 acg
+// Andy Goodrich: changes for IEEE 1666 2011.
+//
+// Revision 1.7 2011/01/19 23:21:50 acg
+// Andy Goodrich: changes for IEEE 1666 2011
+//
+// Revision 1.6 2011/01/18 20:10:45 acg
+// Andy Goodrich: changes for IEEE1666_2011 semantics.
+//
+// Revision 1.5 2010/07/22 20:02:33 acg
+// Andy Goodrich: bug fixes.
+//
+// Revision 1.4 2009/05/22 16:06:29 acg
+// Andy Goodrich: process control updates.
+//
+// Revision 1.3 2008/05/22 17:06:26 acg
+// Andy Goodrich: updated copyright notice to include 2008.
+//
+// Revision 1.2 2007/09/20 20:32:35 acg
+// Andy Goodrich: changes to the semantics of throw_it() to match the
+// specification. A call to throw_it() will immediately suspend the calling
+// thread until all the throwees have executed. At that point the calling
+// thread will be restarted before the execution of any other threads.
+//
+// Revision 1.1.1.1 2006/12/15 20:20:05 acg
+// SystemC 2.3
+//
+// Revision 1.13 2006/05/08 18:00:06 acg
+// Andy Goodrich: added David Long's forward declarations for friend
+// functions, methods, and operators to keep the Microsoft compiler happy.
+//
+// Revision 1.11 2006/04/11 23:13:21 acg
+// Andy Goodrich: Changes for reduced reset support that only includes
+// sc_cthread, but has preliminary hooks for expanding to method and thread
+// processes also.
+//
+// Revision 1.10 2006/03/21 00:00:34 acg
+// Andy Goodrich: changed name of sc_get_current_process_base() to be
+// sc_get_current_process_b() since its returning an sc_process_b instance.
+//
+// Revision 1.9 2006/01/26 21:04:54 acg
+// Andy Goodrich: deprecation message changes and additional messages.
+//
+// Revision 1.8 2006/01/24 20:49:05 acg
+// Andy Goodrich: changes to remove the use of deprecated features within the
+// simulator, and to issue warning messages when deprecated features are used.
+//
+// Revision 1.7 2006/01/19 00:29:52 acg
+// Andy Goodrich: Yet another implementation for signal write checking. This
+// one uses an environment variable SC_SIGNAL_WRITE_CHECK, that when set to
+// DISABLE will disable write checking on signals.
+//
+// Revision 1.6 2006/01/18 21:42:37 acg
+// Andy Goodrich: Changes for check writer support.
+//
+// Revision 1.5 2006/01/13 18:44:30 acg
+// Added $Log to record CVS changes into the source.
+//
+// Revision 1.4 2006/01/03 23:18:44 acg
+// Changed copyright to include 2006.
+//
+// Revision 1.3 2005/12/20 22:11:10 acg
+// Fixed $Log lines.
+//
+// Revision 1.2 2005/12/20 22:02:30 acg
+// Changed where delta cycles are incremented to match IEEE 1666. Added the
+// event_occurred() method to hide how delta cycle comparisions are done within
+// sc_simcontext. Changed the boolean update_phase to an enum that shows all
+// the phases.
+
+#endif