20 #ifndef TLM_UTILS_MULTI_SOCKET_BASES_H_INCLUDED_ 21 #define TLM_UTILS_MULTI_SOCKET_BASES_H_INCLUDED_ 30 template <
typename signature>
35 #define TLM_DEFINE_FUNCTOR(name) \ 36 template <typename MODULE, typename TRAITS> \ 37 inline TLM_RET_VAL static_##name( void* mod \ 40 , TLM_FULL_ARG_LIST) \ 42 typedef fn_container<TLM_RET_VAL (MODULE::*)(int, TLM_FULL_ARG_LIST)> fn_container_type; \ 43 MODULE* tmp_mod=static_cast<MODULE*>(mod); \ 44 fn_container_type* tmp_cb =static_cast<fn_container_type*> (fn); \ 45 return (tmp_mod->*(tmp_cb->function))(index, TLM_ARG_LIST_WITHOUT_TYPES); \ 48 template <typename MODULE, typename TRAITS> \ 49 inline void delete_fn_container_of_##name(void* fn) \ 51 typedef fn_container<TLM_RET_VAL (MODULE::*)(int, TLM_FULL_ARG_LIST)> fn_container_type; \ 52 fn_container_type* tmp_cb =static_cast<fn_container_type*> (fn); \ 53 if (tmp_cb) delete tmp_cb;\ 56 template <typename TRAITS> \ 57 class name##_functor{ \ 59 typedef typename TRAITS::tlm_payload_type payload_type; \ 60 typedef typename TRAITS::tlm_phase_type phase_type; \ 61 typedef TLM_RET_VAL (*call_fn)(void*,void*, int, TLM_FULL_ARG_LIST); \ 62 typedef void (*del_fn)(void*); \ 64 name##_functor(): m_fn(0), m_del_fn(0), m_mod(0), m_mem_fn(0){} \ 65 ~name##_functor(){if (m_del_fn) (*m_del_fn)(m_mem_fn);} \ 67 template <typename MODULE> \ 68 void set_function(MODULE* mod, TLM_RET_VAL (MODULE::*cb)(int, TLM_FULL_ARG_LIST)){ \ 69 typedef fn_container<TLM_RET_VAL (MODULE::*)(int, TLM_FULL_ARG_LIST)> fn_container_type; \ 70 m_fn=&static_##name<MODULE,TRAITS>;\ 71 m_del_fn=&delete_fn_container_of_##name<MODULE,TRAITS>;\ 73 fn_container_type* tmp= new fn_container_type(); \ 75 m_mod=static_cast<void*>(mod); \ 76 m_mem_fn=static_cast<void*>(tmp); \ 79 TLM_RET_VAL operator()(int index, TLM_FULL_ARG_LIST){ \ 80 return m_fn(m_mod,m_mem_fn, index, TLM_ARG_LIST_WITHOUT_TYPES); \ 83 bool is_valid(){return (m_mod!=0 && m_mem_fn!=0 && m_fn!=0);}\ 91 name##_functor& operator=(const name##_functor&); \ 95 #define TLM_RET_VAL tlm::tlm_sync_enum 96 #define TLM_FULL_ARG_LIST typename TRAITS::tlm_payload_type& txn, typename TRAITS::tlm_phase_type& ph, sc_core::sc_time& t 97 #define TLM_ARG_LIST_WITHOUT_TYPES txn,ph,t 100 #undef TLM_FULL_ARG_LIST 101 #undef TLM_ARG_LIST_WITHOUT_TYPES 103 #define TLM_RET_VAL void 104 #define TLM_FULL_ARG_LIST typename TRAITS::tlm_payload_type& txn, sc_core::sc_time& t 105 #define TLM_ARG_LIST_WITHOUT_TYPES txn,t 108 #undef TLM_FULL_ARG_LIST 109 #undef TLM_ARG_LIST_WITHOUT_TYPES 111 #define TLM_RET_VAL unsigned int 112 #define TLM_FULL_ARG_LIST typename TRAITS::tlm_payload_type& txn 113 #define TLM_ARG_LIST_WITHOUT_TYPES txn 116 #undef TLM_FULL_ARG_LIST 117 #undef TLM_ARG_LIST_WITHOUT_TYPES 119 #define TLM_RET_VAL bool 120 #define TLM_FULL_ARG_LIST typename TRAITS::tlm_payload_type& txn, tlm::tlm_dmi& dmi 121 #define TLM_ARG_LIST_WITHOUT_TYPES txn,dmi 124 #undef TLM_FULL_ARG_LIST 125 #undef TLM_ARG_LIST_WITHOUT_TYPES 127 #define TLM_RET_VAL void 128 #define TLM_FULL_ARG_LIST sc_dt::uint64 l, sc_dt::uint64 u 129 #define TLM_ARG_LIST_WITHOUT_TYPES l,u 132 #undef TLM_FULL_ARG_LIST 133 #undef TLM_ARG_LIST_WITHOUT_TYPES 135 #undef TLM_DEFINE_FUNCTOR 143 template <
typename TYPES>
163 , m_nb_f(0), m_b_f(0), m_dbg_f(0), m_dmi_f(0)
172 if (m_nb_f && m_nb_f->is_valid()) {
173 return (*m_nb_f)(m_id, txn, p, t);
176 display_error(
"Call to nb_transport_fw without a registered callback for nb_transport_fw.");
183 if (m_b_f && m_b_f->is_valid()) {
184 (*m_b_f)(m_id, trans,t);
188 display_error(
"Call to b_transport without a registered callback for b_transport.");
194 if (m_dmi_f && m_dmi_f->is_valid()) {
195 return (*m_dmi_f)(m_id, trans,dmi_data);
207 if (m_dbg_f && m_dbg_f->is_valid()) {
208 return (*m_dbg_f)(m_id, trans);
222 void set_callbacks(nb_func_type& cb1, b_func_type& cb2, dmi_func_type& cb3, debug_func_type& cb4){
239 nb_func_type* m_nb_f;
241 debug_func_type* m_dbg_f;
242 dmi_func_type* m_dmi_f;
254 template <
typename TYPES>
272 , m_nb_f(0), m_dmi_f(0) {}
279 if (m_nb_f && m_nb_f->is_valid()) {
280 return (*m_nb_f)(m_id, txn, p, t);
283 display_error(
"Call to nb_transport_bw without a registered callback for nb_transport_bw");
290 if (m_dmi_f && m_dmi_f->is_valid()) {
291 (*m_dmi_f)(m_id,l,u);
305 nb_func_type* m_nb_f;
306 dmi_func_type* m_dmi_f;
314 template <
typename TYPES = tlm::tlm_base_protocol_types>
318 virtual std::vector<callback_binder_bw<TYPES>* >& get_binders()=0;
320 virtual std::vector<tlm::tlm_fw_transport_if<TYPES>*>& get_sockets()=0;
330 template <
unsigned int BUSWIDTH = 32,
345 virtual void disable_cb_bind()=0;
371 template <
typename TYPES = tlm::tlm_base_protocol_types>
375 virtual std::vector<callback_binder_fw<TYPES>* >& get_binders()=0;
381 virtual std::map<unsigned int, tlm::tlm_bw_transport_if<TYPES>*>& get_multi_binds()=0;
391 template <
unsigned int BUSWIDTH = 32,
432 template <
typename TYPES>
440 #endif // TLM_UTILS_MULTI_SOCKET_BASES_H_INCLUDED_ b_transport_functor< TYPES > b_func_type
multi_target_base(const char *name)
invalidate_dmi_functor< TYPES > dmi_func_type
TLM_DEFINE_FUNCTOR(nb_transport)
nb_transport_functor< TYPES > nb_func_type
tlm::tlm_sync_enum sync_enum_type
bool get_direct_mem_ptr(transaction_type &trans, tlm::tlm_dmi &dmi_data)
virtual ~multi_to_multi_bind_base()
get_dmi_ptr_functor< TYPES > dmi_func_type
void set_callbacks(nb_func_type &cb1, dmi_func_type &cb2)
sync_enum_type nb_transport_fw(transaction_type &txn, phase_type &p, sc_core::sc_time &t)
nb_transport_functor< TYPES > nb_func_type
virtual tlm::tlm_socket_category get_socket_category() const
TYPES::tlm_phase_type phase_type
callback_binder_fw(multi_socket_base *owner, int id)
tlm::tlm_target_socket< BUSWIDTH, TYPES, N, POL > base_type
void set_start_address(sc_dt::uint64 addr)
void register_port(sc_core::sc_port_base &b, const char *)
callback_binder_bw(multi_socket_base *owner, int id)
void set_callbacks(nb_func_type &cb1, b_func_type &cb2, dmi_func_type &cb3, debug_func_type &cb4)
sync_enum_type nb_transport_bw(transaction_type &txn, phase_type &p, sc_core::sc_time &t)
void invalidate_direct_mem_ptr(sc_dt::uint64 l, sc_dt::uint64 u)
virtual ~multi_target_base_if()
void b_transport(transaction_type &trans, sc_core::sc_time &t)
tlm::tlm_initiator_socket< BUSWIDTH, TYPES, N, POL > base_type
sc_core::sc_port_base * get_other_side()
TYPES::tlm_payload_type transaction_type
multi_init_base(const char *name)
virtual ~multi_init_base()
virtual ~multi_target_base()
SC_API const char * sc_gen_unique_name(const char *, bool preserve_first)
unsigned int transport_dbg(transaction_type &trans)
virtual tlm::tlm_socket_category get_socket_category() const
TYPES::tlm_phase_type phase_type
tlm::tlm_sync_enum sync_enum_type
debug_transport_functor< TYPES > debug_func_type
virtual ~multi_init_base_if()
void set_end_address(sc_dt::uint64 addr)
TYPES::tlm_payload_type transaction_type