quic/qbox
Loading...
Searching...
No Matches
generic_lua_model.h
1/*
2 * Copyright (c) 2026 Qualcomm Innovation Center, Inc. All Rights Reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#ifndef GREENSOCS_BASE_COMPONENTS_GENERIC_LUA_MODEL_H
8#define GREENSOCS_BASE_COMPONENTS_GENERIC_LUA_MODEL_H
9
10#include <systemc>
11#include <tlm>
12#include <tlm_utils/peq_with_get.h>
13#include <cci_configuration>
14#include <cciutils.h>
15#include <scp/report.h>
16#include <module_factory_registery.h>
17#include <ports/target-signal-socket.h>
18#include <ports/initiator-signal-socket.h>
19#include <gs_memory.h>
20#include <reg_router.h>
21#include <registers.h>
22#include <vector>
23#include <tuple>
24#include <memory>
25#include <functional>
26#include <algorithm>
27#include <unordered_map>
28#include <list>
29#include <tlm_sockets_buswidth.h>
30
31#define DEFAULT_REG_MASK 0xFFFFFFFFUL
32
33namespace gs {
34
36 std::shared_ptr<std::pair<uint32_t, bool>> sig_num_val_pair;
37 std::string sig_name;
38 generic_lua_model_signal_payload(uint32_t sig_num, bool val, const std::string& _name = "");
39};
40
42 std::shared_ptr<tlm::tlm_generic_payload> txn;
43 std::array<unsigned char, sizeof(uint32_t)> buffer;
44 generic_lua_model_txn_payload(uint64_t addr, uint32_t value);
45};
46
47class generic_lua_model : public sc_core::sc_module
48{
49protected:
50 SCP_LOGGER();
51
52 using tlm_initiator_socket_t = tlm_utils::simple_initiator_socket_b<
53 generic_lua_model, DEFAULT_TLM_BUSWIDTH, tlm::tlm_base_protocol_types, sc_core::SC_ZERO_OR_MORE_BOUND>;
54 using tlm_target_socket_t = tlm_utils::simple_target_socket_b<
55 generic_lua_model, DEFAULT_TLM_BUSWIDTH, tlm::tlm_base_protocol_types, sc_core::SC_ZERO_OR_MORE_BOUND>;
56 using reg_ptr_t = std::shared_ptr<gs::gs_register<uint32_t>>;
57 using data_t = std::vector<std::tuple<sc_core::sc_time, uint64_t, uint32_t>>;
58 using signals_t = std::vector<std::tuple<sc_core::sc_time, uint32_t, bool>>;
59 using reactions_t = std::pair<data_t, signals_t>;
60
61 enum class action_source { REGISTER_CB, TARGET_SIGNAL, START_OF_SIM, UNKNOWN };
62 enum class actions { PRE_READ, PRE_WRITE, POST_READ, POST_WRITE, UNKNOWN };
63 struct enum_hash {
64 template <typename T>
65 std::size_t operator()(T inst) const
66 {
67 return static_cast<std::size_t>(inst);
68 }
69 };
70
72 std::string reg_name;
73 actions action;
74 uint64_t address;
75 uint32_t reg_mask;
76 uint32_t default_value;
77 bool is_default_value_set;
78 bool value_set;
79 uint32_t value;
80 uint32_t mask;
81 bool if_val_set;
82 uint32_t if_val;
83 data_t data;
84 signals_t signals;
85 reg_ptr_t reg_ptr;
86
88 : reg_name("")
89 , action(actions::UNKNOWN)
90 , address(0xffffffffffffffffULL)
91 , reg_mask(DEFAULT_REG_MASK)
92 , default_value(0)
93 , value_set(false)
94 , value(0)
95 , mask(DEFAULT_REG_MASK)
96 , if_val_set(false)
97 , if_val(0)
98 , data{}
99 , signals{}
100 , reg_ptr(nullptr)
101 {
102 }
103 ~register_info_t() = default;
104 };
105
106public:
107 generic_lua_model(sc_core::sc_module_name _name, sc_core::sc_object* _container, sc_core::sc_object* _reg_memory);
108
110
111 ~generic_lua_model() = default;
112
113protected:
114 void set_base_address();
115 void b_transport(tlm::tlm_generic_payload& trans, sc_core::sc_time& delay);
116 unsigned int transport_dbg(tlm::tlm_generic_payload& trans);
117 bool get_direct_mem_ptr(tlm::tlm_generic_payload& trans, tlm::tlm_dmi& dmi_data);
118 void invalidate_direct_mem_ptr(sc_dt::uint64 start, sc_dt::uint64 end);
119 void before_end_of_elaboration() override;
120 void start_of_simulation() override;
121 void dispatch(const std::string& _name);
122 void set_data_and_signals_actions_from_cci(const std::string& cci_name, data_t& data, signals_t& signals);
124 void dispatch_signals_actions(const std::string& cci_name, uint32_t sig_num, bool sig_val);
125 void dispatch_registers_cb_actions(const std::string& cci_name, const std::string& reg_name, uint64_t address,
126 uint32_t reg_mask, bool is_default_value_set, uint32_t default_value,
127 actions action);
128 void bind_register(register_info_t& regs_info);
129 void register_input_signal(uint32_t sig_num, bool value, const data_t& data, const signals_t& signals);
130 void reg_action_cb(tlm::tlm_generic_payload& txn, sc_core::sc_time& delay, const register_info_t& regs_info);
131 void target_signal_cb(int id, bool value);
132 void trigger_signals(const signals_t& signals, action_source act_src);
133 void write_data(const data_t& data, action_source act_src);
134 void exec_data_thread(action_source act_src);
135 void exec_sig_thread(action_source act_src);
136 void reg_data_thread();
137 void reg_signals_thread();
138 void sos_data_thread();
139 void sos_signals_thread();
140 void target_sig_data_thread();
141 void target_sig_signals_thread();
142
143 template <class T>
144 void cci_set(std::string n, T value)
145 {
146 auto handle = m_broker.get_param_handle(n);
147 if (handle.is_valid())
148 handle.set_cci_value(cci::cci_value(value));
149 else if (!m_broker.has_preset_value(n)) {
150 m_broker.set_preset_cci_value(n, cci::cci_value(value));
151 } else {
152 SCP_FATAL(())("Trying to re-set a value? {}", n);
153 }
154 }
155
156public:
157 tlm_initiator_socket_t initiator_socket;
158 tlm_target_socket_t target_socket;
159 sc_core::sc_vector<TargetSignalSocket<bool>> target_signal_sockets;
160 sc_core::sc_vector<InitiatorSignalSocket<bool>> initiator_signal_sockets;
162
163private:
164 tlm_initiator_socket_t m_initiator_socket;
165 cci::cci_broker_handle m_broker;
166 std::unordered_map<action_source, std::unique_ptr<tlm_utils::peq_with_get<tlm::tlm_generic_payload>>, enum_hash>
167 m_data_peq;
168 std::unordered_map<action_source, std::list<generic_lua_model_txn_payload>, enum_hash> m_data_pending_list;
169 std::unordered_map<action_source, std::unique_ptr<tlm_utils::peq_with_get<std::pair<uint32_t, bool>>>, enum_hash>
170 m_signals_peq;
171 std::unordered_map<action_source, std::list<generic_lua_model_signal_payload>, enum_hash> m_signals_pending_list;
172 gs::reg_router<>* m_reg_router;
173 gs::gs_memory<>* m_reg_memory;
174 std::vector<register_info_t> m_registers;
175 std::unordered_map<uint32_t, std::unordered_map<bool, reactions_t>> m_signals;
176 std::vector<reactions_t> m_start_of_sim_ts_ns;
177 uint64_t m_base_addr;
178};
179} // namespace gs
180
181extern "C" void module_register();
182
183#endif
Definition target.h:160
Definition generic_lua_model.h:48
void invalidate_direct_mem_ptr(sc_dt::uint64 start, sc_dt::uint64 end)
Definition generic_lua_model.cc:157
void dispatch(const std::string &_name)
Definition generic_lua_model.cc:165
unsigned int transport_dbg(tlm::tlm_generic_payload &trans)
Definition generic_lua_model.cc:140
void target_signal_cb(int id, bool value)
Definition generic_lua_model.cc:523
bool get_direct_mem_ptr(tlm::tlm_generic_payload &trans, tlm::tlm_dmi &dmi_data)
Definition generic_lua_model.cc:149
void b_transport(tlm::tlm_generic_payload &trans, sc_core::sc_time &delay)
Definition generic_lua_model.cc:131
void set_reg_mask_and_value_actions_from_cci(const std::string &cci_name, register_info_t &regs_info)
Definition generic_lua_model.cc:343
A gs_memory component that can add memory to a virtual platform project.
Definition gs_memory.h:59
Definition reg_router.h:34
Tool which reads a Lua configuration file and sets parameters.
Definition biflow.cc:10
Definition generic_lua_model.h:63
Definition generic_lua_model.h:71
Definition generic_lua_model.h:35
Definition generic_lua_model.h:41