20 #ifndef __SYSTEMC_EXT_TLM_UTILS_SIMPLE_TARGET_SOCKET_H__ 21 #define __SYSTEMC_EXT_TLM_UTILS_SIMPLE_TARGET_SOCKET_H__ 23 #include "../core/sc_event.hh" 24 #include "../core/sc_module.hh" 25 #include "../core/sc_port.hh" 26 #include "../core/sc_spawn.hh" 27 #include "../tlm_core/2/generic_payload/gp.hh" 28 #include "../tlm_core/2/interfaces/fw_bw_ifs.hh" 29 #include "../tlm_core/2/sockets/initiator_socket.hh" 30 #include "../tlm_core/2/sockets/target_socket.hh" 31 #include "../utils/sc_report_handler.hh" 38 template <
typename MODULE,
unsigned int BUSWIDTH,
typename TYPES,
75 sync_enum_type (MODULE::*cb)(
92 unsigned int (MODULE::*cb)(transaction_type &))
140 typename std::map<transaction_type *,
158 it->second->notify(t);
182 typedef void (MODULE::*BTransportPtr)(
184 typedef unsigned int (MODULE::*TransportDbgPtr)(transaction_type &);
185 typedef bool (MODULE::*GetDirectMemPtr)(
189 m_owner(p_own), m_mod(0), m_nb_transport_ptr(0),
190 m_b_transport_ptr(0), m_transport_dbg_ptr(0),
191 m_get_direct_mem_ptr(0),
193 m_response_in_progress(false)
200 if (!m_b_transport_ptr && m_nb_transport_ptr) {
212 if (m_nb_transport_ptr) {
214 "non-blocking callback already registered");
219 m_nb_transport_ptr =
p;
225 if (m_b_transport_ptr) {
227 "blocking callback already registered");
232 m_b_transport_ptr =
p;
238 if (m_transport_dbg_ptr) {
244 m_transport_dbg_ptr =
p;
250 if (m_get_direct_mem_ptr) {
252 "get DMI pointer callback already registered");
257 m_get_direct_mem_ptr =
p;
265 if (m_nb_transport_ptr) {
268 return (m_mod->*m_nb_transport_ptr)(trans, phase,
t);
272 if (m_b_transport_ptr) {
276 m_process_handle.get_handle(&trans);
280 m_process_handle.put_handle(ph);
296 m_response_in_progress =
false;
297 m_end_response.notify(t);
304 "no non-blocking transport callback registered");
311 if (m_b_transport_ptr) {
314 (m_mod->*m_b_transport_ptr)(trans, t);
319 if (m_nb_transport_ptr) {
320 m_peq.notify(trans, t);
324 const bool mm_added = !trans.has_mm();
328 trans.set_auto_extension(&mm_ext);
341 if (trans.get_ref_count()) {
351 "no blocking transport callback registered");
357 if (m_transport_dbg_ptr) {
360 return (m_mod->*m_transport_dbg_ptr)(trans);
369 if (m_get_direct_mem_ptr) {
372 return (m_mod->*m_get_direct_mem_ptr)(trans, dmi_data);
389 m_trans(trans), m_suspend(false)
406 end =
v.end(); it != end; ++it) {
416 for (it =
v.begin(); it !=
v.end(); it++) {
417 if ((*it)->m_suspend) {
419 (*it)->m_trans = trans;
420 (*it)->m_suspend =
false;
443 transaction_type *trans = h->
m_trans;
448 (m_mod->*m_b_transport_ptr)(*trans, t);
453 while (m_response_in_progress) {
458 sync_enum_type sync =
463 m_response_in_progress =
true;
476 transaction_type *trans;
477 while ((trans = m_peq.get_next_transaction()) != 0) {
483 switch ((m_mod->*m_nb_transport_ptr)(*trans, phase, t)) {
487 typename std::map<transaction_type *,
491 it->second->notify(t);
515 (m_mod->*m_nb_transport_ptr)(
519 typename std::map<transaction_type *,
525 it->second->notify(t);
547 trans->template get_extension<mm_end_event_ext>();
586 template <
typename MODULE,
unsigned int BUSWIDTH=32,
597 template <
typename MODULE,
unsigned int BUSWIDTH=32,
601 sc_core::SC_ZERO_OR_MORE_BOUND>
613 template <
typename MODULE,
unsigned int BUSWIDTH,
typename TYPES,
650 sync_enum_type (MODULE::*cb)(
int id, transaction_type &,
661 void (MODULE::*cb)(
int id, transaction_type &,
672 unsigned int (MODULE::*cb)(
int id, transaction_type &),
int id)
681 bool (MODULE::*cb)(
int id, transaction_type &,
tlm::tlm_dmi &),
723 typename std::map<transaction_type *,
739 it->second->notify(t);
762 int id, transaction_type &, phase_type &,
764 typedef void (MODULE::*BTransportPtr)(
766 typedef unsigned int (MODULE::*TransportDbgPtr)(
767 int id, transaction_type &);
768 typedef bool (MODULE::*GetDirectMemPtr)(
772 m_owner(p_own), m_mod(0), m_nb_transport_ptr(0),
773 m_b_transport_ptr(0), m_transport_dbg_ptr(0),
774 m_get_direct_mem_ptr(0), m_nb_transport_user_id(0),
775 m_b_transport_user_id(0), m_transport_dbg_user_id(0),
776 m_get_dmi_user_id(0),
778 m_response_in_progress(false)
784 if (!m_b_transport_ptr && m_nb_transport_ptr) {
799 m_transport_dbg_user_id =
id;
806 if (m_nb_transport_ptr) {
808 "non-blocking callback already registered");
813 m_nb_transport_ptr =
p;
819 if (m_b_transport_ptr) {
821 "blocking callback already registered");
826 m_b_transport_ptr =
p;
832 if (m_transport_dbg_ptr) {
834 "debug callback already registered");
839 m_transport_dbg_ptr =
p;
845 if (m_get_direct_mem_ptr) {
847 "get DMI pointer callback already registered");
851 m_get_direct_mem_ptr =
p;
859 if (m_nb_transport_ptr) {
862 return (m_mod->*m_nb_transport_ptr)(
863 m_nb_transport_user_id, trans, phase,
t);
867 if (m_b_transport_ptr) {
872 m_process_handle.get_handle(&trans);
876 m_process_handle.put_handle(ph);
892 m_response_in_progress =
false;
893 m_end_response.notify(t);
901 "no non-blocking transport callback registered");
908 if (m_b_transport_ptr) {
911 (m_mod->*m_b_transport_ptr)(m_b_transport_user_id, trans, t);
916 if (m_nb_transport_ptr) {
917 m_peq.notify(trans, t);
921 const bool mm_added = !trans.has_mm();
925 trans.set_auto_extension(&mm_ext);
938 if (trans.get_ref_count()) {
952 if (m_transport_dbg_ptr) {
955 return (m_mod->*m_transport_dbg_ptr)(
956 m_transport_dbg_user_id, trans);
965 if (m_get_direct_mem_ptr) {
968 return (m_mod->*m_get_direct_mem_ptr)(
969 m_get_dmi_user_id, trans, dmi_data);
985 m_trans(trans), m_suspend(false)
1002 end =
v.end(); it != end; ++it) {
1012 for (it =
v.begin(); it !=
v.end(); it++) {
1013 if ((*it)->m_suspend) {
1015 (*it)->m_trans = trans;
1016 (*it)->m_suspend =
false;
1036 transaction_type *trans = h->
m_trans;
1041 (m_mod->*m_b_transport_ptr)(
1042 m_b_transport_user_id, *trans, t);
1047 while (m_response_in_progress) {
1052 sync_enum_type sync =
1057 m_response_in_progress =
true;
1070 transaction_type *trans;
1071 while ((trans = m_peq.get_next_transaction()) != 0) {
1077 switch ((m_mod->*m_nb_transport_ptr)(
1078 m_nb_transport_user_id, *trans, phase, t)) {
1082 typename std::map<transaction_type *,
1086 it->second->notify(t);
1110 (m_mod->*m_nb_transport_ptr)(
1111 m_nb_transport_user_id,
1115 typename std::map<transaction_type *,
1121 it->second->notify(t);
1143 trans->template get_extension<mm_end_event_ext>();
1186 template <
typename MODULE,
unsigned int BUSWIDTH=32,
1197 template <
typename MODULE,
unsigned int BUSWIDTH=32,
1201 sc_core::SC_ZERO_OR_MORE_BOUND>
peq_with_get< transaction_type > m_peq
void register_b_transport(MODULE *mod, void(MODULE::*cb)(int id, transaction_type &, sc_core::sc_time &), int id)
void set_nb_transport_user_id(int id)
process_handle_class(transaction_type *trans)
void free(tlm::tlm_generic_payload *trans)
void start_of_simulation()
void bw_invalidate_direct_mem_ptr(sc_dt::uint64 s, sc_dt::uint64 e)
bool get_direct_mem_ptr(transaction_type &trans, tlm::tlm_dmi &dmi_data)
void register_get_direct_mem_ptr(MODULE *mod, bool(MODULE::*cb)(int id, transaction_type &, tlm::tlm_dmi &), int id)
simple_target_socket_tagged_optional(const char *name)
void start_of_simulation() override
sc_core::sc_event m_end_response
TYPES::tlm_phase_type phase_type
unsigned int transport_dbg(transaction_type &trans)
void start_of_simulation()
TYPES::tlm_payload_type transaction_type
bw_process(simple_target_socket_tagged_b *p_own)
const sc_core::sc_object * get_socket() const
GetDirectMemPtr m_get_direct_mem_ptr
void set_b_transport_user_id(int id)
transaction_type * m_trans
unsigned int transport_dbg(transaction_type &trans)
tlm::tlm_sync_enum sync_enum_type
fw_process(simple_target_socket_tagged_b *p_own)
void set_start_address(sc_dt::uint64 addr)
const char * sc_gen_unique_name(const char *seed)
TYPES::tlm_payload_type transaction_type
void copy_from(tlm::tlm_extension_base const &)
process_handle_class * get_handle(transaction_type *trans)
simple_target_socket_tagged()
sc_process_handle sc_spawn(T object, const char *name_p=nullptr, const sc_spawn_options *opt_p=nullptr)
std::map< transaction_type *, sc_core::sc_event * > m_pending_trans
const char * name() const
simple_target_socket_optional(const char *name)
tlm::tlm_fw_transport_if< TYPES > fw_interface_type
tlm::tlm_bw_transport_if< TYPES > bw_interface_type
simple_target_socket_tagged_optional()
bool get_direct_mem_ptr(transaction_type &trans, tlm::tlm_dmi &dmi_data)
std::vector< process_handle_class * > v
void copy_from(tlm::tlm_extension_base const &)
sc_core::sc_event m_end_response
simple_target_socket_tagged_b< MODULE, BUSWIDTH, TYPES > socket_b
void set_get_direct_mem_ptr(MODULE *mod, GetDirectMemPtr p)
process_handle_class(transaction_type *trans)
fw_process(simple_target_socket_b *p_own)
sync_enum_type nb_transport_fw(transaction_type &trans, phase_type &phase, sc_core::sc_time &t)
simple_target_socket_optional()
TransportDbgPtr m_transport_dbg_ptr
sync_enum_type nb_transport_fw(transaction_type &trans, phase_type &phase, sc_core::sc_time &t)
void b_transport(transaction_type &trans, sc_core::sc_time &t)
int m_nb_transport_user_id
transaction_type * m_current_transaction
bw_process(simple_target_socket_b *p_own)
void register_nb_transport_fw(MODULE *mod, sync_enum_type(MODULE::*cb)(int id, transaction_type &, phase_type &, sc_core::sc_time &), int id)
void set_nb_transport_ptr(MODULE *mod, NBTransportPtr p)
void nb2b_thread(process_handle_class *h)
virtual void bind(base_initiator_socket_type &s)
void set_nb_transport_ptr(MODULE *mod, NBTransportPtr p)
void b_transport(transaction_type &trans, sc_core::sc_time &t)
simple_target_socket_tagged_b * m_owner
virtual tlm_sync_enum nb_transport_bw(TRANS &trans, PHASE &phase, sc_core::sc_time &t)=0
static const char * default_name()
const sc_core::sc_object * get_socket() const
void set_transport_dbg_ptr(MODULE *mod, TransportDbgPtr p)
int m_b_transport_user_id
sync_enum_type nb_transport_bw(transaction_type &trans, phase_type &phase, sc_core::sc_time &t)
process_handle_list m_process_handle
simple_target_socket_b * m_owner
simple_target_socket_tagged_b * m_owner
void bw_invalidate_direct_mem_ptr(sc_dt::uint64 s, sc_dt::uint64 e)
void set_transport_dbg_ptr(MODULE *mod, TransportDbgPtr p)
NBTransportPtr m_nb_transport_ptr
simple_target_socket_b(const char *n=default_name())
TYPES::tlm_phase_type phase_type
void set_transport_dbg_user_id(int id)
void display_error(const char *msg) const
int mod(int val, int mod)
int m_transport_dbg_user_id
bool m_response_in_progress
tlm::tlm_target_socket< BUSWIDTH, TYPES, 1, POL > base_type
transaction_type * m_trans
simple_target_socket_b< MODULE, BUSWIDTH, TYPES > socket_b
tlm::tlm_sync_enum sync_enum_type
std::map< transaction_type *, sc_core::sc_event * > m_pending_trans
void register_get_direct_mem_ptr(MODULE *mod, bool(MODULE::*cb)(transaction_type &, tlm::tlm_dmi &))
void start_of_simulation()
void set_sensitivity(const sc_event *)
void invalidate_direct_mem_ptr(sc_dt::uint64 s, sc_dt::uint64 e)
void free(tlm::tlm_generic_payload *trans)
bool m_response_in_progress
simple_target_socket(const char *name)
simple_target_socket_b * m_owner
simple_target_socket_tagged_b< MODULE, BUSWIDTH, TYPES, sc_core::SC_ZERO_OR_MORE_BOUND > socket_b
void register_transport_dbg(MODULE *mod, unsigned int(MODULE::*cb)(transaction_type &))
simple_target_socket_tagged(const char *name)
const sc_time SC_ZERO_TIME
sync_enum_type bw_nb_transport(transaction_type &trans, phase_type &phase, sc_core::sc_time &t)
TransportDbgPtr m_transport_dbg_ptr
process_handle_list m_process_handle
void start_of_simulation()
NBTransportPtr m_nb_transport_ptr
void set_get_direct_mem_ptr(MODULE *mod, GetDirectMemPtr p)
simple_target_socket_b< MODULE, BUSWIDTH, TYPES, sc_core::SC_ZERO_OR_MORE_BOUND > socket_b
void put_handle(process_handle_class *ph)
transaction_type * m_current_transaction
auto sc_bind(F &&f, Args &&...args) -> decltype(std::bind(std::forward< F >(f), std::forward< Args >(args)...))
tlm::tlm_bw_transport_if< TYPES > bw_interface_type
void register_nb_transport_fw(MODULE *mod, sync_enum_type(MODULE::*cb)(transaction_type &, phase_type &, sc_core::sc_time &))
tlm::tlm_target_socket< BUSWIDTH, TYPES, 1, POL > base_type
static const char * default_name()
void display_warning(const char *msg) const
tlm::tlm_extension_base * clone() const
bw_interface_type * operator->()
tlm::tlm_fw_transport_if< TYPES > fw_interface_type
sync_enum_type bw_nb_transport(transaction_type &trans, phase_type &phase, sc_core::sc_time &t)
BTransportPtr m_b_transport_ptr
peq_with_get< transaction_type > m_peq
void register_transport_dbg(MODULE *mod, unsigned int(MODULE::*cb)(int id, transaction_type &), int id)
BTransportPtr m_b_transport_ptr
void set_get_dmi_user_id(int id)
void nb2b_thread(process_handle_class *h)
simple_target_socket_tagged_b(const char *n=default_name())
process_handle_class * get_handle(transaction_type *trans)
void set_b_transport_ptr(MODULE *mod, BTransportPtr p)
void register_b_transport(MODULE *mod, void(MODULE::*cb)(transaction_type &, sc_core::sc_time &))
sc_core::sc_event m_end_request
void set_end_address(sc_dt::uint64 addr)
GetDirectMemPtr m_get_direct_mem_ptr
std::vector< process_handle_class * > v
virtual void invalidate_direct_mem_ptr(sc_dt::uint64 start_range, sc_dt::uint64 end_range)=0
tlm::tlm_extension_base * clone() const
void elaboration_check(const char *action) const
void set_b_transport_ptr(MODULE *mod, BTransportPtr p)
void put_handle(process_handle_class *ph)
sync_enum_type nb_transport_bw(transaction_type &trans, phase_type &phase, sc_core::sc_time &t)
tlm::tlm_bw_transport_if< TYPES > * operator->()
void invalidate_direct_mem_ptr(sc_dt::uint64 s, sc_dt::uint64 e)
sc_core::sc_event m_end_request