SystemC Library API Reference Manual
Reference documentation for the Simics SystemC Library.
 
Loading...
Searching...
No Matches
adapter.h
Go to the documentation of this file.
1// -*- mode: C++; c-file-style: "virtutech-c++" -*-
2
3/*
4 © 2013 Intel Corporation
5
6 This software and the related documents are Intel copyrighted materials, and
7 your use of them is governed by the express license under which they were
8 provided to you ("License"). Unless the License provides otherwise, you may
9 not use, modify, copy, publish, distribute, disclose or transmit this software
10 or the related documents without Intel's prior written permission.
11
12 This software and the related documents are provided as is, with no express or
13 implied warranties, other than those that are expressly stated in the License.
14*/
15
16#ifndef SIMICS_SYSTEMC_ADAPTER_H
17#define SIMICS_SYSTEMC_ADAPTER_H
18
19#include <systemc>
20
21#include <simics/conf-object.h>
40
41#if INTC_EXT && USE_SIMICS_CHECKPOINTING
45#endif
46
65
66#include <systemc-kernel-compiler-version-check.h>
67#include <systemc-library-version-checks.h>
68
69#if INTC_EXT && USE_SIMICS_CCI
70#include <cci_utils/broker.h>
71#endif
72
73#include <string>
74#include <vector>
75#include <memory>
76#include <map>
77#include <type_traits>
78#include <utility> // pair
79
80namespace simics {
81namespace systemc {
82
89class AdapterBase : public ConfObject,
90 public Simulation,
91 public SimContext,
94 public Version,
95 public GasketInfo {
96 public:
98 explicit AdapterBase(ConfObjectRef o);
99 virtual ~AdapterBase();
100
108 virtual void elaborate() {}
109
117
126 virtual void bindGaskets() {}
127
139 virtual void finalize();
140
141 template <typename C>
142 static void initClassInternal(ConfClass *conf_class) {
143 static iface::SimContextSimicsAdapter<C> simcontext_simics_adapter;
144 conf_class->add(simcontext_simics_adapter);
146 memory_profiler_control_simics_adapter;
147 conf_class->add(memory_profiler_control_simics_adapter);
149 ppc_simics_adapter;
150 conf_class->add(ppc_simics_adapter);
151 static iface::ScVersionSimicsAdapter<C> version_simics_adapter;
152 conf_class->add(version_simics_adapter);
153 static iface::EventDeltaSimicsAdapter<C> event_delta_simics_adapter;
154 conf_class->add(event_delta_simics_adapter);
155 static iface::ExecuteSimicsAdapter<C> execute_simics_adapter;
156 conf_class->add(execute_simics_adapter);
157 static iface::FrequencySimicsAdapter<C> frequency_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);
168 static iface::ScGasketInfoSimicsAdapter<C> gasket_info_simics_adapter;
169 conf_class->add(gasket_info_simics_adapter);
170
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);
177 }
178
179 initOnce();
180 initScAttributes(conf_class);
181 conf_class_t *cls = *conf_class;
182
183 struct Invoker {
184 bool operator()(iface::SimicsAdapterInterface* adapter) {
185 if (adapter->map_adapter()) {
186 adapter->set_map_adapter(false);
187 adapter->set_simics_class(cls);
188 }
189 return false;
190 }
191 conf_class_t *cls;
192 };
193
194 Invoker invoker{cls};
196
197 const char *const log_groups[] = {
198 "Scheduling",
199 "TLM",
200 "Configuration",
201 "Awareness",
202 "Other",
203 NULL };
204
205 SIM_log_register_groups(cls, log_groups);
206
207 conf_class_t *clock = SIM_get_class("clock-extension");
208 if (SIM_clear_exception() != SimExc_No_Exception) {
209 FATAL_ERROR("Adapter::initClass: %s", SIM_last_error());
210 }
211 SIM_extend_class(cls, clock);
212
213 SIM_register_notifier(cls, Sim_Notify_Frequency_Change, NULL);
214
215 conf_class_t *co_execute = SIM_get_class("co-execute");
216 if (SIM_clear_exception() != SimExc_No_Exception) {
217 FATAL_ERROR("Adapter::initClass: %s", SIM_last_error());
218 }
219 // TODO(ah): change name in Simics 8 ; must not break compatibility in 7
220 SIM_register_port(cls, "engine", co_execute,
221 "co-execute helper object");
222 }
223
225 static SimulationInterface &simulation_from_conf_obj(conf_object_t *obj);
226
229 return &proxy_builder_;
230 }
231
234 return &internal_;
235 }
236
237#if INTC_EXT
239 static awareness::TlmSpyFactoryRegistry *spy_factory_registry() {
240 static awareness::TlmSpyFactoryRegistry registry;
241 return &registry;
242 }
243#endif
244
245 std::vector<simics::ConfObjectRef> gaskets_;
246
248 virtual void deinit();
249
250 private:
252 bool allowUnconnectedPorts() const;
253 void setAllowUnconnectedPorts(const bool &val);
254 bool createProxyObjects() const;
255 void setCreateProxyObjects(const bool &val);
256 void set_argv(const std::vector<std::string> &val);
257 std::vector<std::string> get_argv() const;
258 void set_cci_preset_values(
259 const std::vector<std::pair<std::string, std::string>> &attr);
260 simics::ConfObjectRef get_same_cell_as() const;
261
262 conf_object_t *createObject(conf_class_t *cls,
263 std::string full_name);
264 void createGaskets(const std::vector<simics::ConfObjectRef> &objs);
265
266 static void initOnce();
267 static void initScAttributes(ConfClass *conf_class);
268
269 bool allow_unconnected_ports_;
270 bool create_proxy_objects_;
271#if INTC_EXT
272 LateBinder late_binder_;
273#endif
274 static awareness::ProxyBuilder proxy_builder_;
275 std::map<sc_core::sc_object *, awareness::ProxyInterface *> links_;
276 awareness::Attributes attributes_;
277 conf_object_t *dynamic_events_object_;
278 conf_object_t *dynamic_processes_object_;
279 StateHandler *state_handler_;
280 void *dbg_library_;
281 ScSignalAccess signal_access_;
282 GasketTag gasket_tag_;
283 Internal internal_;
284#if INTC_EXT
285 awareness::TlmSpyFactoryRegistry spy_factory_registry_;
286#endif
287#if INTC_EXT && USE_SIMICS_CCI
288 cci_utils::broker broker_;
289 conf_object_t *cci_global_;
290#endif
291};
292
294 public:
296
297 template <typename C>
298 static void initClassInternal(ConfClass *conf_class) {
299 AdapterBase::initClassInternal<C>(conf_class);
300#ifdef MODULE_NAME
302#ifdef REGISTER_SYSTEMC_GASKET_CLASSES
304#endif
305#endif
306 }
307};
308
309#if INTC_EXT && USE_SIMICS_CHECKPOINTING
310class AdapterCheckpointable : public AdapterBase, public Checkpoint {
311 public:
312 explicit AdapterCheckpointable(ConfObjectRef o);
313
314 template <typename C>
315 static void initClassInternal(ConfClass *conf_class) {
316 static iface::CheckpointSimicsAdapter<C> checkpoint_simics_adapter;
317 conf_class->add(checkpoint_simics_adapter);
318 static iface::TemporalStateSimicsAdapter<C> temporal_simics_adapter;
319 conf_class->add(temporal_simics_adapter);
320 AdapterBase::initClassInternal<C>(conf_class);
321 conf_class->add(Attribute("sc_state", "[s*]",
322 "When this attribute is set the SystemC "
323 "state is restored from disk",
324 ATTR_GETTER(AdapterCheckpointable,
325 systemcState),
326 ATTR_SETTER(AdapterCheckpointable,
327 setSystemcState)));
328#ifdef MODULE_NAME
330#ifdef REGISTER_SYSTEMC_GASKET_CLASSES
331 simics::systemc::initGasketClassesCheckpointable(MODULE_NAME);
332#endif
333#endif
334 }
335
336 virtual void finalize();
337};
338using Adapter = AdapterCheckpointable;
339#else
341#endif
342
343} // namespace systemc
344} // namespace simics
345
346#endif
Entry point for creating a Simics conf-object that adapts a SystemC model to Simics,...
Definition: adapter.h:95
virtual void elaborate()
Override this method to elaborate the SystemC hierarchy.
Definition: adapter.h:108
static SimulationInterface & simulation_from_conf_obj(conf_object_t *obj)
AdapterBase(ConfObjectRef o)
AdapterBase * is_systemc_adapter
Definition: adapter.h:97
std::vector< simics::ConfObjectRef > gaskets_
Definition: adapter.h:245
virtual void finalize()
Called during the finalize phase.
virtual void bindGaskets()
Override this method to bind Simics interfaces to SystemC after elaboration.
Definition: adapter.h:126
virtual void tagGaskets(simics::systemc::GasketTagInterface *gasket_tag)
Override this method to create tag based gaskets.
Definition: adapter.h:116
InternalInterface * internal()
Definition: adapter.h:233
static awareness::ProxyBuilder * proxy_builder()
Definition: adapter.h:228
static void initClassInternal(ConfClass *conf_class)
Definition: adapter.h:142
static void initClassInternal(ConfClass *conf_class)
Definition: adapter.h:298
Definition: gasket_info.h:29
This interface provides the means to create gaskets encapsulated in Simics objects.
Definition: gasket_tag.h:33
Definition: gasket_tag.h:68
Definition: internal_interface.h:25
Definition: internal.h:27
static void set_module_name(const char *module_name)
Definition: process_profiler_control.h:25
static Registry< T > * instance()
Definition: registry.h:69
Definition: sc_memory_profiler_control.h:24
Definition: sc_signal_access.h:24
Provides the interface to the SystemC simulation context.
Definition: simcontext.h:30
Provides the interface to the SystemC kernel.
Definition: simulation.h:54
Definition: state_handler.h:26
Definition: version.h:43
Definition: attributes.h:28
Definition: proxy_builder.h:50
Adapter for concurrency mode interface.
Definition: concurrency_group_simics_adapter.h:33
Adapter for concurrency mode interface.
Definition: concurrency_mode_simics_adapter.h:33
Definition: event_delta_simics_adapter.h:32
Adapter for concurrency group interface.
Definition: execute_control_simics_adapter.h:33
Definition: execute_simics_adapter.h:32
Definition: frequency_simics_adapter.h:32
Definition: register_view_simics_adapter.h:34
Definition: sc_gasket_info_simics_adapter.h:36
Definition: sc_memory_profiler_control_simics_adapter.h:33
Definition: sc_process_profiler_control_simics_adapter.h:35
Definition: sc_version_simics_adapter.h:35
Adapter for Simics simulation context interface.
Definition: simcontext_simics_adapter.h:34
Definition: simics_adapter_interface.h:29
virtual void set_simics_class(conf_class_t *conf_class)=0
conf_class_t * SIM_get_class(const char *NOTNULL name)
AdapterNonCheckpointable Adapter
Definition: adapter.h:340
void initGasketClasses(const char *module_name)
Definition: adapter.h:80