28 #ifndef SC_SIMCONTEXT_H
29 #define SC_SIMCONTEXT_H
46 class sc_export_registry;
49 class sc_module_registry;
52 class sc_object_manager;
53 class sc_phase_callback_registry;
54 class sc_process_handle;
55 class sc_port_registry;
56 class sc_prim_channel_registry;
57 class sc_process_table;
58 class sc_signal_bool_deval;
61 class sc_process_host;
62 class sc_method_process;
63 class sc_cthread_process;
64 class sc_thread_process;
91 extern void sc_start(
const sc_time& duration,
111 const sc_simcontext* simc_p);
113 const sc_simcontext* simc_p);
127 struct sc_invoke_method;
206 bool preserve_first =
false
252 {
return m_cor_pkg; }
267 void remove_child_event(
sc_event* );
270 void crunch(
bool once=
false );
273 void remove_delta_event(
sc_event* );
276 void trace_cycle(
bool delta_cycle );
278 const ::std::vector<sc_event*>& get_child_events_internal()
const;
279 const ::std::vector<sc_object*>& get_child_objects_internal()
const;
299 void requeue_current_process();
300 void suspend_current_process();
302 void do_sc_stop_action();
307 enum execution_phases {
308 phase_initialize = 0,
313 sc_object_manager* m_object_manager;
315 sc_module_registry* m_module_registry;
316 sc_port_registry* m_port_registry;
317 sc_export_registry* m_export_registry;
318 sc_prim_channel_registry* m_prim_channel_registry;
321 sc_name_gen* m_name_gen;
323 sc_process_table* m_process_table;
324 sc_curr_proc_info m_curr_proc_info;
329 std::vector<sc_thread_handle> m_active_invokers;
331 std::vector<sc_event*> m_child_events;
332 std::vector<sc_object*> m_child_objects;
334 std::vector<sc_event*> m_delta_events;
335 sc_ppq<sc_event_timed*>* m_timed_events;
337 std::vector<sc_trace_file*> m_trace_files;
338 bool m_something_to_trace;
340 sc_runnable* m_runnable;
343 sc_time_params* m_time_params;
352 bool m_ready_to_simulate;
353 bool m_elaboration_done;
354 execution_phases m_execution_phase;
356 bool m_in_simulator_control;
357 bool m_end_of_simulation_called;
359 bool m_start_of_simulation_called;
361 sc_cor_pkg* m_cor_pkg;
379 inline sc_simcontext*
403 return m_elaboration_done;
410 m_simulation_status :
421 if( m_forced_stop ) {
432 return m_object_manager;
439 return m_module_registry;
446 return m_port_registry;
453 return m_export_registry;
460 return m_prim_channel_registry;
468 return &m_curr_proc_info;
476 return ( ++ m_next_proc_id );
495 return m_change_stamp;
510 return m_change_stamp == last_change_stamp;
517 return (m_execution_phase == phase_evaluate) &&
525 return m_execution_phase == phase_update;
532 return m_execution_phase == phase_notify;
548 return m_error != NULL;
553 sc_simcontext::add_delta_event(
sc_event* e )
555 m_delta_events.push_back( e );
556 return ( m_delta_events.size() - 1 );
561 sc_simcontext::add_timed_event( sc_event_timed* et )
563 m_timed_events->insert( et );
569 return m_current_writer;
575 return m_write_check;
641 return simc_p->m_child_events;
648 return simc_p->m_child_objects;
664 return simc_p->m_ready_to_simulate;
679 return simc_p->pending_activity_at_current_time();
688 return simc_p->next_time( ignored );
bool pending_activity_at_current_time() const
sc_simcontext * sc_curr_simcontext
sc_object * sc_find_object(const char *name)
const char * gen_unique_name(const char *basename_, bool preserve_first=false)
void add_trace_file(sc_trace_file *)
friend void sc_start(const sc_time &, sc_starvation_policy)
sc_time sc_time_to_pending_activity(const sc_simcontext *)
sc_module * hierarchy_pop()
bool elaboration_done() const
friend bool sc_start_of_simulation_invoked()
int sc_get_simulator_status()
bool next_time(sc_time &t) const
sc_object * sc_get_current_object()
const sc_time & sc_max_time()
friend sc_time sc_get_default_time_unit()
bool sc_allow_process_control_corners
sc_dt::uint64 delta_count() const
sc_stop_mode sc_get_stop_mode()
sc_prim_channel_registry * get_prim_channel_registry()
friend sc_time sc_time_to_pending_activity(const sc_simcontext *)
bool update_phase() const
sc_dt::uint64 change_stamp() const
void initialize(bool=false)
friend struct sc_invoke_method
friend bool sc_end_of_simulation_invoked()
sc_event * sc_find_event(const char *name)
bool notify_phase() const
void(sc_process_host::* SC_ENTRY_FUNC)()
void sc_set_random_seed(unsigned int seed_)
static sc_time from_value(value_type)
bool sc_pending_activity_at_future_time(const sc_simcontext *)
friend bool sc_pending_activity_at_future_time(const sc_simcontext *)
sc_status get_status() const
sc_object_manager * get_object_manager()
sc_process_b sc_process_b
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)
void simulate(const sc_time &duration)
sc_curr_proc_kind sc_get_curr_process_kind()
void set_error(sc_report *)
sc_process_b * sc_get_current_process_b()
bool sc_is_running(const sc_simcontext *simc_p)
sc_curr_proc_handle get_curr_proc_info()
sc_simcontext * sc_get_curr_simcontext()
class sc_thread_process * sc_thread_handle
sc_object * get_current_writer() const
friend const std::vector< sc_event * > & sc_get_top_level_events(const sc_simcontext *simc_p)
const std::vector< sc_event * > & sc_get_top_level_events(const sc_simcontext *simc_p)
void hierarchy_push(sc_module *)
const std::vector< sc_object * > & sc_get_top_level_objects(const sc_simcontext *simc_p)
sc_module_registry * get_module_registry()
sc_module * hierarchy_curr() const
const int SC_SIM_USER_STOP
friend bool sc_pending_activity_at_current_time(const sc_simcontext *)
bool event_occurred(sc_dt::uint64 last_change_count) const
friend sc_dt::uint64 sc_delta_count()
friend void sc_thread_cor_fn(void *)
const sc_time & max_time() const
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)
const sc_time & time_stamp() const
const char * sc_gen_unique_name(const char *, bool preserve_first)
sc_object * next_object()
void set_curr_proc(sc_process_b *)
bool sc_hierarchical_name_exists(const char *name)
bool sc_end_of_simulation_invoked()
bool evaluation_phase() const
sc_object * active_object()
double sc_simulation_time()
const sc_curr_proc_info * sc_curr_proc_handle
void remove_trace_file(sc_trace_file *)
void initial_crunch(bool no_crunch)
friend const std::vector< sc_object * > & sc_get_top_level_objects(const sc_simcontext *simc_p)
sc_port_registry * get_port_registry()
friend void sc_set_time_resolution(double, sc_time_unit)
sc_dt::uint64 sc_delta_count()
void sc_set_stop_mode(sc_stop_mode mode)
sc_process_b * process_handle
const sc_time SC_ZERO_TIME
sc_status sc_get_status()
friend bool sc_is_running(const sc_simcontext *simc_p)
sc_time sc_get_time_resolution()
sc_simcontext * sc_default_global_context
sc_process_handle sc_get_current_process_handle()
void cycle(const sc_time &)
void sc_set_time_resolution(double, sc_time_unit)
sc_export_registry * get_export_registry()
const ::std::vector< sc_object * > & get_child_objects() const
class sc_method_process * sc_method_handle
sc_process_b * sc_get_curr_process_handle()
bool sc_pending_activity(const sc_simcontext *simc_p=sc_get_curr_simcontext())
const sc_time & sc_time_stamp()
void sc_set_default_time_unit(double, sc_time_unit)
bool sc_pending_activity_at_current_time(const sc_simcontext *)
sc_time sc_get_default_time_unit()
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)
friend sc_time sc_get_time_resolution()
bool sc_start_of_simulation_invoked()
void prepare_to_simulate()
friend class sc_phase_callback_registry
sc_plist< sc_process_b * > sc_process_list
sc_object * first_object()
std::vector< sc_thread_handle > & get_active_invokers()
friend void sc_set_default_time_unit(double, sc_time_unit)
sc_object * find_object(const char *name)