30#ifndef SC_SIMCONTEXT_H
31#define SC_SIMCONTEXT_H
43#if defined(_MSC_VER) && !defined(SC_WIN_DLL_WARN)
45#pragma warning(disable: 4251)
56class sc_export_registry;
57class sc_hierarchy_scope;
58class sc_initializer_function;
61class sc_module_registry;
65class sc_object_manager;
66class sc_stage_callback_registry;
67class sc_process_handle;
68class sc_port_registry;
69class sc_prim_channel_registry;
70class sc_process_table;
71class sc_signal_bool_deval;
75class sc_method_process;
76class sc_cthread_process;
77class sc_thread_process;
79class sc_stub_registry;
83template<
typename >
class sc_plist;
150class sc_invoke_method;
169 friend class sc_invoke_method;
208 enum sc_signal_write_check
210 SC_SIGNAL_WRITE_CHECK_DISABLE_ = 0x0,
211 SC_SIGNAL_WRITE_CHECK_DEFAULT_ = 0x1,
212 SC_SIGNAL_WRITE_CHECK_CONFLICT_ = 0x2
231 int sim_status()
const;
232 bool elaboration_done()
const;
234 std::vector<sc_thread_handle>& get_active_invokers();
258 const std::string& name);
260 const std::string& name);
262 const std::string& name);
264 const std::string& name);
266 const std::string& name);
270 bool preserve_first =
false
288 bool write_check()
const;
289 bool write_check_conflicts_only()
const;
291 void reset_curr_proc();
300 const sc_time& max_time()
const;
301 const sc_time& time_stamp()
const;
306 bool event_occurred(
sc_dt::uint64 last_change_count )
const;
307 bool evaluation_phase()
const;
309 bool update_phase()
const;
310 bool notify_phase()
const;
315 {
return m_cor_pkg; }
340 void remove_child_event(
sc_event* );
343 void crunch(
bool once=
false );
346 void remove_delta_event(
sc_event* );
349 void trace_cycle(
bool delta_cycle );
369 void requeue_current_process();
370 void suspend_current_process();
372 void do_sc_stop_action();
373 void do_timestep(
const sc_time& );
375 void do_collect_processes();
380 inline void set_simulation_status(
sc_status status);
384 enum execution_phases {
385 phase_initialize = 0,
401 sc_process_table* m_process_table;
404 sc_signal_write_check m_write_check;
407 std::vector<sc_thread_handle> m_active_invokers;
409 std::vector<sc_event*> m_child_events;
410 std::vector<sc_object*> m_child_objects;
412 std::vector<sc_event*> m_delta_events;
417 std::vector<sc_trace_file*> m_trace_files;
418 bool m_something_to_trace;
427 sc_invoke_method* m_method_invoker_p;
433 bool m_ready_to_simulate;
434 bool m_elaboration_done;
435 execution_phases m_execution_phase;
437 bool m_in_simulator_control;
438 bool m_end_of_simulation_called;
442 bool m_start_of_simulation_called;
501 return m_elaboration_done;
520 m_simulation_status :
536 if( m_forced_stop ) {
547 return m_object_manager;
554 return m_module_registry;
561 return m_port_registry;
568 return m_export_registry;
575 return m_prim_channel_registry;
582 return m_stage_cb_registry;
589 return m_stub_registry;
596 return &m_curr_proc_info;
604 return ( ++ m_next_proc_id );
623 return m_change_stamp;
629 return m_delta_count - m_initial_delta_count_at_current_time;
644 return m_change_stamp == last_change_stamp;
651 return (m_execution_phase == phase_evaluate) &&
659 return m_execution_phase == phase_update;
666 return m_execution_phase == phase_notify;
682 return m_error != NULL;
687sc_simcontext::add_delta_event(
sc_event* e )
689 m_delta_events.push_back( e );
690 return static_cast<int>( m_delta_events.size() - 1 );
695sc_simcontext::add_timed_event( sc_event_timed* et )
697 m_timed_events->insert( et );
705 return m_current_writer;
708inline void sc_simcontext::set_simulation_status(
sc_status status)
711 m_simulation_status = status;
718 return m_write_check != SC_SIGNAL_WRITE_CHECK_DISABLE_;
784 return simc_p->m_child_events;
791 return simc_p->m_child_objects;
813 static bool stop_assert_issued =
false;
815 if ( ( !stop_assert_issued ) &&
816 ( simc_p->m_ready_to_simulate != lrm_assert_condition_section_4_6_7_sc_is_running )
818 stop_assert_issued =
true;
819 sc_assert( simc_p->m_ready_to_simulate == lrm_assert_condition_section_4_6_7_sc_is_running );
821 return simc_p->m_ready_to_simulate;
836 return simc_p->pending_activity_at_current_time();
845 return simc_p->next_time( ignored );
879 result = active_p->
name();
957#if defined(_MSC_VER) && !defined(SC_WIN_DLL_WARN)
SC_API bool sc_start_of_simulation_invoked()
int sc_get_simulator_status()
SC_API const sc_time & sc_max_time()
SC_API sc_dt::uint64 sc_delta_count()
class SC_API sc_simcontext
SC_API bool sc_allow_process_control_corners
const int SC_SIM_USER_STOP
bool sc_unregister_hierarchical_name(const char *name)
class sc_method_process * sc_method_handle
sc_status sc_get_status()
SC_API sc_time sc_time_to_pending_activity(const sc_simcontext *)
SC_API const char * sc_gen_unique_name(const char *, bool preserve_first)
const char * sc_get_hierarchical_name(const char *name)
SC_API bool sc_end_of_simulation_invoked()
SC_API bool sc_pending_activity_at_future_time(const sc_simcontext *)
SC_API sc_process_b * sc_get_curr_process_handle()
SC_API sc_stop_mode sc_get_stop_mode()
SC_API void sc_unsuspend_all()
SC_API sc_simcontext * sc_default_global_context
SC_API bool sc_is_unwinding()
SC_API void sc_set_time_resolution(double, sc_time_unit)
SC_API const sc_time & sc_time_stamp()
class sc_thread_process * sc_thread_handle
SC_API void sc_initialize()
const char * sc_get_current_process_name(const char *if_empty=NULL)
SC_API double sc_simulation_time()
class SC_API sc_trace_file
const sc_curr_proc_info * sc_curr_proc_handle
SC_API sc_time sc_get_default_time_unit()
sc_curr_proc_kind sc_get_curr_process_kind()
sc_simcontext * sc_get_curr_simcontext()
SC_API void sc_set_stop_mode(sc_stop_mode mode)
SC_API void sc_unsuspendable()
SC_API const std::vector< sc_object * > & sc_get_top_level_objects(const sc_simcontext *simc_p)
SC_API sc_process_handle sc_get_current_process_handle()
SC_API sc_event * sc_find_event(const char *name)
void(sc_process_host::* sc_entry_func)()
SC_API const std::vector< sc_event * > & sc_get_top_level_events(const sc_simcontext *simc_p)
bool sc_hierarchical_name_exists(const char *name)
SC_API const sc_time SC_ZERO_TIME
SC_API sc_dt::uint64 sc_delta_count_at_current_time()
SC_API bool sc_is_running(const sc_simcontext *simc_p)
bool sc_pending_activity(const sc_simcontext *simc_p=sc_get_curr_simcontext())
SC_API void sc_register_stage_callback(sc_stage_callback_if &cb, unsigned int mask)
SC_API void sc_set_default_time_unit(double, sc_time_unit)
sc_process_b * sc_get_current_process_b()
bool sc_register_hierarchical_name(const char *name)
SC_API bool sc_pending_activity_at_current_time(const sc_simcontext *)
SC_API void sc_suspendable()
sc_object * sc_get_current_object()
class SC_API sc_object_host
SC_API sc_object * sc_find_object(const char *name)
SC_API sc_time sc_get_time_resolution()
sc_plist< sc_process_b * > sc_process_list
SC_API void sc_unregister_stage_callback(sc_stage_callback_if &cb, unsigned int mask)
SC_API void sc_suspend_all()
SC_API void sc_set_random_seed(unsigned int seed_)
SC_API sc_simcontext * sc_curr_simcontext
unsigned long long uint64
constexpr uint64 UINT64_ZERO
const char * name() const
sc_process_b * process_handle
sc_export_registry * get_export_registry()
friend SC_API void sc_suspend_all()
friend SC_API void sc_start(const sc_time &, sc_starvation_policy)
bool pending_activity_at_current_time() const
void simulate(const sc_time &duration)
friend SC_API sc_time sc_get_default_time_unit()
sc_object_host * active_object()
const char * gen_unique_name(const char *basename_, bool preserve_first=false)
const ::std::vector< sc_object * > & get_child_objects() const
friend SC_API sc_time sc_get_time_resolution()
sc_dt::uint64 change_stamp() const
void add_reset_finder(sc_reset_finder *)
friend SC_API void sc_unsuspendable()
bool notify_phase() const
void prepare_to_simulate()
friend void sc_thread_cor_fn(void *)
bool next_time(sc_time &t) const
friend SC_API void sc_register_stage_callback(sc_stage_callback_if &cb, unsigned int mask)
bool evaluation_phase() const
const char * get_hierarchical_name(const sc_object *parent, const std::string &name)
friend SC_API void sc_suspendable()
void initial_crunch(bool no_crunch)
std::string construct_hierarchical_name(const sc_object *parent, const std::string &name)
bool event_occurred(sc_dt::uint64 last_change_count) const
sc_object * next_object()
const sc_time & max_time() const
sc_object_manager * get_object_manager()
friend SC_API void sc_unregister_stage_callback(sc_stage_callback_if &cb, unsigned int mask)
sc_status get_status() const
sc_curr_proc_handle get_curr_proc_info()
sc_status get_thread_safe_status()
bool unregister_hierarchical_name(const sc_object *parent, const std::string &name)
void set_error(sc_report *)
friend SC_API void sc_set_default_time_unit(double, sc_time_unit)
bool update_phase() const
sc_stage_callback_registry * get_stage_cb_registry()
void post_suspend() const
void initialize(bool=false)
friend SC_API sc_time sc_time_to_pending_activity(const sc_simcontext *)
void cycle(const sc_time &)
friend SC_API void sc_unsuspend_all()
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_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_process_b * get_current_writer() const
bool hierarchical_name_exists(const sc_object *parent, const std::string &name)
const sc_time & time_stamp() const
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_stage get_stage() const
bool register_hierarchical_name(const sc_object *parent, const std::string &name)
sc_dt::uint64 delta_count() const
bool elaboration_done() const
sc_object * find_object(const char *name)
sc_object * first_object()
sc_port_registry * get_port_registry()
sc_module_registry * get_module_registry()
sc_stub_registry * get_stub_registry()
sc_dt::uint64 delta_count_at_current_time() const
sc_prim_channel_registry * get_prim_channel_registry()
friend SC_API void sc_set_time_resolution(double, sc_time_unit)
static sc_time from_value(value_type)