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
184 struct Invoker {
185 bool operator()(iface::SimicsAdapterInterface* adapter) {
186 if (adapter->map_adapter()) {
187 adapter->set_map_adapter(false);
188 adapter->set_simics_class(cls);
189 }
190 return false;
191 }
192 conf_class_t *cls;
193 };
194
195 Invoker invoker{cls};
197
198 const char *const log_groups[] = {
199 "Scheduling",
200 "TLM",
201 "Configuration",
202 "Awareness",
203 "Other",
204 NULL };
205
206 SIM_log_register_groups(cls, log_groups);
207
208 conf_class_t *clock = SIM_get_class("clock-extension");
209 if (SIM_clear_exception() != SimExc_No_Exception) {
210 FATAL_ERROR("Adapter::initClass: %s", SIM_last_error());
211 }
212 SIM_extend_class(cls, clock);
213
214 SIM_register_notifier(cls, Sim_Notify_Frequency_Change, NULL);
215
216 conf_class_t *co_execute = SIM_get_class("co-execute");
217 if (SIM_clear_exception() != SimExc_No_Exception) {
218 FATAL_ERROR("Adapter::initClass: %s", SIM_last_error());
219 }
220 // TODO(ah): change name in Simics 8 ; must not break compatibility in 7
221 SIM_register_port(cls, "engine", co_execute,
222 "co-execute helper object");
223 }
224
226 static SimulationInterface &simulation_from_conf_obj(conf_object_t *obj);
227
230 return &proxy_builder_;
231 }
232
235 return &internal_;
236 }
237
238#if INTC_EXT
240 static awareness::TlmSpyFactoryRegistry *spy_factory_registry() {
241 static awareness::TlmSpyFactoryRegistry registry;
242 return &registry;
243 }
244#endif
245
246 std::vector<simics::ConfObjectRef> gaskets_;
247
249 virtual void deinit();
250
251 private:
253 bool allowUnconnectedPorts() const;
254 void setAllowUnconnectedPorts(const bool &val);
255 bool createProxyObjects() const;
256 void setCreateProxyObjects(const bool &val);
257 void set_argv(const std::vector<std::string> &val);
258 std::vector<std::string> get_argv() const;
259 void set_cci_preset_values(
260 const std::vector<std::pair<std::string, std::string>> &attr);
261 simics::ConfObjectRef get_same_cell_as() const;
262
263 conf_object_t *createObject(conf_class_t *cls,
264 std::string full_name);
265 void createGaskets(const std::vector<simics::ConfObjectRef> &objs);
266
267 static void initOnce();
268 static void initScAttributes(ConfClass *conf_class);
269
270 bool allow_unconnected_ports_;
271 bool create_proxy_objects_;
272#if INTC_EXT
273 LateBinder late_binder_;
274#endif
275 static awareness::ProxyBuilder proxy_builder_;
276 std::map<sc_core::sc_object *, awareness::ProxyInterface *> links_;
277 awareness::Attributes attributes_;
278 conf_object_t *dynamic_events_object_;
279 conf_object_t *dynamic_processes_object_;
280 StateHandler *state_handler_;
281 void *dbg_library_;
282 ScSignalAccess signal_access_;
283 GasketTag gasket_tag_;
284 Internal internal_;
285#if INTC_EXT
286 awareness::TlmSpyFactoryRegistry spy_factory_registry_;
287#endif
288#if INTC_EXT && USE_SIMICS_CCI
289 cci_utils::broker broker_;
290 conf_object_t *cci_global_;
291#endif
292};
293
295 public:
297
298 template <typename C>
299 static void initClassInternal(ConfClass *conf_class) {
300 AdapterBase::initClassInternal<C>(conf_class);
301#ifdef MODULE_NAME
303#ifdef REGISTER_SYSTEMC_GASKET_CLASSES
305#endif
306#endif
307 }
308};
309
310#if INTC_EXT && USE_SIMICS_CHECKPOINTING
311class AdapterCheckpointable : public AdapterBase, public Checkpoint {
312 public:
313 explicit AdapterCheckpointable(ConfObjectRef o);
314
315 template <typename C>
316 static void initClassInternal(ConfClass *conf_class) {
317 static iface::CheckpointSimicsAdapter<C> checkpoint_simics_adapter;
318 conf_class->add(checkpoint_simics_adapter);
319 static iface::TemporalStateSimicsAdapter<C> temporal_simics_adapter;
320 conf_class->add(temporal_simics_adapter);
321 AdapterBase::initClassInternal<C>(conf_class);
322 conf_class->add(Attribute("sc_state", "[s*]",
323 "When this attribute is set the SystemC "
324 "state is restored from disk",
325 ATTR_GETTER(AdapterCheckpointable,
326 systemcState),
327 ATTR_SETTER(AdapterCheckpointable,
328 setSystemcState)));
329#ifdef MODULE_NAME
331#ifdef REGISTER_SYSTEMC_GASKET_CLASSES
332 simics::systemc::initGasketClassesCheckpointable(MODULE_NAME);
333#endif
334#endif
335 }
336
337 virtual void finalize();
338};
339using Adapter = AdapterCheckpointable;
340#else
342#endif
343
344} // namespace systemc
345} // namespace simics
346
347#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:246
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:234
static awareness::ProxyBuilder * proxy_builder()
Definition: adapter.h:229
static void initClassInternal(ConfClass *conf_class)
Definition: adapter.h:143
static void initClassInternal(ConfClass *conf_class)
Definition: adapter.h:299
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:70
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:341
void initGasketClasses(const char *module_name)
Definition: adapter.h:81