16#ifndef SIMICS_CONNECT_TEMPLATES_H
17#define SIMICS_CONNECT_TEMPLATES_H
19#include <fmt/fmt/format.h>
20#include <simics/base/map-target.h>
21#include <simics/base/sim-exception.h>
22#include <simics/base/transaction.h>
35template<
typename FirstIface,
typename... RestIfaces>
39 const std::string &descendant)
43 if (!SIM_class_port(SIM_object_class(dev_obj), descendant.c_str())) {
45 fmt::format(
"Port {} is not registered yet",
50 conf_object_t *obj = SIM_object_descendant(dev_obj,
56 fmt::format(
"Descendant object {} not found",
76 SIM_free_map_target(map_target_);
80 SIM_free_map_target(map_target_);
82 map_target_ =
nullptr;
86 map_target_t *tmp = SIM_new_map_target(obj,
nullptr,
nullptr);
88 (void)SIM_clear_exception();
96 uint64_t
read(uint64_t addr, uint64_t size) {
98 SIM_LOG_ERROR(device_, 0,
"size must be less than or equal to 8");
101 std::vector<uint8_t> val(size);
102 std::vector<atom_t> atoms {
103 ATOM_data(val.data()),
105 ATOM_initiator(device_),
109 t.atoms = atoms.data();
110 auto exc =
issue(&t, addr);
111 if (exc != Sim_PE_No_Exception) {
113 fmt::format(
"unexpected exception: {}",
114 static_cast<int>(exc)));
117 return SIM_get_transaction_value_le(&t);
120 void read_bytes(uint64_t addr, uint64_t size, uint8_t *bytes) {
121 std::vector<atom_t> atoms {
124 ATOM_initiator(device_),
128 t.atoms = atoms.data();
132 void write(uint64_t addr, uint64_t size, uint64_t value) {
134 SIM_LOG_ERROR(device_, 0,
"size must be less than or equal to 8");
137 std::vector<uint8_t> buf(size);
138 std::vector<atom_t> atoms {
139 ATOM_data(buf.data()),
141 ATOM_flags(Sim_Transaction_Write),
142 ATOM_initiator(device_),
146 t.atoms = atoms.data();
147 SIM_set_transaction_value_le(&t, value);
152 std::vector<atom_t> atoms {
153 ATOM_flags(Sim_Transaction_Write),
156 ATOM_initiator(device_),
160 t.atoms = atoms.data();
164 exception_type_t
issue(transaction_t *t, uint64_t addr) {
166 SIM_LOG_INFO(2, device_, 0,
167 "null transaction is terminated");
168 return Sim_PE_IO_Not_Taken;
172 SIM_LOG_INFO(2, device_, 0,
173 "map_target not set, transaction terminated");
174 return Sim_PE_IO_Not_Taken;
177 exception_type_t exc = SIM_issue_transaction(map_target_, t, addr);
178 std::string op {SIM_transaction_is_read(t) ?
"read" :
"write"};
179 if (exc == Sim_PE_No_Exception) {
181 fmt::format(
"{} {} bytes @0x{:x} in {}",
182 op, SIM_transaction_size(t),
183 addr, SIM_object_name(device_)));
186 fmt::format(
"failed to {} {} bytes @0x{:x} in {}",
187 op, SIM_transaction_size(t),
188 addr, SIM_object_name(device_)));
190 return Sim_PE_No_Exception;
198 conf_object_t *device_ {
nullptr};
199 map_target_t *map_target_ {
nullptr};
Represents Simics C type conf_object_t.
Definition: conf-object.h:38
Base class for all Simics configuration objects.
Definition: conf-object.h:126
A base class for Simics C++ interface connect class.
Definition: connect.h:36
ConfObjectRef obj_
Definition: connect.h:64
Definition: connect-templates.h:36
ConnectToDescendant(const ConfObject *device, const std::string &descendant)
Definition: connect-templates.h:38
A class for connecting with another Simics object.
Definition: connect.h:118
conf_object_t * device() const
Return the device object which can be used for logging purpose.
Definition: connect.h:177
bool set(const ConfObjectRef &o) override
Set the connected configuration object.
Definition: connect.h:130
Definition: connect-templates.h:202
bool set(const ConfObjectRef &o) override
Set the connected configuration object.
Definition: connect-templates.h:208
MapTargetConnect(const ConfObjectRef &device)
Definition: connect-templates.h:204
Definition: connect-templates.h:72
MapTarget(const ConfObjectRef &device)
Definition: connect-templates.h:74
bool set_map_target(const ConfObjectRef &obj)
Definition: connect-templates.h:79
void write(uint64_t addr, uint64_t size, uint64_t value)
Definition: connect-templates.h:132
void write_bytes(uint64_t addr, uint64_t size, uint8_t *bytes)
Definition: connect-templates.h:151
virtual ~MapTarget()
Definition: connect-templates.h:75
exception_type_t issue(transaction_t *t, uint64_t addr)
Definition: connect-templates.h:164
void read_bytes(uint64_t addr, uint64_t size, uint8_t *bytes)
Definition: connect-templates.h:120
uint64_t read(uint64_t addr, uint64_t size)
Definition: connect-templates.h:96
const map_target_t * map_target() const
Definition: connect-templates.h:193
Definition: attribute-exceptions.h:25
#define SIM_LOG_CRITICAL_STR(obj, group, str)
Definition: log.h:42
#define SIM_LOG_INFO_STR(level, obj, group, str)
Special macro to handle string object (for example, fmt::format)
Definition: log.h:30
#define SIM_LOG_ERROR_STR(obj, group, str)
Definition: log.h:39
Definition: after-bank.h:33