50 for (
const auto&
event : events) {
53 const bool is_top_level =
event.read_context_id == 0;
54 const FF parent_id_inv = is_top_level ? 0 :
FF(
event.read_context_id);
58 const uint64_t
copy_size =
static_cast<uint64_t
>(
event.data_copy_size);
59 const uint64_t data_offset =
static_cast<uint64_t
>(
event.data_offset);
60 const uint64_t data_index_upper_bound =
61 std::min(data_offset +
copy_size,
static_cast<uint64_t
>(
event.src_data_size));
63 const uint64_t read_addr_upper_bound =
static_cast<uint64_t
>(
event.src_data_addr) + data_index_upper_bound;
64 const uint64_t write_addr_upper_bound =
static_cast<uint64_t
>(
event.dst_addr) +
copy_size;
69 { C::data_copy_sel, 1 },
70 { C::data_copy_clk,
event.execution_clk },
71 { C::data_copy_sel_start, 1 },
72 { C::data_copy_sel_cd_copy, is_cd_copy ? 1 : 0 },
73 { C::data_copy_sel_cd_copy_start, is_cd_copy ? 1 : 0 },
74 { C::data_copy_sel_rd_copy_start, is_rd_copy ? 1 : 0 },
76 { C::data_copy_src_context_id,
event.read_context_id },
77 { C::data_copy_dst_context_id,
event.write_context_id },
79 { C::data_copy_copy_size,
event.data_copy_size },
80 { C::data_copy_offset,
event.data_offset },
82 { C::data_copy_src_addr,
event.src_data_addr },
83 { C::data_copy_src_data_size,
event.src_data_size },
84 { C::data_copy_dst_addr,
event.dst_addr },
86 { C::data_copy_is_top_level, is_top_level ? 1 : 0 },
87 { C::data_copy_parent_id_inv, parent_id_inv },
90 { C::data_copy_offset_plus_size, data_offset +
copy_size },
91 { C::data_copy_offset_plus_size_is_gt, data_offset +
copy_size >
event.src_data_size ? 1 : 0 },
92 { C::data_copy_data_index_upper_bound, data_index_upper_bound },
96 { C::data_copy_read_addr_upper_bound, read_addr_upper_bound },
97 { C::data_copy_write_addr_upper_bound, write_addr_upper_bound },
108 bool write_address_overflow = write_addr_upper_bound >
AVM_MEMORY_SIZE;
109 if (read_address_overflow || write_address_overflow) {
112 { C::data_copy_sel_end, 1 },
114 { C::data_copy_src_out_of_range_err, read_address_overflow ? 1 : 0 },
115 { C::data_copy_dst_out_of_range_err, write_address_overflow ? 1 : 0 },
116 { C::data_copy_err, 1 },
134 { C::data_copy_sel_start_no_err, 1 },
135 { C::data_copy_sel_end, 1 },
136 { C::data_copy_sel_write_count_is_zero, 1 },
137 { C::data_copy_data_index_upper_bound_gt_offset, data_index_upper_bound > data_offset ? 1 : 0 },
146 uint32_t reads_left =
147 data_offset >= data_index_upper_bound ? 0 :
static_cast<uint32_t
>(data_index_upper_bound - data_offset);
149 for (uint32_t i = 0; i <
copy_size; i++) {
152 bool end = (current_copy_size - 1) == 0;
154 bool is_padding_row = reads_left == 0;
157 uint64_t read_addr =
event.src_data_addr + data_offset + i;
158 bool read_cd_col = is_cd_copy && is_top_level && !is_padding_row;
161 bool sel_mem_read = !is_padding_row && (is_rd_copy || !is_top_level);
162 FF value = is_padding_row ? 0 :
event.copying_data[i].as_ff();
164 FF tag = sel_mem_read ?
static_cast<FF>(
static_cast<uint8_t
>(
event.copying_data[i].get_tag())) : 0;
169 { C::data_copy_sel, 1 },
170 { C::data_copy_clk,
event.execution_clk },
171 { C::data_copy_sel_cd_copy, is_cd_copy ? 1 : 0 },
173 { C::data_copy_src_context_id,
event.read_context_id },
174 { C::data_copy_dst_context_id,
event.write_context_id },
175 { C::data_copy_dst_addr,
event.dst_addr + i },
177 { C::data_copy_sel_start_no_err, start ? 1 : 0 },
178 { C::data_copy_sel_end, end ? 1 : 0 },
179 { C::data_copy_copy_size, current_copy_size },
180 { C::data_copy_write_count_minus_one_inv,
181 current_copy_size - 1 },
183 { C::data_copy_sel_mem_write, 1 },
185 { C::data_copy_is_top_level, is_top_level ? 1 : 0 },
186 { C::data_copy_parent_id_inv, parent_id_inv },
188 { C::data_copy_sel_mem_read, sel_mem_read ? 1 : 0 },
189 { C::data_copy_read_addr, read_addr },
190 { C::data_copy_read_addr_plus_one, read_cd_col ? read_addr + 1 : 0 },
192 { C::data_copy_reads_left_inv, reads_left },
193 { C::data_copy_padding, is_padding_row ? 1 : 0 },
194 { C::data_copy_value,
value },
195 { C::data_copy_tag,
tag },
197 { C::data_copy_cd_copy_col_read, read_cd_col ? 1 : 0 },
200 { C::data_copy_reads_left, reads_left },
201 { C::data_copy_data_index_upper_bound_gt_offset,
202 (start && data_index_upper_bound > data_offset) ? 1 : 0 },
205 { C::data_copy_write_count_zero_inv, start ?
FF(
copy_size) : 0 },
208 if (reads_left > 0) {
217 trace.invert_columns({ { C::data_copy_parent_id_inv,
218 C::data_copy_write_count_zero_inv,
219 C::data_copy_reads_left_inv,
220 C::data_copy_write_count_minus_one_inv } });