17 #ifndef __MULTI_PASSTHROUGH_INITIATOR_SOCKET_H__
18 #define __MULTI_PASSTHROUGH_INITIATOR_SOCKET_H__
35 template <
typename MODULE,
36 unsigned int BUSWIDTH = 32,
39 #if !(defined SYSTEMC_VERSION & SYSTEMC_VERSION <= 20050714)
46 #if !(defined SYSTEMC_VERSION & SYSTEMC_VERSION <= 20050714)
56 typedef typename TYPES::tlm_payload_type transaction_type;
57 typedef typename TYPES::tlm_phase_type phase_type;
58 typedef tlm::tlm_sync_enum sync_enum_type;
61 typedef sync_enum_type (MODULE::*nb_cb)(int,
65 typedef void (MODULE::*dmi_cb)(int, sc_dt::uint64, sc_dt::uint64);
67 typedef multi_init_base<BUSWIDTH,
70 #if !(defined SYSTEMC_VERSION & SYSTEMC_VERSION <= 20050714)
75 typedef typename base_type::base_target_socket_type base_target_socket_type;
78 multi_passthrough_initiator_socket()
79 : base_type(sc_core::sc_gen_unique_name("multi_passthrough_initiator_socket"))
81 , m_beoe_disabled(false)
87 multi_passthrough_initiator_socket(const char* name)
90 , m_beoe_disabled(false)
95 ~multi_passthrough_initiator_socket(){
97 for (unsigned int i=0; i<m_binders.size(); i++) delete m_binders[i];
101 void display_warning(const std::string& text) const {
103 s<<"WARNING in instance "<<base_type::name()<<": "<<text;
104 SC_REPORT_WARNING("/OSCI_TLM-2/multi_socket", s.str().c_str());
107 void display_error(const std::string& text) const {
109 s<<"ERROR in instance "<<base_type::name()<<": "<<text;
110 SC_REPORT_ERROR("/OSCI_TLM-2/multi_socket", s.str().c_str());
115 void register_nb_transport_bw(MODULE* mod,
116 sync_enum_type (MODULE::*cb)(int,
122 if (!m_nb_f.empty()){
123 display_warning("NBTransport_bw callback already registered.");
128 m_nb_f.set_function(mod, cb);
132 void register_invalidate_direct_mem_ptr(MODULE* mod,
133 void (MODULE::*cb)(int, sc_dt::uint64, sc_dt::uint64))
136 if (!m_dmi_f.empty()){
137 display_warning("InvalidateDMI callback already registered.");
142 m_dmi_f.set_function(mod, cb);
150 virtual tlm::tlm_bw_transport_if<TYPES>& get_base_interface()
152 m_binders.push_back(new callback_binder_bw<TYPES>(m_binders.size()));
153 return *m_binders[m_binders.size()-1];
157 virtual const tlm::tlm_bw_transport_if<TYPES>& get_base_interface() const
159 display_error("'get_base_interface()' const not allowed for multi-sockets.");
160 return base_type::get_base_interface();
167 virtual sc_core::sc_export<tlm::tlm_bw_transport_if<TYPES> >& get_base_export()
169 if (!m_beoe_disabled)
170 base_type::m_export.bind(m_dummy);
171 return base_type::get_base_export();
174 virtual const sc_core::sc_export<tlm::tlm_bw_transport_if<TYPES> >& get_base_export() const
176 return base_type::get_base_export();
180 virtual void bind(base_target_socket_type& s)
184 display_error("Already hierarchically bound.");
189 sc_core::sc_export<tlm::tlm_fw_transport_if<TYPES> >* p_ex_s=dynamic_cast<sc_core::sc_export<tlm::tlm_fw_transport_if<TYPES> >*>(&s);
190 if (!p_ex_s) display_error("Multi socket not bound to tlm_socket.");
193 multi_to_multi_bind_base<TYPES>* test=dynamic_cast<multi_to_multi_bind_base<TYPES>*> (p_ex_s);
198 m_sockets.push_back(test->get_last_binder(m_binders[m_binders.size()-1]));
200 sc_core::sc_export<tlm::tlm_fw_transport_if<TYPES> >& ex_s=*p_ex_s;
201 m_sockets.push_back(&((tlm::tlm_fw_transport_if<TYPES>&)ex_s));
206 void operator() (base_target_socket_type& s)
212 void before_end_of_elaboration(){
217 if (!base_type::m_export.get_interface()){
218 base_type::m_export.bind(m_dummy);
222 if (m_beoe_disabled) return;
226 std::vector<callback_binder_bw<TYPES>* >& binders=get_hierarch_bind()->get_binders();
230 m_used_sockets=get_hierarch_bind()->get_sockets();
234 for (unsigned int i=0; i<binders.size(); i++) {
235 binders[i]->set_callbacks(m_nb_f, m_dmi_f);
242 virtual void bind(base_type& s)
244 if (m_binders.size())
245 display_error("Socket already directly bound.");
246 if (m_hierarch_bind){
247 display_warning("Socket already bound hierarchically. Bind attempt ignored.");
259 void operator() (base_type& s)
265 tlm::tlm_fw_transport_if<TYPES>* operator[](int i){return m_used_sockets[i];}
269 unsigned int size() {return get_hierarch_bind()->get_sockets().size();}
273 base_type* get_hierarch_bind(){if (m_hierarch_bind) return m_hierarch_bind->get_hierarch_bind(); else return this;}
274 void disable_cb_bind(){ m_beoe_disabled=true;}
275 std::vector<callback_binder_bw<TYPES>* >& get_binders(){return m_binders;}
276 std::vector<tlm::tlm_fw_transport_if<TYPES>*>& get_sockets(){return m_sockets;}
278 std::vector<tlm::tlm_fw_transport_if<TYPES>*> m_sockets;
279 std::vector<tlm::tlm_fw_transport_if<TYPES>*> m_used_sockets;
281 std::vector<callback_binder_bw<TYPES>*> m_binders;
283 base_type* m_hierarch_bind;
284 bool m_beoe_disabled;
285 callback_binder_bw<TYPES> m_dummy;
291 typename callback_binder_bw<TYPES>::nb_func_type m_nb_f;
292 typename callback_binder_bw<TYPES>::dmi_func_type m_dmi_f;