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/*
2 © 2013 Intel Corporation
3
4 This software and the related documents are Intel copyrighted materials, and
5 your use of them is governed by the express license under which they were
6 provided to you ("License"). Unless the License provides otherwise, you may
7 not use, modify, copy, publish, distribute, disclose or transmit this software
8 or the related documents without Intel's prior written permission.
9
10 This software and the related documents are provided as is, with no express or
11 implied warranties, other than those that are expressly stated in the License.
12*/
13
14#ifndef SIMICS_SYSTEMC_ADAPTER_H
15#define SIMICS_SYSTEMC_ADAPTER_H
16
17#include <systemc>
18
19#include <simics/conf-object.h>
38
39#if INTC_EXT && USE_SIMICS_CHECKPOINTING
43#endif
44
63
64#include <systemc-kernel__compiler-version-check.h>
65#include <systemc-library__compiler-version-check.h>
66#include <systemc-library__kernel-version-check.h>
67
68#if INTC_EXT && USE_SIMICS_CCI
69#include <cci/utils/broker.h>
70#endif
71
72#include <string>
73#include <vector>
74#include <memory>
75#include <map>
76#include <type_traits>
77#include <utility> // pair
78
79namespace simics {
80namespace systemc {
81
88class AdapterBase : public ConfObject,
89 public Simulation,
90 public SimContext,
93 public Version,
94 public GasketInfo {
95 public:
97 explicit AdapterBase(ConfObjectRef o);
98 virtual ~AdapterBase();
99
107 virtual void elaborate() {}
108
116
125 virtual void bindGaskets() {}
126
138 void finalize() override;
139 void objects_finalized() override;
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
184
185 const char *const log_groups[] = {
186 "Scheduling",
187 "TLM",
188 "Configuration",
189 "Awareness",
190 "Other",
191 NULL };
192
193 SIM_log_register_groups(cls, log_groups);
194
195 conf_class_t *clock = SIM_get_class("clock-extension");
196 if (SIM_clear_exception() != SimExc_No_Exception) {
197 FATAL_ERROR("Adapter::initClass: %s", SIM_last_error());
198 }
199 SIM_extend_class(cls, clock);
200
201 SIM_register_notifier(cls, Sim_Notify_Frequency_Change, NULL);
202
203 conf_class_t *co_execute = SIM_get_class("co-execute");
204 if (SIM_clear_exception() != SimExc_No_Exception) {
205 FATAL_ERROR("Adapter::initClass: %s", SIM_last_error());
206 }
207 // TODO(ah): change name in Simics 8 ; must not break compatibility in 7
208 SIM_register_port(cls, "engine", co_execute,
209 "co-execute helper object");
210 }
211
213 static SimulationInterface &simulation_from_conf_obj(conf_object_t *obj);
214
217 return &proxy_builder_;
218 }
219
222 return &internal_;
223 }
224
225#if INTC_EXT
227 static awareness::TlmSpyFactoryRegistry *spy_factory_registry() {
228 static awareness::TlmSpyFactoryRegistry registry;
229 return &registry;
230 }
231#endif
232
233 std::vector<simics::ConfObjectRef> gaskets_;
234
236 virtual void deinit();
237
238 protected:
243
244 private:
246 bool allowUnconnectedPorts() const;
247 void setAllowUnconnectedPorts(const bool &val);
248 bool createProxyObjects() const;
249 void setCreateProxyObjects(const bool &val);
250 void set_argv(const std::vector<std::string> &val);
251 std::vector<std::string> get_argv() const;
252 void set_cci_preset_values(
253 const std::vector<std::pair<std::string, std::string>> &attr);
254 simics::ConfObjectRef get_same_cell_as() const;
255
256 conf_object_t *createObject(conf_class_t *cls,
257 std::string full_name);
258 void createGaskets(const std::vector<simics::ConfObjectRef> &objs);
259 void finalizeSimulation();
260
261 static void initOnce();
262 static void initScAttributes(ConfClass *conf_class);
263
264 bool allow_unconnected_ports_;
265 bool create_proxy_objects_;
266 bool defer_end_of_elaboration_;
267 bool skip_gasket_binding_check_;
268#if INTC_EXT
269 LateBinder late_binder_;
270#endif
271 static awareness::ProxyBuilder proxy_builder_;
272 std::map<sc_core::sc_object *, awareness::ProxyInterface *> links_;
273 awareness::Attributes attributes_;
274 conf_object_t *dynamic_events_object_;
275 conf_object_t *dynamic_processes_object_;
276 StateHandler *state_handler_;
277 void *dbg_library_;
278 ScSignalAccess signal_access_;
279 GasketTag gasket_tag_;
280 Internal internal_;
281#if INTC_EXT
282 awareness::TlmSpyFactoryRegistry spy_factory_registry_;
283#endif
284#if INTC_EXT && USE_SIMICS_CCI
285 cci_utils::broker broker_;
286 conf_object_t *cci_global_;
287#endif
288};
289
291 public:
293
294 template <typename C>
295 static void initClassInternal(ConfClass *conf_class) {
296 AdapterBase::initClassInternal<C>(conf_class);
297#ifdef MODULE_NAME
299#ifdef REGISTER_SYSTEMC_GASKET_CLASSES
301#endif
302#endif
303 }
304};
305
306#if INTC_EXT && USE_SIMICS_CHECKPOINTING
307class AdapterCheckpointable : public AdapterBase, public Checkpoint {
308 public:
309 explicit AdapterCheckpointable(ConfObjectRef o);
310
311 template <typename C>
312 static void initClassInternal(ConfClass *conf_class) {
313 static iface::CheckpointSimicsAdapter<C> checkpoint_simics_adapter;
314 conf_class->add(checkpoint_simics_adapter);
315 static iface::TemporalStateSimicsAdapter<C> temporal_simics_adapter;
316 conf_class->add(temporal_simics_adapter);
317 AdapterBase::initClassInternal<C>(conf_class);
318 conf_class->add(Attribute("sc_state", "[s*]",
319 "When this attribute is set the SystemC "
320 "state is restored from disk",
321 ATTR_GETTER(AdapterCheckpointable,
322 systemcState),
323 ATTR_SETTER(AdapterCheckpointable,
324 setSystemcState)));
325#ifdef MODULE_NAME
327#ifdef REGISTER_SYSTEMC_GASKET_CLASSES
328 simics::systemc::initGasketClassesCheckpointable(MODULE_NAME);
329#endif
330#endif
331 }
332
333 void finalize() override;
334 void objects_finalized() override;
335};
336using Adapter = AdapterCheckpointable;
337#else
339#endif
340
341} // namespace systemc
342} // namespace simics
343
344#endif
Entry point for creating a Simics conf-object that adapts a SystemC model to Simics,...
Definition: adapter.h:94
virtual void elaborate()
Override this method to elaborate the SystemC hierarchy.
Definition: adapter.h:107
static SimulationInterface & simulation_from_conf_obj(conf_object_t *obj)
AdapterBase(ConfObjectRef o)
AdapterBase * is_systemc_adapter
Definition: adapter.h:96
std::vector< simics::ConfObjectRef > gaskets_
Definition: adapter.h:233
void objects_finalized() override
virtual void bindGaskets()
Override this method to bind Simics interfaces to SystemC after elaboration.
Definition: adapter.h:125
virtual void tagGaskets(simics::systemc::GasketTagInterface *gasket_tag)
Override this method to create tag based gaskets.
Definition: adapter.h:115
bool isEndOfElaborationDeferred() const
InternalInterface * internal()
Definition: adapter.h:221
static awareness::ProxyBuilder * proxy_builder()
Definition: adapter.h:216
void finalize() override
Called during the finalize phase.
static void initClassInternal(ConfClass *conf_class)
Definition: adapter.h:142
void setDeferEndOfElaboration(bool val)
static void initClassInternal(ConfClass *conf_class)
Definition: adapter.h:295
Definition: gasket_info.h:27
This interface provides the means to create gaskets encapsulated in Simics objects.
Definition: gasket_tag.h:31
Definition: gasket_tag.h:66
Definition: internal_interface.h:23
Definition: internal.h:25
static void set_module_name(const char *module_name)
Definition: process_profiler_control.h:23
Definition: sc_memory_profiler_control.h:22
Definition: sc_signal_access.h:22
Provides the interface to the SystemC simulation context.
Definition: simcontext.h:28
Provides the interface to the SystemC kernel.
Definition: simulation.h:52
Definition: state_handler.h:24
Definition: version.h:41
Definition: attributes.h:26
Definition: proxy_builder.h:48
Adapter for concurrency mode interface.
Definition: concurrency_group_simics_adapter.h:32
Adapter for concurrency mode interface.
Definition: concurrency_mode_simics_adapter.h:31
Definition: event_delta_simics_adapter.h:41
Adapter for concurrency group interface.
Definition: execute_control_simics_adapter.h:31
Definition: execute_simics_adapter.h:30
Definition: frequency_simics_adapter.h:30
Definition: register_view_simics_adapter.h:32
Definition: sc_gasket_info_simics_adapter.h:34
Definition: sc_memory_profiler_control_simics_adapter.h:31
Definition: sc_process_profiler_control_simics_adapter.h:33
Definition: sc_version_simics_adapter.h:33
Adapter for Simics simulation context interface.
Definition: simcontext_simics_adapter.h:32
void bindUnmappedSimicsAdapters(conf_class_t *conf_class)
Bind all adapters that are still pending mapping to a conf_class.
Definition: simics_adapter.h:184
conf_class_t * SIM_get_class(const char *NOTNULL name)
AdapterNonCheckpointable Adapter
Definition: adapter.h:338
void initGasketClasses(const char *module_name)
Definition: adapter.h:79