20 #ifndef __SYSTEMC_EXT_TLM_UTILS_MULTI_SOCKET_BASES_H__ 21 #define __SYSTEMC_EXT_TLM_UTILS_MULTI_SOCKET_BASES_H__ 25 #include "../core/sc_port.hh" 26 #include "../tlm_core/2/interfaces/fw_bw_ifs.hh" 32 template <
typename signature>
38 #define TLM_DEFINE_FUNCTOR(name) \ 39 template <typename MODULE, typename TRAITS> \ 41 static_##name(void *mod, void *fn, int index, TLM_FULL_ARG_LIST) \ 43 typedef fn_container<TLM_RET_VAL (MODULE::*)(int, TLM_FULL_ARG_LIST)> \ 45 MODULE *tmp_mod = static_cast<MODULE *>(mod); \ 46 fn_container_type *tmp_cb = static_cast<fn_container_type *> (fn); \ 47 return (tmp_mod->*(tmp_cb->function))( \ 48 index, TLM_ARG_LIST_WITHOUT_TYPES); \ 51 template <typename MODULE, typename TRAITS> \ 53 delete_fn_container_of_##name(void *fn) \ 55 typedef fn_container<TLM_RET_VAL (MODULE::*)(int, TLM_FULL_ARG_LIST)> \ 57 fn_container_type *tmp_cb = static_cast<fn_container_type *>(fn); \ 62 template <typename TRAITS> \ 63 class name##_functor{ \ 65 typedef typename TRAITS::tlm_payload_type payload_type; \ 66 typedef typename TRAITS::tlm_phase_type phase_type; \ 67 typedef TLM_RET_VAL (*call_fn)(void *,void *, int, TLM_FULL_ARG_LIST); \ 68 typedef void (*del_fn)(void *); \ 70 name##_functor() : m_fn(0), m_del_fn(0), m_mod(0), m_mem_fn(0) {} \ 74 (*m_del_fn)(m_mem_fn); \ 77 template <typename MODULE> \ 79 set_function(MODULE *mod, TLM_RET_VAL (MODULE::*cb)( \ 80 int, TLM_FULL_ARG_LIST)) \ 82 typedef fn_container<TLM_RET_VAL (MODULE::*)( \ 83 int, TLM_FULL_ARG_LIST)> fn_container_type; \ 84 m_fn = &static_##name<MODULE,TRAITS>; \ 85 m_del_fn = &delete_fn_container_of_##name<MODULE, TRAITS>; \ 87 fn_container_type *tmp =new fn_container_type(); \ 89 m_mod = static_cast<void *>(mod); \ 90 m_mem_fn = static_cast<void *>(tmp); \ 94 operator ()(int index, TLM_FULL_ARG_LIST) \ 96 return m_fn(m_mod, m_mem_fn, index, TLM_ARG_LIST_WITHOUT_TYPES); \ 99 bool is_valid() { return (m_mod != 0 && m_mem_fn != 0 && m_fn != 0); } \ 107 name##_functor &operator = (const name##_functor &); \ 111 #define TLM_RET_VAL tlm::tlm_sync_enum 112 #define TLM_FULL_ARG_LIST \ 113 typename TRAITS::tlm_payload_type &txn, \ 114 typename TRAITS::tlm_phase_type &ph, sc_core::sc_time &t 115 #define TLM_ARG_LIST_WITHOUT_TYPES txn, ph, t 118 #undef TLM_FULL_ARG_LIST 119 #undef TLM_ARG_LIST_WITHOUT_TYPES 121 #define TLM_RET_VAL void 122 #define TLM_FULL_ARG_LIST \ 123 typename TRAITS::tlm_payload_type &txn, sc_core::sc_time &t 124 #define TLM_ARG_LIST_WITHOUT_TYPES txn, t 127 #undef TLM_FULL_ARG_LIST 128 #undef TLM_ARG_LIST_WITHOUT_TYPES 130 #define TLM_RET_VAL unsigned int 131 #define TLM_FULL_ARG_LIST typename TRAITS::tlm_payload_type &txn 132 #define TLM_ARG_LIST_WITHOUT_TYPES txn 135 #undef TLM_FULL_ARG_LIST 136 #undef TLM_ARG_LIST_WITHOUT_TYPES 138 #define TLM_RET_VAL bool 139 #define TLM_FULL_ARG_LIST \ 140 typename TRAITS::tlm_payload_type &txn, tlm::tlm_dmi &dmi 141 #define TLM_ARG_LIST_WITHOUT_TYPES txn, dmi 144 #undef TLM_FULL_ARG_LIST 145 #undef TLM_ARG_LIST_WITHOUT_TYPES 147 #define TLM_RET_VAL void 148 #define TLM_FULL_ARG_LIST sc_dt::uint64 l, sc_dt::uint64 u 149 #define TLM_ARG_LIST_WITHOUT_TYPES l, u 152 #undef TLM_FULL_ARG_LIST 153 #undef TLM_ARG_LIST_WITHOUT_TYPES 155 #undef TLM_DEFINE_FUNCTOR 163 template <
typename TYPES>
181 m_nb_f(0), m_b_f(0), m_dbg_f(0), m_dmi_f(0) , m_caller_port(0)
189 if (m_nb_f && m_nb_f->is_valid()) {
190 return (*m_nb_f)(m_id, txn,
p,
t);
193 display_error(
"Call to nb_transport_fw without a " 194 "registered callback for nb_transport_fw.");
203 if (m_b_f && m_b_f->is_valid()) {
204 (*m_b_f)(m_id, trans,
t);
208 display_error(
"Call to b_transport without a " 209 "registered callback for b_transport.");
217 if (m_dmi_f && m_dmi_f->is_valid()) {
219 return (*m_dmi_f)(m_id, trans, dmi_data);
233 if (m_dbg_f && m_dbg_f->is_valid()) {
234 return (*m_dbg_f)(m_id, trans);
252 dmi_func_type &cb3, debug_func_type &cb4)
285 template <
typename TYPES>
301 m_nb_f(0), m_dmi_f(0)
310 if (m_nb_f && m_nb_f->is_valid()) {
311 return (*m_nb_f)(m_id, txn,
p,
t);
314 display_error(
"Call to nb_transport_bw without a " 315 "registered callback for nb_transport_bw");
324 if (m_dmi_f && m_dmi_f->is_valid()) {
325 (*m_dmi_f)(m_id,
l,
u);
350 template <
typename TYPES=tlm::tlm_base_protocol_types>
369 template <
unsigned int BUSWIDTH=32,
382 virtual void disable_cb_bind()=0;
410 template <
typename TYPES=tlm::tlm_base_protocol_types>
422 virtual std::map<unsigned int, tlm::tlm_bw_transport_if<TYPES>*> &
423 get_multi_binds() = 0;
434 template <
unsigned int BUSWIDTH=32,
476 template <
typename TYPES>
debug_transport_functor< TYPES > debug_func_type
b_transport_functor< TYPES > b_func_type
const std::string & name()
tlm::tlm_initiator_socket< BUSWIDTH, TYPES, N, POL > base_type
void b_transport(transaction_type &trans, sc_core::sc_time &t)
sync_enum_type nb_transport_bw(transaction_type &txn, phase_type &p, sc_core::sc_time &t)
void set_start_address(sc_dt::uint64 addr)
const char * sc_gen_unique_name(const char *seed)
multi_target_base(const char *name)
virtual ~multi_init_base_if()
sc_core::sc_port_base * get_other_side()
callback_binder_bw(multi_socket_base *owner, int id)
virtual tlm::tlm_socket_category get_socket_category() const
unsigned int transport_dbg(transaction_type &trans)
get_dmi_ptr_functor< TYPES > dmi_func_type
multi_init_base(const char *name)
const sc_core::sc_object * get_socket() const
nb_transport_functor< TYPES > nb_func_type
virtual ~multi_target_base()
tlm::tlm_sync_enum sync_enum_type
void register_port(sc_core::sc_port_base &b, const char *)
void set_callbacks(nb_func_type &cb1, dmi_func_type &cb2)
TYPES::tlm_payload_type transaction_type
bool get_direct_mem_ptr(transaction_type &trans, tlm::tlm_dmi &dmi_data)
virtual tlm::tlm_socket_category get_socket_category() const
virtual ~multi_to_multi_bind_base()
nb_transport_functor< TYPES > nb_func_type
sync_enum_type nb_transport_fw(transaction_type &txn, phase_type &p, sc_core::sc_time &t)
void set_callbacks(nb_func_type &cb1, b_func_type &cb2, dmi_func_type &cb3, debug_func_type &cb4)
tlm::tlm_target_socket< BUSWIDTH, TYPES, N, POL > base_type
tlm::tlm_sync_enum sync_enum_type
sc_core::sc_port_base * m_caller_port
debug_func_type * m_dbg_f
virtual ~multi_init_base()
void invalidate_direct_mem_ptr(sc_dt::uint64 l, sc_dt::uint64 u)
invalidate_dmi_functor< TYPES > dmi_func_type
const sc_core::sc_object * get_socket() const
TYPES::tlm_payload_type transaction_type
void set_end_address(sc_dt::uint64 addr)
callback_binder_fw(multi_socket_base *owner, int id)
TLM_DEFINE_FUNCTOR(nb_transport)
virtual ~multi_target_base_if()
TYPES::tlm_phase_type phase_type
TYPES::tlm_phase_type phase_type