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__compiler-version-check.h>
68#include <systemc-library__kernel-version-check.h>
69
70#if INTC_EXT && USE_SIMICS_CCI
71#include <cci/utils/broker.h>
72#endif
73
74#include <string>
75#include <vector>
76#include <memory>
77#include <map>
78#include <type_traits>
79#include <utility> // pair
80
81namespace simics {
82namespace systemc {
83
90class AdapterBase : public ConfObject,
91 public Simulation,
92 public SimContext,
95 public Version,
96 public GasketInfo {
97 public:
99 explicit AdapterBase(ConfObjectRef o);
100 virtual ~AdapterBase();
101
109 virtual void elaborate() {}
110
118
127 virtual void bindGaskets() {}
128
140 virtual void finalize();
141
142 template <typename C>
143 static void initClassInternal(ConfClass *conf_class) {
144 static iface::SimContextSimicsAdapter<C> simcontext_simics_adapter;
145 conf_class->add(simcontext_simics_adapter);
147 memory_profiler_control_simics_adapter;
148 conf_class->add(memory_profiler_control_simics_adapter);
150 ppc_simics_adapter;
151 conf_class->add(ppc_simics_adapter);
152 static iface::ScVersionSimicsAdapter<C> version_simics_adapter;
153 conf_class->add(version_simics_adapter);
154 static iface::EventDeltaSimicsAdapter<C> event_delta_simics_adapter;
155 conf_class->add(event_delta_simics_adapter);
156 static iface::ExecuteSimicsAdapter<C> execute_simics_adapter;
157 conf_class->add(execute_simics_adapter);
158 static iface::FrequencySimicsAdapter<C> frequency_simics_adapter;
159 conf_class->add(frequency_simics_adapter);
161 concurrency_group_simics_adapter;
162 conf_class->add(concurrency_group_simics_adapter);
164 concurrency_mode_simics_adapter;
165 conf_class->add(concurrency_mode_simics_adapter);
167 execute_control_simics_adapter;
168 conf_class->add(execute_control_simics_adapter);
169 static iface::ScGasketInfoSimicsAdapter<C> gasket_info_simics_adapter;
170 conf_class->add(gasket_info_simics_adapter);
171
172 if ((std::is_base_of<simics2tlm::IoMemoryGasketAdapter, C>::value ||
173 std::is_base_of<simics2tlm::TransactionGasketAdapter, C>::value) &&
174 std::is_base_of<iface::RegisterViewInterface, C>::value) {
176 register_view_simics_adapter;
177 conf_class->add(register_view_simics_adapter);
178 }
179
180 initOnce();
181 initScAttributes(conf_class);
182 conf_class_t *cls = *conf_class;
183
185
186 const char *const log_groups[] = {
187 "Scheduling",
188 "TLM",
189 "Configuration",
190 "Awareness",
191 "Other",
192 NULL };
193
194 SIM_log_register_groups(cls, log_groups);
195
196 conf_class_t *clock = SIM_get_class("clock-extension");
197 if (SIM_clear_exception() != SimExc_No_Exception) {
198 FATAL_ERROR("Adapter::initClass: %s", SIM_last_error());
199 }
200 SIM_extend_class(cls, clock);
201
202 SIM_register_notifier(cls, Sim_Notify_Frequency_Change, NULL);
203
204 conf_class_t *co_execute = SIM_get_class("co-execute");
205 if (SIM_clear_exception() != SimExc_No_Exception) {
206 FATAL_ERROR("Adapter::initClass: %s", SIM_last_error());
207 }
208 // TODO(ah): change name in Simics 8 ; must not break compatibility in 7
209 SIM_register_port(cls, "engine", co_execute,
210 "co-execute helper object");
211 }
212
214 static SimulationInterface &simulation_from_conf_obj(conf_object_t *obj);
215
218 return &proxy_builder_;
219 }
220
223 return &internal_;
224 }
225
226#if INTC_EXT
228 static awareness::TlmSpyFactoryRegistry *spy_factory_registry() {
229 static awareness::TlmSpyFactoryRegistry registry;
230 return &registry;
231 }
232#endif
233
234 std::vector<simics::ConfObjectRef> gaskets_;
235
237 virtual void deinit();
238
239 private:
241 bool allowUnconnectedPorts() const;
242 void setAllowUnconnectedPorts(const bool &val);
243 bool createProxyObjects() const;
244 void setCreateProxyObjects(const bool &val);
245 void set_argv(const std::vector<std::string> &val);
246 std::vector<std::string> get_argv() const;
247 void set_cci_preset_values(
248 const std::vector<std::pair<std::string, std::string>> &attr);
249 simics::ConfObjectRef get_same_cell_as() const;
250
251 conf_object_t *createObject(conf_class_t *cls,
252 std::string full_name);
253 void createGaskets(const std::vector<simics::ConfObjectRef> &objs);
254
255 static void initOnce();
256 static void initScAttributes(ConfClass *conf_class);
257
258 bool allow_unconnected_ports_;
259 bool create_proxy_objects_;
260#if INTC_EXT
261 LateBinder late_binder_;
262#endif
263 static awareness::ProxyBuilder proxy_builder_;
264 std::map<sc_core::sc_object *, awareness::ProxyInterface *> links_;
265 awareness::Attributes attributes_;
266 conf_object_t *dynamic_events_object_;
267 conf_object_t *dynamic_processes_object_;
268 StateHandler *state_handler_;
269 void *dbg_library_;
270 ScSignalAccess signal_access_;
271 GasketTag gasket_tag_;
272 Internal internal_;
273#if INTC_EXT
274 awareness::TlmSpyFactoryRegistry spy_factory_registry_;
275#endif
276#if INTC_EXT && USE_SIMICS_CCI
277 cci_utils::broker broker_;
278 conf_object_t *cci_global_;
279#endif
280};
281
283 public:
285
286 template <typename C>
287 static void initClassInternal(ConfClass *conf_class) {
288 AdapterBase::initClassInternal<C>(conf_class);
289#ifdef MODULE_NAME
291#ifdef REGISTER_SYSTEMC_GASKET_CLASSES
293#endif
294#endif
295 }
296};
297
298#if INTC_EXT && USE_SIMICS_CHECKPOINTING
299class AdapterCheckpointable : public AdapterBase, public Checkpoint {
300 public:
301 explicit AdapterCheckpointable(ConfObjectRef o);
302
303 template <typename C>
304 static void initClassInternal(ConfClass *conf_class) {
305 static iface::CheckpointSimicsAdapter<C> checkpoint_simics_adapter;
306 conf_class->add(checkpoint_simics_adapter);
307 static iface::TemporalStateSimicsAdapter<C> temporal_simics_adapter;
308 conf_class->add(temporal_simics_adapter);
309 AdapterBase::initClassInternal<C>(conf_class);
310 conf_class->add(Attribute("sc_state", "[s*]",
311 "When this attribute is set the SystemC "
312 "state is restored from disk",
313 ATTR_GETTER(AdapterCheckpointable,
314 systemcState),
315 ATTR_SETTER(AdapterCheckpointable,
316 setSystemcState)));
317#ifdef MODULE_NAME
319#ifdef REGISTER_SYSTEMC_GASKET_CLASSES
320 simics::systemc::initGasketClassesCheckpointable(MODULE_NAME);
321#endif
322#endif
323 }
324
325 virtual void finalize();
326};
327using Adapter = AdapterCheckpointable;
328#else
330#endif
331
332} // namespace systemc
333} // namespace simics
334
335#endif
Entry point for creating a Simics conf-object that adapts a SystemC model to Simics,...
Definition: adapter.h:96
virtual void elaborate()
Override this method to elaborate the SystemC hierarchy.
Definition: adapter.h:109
static SimulationInterface & simulation_from_conf_obj(conf_object_t *obj)
AdapterBase(ConfObjectRef o)
AdapterBase * is_systemc_adapter
Definition: adapter.h:98
std::vector< simics::ConfObjectRef > gaskets_
Definition: adapter.h:234
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:127
virtual void tagGaskets(simics::systemc::GasketTagInterface *gasket_tag)
Override this method to create tag based gaskets.
Definition: adapter.h:117
InternalInterface * internal()
Definition: adapter.h:222
static awareness::ProxyBuilder * proxy_builder()
Definition: adapter.h:217
static void initClassInternal(ConfClass *conf_class)
Definition: adapter.h:143
static void initClassInternal(ConfClass *conf_class)
Definition: adapter.h:287
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
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:34
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
void bindUnmappedSimicsAdapters(conf_class_t *conf_class)
Bind all adapters that are still pending mapping to a conf_class.
Definition: simics_adapter.h:186
conf_class_t * SIM_get_class(const char *NOTNULL name)
AdapterNonCheckpointable Adapter
Definition: adapter.h:329
void initGasketClasses(const char *module_name)
Definition: adapter.h:81