Skip to content

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