17 #ifndef _SCC_TAGGED_INITIATOR_MIXIN_H__
18 #define _SCC_TAGGED_INITIATOR_MIXIN_H__
21 #include <scc/utilities.h>
32 template <
typename BASE_TYPE,
typename TYPES = tlm::tlm_base_protocol_types>
class tagged_initiator_mixin :
public BASE_TYPE {
34 using transaction_type =
typename TYPES::tlm_payload_type;
35 using phase_type =
typename TYPES::tlm_phase_type;
36 using sync_enum_type = tlm::tlm_sync_enum;
37 using fw_interface_type = tlm::tlm_fw_transport_if<TYPES>;
38 using bw_interface_type = tlm::tlm_bw_transport_if<TYPES>;
45 : BASE_TYPE(sc_core::sc_gen_unique_name(
"tagged_initiator_socket"))
46 , bw_if(this->name()) {
47 this->m_export.bind(bw_if);
55 , bw_if(this->name()) {
56 this->m_export.bind(bw_if);
63 void register_nb_transport_bw(std::function<sync_enum_type(
unsigned int, transaction_type&, phase_type&, sc_core::sc_time&)> cb,
65 bw_if.set_transport_function(cb, tag);
73 bw_if.set_invalidate_direct_mem_function(cb, tag);
77 class bw_transport_if :
public tlm::tlm_bw_transport_if<TYPES> {
79 using transport_fct = std::function<sync_enum_type(
unsigned int, transaction_type&, phase_type&, sc_core::sc_time&)>;
80 using invalidate_dmi_fct = std::function<void(
unsigned int, sc_dt::uint64, sc_dt::uint64)>;
82 bw_transport_if(
const std::string& name)
85 , m_invalidate_direct_mem_ptr(0) {}
87 void set_transport_function(transport_fct p,
unsigned int tag) {
90 s << m_name <<
": non-blocking callback allready registered";
91 SC_REPORT_WARNING(
"/OSCI_TLM-2/simple_socket", s.str().c_str());
98 void set_invalidate_direct_mem_function(invalidate_dmi_fct p,
unsigned int tag) {
99 if(m_invalidate_direct_mem_ptr) {
101 s << m_name <<
": invalidate DMI callback allready registered";
102 SC_REPORT_WARNING(
"/OSCI_TLM-2/simple_socket", s.str().c_str());
104 m_invalidate_direct_mem_ptr = p;
109 sync_enum_type nb_transport_bw(transaction_type& trans, phase_type& phase, sc_core::sc_time& t) {
111 return m_transport_ptr(tags[0], trans, phase, t);
113 s << m_name <<
": no transport callback registered";
114 SC_REPORT_ERROR(
"/OSCI_TLM-2/tagged_initiator_mixin", s.str().c_str());
115 return tlm::TLM_ACCEPTED;
118 void invalidate_direct_mem_ptr(sc_dt::uint64 start_range, sc_dt::uint64 end_range) {
119 if(m_invalidate_direct_mem_ptr)
120 m_invalidate_direct_mem_ptr(tags[1], start_range, end_range);
124 const std::string m_name;
125 unsigned int tags[2];
126 transport_fct m_transport_ptr;
127 invalidate_dmi_fct m_invalidate_direct_mem_ptr;
131 bw_transport_if bw_if;
void register_nb_transport_bw(std::function< sync_enum_type(unsigned int, transaction_type &, phase_type &, sc_core::sc_time &)> cb, unsigned int tag)
void register_invalidate_direct_mem_ptr(std::function< void(unsigned int, sc_dt::uint64, sc_dt::uint64)> cb, unsigned int tag)
tagged_initiator_mixin(const char *n)