quic/qbox
Loading...
Searching...
No Matches
pass.h
1/*
2 * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All Rights Reserved.
3 * Author: GreenSocs 2022
4 *
5 * SPDX-License-Identifier: BSD-3-Clause
6 */
7
8#ifndef _GREENSOCS_BASE_COMPONENTS_PASS_H
9#define _GREENSOCS_BASE_COMPONENTS_PASS_H
10
11#include <cci_configuration>
12#include <systemc>
13#include <scp/report.h>
14#include <scp/helpers.h>
15
16#include <tlm_utils/simple_initiator_socket.h>
17#include <tlm_utils/simple_target_socket.h>
18#include <module_factory_registery.h>
19#include <tlm_sockets_buswidth.h>
20
21#include <iomanip>
22
23namespace gs {
24template <unsigned int BUSWIDTH = DEFAULT_TLM_BUSWIDTH>
25class pass : public sc_core::sc_module
26{
27 SCP_LOGGER(());
28
29 /* Alias from - to */
30 void alias_preset_param(std::string a, std::string b, bool required = false)
31 {
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; });
37 } else {
38 if (required) {
39 SCP_FATAL(()) << " Can't find " << a;
40 }
41 }
42 }
43
44 template <typename MOD>
45 class initiator_socket_spying : public tlm_utils::simple_initiator_socket<MOD, BUSWIDTH>
46 {
47 using typename tlm_utils::simple_initiator_socket<MOD, BUSWIDTH>::base_target_socket_type;
48
49 const std::function<void(std::string)> register_cb;
50
51 public:
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)
54 {
55 }
56
57 void bind(base_target_socket_type& socket)
58 {
59 tlm_utils::simple_initiator_socket<MOD, BUSWIDTH>::bind(socket);
60 register_cb(socket.get_base_export().name());
61 }
62
63 // hierarchial binding
64 void bind(tlm::tlm_initiator_socket<BUSWIDTH>& socket)
65 {
66 tlm_utils::simple_initiator_socket<MOD, BUSWIDTH>::bind(socket);
67 register_cb(socket.get_base_port().name());
68 }
69 };
70
71 /* NB use the EXPORT name, so as not to be hassled by the _port_0*/
72 std::string nameFromSocket(std::string s) { return s; }
73 void register_boundto(std::string s)
74 {
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");
79 }
80
81public:
83 tlm_utils::simple_target_socket<pass<BUSWIDTH>, BUSWIDTH> target_socket;
84
85private:
86 void b_transport(tlm::tlm_generic_payload& trans, sc_core::sc_time& delay)
87 {
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);
91 }
92
93 unsigned int transport_dbg(tlm::tlm_generic_payload& trans)
94 {
95 SCP_INFO(()) << "calling dbg_transport: " << scp::scp_txn_tostring(trans);
96 return initiator_socket->transport_dbg(trans);
97 }
98
99 bool get_direct_mem_ptr(tlm::tlm_generic_payload& trans, tlm::tlm_dmi& dmi_data)
100 {
101 SCP_INFO(()) << "calling get_direct_mem_ptr: " << scp::scp_txn_tostring(trans);
102 return initiator_socket->get_direct_mem_ptr(trans, dmi_data);
103 }
104
105 void invalidate_direct_mem_ptr(sc_dt::uint64 start, sc_dt::uint64 end)
106 {
107 SCP_INFO(()) << std::hex << "calling invalidate_direct_mem_ptr: 0x" << start << " - 0x" << end;
108 target_socket->invalidate_direct_mem_ptr(start, end);
109 }
110
111 cci::cci_broker_handle m_broker;
112
113public:
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())
119 {
120 SCP_DEBUG(()) << "pass constructor";
121
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);
126 }
127 pass() = delete;
128 pass(const pass&) = delete;
129 ~pass() {}
130};
131
132} // namespace gs
133
134extern "C" void module_register();
135
136#endif
Definition target.h:160
Definition pass.h:26
Tool which reads a Lua configuration file and sets parameters.
Definition biflow.cc:10