quic/qbox
Loading...
Searching...
No Matches
addrtr.h
1/*
2 * Copyright (c) 2022 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_ADDRTR_H
9#define _GREENSOCS_BASE_COMPONENTS_ADDRTR_H
10
11#include <cinttypes>
12#include <vector>
13
14#include <systemc>
15#include <tlm>
16#include <tlm_utils/simple_initiator_socket.h>
17#include <tlm_utils/simple_target_socket.h>
18#include <cci_configuration>
19
20#include <libgsutils.h>
21#include <module_factory_registery.h>
22#include <tlm_sockets_buswidth.h>
23
44class addrtr : public sc_core::sc_module
45{
46private:
47 sc_dt::uint64 addr_fw(sc_dt::uint64 addr) { return addr + offset; }
48 sc_dt::uint64 addr_bw(sc_dt::uint64 addr) { return addr - offset; }
49 void translate_fw(tlm::tlm_generic_payload& trans) { trans.set_address(addr_fw(trans.get_address())); }
50 void translate_bw(tlm::tlm_generic_payload& trans) { trans.set_address(addr_bw(trans.get_address())); }
51
52 void b_transport(tlm::tlm_generic_payload& trans, sc_core::sc_time& delay)
53 {
54 translate_fw(trans);
55 back_socket->b_transport(trans, delay);
56 translate_bw(trans);
57 }
58
59 unsigned int transport_dbg(tlm::tlm_generic_payload& trans)
60 {
61 sc_dt::uint64 addr = trans.get_address();
62
63 translate_fw(trans);
64 unsigned int r = back_socket->transport_dbg(trans);
65 translate_bw(trans);
66 return r;
67 }
68
69 bool get_direct_mem_ptr(tlm::tlm_generic_payload& trans, tlm::tlm_dmi& dmi_data)
70 {
71 sc_dt::uint64 addr = trans.get_address();
72
73 translate_fw(trans);
74 bool r = back_socket->get_direct_mem_ptr(trans, dmi_data);
75 translate_bw(trans);
76 return r;
77 }
78
79 void invalidate_direct_mem_ptr(sc_dt::uint64 start, sc_dt::uint64 end)
80 {
81 front_socket->invalidate_direct_mem_ptr(addr_bw(start), addr_bw(end));
82 }
83
84public:
85 tlm_utils::simple_target_socket<addrtr, DEFAULT_TLM_BUSWIDTH> front_socket;
86 tlm_utils::simple_initiator_socket<addrtr, DEFAULT_TLM_BUSWIDTH> back_socket;
87 cci::cci_param<uint64_t> offset;
88
89 explicit addrtr(const sc_core::sc_module_name& nm)
90 : sc_core::sc_module(nm), back_socket("initiator"), front_socket("target"), offset("offset", 0)
91 {
92 front_socket.register_b_transport(this, &addrtr::b_transport);
93 front_socket.register_transport_dbg(this, &addrtr::transport_dbg);
94 front_socket.register_get_direct_mem_ptr(this, &addrtr::get_direct_mem_ptr);
95 back_socket.register_invalidate_direct_mem_ptr(this, &addrtr::invalidate_direct_mem_ptr);
96 }
97
98 addrtr() = delete;
99
100 addrtr(const addrtr&) = delete;
101
102 virtual ~addrtr() {}
103};
104
105extern "C" void module_register();
106
107#endif
Definition target.h:160
Definition addrtr.h:45