18 const uint32_t cd_copy_size,
21 const std::vector<FF>&
calldata = {})
26 .write_context_id =
context.get_context_id(),
27 .read_context_id =
context.get_parent_id(),
28 .data_copy_size = cd_copy_size,
30 .data_addr =
context.get_parent_cd_addr(),
31 .data_size =
context.get_parent_cd_size(),
32 .is_nested =
context.has_parent(),
38 const uint32_t rd_copy_size,
39 const uint32_t rd_offset,
46 .write_context_id =
context.get_context_id(),
48 .read_context_id =
context.get_last_child_id(),
49 .data_copy_size = rd_copy_size,
50 .data_offset = rd_offset,
51 .data_addr =
context.get_last_rd_addr(),
52 .data_size =
context.get_last_rd_size(),
53 .is_nested =
context.has_parent(),
88 const uint32_t copy_size,
101 uint64_t max_read_index =
min(
static_cast<uint64_t
>(
offset) + copy_size,
context.get_parent_cd_size());
105 uint64_t max_read_addr = max_read_index +
context.get_parent_cd_addr();
106 uint64_t max_write_addr =
static_cast<uint64_t
>(
dst_addr) + copy_size;
112 if (read_out_of_range || write_out_of_range) {
113 throw std::runtime_error(
"Attempting to access out of bounds memory");
117 std::vector<FF> padded_calldata(copy_size, 0);
120 if (!
gt.gt(
offset, max_read_index)) {
124 for (uint32_t i = 0; i < copy_size; i++) {
125 memory.set(
dst_addr + i, MemoryValue::from<FF>(padded_calldata[i]));
129 }
catch (
const std::exception& e) {
130 debug(
"CD_COPY exception: ", e.what());
146 const uint32_t copy_size,
155 uint64_t max_read_index =
min(
static_cast<uint64_t
>(
offset) + copy_size,
context.get_last_rd_size());
157 uint64_t max_read_addr = max_read_index +
context.get_last_rd_addr();
158 uint64_t max_write_addr =
static_cast<uint64_t
>(
dst_addr) + copy_size;
164 if (read_out_of_range || write_out_of_range) {
165 throw std::runtime_error(
"Attempting to access out of bounds memory");
173 std::vector<FF> padded_returndata(copy_size, 0);
174 if (!
gt.gt(
offset, max_read_index)) {
175 padded_returndata =
context.get_returndata(
offset, copy_size);
178 for (uint32_t i = 0; i < copy_size; i++) {
179 memory.set(
dst_addr + i, MemoryValue::from<FF>(padded_returndata[i]));
184 }
catch (
const std::exception& e) {
185 debug(
"RD_COPY exception: ", e.what());
#define AVM_HIGHEST_MEM_ADDRESS
ExecutionIdGetterInterface & execution_id_manager
uint64_t min(uint64_t a, uint64_t b)
EventEmitterInterface< DataCopyEvent > & events
void cd_copy(ContextInterface &context, const uint32_t cd_copy_size, const uint32_t cd_offset, const MemoryAddress dst_addr) override
Writes calldata into dst_addr. There is slight difference in how enqueued and nested contexts,...
void rd_copy(ContextInterface &context, const uint32_t rd_copy_size, const uint32_t rd_offset, const MemoryAddress dst_addr) override
Copies returndata from the last executed context to the dst_addr.
virtual uint32_t get_execution_id() const =0
constexpr uint32_t MAX_MEM_ADDR
std::vector< FF > returndata