| /***************************************************************************** | |
| 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 |