49 for (
const auto&
event : events) {
52 const bool is_top_level =
event.read_context_id == 0;
53 const FF parent_id_inv = is_top_level ? 0 :
FF(
event.read_context_id);
57 const uint64_t copy_size =
static_cast<uint64_t
>(
event.data_copy_size);
58 const uint64_t data_offset =
static_cast<uint64_t
>(
event.data_offset);
59 const uint64_t read_index_upper_bound =
60 std::min(data_offset + copy_size,
static_cast<uint64_t
>(
event.src_data_size));
62 const uint64_t read_addr_upper_bound =
static_cast<uint64_t
>(
event.src_data_addr) + read_index_upper_bound;
63 const uint64_t write_addr_upper_bound =
static_cast<uint64_t
>(
event.dst_addr) + copy_size;
66 const bool read_address_overflow = read_addr_upper_bound >
AVM_MEMORY_SIZE;
67 const bool write_address_overflow = write_addr_upper_bound >
AVM_MEMORY_SIZE;
68 const uint64_t clamped_read_index_upper_bound =
70 : read_index_upper_bound;
75 { C::data_copy_sel, 1 },
76 { C::data_copy_clk,
event.execution_clk },
77 { C::data_copy_start, 1 },
78 { C::data_copy_sel_cd_copy, is_cd_copy ? 1 : 0 },
79 { C::data_copy_sel_cd_copy_start, is_cd_copy ? 1 : 0 },
80 { C::data_copy_sel_rd_copy_start, is_rd_copy ? 1 : 0 },
82 { C::data_copy_src_context_id,
event.read_context_id },
83 { C::data_copy_dst_context_id,
event.write_context_id },
85 { C::data_copy_copy_size,
event.data_copy_size },
86 { C::data_copy_offset,
event.data_offset },
88 { C::data_copy_src_addr,
event.src_data_addr },
89 { C::data_copy_src_data_size,
event.src_data_size },
90 { C::data_copy_dst_addr,
event.dst_addr },
92 { C::data_copy_is_top_level, is_top_level ? 1 : 0 },
93 { C::data_copy_parent_id_inv, parent_id_inv },
96 { C::data_copy_offset_plus_size, data_offset + copy_size },
97 { C::data_copy_offset_plus_size_is_gt, data_offset + copy_size >
event.src_data_size ? 1 : 0 },
101 { C::data_copy_read_addr_upper_bound, read_addr_upper_bound },
102 { C::data_copy_src_reads_exceed_mem, read_address_overflow ? 1 : 0 },
103 { C::data_copy_clamped_read_index_upper_bound, clamped_read_index_upper_bound },
106 { C::data_copy_write_addr_upper_bound, write_addr_upper_bound },
113 if (write_address_overflow) {
116 { C::data_copy_end, 1 },
117 { C::data_copy_dst_out_of_range_err, 1 },
125 BB_ASSERT_EQ(
event.copying_data.size(), copy_size,
"Copying data size is not equal to copy size");
131 if (copy_size == 0) {
134 { C::data_copy_start_no_err, 1 },
135 { C::data_copy_end, 1 },
136 { C::data_copy_sel_write_count_is_zero, 1 },
137 { C::data_copy_sel_has_reads, clamped_read_index_upper_bound > data_offset ? 1 : 0 },
146 uint32_t reads_left = data_offset >= clamped_read_index_upper_bound
148 :
static_cast<uint32_t
>(clamped_read_index_upper_bound - data_offset);
150 for (uint32_t i = 0; i < copy_size; i++) {
152 auto current_copy_size = copy_size - i;
153 bool end = (current_copy_size - 1) == 0;
155 bool is_padding_row = reads_left == 0;
158 uint64_t read_addr =
event.src_data_addr + data_offset + i;
159 bool read_cd_col = is_cd_copy && is_top_level && !is_padding_row;
162 bool sel_mem_read = !is_padding_row && (is_rd_copy || !is_top_level);
163 FF value = is_padding_row ? 0 :
event.copying_data[i].as_ff();
165 FF tag = sel_mem_read ?
static_cast<FF>(
static_cast<uint8_t
>(
event.copying_data[i].get_tag())) : 0;
170 { C::data_copy_sel, 1 },
171 { C::data_copy_clk,
event.execution_clk },
172 { C::data_copy_sel_cd_copy, is_cd_copy ? 1 : 0 },
174 { C::data_copy_src_context_id,
event.read_context_id },
175 { C::data_copy_dst_context_id,
event.write_context_id },
176 { C::data_copy_dst_addr,
event.dst_addr + i },
178 { C::data_copy_start_no_err, start ? 1 : 0 },
179 { C::data_copy_end, end ? 1 : 0 },
180 { C::data_copy_copy_size, current_copy_size },
181 { C::data_copy_write_count_minus_one_inv,
182 current_copy_size - 1 },
184 { C::data_copy_sel_mem_write, 1 },
186 { C::data_copy_is_top_level, is_top_level ? 1 : 0 },
187 { C::data_copy_parent_id_inv, parent_id_inv },
189 { C::data_copy_sel_mem_read, sel_mem_read ? 1 : 0 },
190 { C::data_copy_read_addr, read_addr },
191 { C::data_copy_read_addr_plus_one, read_cd_col ? read_addr + 1 : 0 },
193 { C::data_copy_reads_left_inv, reads_left },
194 { C::data_copy_padding, is_padding_row ? 1 : 0 },
195 { C::data_copy_value,
value },
196 { C::data_copy_tag,
tag },
198 { C::data_copy_cd_copy_col_read, read_cd_col ? 1 : 0 },
201 { C::data_copy_reads_left, reads_left },
202 { C::data_copy_sel_has_reads, (start && clamped_read_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 } });