SystemC Library API Reference Manual
Reference documentation for the Simics SystemC Library.
 
Loading...
Searching...
No Matches
proxy_socket.h
Go to the documentation of this file.
1// -*- mode: C++; c-file-style: "virtutech-c++" -*-
2
3/*
4 © 2015 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_AWARENESS_PROXY_SOCKET_H
17#define SIMICS_SYSTEMC_AWARENESS_PROXY_SOCKET_H
18
19#include <tlm>
20#include <tlm_utils/multi_socket_bases.h>
21
34#include <deque>
35#include <map>
36#include <string>
37#include <utility>
38#include <vector>
39
40namespace simics {
41namespace systemc {
42namespace awareness {
43
44template <typename TYPES>
46 : public Proxy,
48 public ScExportConnection,
49 public ScPortConnection,
52
53 public:
54 typedef TYPES types;
55
56 explicit ProxySocketBase(simics::ConfObjectRef o)
57 : Proxy(o), ToolController(this), base_socket_(NULL), base_bw_(NULL),
59 multi_initiator_(nullptr), multi_target_(nullptr) {}
60 void init(sc_core::sc_object *obj,
61 SimulationInterface *simulation) override {
65 base_socket_ = dynamic_cast<tlm::tlm_base_socket_if *>(obj);
66 if (base_socket_ == nullptr) {
67 if (obj && simulation) {
68 SIM_LOG_CRITICAL(simulation->simics_object(), Log_Awareness,
69 "SystemC object '%s' does not implement"
70 " tlm::tlm_base_socket_if. Init abort",
71 obj->name());
72 }
73 return;
74 }
75
77 dynamic_cast<tlm_utils::multi_init_base_if<TYPES> *>(obj);
78 if (multi_initiator_) {
79 binders_bw_ = multi_initiator_->get_binders();
80#ifdef SYSTEMC_2_3_3
81 base_bw_ = &base_socket_->get_export_base();
82#elif defined SYSTEMC_2_3_4 || defined SYSTEMC_3_0_0
83 base_bw_ = const_cast<sc_core::sc_export_base *>(
84 &const_cast<const tlm::tlm_base_socket_if *>(
85 base_socket_)->get_base_export());
86#endif
89 for (auto i : binders_bw_) {
92 }
93 }
94
96 dynamic_cast<tlm_utils::multi_target_base_if<TYPES> *>(obj);
97 if (multi_target_) {
98 binders_fw_ = multi_target_->get_binders();
99#ifdef SYSTEMC_2_3_3
100 base_fw_ = &base_socket_->get_export_base();
101#elif defined SYSTEMC_2_3_4 || defined SYSTEMC_3_0_0
102 base_fw_ = const_cast<sc_core::sc_export_base *>(
103 &const_cast<const tlm::tlm_base_socket_if *>(
104 base_socket_)->get_base_export());
105#endif
108 for (auto i : binders_fw_) {
109 ScExportConnection::keytype key = std::make_pair(i,
111 insertKey(key);
113 }
114 }
115 }
116 void allProxiesInitialized() override {
117 for (auto i : binders_bw_) {
118 ScExportConnection *connection =
120 if (connection) {
121 connection->insertKey(std::make_pair(i,
123 }
124 }
125 }
126 void simulationStarted() override {
129
130 for (auto b : binders_bw_)
132
133 for (auto f : binders_fw_) {
136 }
137
138 if (multi_initiator_) {
139 std::vector<tlm::tlm_fw_transport_if<TYPES> *> &sockets =
140 multi_initiator_->get_sockets();
141 for (auto s : sockets) {
144 }
145 }
146
147 if (multi_target_) {
148 std::map<unsigned int, tlm::tlm_bw_transport_if<TYPES> *> &binds =
149 multi_target_->get_multi_binds();
150 for (const auto &b : binds) {
152 b.second));
153 }
154 }
155
156 sc_core::sc_object *obj = dynamic_cast<sc_core::sc_object *>(
162 }
163 void simulationEnded() override {
164 }
165 bool isTargetSocket() override {
166 if (base_socket_) {
167 const sc_core::sc_interface *iface = nullptr;
168#ifdef SYSTEMC_2_3_3
169 iface = base_socket_->get_export_base().get_interface();
170#elif defined SYSTEMC_2_3_4 || defined SYSTEMC_3_0_0
171 iface = const_cast<const tlm::tlm_base_socket_if *>(
172 base_socket_)->get_base_export().get_interface();
173#endif
174 return dynamic_cast<const tlm::tlm_fw_transport_if<TYPES> *>(
175 iface) != nullptr;
176 }
177
178 return false;
179 }
180 void tool_controller_init(ToolController *controller) override {
181 for (auto handler : all_handlers_)
182 handler->init(this, controller);
183 }
185 for (auto handler : all_handlers_) {
186 if (state == EMPTY)
187 handler->disable();
188 else
189 handler->enable();
190 }
191 }
193 typename std::vector<tlm_utils::callback_binder_bw<TYPES>* >::
194 iterator i;
195 for (i = binders_bw_.begin(); i != binders_bw_.end(); ++i) {
196 // the implicit cast triggered a segfault, because the object
197 // pointed to has been freed. Cast via void* to circumvent this,
198 // as all we need in the pair is the pointer address
199 ScExportConnection::keytype key = std::make_pair(
200 static_cast<sc_core::sc_interface *>(
201 static_cast<void*>(*i)), base_bw_typename_);
203 }
204 }
205
206 protected:
208 if (handler)
209 all_handlers_.push_back(handler);
210 }
211
212 std::string socket_name_;
213 tlm::tlm_base_socket_if *base_socket_;
214 sc_core::sc_export_base *base_bw_;
215 sc_core::sc_export_base *base_fw_;
216 const char *base_bw_typename_;
217 const char *base_fw_typename_;
218 std::vector<tlm_utils::callback_binder_bw<TYPES>* > binders_bw_;
219 std::vector<tlm_utils::callback_binder_fw<TYPES>* > binders_fw_;
220 std::vector<TlmHandlerInterface *> all_handlers_;
221 tlm_utils::multi_init_base_if<TYPES> *multi_initiator_;
222 tlm_utils::multi_target_base_if<TYPES> *multi_target_;
223};
224
225template <typename TYPES>
227 public tlm::tlm_fw_transport_if<TYPES> {
228 public:
229 typedef typename TYPES::tlm_payload_type transaction_type;
230 typedef typename TYPES::tlm_phase_type phase_type;
231 explicit ProxyInitiatorSocket(simics::ConfObjectRef o)
232 : ProxySocketBase<TYPES>(o) {}
233 tlm::tlm_sync_enum nb_transport_fw(transaction_type &trans, // NOLINT
234 phase_type &phase, // NOLINT
235 sc_core::sc_time &t) override { // NOLINT
237 return fw_if()->nb_transport_fw(trans, phase, t);
238 }
239 void b_transport(transaction_type &trans, // NOLINT
240 sc_core::sc_time &t) override { // NOLINT
242 invoker_.enqueue(this->base_socket_, &trans, &t);
243 }
245 tlm::tlm_dmi &dmi_data) override { // NOLINT
247 return fw_if()->get_direct_mem_ptr(trans, dmi_data);
248 }
249 unsigned int transport_dbg(transaction_type &trans) override { // NOLINT
250 Kernel(this->simulation()->context());
251 return fw_if()->transport_dbg(trans);
252 }
253 private:
254 tlm::tlm_fw_transport_if<TYPES> *fw_if() {
255#ifdef SYSTEMC_2_3_3
256 tlm::tlm_fw_transport_if<TYPES> *fw_if =
257 dynamic_cast<tlm::tlm_fw_transport_if<TYPES> *>(
258 this->base_socket_->get_port_base().get_interface());
259#elif defined SYSTEMC_2_3_4 || defined SYSTEMC_3_0_0
260 tlm::tlm_fw_transport_if<TYPES> *fw_if =
261 dynamic_cast<tlm::tlm_fw_transport_if<TYPES> *>(
262 const_cast<sc_core::sc_interface *>(
263 const_cast<const tlm::tlm_base_socket_if *>(
264 this->base_socket_)->get_base_port().get_interface()));
265#endif
266 assert(fw_if);
267 return fw_if;
268 }
270};
271
272template <typename TYPES>
273injection::BTransportInvoker<TYPES> ProxyInitiatorSocket<TYPES>::invoker_;
274
275template <typename TYPES>
276class ProxyTargetSocket : public ProxySocketBase<TYPES>,
277 public tlm::tlm_bw_transport_if<TYPES> {
278 public:
279 typedef typename TYPES::tlm_payload_type transaction_type;
280 typedef typename TYPES::tlm_phase_type phase_type;
281 explicit ProxyTargetSocket(simics::ConfObjectRef o)
282 : ProxySocketBase<TYPES>(o) {}
283
284 virtual tlm::tlm_sync_enum nb_transport_bw(transaction_type &trans, // NOLINT
285 phase_type &phase, // NOLINT
286 sc_core::sc_time &t) { // NOLINT
288 return bw_if()->nb_transport_bw(trans, phase, t);
289 }
290 virtual void invalidate_direct_mem_ptr(sc_dt::uint64 start_range,
291 sc_dt::uint64 end_range) {
293 bw_if()->invalidate_direct_mem_ptr(start_range, end_range);
294 }
295
296 private:
297 tlm::tlm_bw_transport_if<TYPES> *bw_if() {
298#ifdef SYSTEMC_2_3_3
299 tlm::tlm_bw_transport_if<TYPES> *bw_if =
300 dynamic_cast<tlm::tlm_bw_transport_if<TYPES> *>(
301 this->base_socket_->get_port_base().get_interface());
302#elif defined SYSTEMC_2_3_4 || defined SYSTEMC_3_0_0
303 tlm::tlm_bw_transport_if<TYPES> *bw_if =
304 dynamic_cast<tlm::tlm_bw_transport_if<TYPES> *>(
305 const_cast<sc_core::sc_interface *>(
306 const_cast<const tlm::tlm_base_socket_if *>(
307 this->base_socket_)->get_base_port().get_interface()));
308#endif
309 assert(bw_if);
310 return bw_if;
311 }
312};
313
314} // namespace awareness
315} // namespace systemc
316} // namespace simics
317
318#endif
static const char * get_typename(sc_export_base *object)
Definition: kernel_state_modifier.h:33
Utility class that reset the current context to the previous one upon leaving current scope.
Definition: kernel.h:29
sc_core::sc_simcontext * context() const override
Definition: simulation_interface_proxy.h:46
tlm::tlm_sync_enum nb_transport_fw(transaction_type &trans, phase_type &phase, sc_core::sc_time &t) override
Definition: proxy_socket.h:233
unsigned int transport_dbg(transaction_type &trans) override
Definition: proxy_socket.h:249
void b_transport(transaction_type &trans, sc_core::sc_time &t) override
Definition: proxy_socket.h:239
TYPES::tlm_phase_type phase_type
Definition: proxy_socket.h:230
bool get_direct_mem_ptr(transaction_type &trans, tlm::tlm_dmi &dmi_data) override
Definition: proxy_socket.h:244
ProxyInitiatorSocket(simics::ConfObjectRef o)
Definition: proxy_socket.h:231
TYPES::tlm_payload_type transaction_type
Definition: proxy_socket.h:229
Definition: proxy_socket.h:51
std::string socket_name_
Definition: proxy_socket.h:212
void addHandler(TlmHandlerInterface *handler)
Definition: proxy_socket.h:207
std::vector< tlm_utils::callback_binder_fw< TYPES > * > binders_fw_
Definition: proxy_socket.h:219
sc_core::sc_export_base * base_bw_
Definition: proxy_socket.h:214
void tool_controller_init(ToolController *controller) override
Definition: proxy_socket.h:180
void allProxiesInitialized() override
Definition: proxy_socket.h:116
void simulationStarted() override
Definition: proxy_socket.h:126
void connection_list_updated(ConnectionListState state) override
Definition: proxy_socket.h:184
void init(sc_core::sc_object *obj, SimulationInterface *simulation) override
Definition: proxy_socket.h:60
std::vector< TlmHandlerInterface * > all_handlers_
Definition: proxy_socket.h:220
tlm_utils::multi_target_base_if< TYPES > * multi_target_
Definition: proxy_socket.h:222
ProxySocketBase(simics::ConfObjectRef o)
Definition: proxy_socket.h:56
const char * base_bw_typename_
Definition: proxy_socket.h:216
const char * base_fw_typename_
Definition: proxy_socket.h:217
void simulationEnded() override
Definition: proxy_socket.h:163
bool isTargetSocket() override
Definition: proxy_socket.h:165
tlm_utils::multi_init_base_if< TYPES > * multi_initiator_
Definition: proxy_socket.h:221
std::vector< tlm_utils::callback_binder_bw< TYPES > * > binders_bw_
Definition: proxy_socket.h:218
sc_core::sc_export_base * base_fw_
Definition: proxy_socket.h:215
virtual ~ProxySocketBase()
Definition: proxy_socket.h:192
tlm::tlm_base_socket_if * base_socket_
Definition: proxy_socket.h:213
TYPES types
Definition: proxy_socket.h:54
Definition: proxy_socket_interface.h:23
Definition: proxy_socket.h:277
virtual void invalidate_direct_mem_ptr(sc_dt::uint64 start_range, sc_dt::uint64 end_range)
Definition: proxy_socket.h:290
TYPES::tlm_payload_type transaction_type
Definition: proxy_socket.h:279
TYPES::tlm_phase_type phase_type
Definition: proxy_socket.h:280
virtual tlm::tlm_sync_enum nb_transport_bw(transaction_type &trans, phase_type &phase, sc_core::sc_time &t)
Definition: proxy_socket.h:284
ProxyTargetSocket(simics::ConfObjectRef o)
Definition: proxy_socket.h:281
Definition: proxy.h:41
void init(sc_core::sc_object *obj, iface::SimulationInterface *simulation) override
static ProxyInterface * findProxy(sc_core::sc_object *obj)
iface::SimulationInterface * simulation() override
Definition: sc_export_connection.h:40
conf_object_t * export_to_proxy() override
static void removeBinderExport(keytype key, sc_core::sc_export_base *obj)
std::pair< sc_core::sc_interface *, std::string > keytype
Definition: sc_export_connection.h:42
static void addBinderExport(const keytype &key, sc_core::sc_export_base *obj)
void init(sc_core::sc_object *object, iface::SimulationInterface *simulation)
Definition: sc_port_connection.h:39
void init(sc_core::sc_object *object, iface::SimulationInterface *simulation)
std::vector< conf_object_t * > port_to_proxies() override
static TlmHandlerInterface * targetFwSocketHandler(sc_core::sc_object *obj)
Definition: tlm_base_handler.h:161
static TlmHandlerInterface * mPInitiatorFwSocketHandler(tlm::tlm_fw_transport_if< TYPES > *socket)
Definition: tlm_base_handler.h:202
static TlmHandlerInterface * targetBwSocketHandler(sc_core::sc_object *obj)
Definition: tlm_base_handler.h:181
static TlmHandlerInterface * mPInitiatorBwSocketHandler(tlm_utils::callback_binder_bw< TYPES > *cb)
Definition: tlm_base_handler.h:217
static TlmHandlerInterface * mPtargetBwSocketHandler(tlm::tlm_bw_transport_if< TYPES > *socket)
Definition: tlm_base_handler.h:246
static TlmHandlerInterface * initiatorFwSocketHandler(sc_core::sc_object *obj)
Definition: tlm_base_handler.h:121
static TlmHandlerInterface * mPTargetFwSocketHandler(tlm_utils::callback_binder_fw< TYPES > *cb)
Definition: tlm_base_handler.h:227
static TlmHandlerInterface * mPTargetBwSocketHandler(tlm_utils::callback_binder_fw< TYPES > *cb)
Definition: tlm_base_handler.h:237
static TlmHandlerInterface * mPInitiatorFwMpSocketHandler(tlm::tlm_fw_transport_if< TYPES > *socket)
Definition: tlm_base_handler.h:212
static TlmHandlerInterface * initiatorBwSocketHandler(sc_core::sc_object *obj)
Definition: tlm_base_handler.h:141
Definition: tlm_handler_interface.h:26
virtual ConfObjectRef simics_object() const =0
Definition: b_transport_invoker.h:31
Definition: tool_controller.h:74
ConnectionListState
Definition: tool_controller.h:76
@ EMPTY
Definition: tool_controller.h:77
@ Log_Awareness
Definition: adapter_log_groups.h:26
Definition: adapter.h:81