25class pass : 
public sc_core::sc_module
 
   30    void alias_preset_param(std::string 
a, std::string 
b, 
bool required = 
false)
 
   32        if (gs::cci_get<std::string>(m_broker, 
a, 
b)) {
 
   33            m_broker.set_preset_cci_value(
b, m_broker.get_preset_cci_value(
a));
 
   34            m_broker.lock_preset_value(
a);
 
   35            m_broker.ignore_unconsumed_preset_values(
 
   36                [
a](
const std::pair<std::string, cci::cci_value>& 
iv) -> 
bool { 
return iv.first == 
a; });
 
   44    template <
typename MOD>
 
   45    class initiator_socket_spying : 
public tlm_utils::simple_initiator_socket<MOD, BUSWIDTH>
 
   47        using typename tlm_utils::simple_initiator_socket<MOD, BUSWIDTH>::base_target_socket_type;
 
   49        const std::function<
void(std::string)> register_cb;
 
   52        initiator_socket_spying(
const char* name, 
const std::function<
void(std::string)>& 
f)
 
   53            : tlm_utils::simple_initiator_socket<MOD, BUSWIDTH>::simple_initiator_socket(name), register_cb(
f)
 
   59            tlm_utils::simple_initiator_socket<MOD, BUSWIDTH>::bind(socket);
 
   60            register_cb(socket.get_base_export().name());
 
   64        void bind(tlm::tlm_initiator_socket<BUSWIDTH>& socket)
 
   66            tlm_utils::simple_initiator_socket<MOD, BUSWIDTH>::bind(socket);
 
   67            register_cb(socket.get_base_port().name());
 
   72    std::string nameFromSocket(std::string s) { 
return s; }
 
   73    void register_boundto(std::string s)
 
   75        s = nameFromSocket(s);
 
   76        alias_preset_param(s + 
".address", std::string(name()) + 
".target_socket.address");
 
   77        alias_preset_param(s + 
".size", std::string(name()) + 
".target_socket.size");
 
   78        alias_preset_param(s + 
".relative_addresses", std::string(name()) + 
".target_socket.relative_addresses");
 
   83    tlm_utils::simple_target_socket<pass<BUSWIDTH>, 
BUSWIDTH> target_socket;
 
   86    void b_transport(tlm::tlm_generic_payload& 
trans, sc_core::sc_time& delay)
 
   88        SCP_INFO(()) << 
"calling b_transport: " << scp::scp_txn_tostring(
trans);
 
   89        initiator_socket->b_transport(
trans, delay);
 
   90        SCP_INFO(()) << 
"returning from b_transport: " << scp::scp_txn_tostring(
trans);
 
   93    unsigned int transport_dbg(tlm::tlm_generic_payload& 
trans)
 
   95        SCP_INFO(()) << 
"calling dbg_transport: " << scp::scp_txn_tostring(
trans);
 
   96        return initiator_socket->transport_dbg(
trans);
 
   99    bool get_direct_mem_ptr(tlm::tlm_generic_payload& 
trans, tlm::tlm_dmi& dmi_data)
 
  101        SCP_INFO(()) << 
"calling get_direct_mem_ptr: " << scp::scp_txn_tostring(
trans);
 
  102        return initiator_socket->get_direct_mem_ptr(
trans, dmi_data);
 
  105    void invalidate_direct_mem_ptr(sc_dt::uint64 start, sc_dt::uint64 end)
 
  107        SCP_INFO(()) << std::hex << 
"calling invalidate_direct_mem_ptr: 0x" << start << 
" - 0x" << end;
 
  108        target_socket->invalidate_direct_mem_ptr(start, end);
 
  111    cci::cci_broker_handle m_broker;
 
  114    explicit pass(
const sc_core::sc_module_name& 
nm)
 
  115        : sc_core::sc_module(
nm)
 
  116        , initiator_socket(
"initiator_socket", [&](std::string s) -> 
void { register_boundto(s); })
 
  117        , target_socket(
"target_socket")
 
  118        , m_broker(cci::cci_get_broker())
 
  122        target_socket.register_b_transport(
this, &pass::b_transport);
 
  123        target_socket.register_transport_dbg(
this, &pass::transport_dbg);
 
  124        target_socket.register_get_direct_mem_ptr(
this, &pass::get_direct_mem_ptr);
 
  125        initiator_socket.register_invalidate_direct_mem_ptr(
this, &pass::invalidate_direct_mem_ptr);