21template <
unsigned int INPUT_BUSWIDTH = DEFAULT_TLM_BUSWIDTH, 
unsigned int OUTPUT_BUSWIDTH = DEFAULT_TLM_BUSWIDTH>
 
   27    using tlm_initiator_socket_t = tlm_utils::simple_initiator_socket_b<
 
   29    using tlm_target_socket_t = tlm_utils::simple_target_socket_tagged_b<
 
   30        MOD, 
INPUT_BUSWIDTH, tlm::tlm_base_protocol_types, sc_core::SC_ZERO_OR_MORE_BOUND>;
 
   34        : sc_core::sc_module(
nm)
 
   35        , initiator_sockets(
"initiator_socket")
 
   36        , target_sockets(
"target_socket")
 
   37        , p_tlm_ports_num(
"tlm_ports_num", 1, 
"number of tlm ports")
 
   39        SCP_DEBUG(()) << 
"tlm_bus_width_bridges constructor";
 
   40        initiator_sockets.init(p_tlm_ports_num.get_value(),
 
   41                               [
this](
const char* 
n, 
int i) { return new tlm_initiator_socket_t(n); });
 
   42        target_sockets.init(p_tlm_ports_num.get_value(),
 
   43                            [
this](
const char* 
n, 
int i) { return new tlm_target_socket_t(n); });
 
   44        for (
uint32_t i = 0; 
i < p_tlm_ports_num.get_value(); 
i++) {
 
   45            target_sockets[
i].register_b_transport(
this, &MOD::b_transport, 
i);
 
   46            target_sockets[
i].register_transport_dbg(
this, &MOD::transport_dbg, 
i);
 
   47            target_sockets[
i].register_get_direct_mem_ptr(
this, &MOD::get_direct_mem_ptr, 
i);
 
   48            initiator_sockets[
i].register_invalidate_direct_mem_ptr(
this, &MOD::invalidate_direct_mem_ptr);
 
   53    void b_transport(
int id, tlm::tlm_generic_payload& 
trans, sc_core::sc_time& delay)
 
   55        SCP_DEBUG(()) << 
"calling b_transport: " << scp::scp_txn_tostring(
trans);
 
   56        initiator_sockets[id]->b_transport(
trans, delay);
 
   57        SCP_DEBUG(()) << 
"returning from b_transport: " << scp::scp_txn_tostring(
trans);
 
   60    unsigned int transport_dbg(
int id, tlm::tlm_generic_payload& 
trans)
 
   62        SCP_DEBUG(()) << 
"calling dbg_transport: " << scp::scp_txn_tostring(
trans);
 
   63        return initiator_sockets[id]->transport_dbg(
trans);
 
   66    bool get_direct_mem_ptr(
int id, tlm::tlm_generic_payload& 
trans, tlm::tlm_dmi& dmi_data)
 
   68        SCP_DEBUG(()) << 
"DMI to " << 
trans.get_address() << 
" range " << std::hex << dmi_data.get_start_address()
 
   69                      << 
" - " << std::hex << dmi_data.get_end_address();
 
   71        return initiator_sockets[id]->get_direct_mem_ptr(
trans, dmi_data);
 
   74    void invalidate_direct_mem_ptr(sc_dt::uint64 start, sc_dt::uint64 end)
 
   76        SCP_DEBUG(()) << 
" invalidate_direct_mem_ptr " 
   77                      << 
" start address 0x" << std::hex << start << 
" end address 0x" << std::hex << end;
 
   79        for (
long unsigned int i = 0; 
i < target_sockets.size(); 
i++) {
 
   80            target_sockets[
i]->invalidate_direct_mem_ptr(start, end);
 
   89    sc_core::sc_vector<tlm_initiator_socket_t> initiator_sockets;
 
   90    sc_core::sc_vector<tlm_target_socket_t> target_sockets;
 
   91    cci::cci_param<uint32_t> p_tlm_ports_num;