78 tlm::tlm_generic_payload* txn;
86 if (txn_created)
delete txn;
89 tlm::tlm_generic_payload* get_payload() {
return txn; }
91 bool is_read()
const {
return txn->is_read(); }
92 void set_read() { txn->set_read(); }
93 bool is_write()
const {
return txn->is_write(); }
94 void set_write() { txn->set_write(); }
95 tlm::tlm_command get_command()
const {
return txn->get_command(); }
96 void set_command(
const tlm::tlm_command
command) { txn->set_command(
command); }
97 sc_dt::uint64 get_address()
const {
return txn->get_address(); }
98 void set_address(
const sc_dt::uint64 address) { txn->set_address(address); }
99 void set_data(
const pybind11::buffer&
bytes)
101 unsigned char* data = get_pybind11_buffer_info_ptr(
bytes);
102 std::memcpy(txn->get_data_ptr(), data, txn->get_data_length());
105 void set_data_ptr(
const pybind11::buffer&
bytes)
107 unsigned char* data = get_pybind11_buffer_info_ptr(
bytes);
108 txn->set_data_ptr(data);
110 unsigned int get_data_length()
const {
return txn->get_data_length(); }
111 void set_data_length(
const unsigned int length) { txn->set_data_length(length); }
112 bool is_response_ok()
const {
return txn->is_response_ok(); }
113 bool is_response_error()
const {
return txn->is_response_error(); }
114 tlm::tlm_response_status get_response_status()
const {
return txn->get_response_status(); }
115 void set_response_status(
const tlm::tlm_response_status
response_status)
119 std::string get_response_string()
const {
return txn->get_response_string(); };
120 unsigned int get_streaming_width()
const {
return txn->get_streaming_width(); }
122 void set_byte_enable_ptr(
const pybind11::buffer&
bytes)
127 void set_byte_enable(
const pybind11::buffer&
bytes)
130 std::memcpy(txn->get_byte_enable_ptr(),
byte_enable, txn->get_byte_enable_length());
134 unsigned int get_byte_enable_length()
const {
return txn->get_byte_enable_length(); }
141 std::stringstream
ss;
142 ss <<
"txn type: " << txn->get_command() <<
" addr: 0x" << std::hex << txn->get_address()
143 <<
" data len: " << txn->get_data_length() <<
" response: " << txn->get_response_string();
163class python_binder :
public sc_core::sc_module,
public sc_core::sc_stage_callback_if
167 using tlm_initiator_socket_t = tlm_utils::simple_initiator_socket_b<
MOD,
BUSWIDTH, tlm::tlm_base_protocol_types,
168 sc_core::SC_ZERO_OR_MORE_BOUND>;
169 using tlm_target_socket_t = tlm_utils::simple_target_socket_tagged_b<
MOD,
BUSWIDTH, tlm::tlm_base_protocol_types,
170 sc_core::SC_ZERO_OR_MORE_BOUND>;
172 std::shared_ptr<sc_core::sc_event>, std::shared_ptr<sc_core::sc_event>>;
184 void setup_biflow_socket(pybind11::object&
_modules);
186 void do_b_transport(
int id, pybind11::object&
py_trans, pybind11::object&
py_delay);
188 void b_transport(
int id, tlm::tlm_generic_payload&
trans, sc_core::sc_time& delay);
190 void do_target_b_transport(
int id, tlm::tlm_generic_payload&
trans, sc_core::sc_time& delay,
191 const std::string&
tspt_name, std::unordered_map<int, b_transport_info>&
cont,
194 void bf_b_transport(tlm::tlm_generic_payload& txn, sc_core::sc_time& delay);
196 unsigned int transport_dbg(
int id, tlm::tlm_generic_payload&
trans);
198 bool get_direct_mem_ptr(
int id, tlm::tlm_generic_payload&
trans, tlm::tlm_dmi& dmi_data);
200 void invalidate_direct_mem_ptr(sc_dt::uint64 start, sc_dt::uint64 end);
202 void exec_if_py_fn_exist(
const char*
fn_name);
204 void before_end_of_elaboration()
override;
206 void end_of_elaboration()
override;
208 void start_of_simulation()
override;
210 void end_of_simulation()
override;
212 void target_signal_cb(
int id,
bool value);
214 void exec_py_b_transport();
216 void exec_py_spawned_sc_thread();
218 void stage_callback(
const sc_core::sc_stage&
stage)
override;
220 void method_thread();
223 cci::cci_param<std::string> p_py_mod_name;
224 cci::cci_param<std::string> p_py_mod_dir;
225 cci::cci_param<std::string> p_py_mod_args;
226 cci::cci_param<std::string> p_py_mod_current_mod_id_prefix;
227 cci::cci_param<uint32_t> p_tlm_initiator_ports_num;
228 cci::cci_param<uint32_t> p_tlm_target_ports_num;
229 cci::cci_param<uint32_t> p_initiator_signals_num;
230 cci::cci_param<uint32_t> p_target_signals_num;
231 cci::cci_param<uint32_t> p_bf_socket_num;
232 sc_core::sc_vector<tlm_initiator_socket_t> initiator_sockets;
233 sc_core::sc_vector<tlm_target_socket_t> target_sockets;
234 sc_core::sc_vector<InitiatorSignalSocket<bool>> initiator_signal_sockets;
235 sc_core::sc_vector<TargetSignalSocket<bool>> target_signal_sockets;
236 sc_core::sc_vector<gs::biflow_socket<python_binder<BUSWIDTH>>> bf_socket;
239 pybind11::module_ m_main_mod;
240 pybind11::module_ m_tlm_do_b_transport_mod;
241 pybind11::module_ m_biflow_socket_mod;
242 pybind11::module_ m_initiator_signal_socket_mod;
243 pybind11::module_ m_cpp_shared_vars_mod;
244 std::unordered_map<int, b_transport_info> m_btspt_cont;
245 std::unordered_map<int, b_transport_info> m_bftspt_cont;
246 std::unordered_map<int, std::pair<bool, std::shared_ptr<sc_core::sc_event>>> m_target_signals_cont;
247 std::unique_ptr<std::thread> m_btspt_method_thread;
248 b_transport_th_info m_btspt_info;
249 std::condition_variable m_btspt_cv;
250 std::mutex m_btspt_mutex;
252 bool m_btspt_thread_stop;