File initiator.h
File List > bindings > simple > initiator.h
Go to the documentation of this file
#pragma once
#include <systemc.h>
#include <tlm.h>
#include <tlm_utils/simple_initiator_socket.h>
#include <tlm_utils/simple_target_socket.h>
#include <deque>
#include <sol/sol.hpp>
#include "bindings/axi/gtoa.h"
namespace simple {
class Initiator : sc_module {
public:
using Target =
tlm_utils::simple_initiator_socket<Initiator>::base_target_socket_type;
using AXITarget =
ARM::AXI4::SimpleInitiatorSocket<GToA>::base_target_socket_type;
Initiator(const sc_module_name &name);
// Callbacks for TLM transactions
tlm::tlm_sync_enum nb_transport_bw(tlm::tlm_generic_payload &trans,
tlm::tlm_phase &phase, sc_time &delay);
void ThreadProcess();
void EndResponse();
void set_target(Target *t);
Target *target() const;
void set_axi_target(AXITarget *t);
AXITarget *axi_target() const;
void set_clock(sc_clock *clock);
sc_clock *clock() const;
// Lua API implementations
using LuaBytes = sol::as_table_t<std::vector<uint8_t>>;
void add_payload(const sol::table &payload);
sol::lua_value get_read_data();
tlm_utils::simple_initiator_socket<Initiator> mem_port_;
private:
void AddPayloadImpl(tlm::tlm_command command, uint64_t addr,
const std::vector<uint8_t> &payload_data);
Target *target_;
AXITarget *axi_target_;
sc_clock *clock_;
sc_in<bool> clock_i_;
std::deque<tlm::tlm_generic_payload *> payload_q_;
std::unordered_map<tlm::tlm_generic_payload *, std::vector<uint8_t>>
payload_data_map_;
std::deque<std::vector<uint8_t>> read_data_;
sc_event target_ready_;
// Payload event queue
tlm_utils::peq_with_get<tlm::tlm_generic_payload> peq_;
std::unique_ptr<GToA> gtoa_;
};
} // namespace simple