14#ifndef SIMICS_SYSTEMC_ADAPTER_H
15#define SIMICS_SYSTEMC_ADAPTER_H
19#include <simics/conf-object.h>
39#if INTC_EXT && USE_SIMICS_CHECKPOINTING
64#include <systemc-kernel__compiler-version-check.h>
65#include <systemc-library__compiler-version-check.h>
66#include <systemc-library__kernel-version-check.h>
68#if INTC_EXT && USE_SIMICS_CCI
69#include <cci/utils/broker.h>
141 template <
typename C>
144 conf_class->add(simcontext_simics_adapter);
146 memory_profiler_control_simics_adapter;
147 conf_class->add(memory_profiler_control_simics_adapter);
150 conf_class->add(ppc_simics_adapter);
152 conf_class->add(version_simics_adapter);
154 conf_class->add(event_delta_simics_adapter);
156 conf_class->add(execute_simics_adapter);
158 conf_class->add(frequency_simics_adapter);
160 concurrency_group_simics_adapter;
161 conf_class->add(concurrency_group_simics_adapter);
163 concurrency_mode_simics_adapter;
164 conf_class->add(concurrency_mode_simics_adapter);
166 execute_control_simics_adapter;
167 conf_class->add(execute_control_simics_adapter);
169 conf_class->add(gasket_info_simics_adapter);
171 if ((std::is_base_of<simics2tlm::IoMemoryGasketAdapter, C>::value ||
172 std::is_base_of<simics2tlm::TransactionGasketAdapter, C>::value) &&
173 std::is_base_of<iface::RegisterViewInterface, C>::value) {
175 register_view_simics_adapter;
176 conf_class->add(register_view_simics_adapter);
180 initScAttributes(conf_class);
181 conf_class_t *cls = *conf_class;
185 const char *
const log_groups[] = {
193 SIM_log_register_groups(cls, log_groups);
196 if (SIM_clear_exception() != SimExc_No_Exception) {
197 FATAL_ERROR(
"Adapter::initClass: %s", SIM_last_error());
199 SIM_extend_class(cls, clock);
201 SIM_register_notifier(cls, Sim_Notify_Frequency_Change, NULL);
204 if (SIM_clear_exception() != SimExc_No_Exception) {
205 FATAL_ERROR(
"Adapter::initClass: %s", SIM_last_error());
208 SIM_register_port(cls,
"engine", co_execute,
209 "co-execute helper object");
217 return &proxy_builder_;
227 static awareness::TlmSpyFactoryRegistry *spy_factory_registry() {
228 static awareness::TlmSpyFactoryRegistry registry;
246 bool allowUnconnectedPorts()
const;
247 void setAllowUnconnectedPorts(
const bool &val);
248 bool createProxyObjects()
const;
249 void setCreateProxyObjects(
const bool &val);
250 void set_argv(
const std::vector<std::string> &val);
251 std::vector<std::string> get_argv()
const;
252 void set_cci_preset_values(
253 const std::vector<std::pair<std::string, std::string>> &attr);
254 simics::ConfObjectRef get_same_cell_as()
const;
256 conf_object_t *createObject(conf_class_t *cls,
257 std::string full_name);
258 void createGaskets(
const std::vector<simics::ConfObjectRef> &objs);
259 void finalizeSimulation();
261 static void initOnce();
262 static void initScAttributes(ConfClass *conf_class);
264 bool allow_unconnected_ports_;
265 bool create_proxy_objects_;
266 bool defer_end_of_elaboration_;
267 bool skip_gasket_binding_check_;
269 LateBinder late_binder_;
272 std::map<sc_core::sc_object *, awareness::ProxyInterface *> links_;
274 conf_object_t *dynamic_events_object_;
275 conf_object_t *dynamic_processes_object_;
282 awareness::TlmSpyFactoryRegistry spy_factory_registry_;
284#if INTC_EXT && USE_SIMICS_CCI
285 cci_utils::broker broker_;
286 conf_object_t *cci_global_;
294 template <
typename C>
296 AdapterBase::initClassInternal<C>(conf_class);
299#ifdef REGISTER_SYSTEMC_GASKET_CLASSES
306#if INTC_EXT && USE_SIMICS_CHECKPOINTING
307class AdapterCheckpointable :
public AdapterBase,
public Checkpoint {
309 explicit AdapterCheckpointable(ConfObjectRef o);
311 template <
typename C>
312 static void initClassInternal(ConfClass *conf_class) {
313 static iface::CheckpointSimicsAdapter<C> checkpoint_simics_adapter;
314 conf_class->add(checkpoint_simics_adapter);
315 static iface::TemporalStateSimicsAdapter<C> temporal_simics_adapter;
316 conf_class->add(temporal_simics_adapter);
317 AdapterBase::initClassInternal<C>(conf_class);
318 conf_class->add(Attribute(
"sc_state",
"[s*]",
319 "When this attribute is set the SystemC "
320 "state is restored from disk",
321 ATTR_GETTER(AdapterCheckpointable,
323 ATTR_SETTER(AdapterCheckpointable,
327#ifdef REGISTER_SYSTEMC_GASKET_CLASSES
328 simics::systemc::initGasketClassesCheckpointable(MODULE_NAME);
333 void finalize()
override;
334 void objects_finalized()
override;
336using Adapter = AdapterCheckpointable;
Entry point for creating a Simics conf-object that adapts a SystemC model to Simics,...
Definition: adapter.h:94
virtual void elaborate()
Override this method to elaborate the SystemC hierarchy.
Definition: adapter.h:107
static SimulationInterface & simulation_from_conf_obj(conf_object_t *obj)
AdapterBase(ConfObjectRef o)
AdapterBase * is_systemc_adapter
Definition: adapter.h:96
std::vector< simics::ConfObjectRef > gaskets_
Definition: adapter.h:233
void objects_finalized() override
virtual void bindGaskets()
Override this method to bind Simics interfaces to SystemC after elaboration.
Definition: adapter.h:125
virtual void tagGaskets(simics::systemc::GasketTagInterface *gasket_tag)
Override this method to create tag based gaskets.
Definition: adapter.h:115
bool isEndOfElaborationDeferred() const
InternalInterface * internal()
Definition: adapter.h:221
static awareness::ProxyBuilder * proxy_builder()
Definition: adapter.h:216
void finalize() override
Called during the finalize phase.
static void initClassInternal(ConfClass *conf_class)
Definition: adapter.h:142
void setDeferEndOfElaboration(bool val)
Definition: adapter.h:290
static void initClassInternal(ConfClass *conf_class)
Definition: adapter.h:295
Definition: gasket_info.h:27
This interface provides the means to create gaskets encapsulated in Simics objects.
Definition: gasket_tag.h:31
Definition: gasket_tag.h:66
Definition: internal_interface.h:23
Definition: internal.h:25
static void set_module_name(const char *module_name)
Definition: process_profiler_control.h:23
Definition: sc_memory_profiler_control.h:22
Definition: sc_signal_access.h:22
Provides the interface to the SystemC simulation context.
Definition: simcontext.h:28
Provides the interface to the SystemC kernel.
Definition: simulation.h:52
Definition: state_handler.h:24
Definition: attributes.h:26
Definition: proxy_builder.h:48
Adapter for concurrency mode interface.
Definition: concurrency_group_simics_adapter.h:32
Adapter for concurrency mode interface.
Definition: concurrency_mode_simics_adapter.h:31
Definition: event_delta_simics_adapter.h:41
Adapter for concurrency group interface.
Definition: execute_control_simics_adapter.h:31
Definition: execute_simics_adapter.h:30
Definition: frequency_simics_adapter.h:30
Definition: register_view_simics_adapter.h:32
Definition: sc_gasket_info_simics_adapter.h:34
Definition: sc_memory_profiler_control_simics_adapter.h:31
Definition: sc_process_profiler_control_simics_adapter.h:33
Definition: sc_version_simics_adapter.h:33
Adapter for Simics simulation context interface.
Definition: simcontext_simics_adapter.h:32
void bindUnmappedSimicsAdapters(conf_class_t *conf_class)
Bind all adapters that are still pending mapping to a conf_class.
Definition: simics_adapter.h:184
conf_class_t * SIM_get_class(const char *NOTNULL name)
AdapterNonCheckpointable Adapter
Definition: adapter.h:338
void initGasketClasses(const char *module_name)