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);