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