14#ifndef SIMICS_SYSTEMC_TLM2SIMICS_GASKET_DISPATCHER_H
15#define SIMICS_SYSTEMC_TLM2SIMICS_GASKET_DISPATCHER_H
21#include <tlm_utils/multi_passthrough_initiator_socket.h>
22#include <tlm_utils/simple_target_socket.h>
36 std::make_pair(sc_core::sc_get_curr_simcontext(),
this));
40 auto range = context_.equal_range(sc_core::sc_get_curr_simcontext());
41 for (
auto it = range.first; it != range.second; ++it)
44 context_.erase(sc_core::sc_get_curr_simcontext());
48 static std::multimap<sc_core::sc_simcontext *,
52template <
unsigned int BUSWIDTH = 32,
53 typename TYPES = tlm::tlm_base_protocol_types,
55 sc_core::sc_port_policy POL = sc_core::SC_ONE_OR_MORE_BOUND>
60 target_socket_.register_nb_transport_fw(
61 this, &GasketDispatcher::nb_transport_fw);
62 target_socket_.register_b_transport(
63 this, &GasketDispatcher::b_transport);
64 target_socket_.register_transport_dbg(
65 this, &GasketDispatcher::transport_dbg);
66 target_socket_.register_get_direct_mem_ptr(
67 this, &GasketDispatcher::get_direct_mem_ptr);
68 multi_initiator_.register_invalidate_direct_mem_ptr(
69 this, &GasketDispatcher::invalidate_direct_mem_ptr);
70 multi_initiator_.register_nb_transport_bw(
71 this, &GasketDispatcher::nb_transport_bw);
74 tlm::tlm_initiator_socket<BUSWIDTH, TYPES, N, POL> *socket,
76 const simics::ConfObjectRef &simics_obj) {
78 if (dispatchers_.find(socket) == dispatchers_.end()) {
80 sc_core::sc_gen_unique_name(
"GasketDispatcher"));
81 dispatchers_[socket] = dispatcher;
82 (*socket)(dispatcher->target_socket_);
83 dispatcher->simics_obj_ = simics_obj;
86 dispatcher = dispatchers_[socket];
91 dispatcher->receivers_.push_back(
92 std::make_pair(dispatcher->receivers_.size(),
94 gasket->
bind(dispatcher->multi_initiator_);
98 for (
auto it = dispatchers_.begin(); it != dispatchers_.end(); ++it) {
99 if (it->second ==
this) {
100 dispatchers_.erase(it);
107 tlm::tlm_sync_enum nb_transport_fw(
108 tlm::tlm_generic_payload &trans, tlm::tlm_phase &phase,
109 sc_core::sc_time &local_time) {
110 int idx = index(&trans);
112 return multi_initiator_[idx]->nb_transport_fw(trans, phase,
115 return tlm::TLM_COMPLETED;
117 tlm::tlm_sync_enum nb_transport_bw(
118 int idx, tlm::tlm_generic_payload &trans,
119 tlm::tlm_phase &phase, sc_core::sc_time &local_time) {
120 return target_socket_->nb_transport_bw(trans, phase, local_time);
123 tlm::tlm_generic_payload &trans, sc_core::sc_time &local_time) {
124 int idx = index(&trans);
126 multi_initiator_[idx]->b_transport(trans, local_time);
128 unsigned int transport_dbg(tlm::tlm_generic_payload &trans) {
129 int idx = index(&trans);
131 return multi_initiator_[idx]->transport_dbg(trans);
135 void invalidate_direct_mem_ptr(
int idx, sc_dt::uint64 start_range,
136 sc_dt::uint64 end_range) {
137 target_socket_->invalidate_direct_mem_ptr(start_range, end_range);
140 bool get_direct_mem_ptr(
141 tlm::tlm_generic_payload &trans, tlm::tlm_dmi &dmi) {
142 int idx = index(&trans);
144 return multi_initiator_[idx]->get_direct_mem_ptr(trans, dmi);
149 int index(tlm::tlm_generic_payload *trans) {
150 if ((sc_core::SC_ELABORATION |
151 sc_core::SC_BEFORE_END_OF_ELABORATION |
152 sc_core::SC_END_OF_ELABORATION) & sc_core::sc_get_status()) {
153 SIM_LOG_ERROR(simics_obj_, 0,
"b_transport called before "
154 "completion of SystemC SC_END_OF_ELABORATION");
158 if (receivers_.size() <= 0) {
159 SIM_LOG_ERROR(simics_obj_, 0,
"b_transport called without "
164 if (receivers_.size() > 1) {
165 for (
auto it = receivers_.begin(); it != receivers_.end(); ++it) {
166 TransactionHandlerInterface *handler =
167 it->second->transaction_handler();
170 if (receiver && receiver->
probe(trans)) {
180 static std::map<sc_core::sc_object*,
181 GasketDispatcher<BUSWIDTH, TYPES, N, POL> *> dispatchers_;
183 std::vector<std::pair<size_t, GasketInterface *> > receivers_;
184 tlm_utils::multi_passthrough_initiator_socket<
187 TYPES> multi_initiator_;
188 tlm_utils::simple_target_socket<
189 GasketDispatcher<BUSWIDTH, TYPES, N, POL>,
190 BUSWIDTH, TYPES> target_socket_;
191 simics::ConfObjectRef simics_obj_;
194template <
unsigned int BUSWIDTH,
197 sc_core::sc_port_policy POL>
198std::map<sc_core::sc_object*,
199 GasketDispatcher<BUSWIDTH, TYPES, N, POL> *>
200GasketDispatcher<BUSWIDTH, TYPES, N, POL>::dispatchers_;
Interface implemented by the ExtensionReceiver class, used by the ExtensionDispatcher.
Definition: receiver_interface.h:27
virtual bool probe(tlm::tlm_generic_payload *payload)=0
Definition: gasket_dispatcher.h:32
GasketDispatcherBase()
Definition: gasket_dispatcher.h:34
virtual ~GasketDispatcherBase()
Definition: gasket_dispatcher.h:38
static void cleanCache()
Definition: gasket_dispatcher.h:39
Definition: gasket_dispatcher.h:57
static GasketInterface::Ptr bind(tlm::tlm_initiator_socket< BUSWIDTH, TYPES, N, POL > *socket, const char *name, const simics::ConfObjectRef &simics_obj)
Definition: gasket_dispatcher.h:73
SC_CTOR(GasketDispatcher)
Definition: gasket_dispatcher.h:59
virtual ~GasketDispatcher()
Definition: gasket_dispatcher.h:97
std::shared_ptr< GasketInterface > Ptr
Definition: gasket_interface.h:30
Implements core functionality for receiving a TLM2 transaction over a socket.
Definition: gasket.h:45
void bind(Socket &sock)
Definition: gasket.h:71