14#ifndef SIMICS_SYSTEMC_IFACE_SIMICS_ADAPTER_H
15#define SIMICS_SYSTEMC_IFACE_SIMICS_ADAPTER_H
17#include <simics/iface/interface-info.h>
18#include <simics/devs/io-memory.h>
43template<
typename TSimicsInterface>
55 std::string
name()
const override {
58 const interface_t *
cstruct()
const override {
64 conf_class_ = conf_class;
77 template<
typename TBase,
typename TInterface>
79 FATAL_ERROR_IF(!obj,
"NULL object passed to Simics interface");
80 TBase *so = simics::from_obj<TBase>(obj);
81 TInterface *
adapter =
dynamic_cast<TInterface*
>(so);
82 FATAL_ERROR_IF(
adapter == NULL,
"Unable to locate GasketAdapter");
87 template<
typename TBase,
typename TInterface>
89 conf_object_t *obj_lock) {
92 ConfObject *lock_base = simics::from_obj<ConfObject>(obj_lock);
94 if (lock_base != cached_lock_base_) {
96 if (simulation ==
nullptr) {
97 conf_object_t *parent = SIM_port_object_parent(obj_lock);
100 lock_base = simics::from_obj<ConfObject>(parent);
104 FATAL_ERROR_IF(simulation == NULL,
"Unable to locate Simulation");
105 cached_lock_base_ = lock_base;
106 cached_simulation_ = simulation;
108 return {simulation, adapterWithoutLocking<TBase, TInterface>(obj)};
110 template<
typename TBase,
typename TInterface>
112 return adapter<TBase, TInterface>(obj, obj);
114 template<
typename TBase,
typename TInterface>
117 if (SIM_object_class(obj) != conf_class_ )
120 TInterface *iface = adapterWithoutLocking<TBase, TInterface>(obj);
125 std::vector<std::string> description =
adapter->description(type);
126 if (description.empty())
129 description.insert(description.begin(), name_);
130 description.insert(description.begin(), SIM_object_name(obj));
136 TSimicsInterface iface_;
137 conf_class_t *conf_class_;
147 static ConfObject *cached_lock_base_;
153template<
typename TSimicsInterface> ConfObject*
154SimicsAdapter<TSimicsInterface>::cached_lock_base_ =
nullptr;
155template<
typename TSimicsInterface> SimulationInterface*
156SimicsAdapter<TSimicsInterface>::cached_simulation_ =
nullptr;
171template <
typename InterfaceSimicsAdapter>
173 static InterfaceSimicsAdapter adapter;
193 conf_class_t *conf_class_;
195 Binder binder{conf_class};
Definition: description_interface.h:32
Definition: registry.h:86
static Registry< T > * instance()
Definition: registry.h:67
Definition: simics_lock.h:25
Definition: simics_adapter_interface.h:27
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:45
static TInterface * adapterWithoutLocking(conf_object_t *obj)
Definition: simics_adapter.h:78
const interface_t * cstruct() const override
Definition: simics_adapter.h:58
void set_map_adapter(bool map) override
Definition: simics_adapter.h:69
conf_class_t * simics_class() const override
Definition: simics_adapter.h:66
static SimicsLock< TInterface > adapter(conf_object_t *obj)
Definition: simics_adapter.h:111
SimicsAdapter(const char *name, TSimicsInterface iface)
Definition: simics_adapter.h:47
std::vector< std::string > descriptionBase(conf_object_t *obj, DescriptionType type)
Definition: simics_adapter.h:115
static SimicsLock< TInterface > adapter(conf_object_t *obj, conf_object_t *obj_lock)
Definition: simics_adapter.h:88
void set_simics_class(conf_class_t *conf_class) override
Definition: simics_adapter.h:62
std::string name() const override
Definition: simics_adapter.h:55
bool map_adapter() const override
Definition: simics_adapter.h:72
Interface to the SystemC simulation.
Definition: simulation_interface.h:25
void bindUnmappedSimicsAdapters(conf_class_t *conf_class)
Bind all adapters that are still pending mapping to a conf_class.
Definition: simics_adapter.h:184
InterfaceSimicsAdapter & createAdapter()
Create a SimicsAdapter that can be registered with a ConfClass.
Definition: simics_adapter.h:172
DescriptionType
Definition: description_interface.h:23