18 #ifndef __MULTI_SOCKET_BASES_H__
19 #define __MULTI_SOCKET_BASES_H__
29 template <
typename signature>
34 #define TLM_DEFINE_FUNCTOR(name) \
35 template <typename MODULE, typename TRAITS> \
36 inline TLM_RET_VAL static_##name( void* mod \
39 , TLM_FULL_ARG_LIST) \
41 typedef fn_container<TLM_RET_VAL (MODULE::*)(int, TLM_FULL_ARG_LIST)> fn_container_type; \
42 MODULE* tmp_mod=static_cast<MODULE*>(mod); \
43 fn_container_type* tmp_cb =static_cast<fn_container_type*> (fn); \
44 return (tmp_mod->*(tmp_cb->function))(index, TLM_ARG_LIST_WITHOUT_TYPES); \
47 template <typename MODULE, typename TRAITS> \
48 inline void delete_fn_container_of_##name(void* fn) \
50 typedef fn_container<TLM_RET_VAL (MODULE::*)(int, TLM_FULL_ARG_LIST)> fn_container_type; \
51 fn_container_type* tmp_cb =static_cast<fn_container_type*> (fn); \
52 if (tmp_cb) delete tmp_cb;\
55 template <typename TRAITS> \
56 class name##_functor{ \
58 typedef typename TRAITS::tlm_payload_type payload_type; \
59 typedef typename TRAITS::tlm_phase_type phase_type; \
60 typedef TLM_RET_VAL (*call_fn)(void*,void*, int, TLM_FULL_ARG_LIST); \
61 typedef void (*del_fn)(void*); \
63 name##_functor(): m_fn(0), m_del_fn(0), m_mod(0), m_mem_fn(0){} \
64 ~name##_functor(){if (m_del_fn) (*m_del_fn)(m_mem_fn);} \
66 template <typename MODULE> \
67 void set_function(MODULE* mod, TLM_RET_VAL (MODULE::*cb)(int, TLM_FULL_ARG_LIST)){ \
68 typedef fn_container<TLM_RET_VAL (MODULE::*)(int, TLM_FULL_ARG_LIST)> fn_container_type; \
69 m_fn=&static_##name<MODULE,TRAITS>;\
70 m_del_fn=&delete_fn_container_of_##name<MODULE,TRAITS>;\
72 fn_container_type* tmp= new fn_container_type(); \
74 m_mod=static_cast<void*>(mod); \
75 m_mem_fn=static_cast<void*>(tmp); \
78 TLM_RET_VAL operator()(int index, TLM_FULL_ARG_LIST){ \
79 return m_fn(m_mod,m_mem_fn, index, TLM_ARG_LIST_WITHOUT_TYPES); \
82 bool empty(){return (m_mod==0 || m_mem_fn==0 || m_fn==0);}\
90 name##_functor& operator=(const name##_functor&); \
94 #define TLM_RET_VAL tlm::tlm_sync_enum
95 #define TLM_FULL_ARG_LIST typename TRAITS::tlm_payload_type& txn, typename TRAITS::tlm_phase_type& ph, sc_core::sc_time& t
96 #define TLM_ARG_LIST_WITHOUT_TYPES txn,ph,t
99 #undef TLM_FULL_ARG_LIST
100 #undef TLM_ARG_LIST_WITHOUT_TYPES
102 #define TLM_RET_VAL void
103 #define TLM_FULL_ARG_LIST typename TRAITS::tlm_payload_type& txn, sc_core::sc_time& t
104 #define TLM_ARG_LIST_WITHOUT_TYPES txn,t
107 #undef TLM_FULL_ARG_LIST
108 #undef TLM_ARG_LIST_WITHOUT_TYPES
110 #define TLM_RET_VAL unsigned int
111 #define TLM_FULL_ARG_LIST typename TRAITS::tlm_payload_type& txn
112 #define TLM_ARG_LIST_WITHOUT_TYPES txn
115 #undef TLM_FULL_ARG_LIST
116 #undef TLM_ARG_LIST_WITHOUT_TYPES
118 #define TLM_RET_VAL bool
119 #define TLM_FULL_ARG_LIST typename TRAITS::tlm_payload_type& txn, tlm::tlm_dmi& dmi
120 #define TLM_ARG_LIST_WITHOUT_TYPES txn,dmi
123 #undef TLM_FULL_ARG_LIST
124 #undef TLM_ARG_LIST_WITHOUT_TYPES
126 #define TLM_RET_VAL void
127 #define TLM_FULL_ARG_LIST sc_dt::uint64 l, sc_dt::uint64 u
128 #define TLM_ARG_LIST_WITHOUT_TYPES l,u
131 #undef TLM_FULL_ARG_LIST
132 #undef TLM_ARG_LIST_WITHOUT_TYPES
134 #undef TLM_DEFINE_FUNCTOR
142 template <
typename TYPES>
157 callback_binder_fw(
int id): m_id(id), m_nb_f(0), m_b_f(0), m_dbg_f(0), m_dmi_f(0), m_caller_port(0) {
165 if ((m_nb_f == 0) || (m_nb_f && m_nb_f->empty())) {
167 SC_REPORT_ERROR(
"/OSCI_TLM-2/multi_socket",
"Call to nb_transport_fw without a registered callback for nb_transport_fw.");
170 return (*m_nb_f)(m_id, txn, p, t);
177 if ((m_b_f == 0) || (m_b_f && m_b_f->empty())) {
178 SC_REPORT_ERROR(
"/OSCI_TLM-2/multi_socket",
"Call to b_transport without a registered callback for b_transport.");
181 (*m_b_f)(m_id, trans,t);
187 if ((m_dmi_f == 0) && (m_dmi_f && m_dmi_f->empty())) {
194 return (*m_dmi_f)(m_id, trans,dmi_data);
200 if ((m_dbg_f == 0) || (m_dbg_f && m_dbg_f->empty())) {
204 return (*m_dbg_f)(m_id, trans);
247 template <
typename TYPES>
268 if ((m_nb_f == 0) || (m_nb_f && m_nb_f->empty())) {
269 SC_REPORT_ERROR(
"/OSCI_TLM-2/multi_socket",
"Call to nb_transport_bw without a registered callback for nb_transport_bw");
272 return (*m_nb_f)(m_id, txn, p, t);
279 if ((m_dmi_f == 0) || (m_dmi_f && m_dmi_f->empty())) {
283 (*m_dmi_f)(m_id,l,u);
306 template <
unsigned int BUSWIDTH = 32,
309 #if !(defined SYSTEMC_VERSION & SYSTEMC_VERSION <= 20050714)
316 #if !(defined SYSTEMC_VERSION & SYSTEMC_VERSION <= 20050714)
322 typedef tlm::tlm_initiator_socket<BUSWIDTH,
325 #if !(defined SYSTEMC_VERSION & SYSTEMC_VERSION <= 20050714)
332 virtual void disable_cb_bind()=0;
337 virtual multi_init_base* get_hierarch_bind()=0;
340 virtual std::vector<callback_binder_bw<TYPES>* >& get_binders()=0;
343 virtual std::vector<tlm::tlm_fw_transport_if<TYPES>*>& get_sockets()=0;
346 virtual ~multi_init_base(){}
347 multi_init_base():base_type(sc_core::sc_gen_unique_name("multi_init_base")){}
348 multi_init_base(const char* name):base_type(name){}
356 template <unsigned int BUSWIDTH = 32,
357 typename TYPES = tlm::tlm_base_protocol_types,
359 #if !(defined SYSTEMC_VERSION & SYSTEMC_VERSION <= 20050714)
360 ,sc_core::sc_port_policy POL = sc_core::SC_ONE_OR_MORE_BOUND
363 class multi_target_base: public tlm::tlm_target_socket<BUSWIDTH,
366 #if !(defined SYSTEMC_VERSION & SYSTEMC_VERSION <= 20050714)
372 typedef tlm::tlm_target_socket<BUSWIDTH,
375 #if !(defined SYSTEMC_VERSION & SYSTEMC_VERSION <= 20050714)
383 virtual multi_target_base* get_hierarch_bind()=0;
387 virtual void set_hierarch_bind(multi_target_base*)=0;
390 virtual std::vector<callback_binder_fw<TYPES>* >& get_binders()=0;
395 virtual std::map<unsigned int, tlm::tlm_bw_transport_if<TYPES>*>& get_multi_binds()=0;
398 virtual ~multi_target_base(){}
399 multi_target_base():base_type(sc_core::sc_gen_unique_name("multi_target_base")){}
400 multi_target_base(const char* name):base_type(name){}
408 template <typename TYPES>
409 class multi_to_multi_bind_base{
411 virtual ~multi_to_multi_bind_base(){}
412 virtual tlm::tlm_fw_transport_if<TYPES>* get_last_binder(tlm::tlm_bw_transport_if<TYPES>*)=0;
sc_core::sc_port_base * get_other_side()
get_dmi_ptr_functor< TYPES > dmi_func_type
b_transport_functor< TYPES > b_func_type
tlm::tlm_sync_enum sync_enum_type
unsigned int transport_dbg(transaction_type &trans)
void set_end_address(sc_dt::uint64 addr)
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)
void set_start_address(sc_dt::uint64 addr)
debug_transport_functor< TYPES > debug_func_type
TYPES::tlm_phase_type phase_type
nb_transport_functor< TYPES > nb_func_type
void register_port(sc_core::sc_port_base &b, const char *name)
void b_transport(transaction_type &trans, sc_core::sc_time &t)
void invalidate_direct_mem_ptr(sc_dt::uint64 l, sc_dt::uint64 u)
TYPES::tlm_payload_type transaction_type
callback_binder_bw(int id)
TYPES::tlm_payload_type transaction_type
sync_enum_type nb_transport_bw(transaction_type &txn, phase_type &p, sc_core::sc_time &t)
callback_binder_fw(int id)
TLM_DEFINE_FUNCTOR(nb_transport)
void set_callbacks(nb_func_type &cb1, b_func_type &cb2, dmi_func_type &cb3, debug_func_type &cb4)
bool get_direct_mem_ptr(transaction_type &trans, tlm::tlm_dmi &dmi_data)
#define SC_REPORT_ERROR(msg_type, msg)
TYPES::tlm_phase_type phase_type
invalidate_dmi_functor< TYPES > dmi_func_type
tlm::tlm_sync_enum sync_enum_type
nb_transport_functor< TYPES > nb_func_type