19DataCopyEvent create_cd_event(ContextInterface& context,
30 .write_context_id =
context.get_context_id(),
31 .read_context_id =
context.get_parent_id(),
32 .data_copy_size = copy_size,
34 .src_data_addr =
context.get_parent_cd_addr(),
35 .src_data_size =
context.get_parent_cd_size(),
36 .is_nested =
context.has_parent(),
45DataCopyEvent create_rd_event(ContextInterface& context,
56 .write_context_id =
context.get_context_id(),
58 .read_context_id =
context.get_last_child_id(),
59 .data_copy_size = copy_size,
61 .src_data_addr =
context.get_last_rd_addr(),
62 .src_data_size =
context.get_last_rd_size(),
63 .is_nested =
context.has_parent(),
108 uint64_t data_index_upper_bound =
min(
static_cast<uint64_t
>(
offset) + copy_size,
context.get_parent_cd_size());
111 uint64_t read_addr_upper_bound = data_index_upper_bound +
context.get_parent_cd_addr();
112 uint64_t write_addr_upper_bound =
static_cast<uint64_t
>(
dst_addr) + copy_size;
118 if (read_out_of_range || write_out_of_range) {
119 const std::string error_msg =
format(
"Attempting to access out of bounds memory: read_addr_upper_bound = ",
120 read_addr_upper_bound,
121 " write_addr_upper_bound = ",
122 write_addr_upper_bound);
134 if (
gt.gt(data_index_upper_bound,
static_cast<uint64_t
>(
offset))) {
137 padded_calldata.resize(copy_size, MemoryValue::from<FF>(0));
141 for (uint32_t i = 0; i < copy_size; i++) {
142 memory.set(
dst_addr + i, MemoryValue::from<FF>(padded_calldata[i].as_ff()));
162 uint64_t data_index_upper_bound =
min(
static_cast<uint64_t
>(
offset) + copy_size,
context.get_last_rd_size());
164 uint64_t read_addr_upper_bound = data_index_upper_bound +
context.get_last_rd_addr();
165 uint64_t write_addr_upper_bound =
static_cast<uint64_t
>(
dst_addr) + copy_size;
171 if (read_out_of_range || write_out_of_range) {
172 const std::string error_msg =
format(
"Attempting to access out of bounds memory: read_addr_upper_bound = ",
173 read_addr_upper_bound,
174 " write_addr_upper_bound = ",
175 write_addr_upper_bound);
190 if (
gt.gt(data_index_upper_bound,
static_cast<uint64_t
>(
offset))) {
191 padded_returndata =
context.get_returndata(
offset, copy_size);
193 padded_returndata.resize(copy_size, MemoryValue::from<FF>(0));
197 for (uint32_t i = 0; i < copy_size; i++) {
198 memory.set(
dst_addr + i, MemoryValue::from<FF>(padded_returndata[i].as_ff()));
ExecutionIdGetterInterface & execution_id_manager
uint64_t min(uint64_t a, uint64_t b)
void rd_copy(ContextInterface &context, uint32_t copy_size, uint32_t offset, MemoryAddress dst_addr) override
Copies returndata from the last executed context to the dst_addr.
void cd_copy(ContextInterface &context, uint32_t copy_size, uint32_t offset, MemoryAddress dst_addr) override
Writes calldata into dst_addr. There is slight difference in how enqueued and nested contexts are han...
EventEmitterInterface< DataCopyEvent > & events
virtual uint32_t get_execution_id() const =0
std::string format(Args... args)
StrictMock< MockContext > context
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
std::vector< MemoryValue > returndata