88 tlm::tlm_generic_payload* txn;
96 if (txn_created)
delete txn;
99 tlm::tlm_generic_payload* get_payload() {
return txn; }
101 bool is_read()
const {
return txn->is_read(); }
102 void set_read() { txn->set_read(); }
103 bool is_write()
const {
return txn->is_write(); }
104 void set_write() { txn->set_write(); }
105 tlm::tlm_command get_command()
const {
return txn->get_command(); }
106 void set_command(
const tlm::tlm_command
command) { txn->set_command(
command); }
107 sc_dt::uint64 get_address()
const {
return txn->get_address(); }
108 void set_address(
const sc_dt::uint64 address) { txn->set_address(address); }
109 void set_data(
const pybind11::buffer&
bytes)
111 unsigned char* data = get_pybind11_buffer_info_ptr(
bytes);
112 std::memcpy(txn->get_data_ptr(), data, txn->get_data_length());
115 void set_data_ptr(
const pybind11::buffer&
bytes)
117 unsigned char* data = get_pybind11_buffer_info_ptr(
bytes);
118 txn->set_data_ptr(data);
120 unsigned int get_data_length()
const {
return txn->get_data_length(); }
121 void set_data_length(
const unsigned int length) { txn->set_data_length(length); }
122 bool is_response_ok()
const {
return txn->is_response_ok(); }
123 bool is_response_error()
const {
return txn->is_response_error(); }
124 tlm::tlm_response_status get_response_status()
const {
return txn->get_response_status(); }
125 void set_response_status(
const tlm::tlm_response_status
response_status)
129 std::string get_response_string()
const {
return txn->get_response_string(); };
130 unsigned int get_streaming_width()
const {
return txn->get_streaming_width(); }
132 void set_byte_enable_ptr(
const pybind11::buffer&
bytes)
137 void set_byte_enable(
const pybind11::buffer&
bytes)
140 std::memcpy(txn->get_byte_enable_ptr(),
byte_enable, txn->get_byte_enable_length());
144 unsigned int get_byte_enable_length()
const {
return txn->get_byte_enable_length(); }
151 std::stringstream
ss;
152 ss <<
"txn type: " << txn->get_command() <<
" addr: 0x" << std::hex << txn->get_address()
153 <<
" data len: " << txn->get_data_length() <<
" response: " << txn->get_response_string();
173class PYTHON_BINDER_API
python_binder :
public sc_core::sc_module,
public sc_core::sc_stage_callback_if
177 using tlm_initiator_socket_t = tlm_utils::simple_initiator_socket_b<
MOD,
BUSWIDTH, tlm::tlm_base_protocol_types,
178 sc_core::SC_ZERO_OR_MORE_BOUND>;
179 using tlm_target_socket_t = tlm_utils::simple_target_socket_tagged_b<
MOD,
BUSWIDTH, tlm::tlm_base_protocol_types,
180 sc_core::SC_ZERO_OR_MORE_BOUND>;
182 std::shared_ptr<sc_core::sc_event>, std::shared_ptr<sc_core::sc_event>>;
194 void setup_biflow_socket(pybind11::object&
_modules);
196 void do_b_transport(
int id, pybind11::object&
py_trans, pybind11::object&
py_delay);
198 void b_transport(
int id, tlm::tlm_generic_payload&
trans, sc_core::sc_time& delay);
200 void do_target_b_transport(
int id, tlm::tlm_generic_payload&
trans, sc_core::sc_time& delay,
201 const std::string&
tspt_name, std::unordered_map<int, b_transport_info>&
cont,
204 void bf_b_transport(tlm::tlm_generic_payload& txn, sc_core::sc_time& delay);
206 unsigned int transport_dbg(
int id, tlm::tlm_generic_payload&
trans);
208 bool get_direct_mem_ptr(
int id, tlm::tlm_generic_payload&
trans, tlm::tlm_dmi& dmi_data);
210 void invalidate_direct_mem_ptr(sc_dt::uint64 start, sc_dt::uint64 end);
212 void exec_if_py_fn_exist(
const char*
fn_name);
214 void before_end_of_elaboration()
override;
216 void end_of_elaboration()
override;
218 void start_of_simulation()
override;
220 void end_of_simulation()
override;
222 void target_signal_cb(
int id,
bool value);
224 void exec_py_b_transport();
226 void exec_py_spawned_sc_thread();
228 void stage_callback(
const sc_core::sc_stage&
stage)
override;
230 void method_thread();
233 cci::cci_param<std::string> p_py_mod_name;
234 cci::cci_param<std::string> p_py_mod_dir;
235 cci::cci_param<std::string> p_py_mod_args;
236 cci::cci_param<std::string> p_py_mod_current_mod_id_prefix;
237 cci::cci_param<uint32_t> p_tlm_initiator_ports_num;
238 cci::cci_param<uint32_t> p_tlm_target_ports_num;
239 cci::cci_param<uint32_t> p_initiator_signals_num;
240 cci::cci_param<uint32_t> p_target_signals_num;
241 cci::cci_param<uint32_t> p_bf_socket_num;
242 sc_core::sc_vector<tlm_initiator_socket_t> initiator_sockets;
243 sc_core::sc_vector<tlm_target_socket_t> target_sockets;
244 sc_core::sc_vector<InitiatorSignalSocket<bool>> initiator_signal_sockets;
245 sc_core::sc_vector<TargetSignalSocket<bool>> target_signal_sockets;
246 sc_core::sc_vector<gs::biflow_socket<python_binder<BUSWIDTH>>> bf_socket;
249 pybind11::module_ m_main_mod;
250 pybind11::module_ m_tlm_do_b_transport_mod;
251 pybind11::module_ m_biflow_socket_mod;
252 pybind11::module_ m_initiator_signal_socket_mod;
253 pybind11::module_ m_cpp_shared_vars_mod;
254 std::unordered_map<int, b_transport_info> m_btspt_cont;
255 std::unordered_map<int, b_transport_info> m_bftspt_cont;
256 std::unordered_map<int, std::pair<bool, std::shared_ptr<sc_core::sc_event>>> m_target_signals_cont;
257 std::unique_ptr<std::thread> m_btspt_method_thread;
258 b_transport_th_info m_btspt_info;
259 std::condition_variable m_btspt_cv;
260 std::mutex m_btspt_mutex;
262 bool m_btspt_thread_stop;