SystemC Library API Reference Manual
Reference documentation for the Simics SystemC Library.
 
Loading...
Searching...
No Matches
tlm_base_handler.h
Go to the documentation of this file.
1// -*- mode: C++; c-file-style: "virtutech-c++" -*-
2
3/*
4 © 2017 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_TLM_BASE_HANDLER_H
17#define SIMICS_SYSTEMC_AWARENESS_TLM_BASE_HANDLER_H
18
19#include <systemc>
20#include <tlm>
21#include <tlm_utils/multi_socket_bases.h>
22
28
29namespace simics {
30namespace systemc {
31namespace awareness {
32
34 public:
35 virtual ~TlmIfaceInterface() {}
36 virtual sc_core::sc_interface *iface() = 0;
37};
38
40 public:
41 explicit TlmIface(sc_core::sc_interface *iface) {
42 if_ = iface;
43 }
44 virtual sc_core::sc_interface *iface() {
45 return if_;
46 }
47
48 private:
49 sc_core::sc_interface *if_;
50};
51
52template <typename IF_PROVIDER = sc_core::sc_port_base,
53 typename TYPES = tlm::tlm_base_protocol_types,
54 typename IF = tlm::tlm_fw_transport_if<TYPES> >
56 public:
57 explicit TlmIfaceProvider(IF_PROVIDER *if_provider) {
58 if_provider_ = if_provider;
59 }
60 virtual sc_core::sc_interface *iface() {
61 return dynamic_cast<IF*>(if_provider_->get_interface());
62 }
63
64 private:
65 IF_PROVIDER *if_provider_;
66};
67
69 public:
70 TlmBaseHandler() : tlm_iface_(NULL), proxy_(NULL), controller_(NULL) {}
72 delete tlm_iface_;
73 }
76 virtual void init(ProxyInterface *proxy,
78 proxy_ = proxy;
79 controller_ = controller;
80 }
82 return controller_;
83 }
84 virtual ProxyInterface *proxy() {
85 return proxy_;
86 }
87 virtual void enable() {}
88 virtual void disable() {}
89 virtual void set_tlm_iface(TlmIfaceInterface *tlm_iface) {
90 tlm_iface_ = tlm_iface;
91 }
92 virtual sc_core::sc_interface *iface() {
93 return tlm_iface_->iface();
94 }
95 template <typename TYPES>
96 static tlm::tlm_base_socket_if *initiatorSocket(
97 tlm_utils::callback_binder_fw<TYPES> *cb) {
98 return dynamic_cast<tlm::tlm_base_socket_if *>(
99 cb->get_other_side());
100 }
101 template <typename TYPES>
103 tlm_utils::callback_binder_fw<TYPES> *cb) {
104 const tlm::tlm_base_socket_if *base = initiatorSocket(cb);
105 if (!base)
106 return NULL;
107
108 TlmMultiHandlerInterface *mh = nullptr;
109#ifdef SYSTEMC_2_3_3
110 const auto *iface = base->get_export_base().get_interface();
111#elif defined SYSTEMC_2_3_4 || defined SYSTEMC_3_0_0
112 const auto *iface = base->get_base_export().get_interface();
113#endif
114 mh = const_cast<TlmMultiHandlerInterface *>(
115 dynamic_cast<const TlmMultiHandlerInterface *>(iface));
116 return mh;
117 }
119 sc_core::sc_object *obj) {
120 const tlm::tlm_base_socket_if *base =
121 dynamic_cast<tlm::tlm_base_socket_if *>(obj);
122 if (!base)
123 return NULL;
124
125 TlmMultiHandlerInterface *mh = nullptr;
126#ifdef SYSTEMC_2_3_3
127 const auto *iface = base->get_port_base().get_interface();
128#elif defined SYSTEMC_2_3_4 || defined SYSTEMC_3_0_0
129 const auto *iface = base->get_base_port().get_interface();
130#endif
131 mh = const_cast<TlmMultiHandlerInterface *>(
132 dynamic_cast<const TlmMultiHandlerInterface *>(iface));
133 if (!mh)
134 return NULL;
135
136 return mh->firstHandler();
137 }
139 sc_core::sc_object *obj) {
140 const tlm::tlm_base_socket_if *base =
141 dynamic_cast<tlm::tlm_base_socket_if *>(obj);
142 if (!base)
143 return NULL;
144
145 TlmMultiHandlerInterface *mh = nullptr;
146#ifdef SYSTEMC_2_3_3
147 const auto *iface = base->get_export_base().get_interface();
148#elif defined SYSTEMC_2_3_4 || defined SYSTEMC_3_0_0
149 const auto *iface = base->get_base_export().get_interface();
150#endif
151 mh = const_cast<TlmMultiHandlerInterface *>(
152 dynamic_cast<const TlmMultiHandlerInterface *>(iface));
153 if (!mh)
154 return NULL;
155
156 return mh->secondHandler();
157 }
159 sc_core::sc_object *obj) {
160 const tlm::tlm_base_socket_if *base =
161 dynamic_cast<tlm::tlm_base_socket_if *>(obj);
162 if (!base)
163 return NULL;
164
165 TlmMultiHandlerInterface *mh = nullptr;
166#ifdef SYSTEMC_2_3_3
167 const auto *iface = base->get_export_base().get_interface();
168#elif defined SYSTEMC_2_3_4 || defined SYSTEMC_3_0_0
169 const auto *iface = base->get_base_export().get_interface();
170#endif
171 mh = const_cast<TlmMultiHandlerInterface *>(
172 dynamic_cast<const TlmMultiHandlerInterface *>(iface));
173 if (!mh)
174 return NULL;
175
176 return mh->secondHandler();
177 }
179 sc_core::sc_object *obj) {
180 const tlm::tlm_base_socket_if *base =
181 dynamic_cast<tlm::tlm_base_socket_if *>(obj);
182 if (!base)
183 return NULL;
184
185 TlmMultiHandlerInterface *mh = nullptr;
186#ifdef SYSTEMC_2_3_3
187 const auto *iface = base->get_port_base().get_interface();
188#elif defined SYSTEMC_2_3_4 || defined SYSTEMC_3_0_0
189 const auto *iface = base->get_base_port().get_interface();
190#endif
191 mh = const_cast<TlmMultiHandlerInterface *>(
192 dynamic_cast<const TlmMultiHandlerInterface *>(iface));
193 if (!mh)
194 return NULL;
195
196 return mh->firstHandler();
197 }
198 template <typename TYPES>
200 tlm::tlm_fw_transport_if<TYPES> *socket) {
202 dynamic_cast<TlmMultiHandlerInterface *> (socket);
203 if (!mh)
204 return NULL;
205
206 return mh->firstHandler();
207 }
208 template <typename TYPES>
210 tlm::tlm_fw_transport_if<TYPES> *socket) {
211 return dynamic_cast<TlmHandlerInterface *> (socket);
212 }
213 template <typename TYPES>
215 tlm_utils::callback_binder_bw<TYPES> *cb) {
218 if (!mh)
219 return NULL;
220
221 return mh->secondHandler();
222 }
223 template <typename TYPES>
225 tlm_utils::callback_binder_fw<TYPES> *cb) {
228 if (!mh)
229 return NULL;
230
231 return mh->secondHandler();
232 }
233 template <typename TYPES>
235 tlm_utils::callback_binder_fw<TYPES> *cb) {
237 if (!mh)
238 return NULL;
239
240 return mh->firstHandler();
241 }
242 template <typename TYPES>
244 tlm::tlm_bw_transport_if<TYPES> *socket) {
245 return dynamic_cast<TlmHandlerInterface *> (socket);
246 }
247
248 private:
249 TlmIfaceInterface *tlm_iface_;
250 ProxyInterface *proxy_;
252};
253
254} // namespace awareness
255} // namespace systemc
256} // namespace simics
257
258#endif
Definition: proxy_interface.h:29
Definition: tlm_base_handler.h:68
virtual void init(ProxyInterface *proxy, instrumentation::ToolController *controller)
Definition: tlm_base_handler.h:76
static TlmHandlerInterface * targetFwSocketHandler(sc_core::sc_object *obj)
Definition: tlm_base_handler.h:158
virtual instrumentation::ToolController * controller()
Definition: tlm_base_handler.h:81
static TlmMultiHandlerInterface * initiatorExPortHandler(tlm_utils::callback_binder_fw< TYPES > *cb)
Definition: tlm_base_handler.h:102
static TlmHandlerInterface * mPInitiatorFwSocketHandler(tlm::tlm_fw_transport_if< TYPES > *socket)
Definition: tlm_base_handler.h:199
virtual void disable()
Definition: tlm_base_handler.h:88
virtual void set_tlm_iface(TlmIfaceInterface *tlm_iface)
Definition: tlm_base_handler.h:89
static TlmHandlerInterface * targetBwSocketHandler(sc_core::sc_object *obj)
Definition: tlm_base_handler.h:178
virtual sc_core::sc_interface * iface()
Definition: tlm_base_handler.h:92
static tlm::tlm_base_socket_if * initiatorSocket(tlm_utils::callback_binder_fw< TYPES > *cb)
Definition: tlm_base_handler.h:96
virtual ProxyInterface * proxy()
Definition: tlm_base_handler.h:84
TlmBaseHandler()
Definition: tlm_base_handler.h:70
static TlmHandlerInterface * mPInitiatorBwSocketHandler(tlm_utils::callback_binder_bw< TYPES > *cb)
Definition: tlm_base_handler.h:214
static TlmHandlerInterface * mPtargetBwSocketHandler(tlm::tlm_bw_transport_if< TYPES > *socket)
Definition: tlm_base_handler.h:243
static TlmHandlerInterface * initiatorFwSocketHandler(sc_core::sc_object *obj)
Definition: tlm_base_handler.h:118
virtual void enable()
Definition: tlm_base_handler.h:87
static TlmHandlerInterface * mPTargetFwSocketHandler(tlm_utils::callback_binder_fw< TYPES > *cb)
Definition: tlm_base_handler.h:224
TlmBaseHandler(const TlmBaseHandler &)=delete
~TlmBaseHandler()
Definition: tlm_base_handler.h:71
TlmBaseHandler & operator=(const TlmBaseHandler &)=delete
static TlmHandlerInterface * mPTargetBwSocketHandler(tlm_utils::callback_binder_fw< TYPES > *cb)
Definition: tlm_base_handler.h:234
static TlmHandlerInterface * mPInitiatorFwMpSocketHandler(tlm::tlm_fw_transport_if< TYPES > *socket)
Definition: tlm_base_handler.h:209
static TlmHandlerInterface * initiatorBwSocketHandler(sc_core::sc_object *obj)
Definition: tlm_base_handler.h:138
Definition: tlm_handler_interface.h:26
Definition: tlm_base_handler.h:33
virtual sc_core::sc_interface * iface()=0
virtual ~TlmIfaceInterface()
Definition: tlm_base_handler.h:35
Definition: tlm_base_handler.h:55
TlmIfaceProvider(IF_PROVIDER *if_provider)
Definition: tlm_base_handler.h:57
virtual sc_core::sc_interface * iface()
Definition: tlm_base_handler.h:60
Definition: tlm_base_handler.h:39
virtual sc_core::sc_interface * iface()
Definition: tlm_base_handler.h:44
TlmIface(sc_core::sc_interface *iface)
Definition: tlm_base_handler.h:41
Definition: tlm_multi_handler_interface.h:25
virtual TlmHandlerInterface * secondHandler()=0
virtual TlmHandlerInterface * firstHandler()=0
static TlmMultiHandlerInterface * getHandler(sc_core::sc_interface *binder)
Definition: tlm_multi_handler_registry.h:41
Definition: tool_controller.h:74
Definition: adapter.h:80