16#ifndef SIMICS_SYSTEMC_IFACE_SIMICS_ADAPTER_H
17#define SIMICS_SYSTEMC_IFACE_SIMICS_ADAPTER_H
19#include <simics/iface/interface-info.h>
20#include <simics/devs/io-memory.h>
45template<
typename TSimicsInterface>
57 std::string
name()
const override {
60 const interface_t *
cstruct()
const override {
66 conf_class_ = conf_class;
79 template<
typename TBase,
typename TInterface>
81 FATAL_ERROR_IF(!obj,
"NULL object passed to Simics interface");
82 TBase *so = simics::from_obj<TBase>(obj);
83 TInterface *
adapter =
dynamic_cast<TInterface*
>(so);
84 FATAL_ERROR_IF(
adapter == NULL,
"Unable to locate GasketAdapter");
89 template<
typename TBase,
typename TInterface>
91 conf_object_t *obj_lock) {
93 if (obj_lock != cached_obj_lock_
94 || cached_obj_id_ != SIM_object_id(obj_lock)) {
95 ConfObject *lock_base =
96 simics::from_obj<ConfObject>(obj_lock);
98 if (simulation ==
nullptr) {
99 conf_object_t *parent = SIM_port_object_parent(obj_lock);
102 lock_base = simics::from_obj<ConfObject>(parent);
106 FATAL_ERROR_IF(simulation == NULL,
"Unable to locate Simulation");
107 cached_obj_lock_ = obj_lock;
108 cached_obj_id_ = SIM_object_id(obj_lock);
109 cached_simulation_ = simulation;
111 return {simulation, adapterWithoutLocking<TBase, TInterface>(obj)};
113 template<
typename TBase,
typename TInterface>
115 return adapter<TBase, TInterface>(obj, obj);
117 template<
typename TBase,
typename TInterface>
120 if (SIM_object_class(obj) != conf_class_ )
123 TInterface *iface = adapterWithoutLocking<TBase, TInterface>(obj);
128 std::vector<std::string> description =
adapter->description(type);
129 if (description.empty())
132 description.insert(description.begin(), name_);
133 description.insert(description.begin(), SIM_object_name(obj));
139 TSimicsInterface iface_;
140 conf_class_t *conf_class_;
145 static conf_object_t *cached_obj_lock_;
149 static std::string cached_obj_id_;
153template<
typename TSimicsInterface> conf_object_t*
154SimicsAdapter<TSimicsInterface>::cached_obj_lock_ =
nullptr;
155template<
typename TSimicsInterface> std::string
156SimicsAdapter<TSimicsInterface>::cached_obj_id_ =
"";
157template<
typename TSimicsInterface> SimulationInterface*
158SimicsAdapter<TSimicsInterface>::cached_simulation_ =
nullptr;
173template <
typename InterfaceSimicsAdapter>
175 static InterfaceSimicsAdapter adapter;
195 conf_class_t *conf_class_;
197 Binder binder{conf_class};
Definition: description_interface.h:34
Definition: registry.h:89
static Registry< T > * instance()
Definition: registry.h:70
Definition: simics_lock.h:27
Definition: simics_adapter_interface.h:29
virtual void set_map_adapter(bool map)=0
virtual void set_simics_class(conf_class_t *conf_class)=0
virtual bool map_adapter() const =0
Base class for mapping Simics interface to a C++ interface.
Definition: simics_adapter.h:47
static TInterface * adapterWithoutLocking(conf_object_t *obj)
Definition: simics_adapter.h:80
const interface_t * cstruct() const override
Definition: simics_adapter.h:60
void set_map_adapter(bool map) override
Definition: simics_adapter.h:71
conf_class_t * simics_class() const override
Definition: simics_adapter.h:68
static SimicsLock< TInterface > adapter(conf_object_t *obj)
Definition: simics_adapter.h:114
SimicsAdapter(const char *name, TSimicsInterface iface)
Definition: simics_adapter.h:49
std::vector< std::string > descriptionBase(conf_object_t *obj, DescriptionType type)
Definition: simics_adapter.h:118
static SimicsLock< TInterface > adapter(conf_object_t *obj, conf_object_t *obj_lock)
Definition: simics_adapter.h:90
void set_simics_class(conf_class_t *conf_class) override
Definition: simics_adapter.h:64
std::string name() const override
Definition: simics_adapter.h:57
bool map_adapter() const override
Definition: simics_adapter.h:74
Interface to the SystemC simulation.
Definition: simulation_interface.h:27
void bindUnmappedSimicsAdapters(conf_class_t *conf_class)
Bind all adapters that are still pending mapping to a conf_class.
Definition: simics_adapter.h:186
InterfaceSimicsAdapter & createAdapter()
Create a SimicsAdapter that can be registered with a ConfClass.
Definition: simics_adapter.h:174
DescriptionType
Definition: description_interface.h:25