27 for (
const auto&
event : events) {
33 bool is_top_level =
event.read_context_id == 0;
34 FF parent_id_inv = is_top_level ? 0 :
FF(
event.read_context_id);
38 uint64_t copy_size =
static_cast<uint64_t
>(
event.data_copy_size);
39 uint64_t data_offset =
static_cast<uint64_t
>(
event.data_offset);
40 uint64_t max_read_index = std::min(data_offset + copy_size,
static_cast<uint64_t
>(
event.data_size));
42 uint64_t max_read_addr =
static_cast<uint64_t
>(
event.data_addr) + max_read_index;
43 uint64_t max_write_addr =
static_cast<uint64_t
>(
event.dst_addr) + copy_size;
48 { C::data_copy_clk,
event.execution_clk },
49 { C::data_copy_sel_start, 1 },
50 { C::data_copy_sel_cd_copy, is_cd_copy ? 1 : 0 },
51 { C::data_copy_sel_cd_copy_start, is_cd_copy ? 1 : 0 },
52 { C::data_copy_sel_rd_copy, is_rd_copy ? 1 : 0 },
53 { C::data_copy_sel_rd_copy_start, is_rd_copy ? 1 : 0 },
54 { C::data_copy_thirty_two, 32 },
56 { C::data_copy_src_context_id,
event.read_context_id },
57 { C::data_copy_dst_context_id,
event.write_context_id },
59 { C::data_copy_copy_size,
event.data_copy_size },
60 { C::data_copy_offset,
event.data_offset },
62 { C::data_copy_src_addr,
event.data_addr },
63 { C::data_copy_src_data_size,
event.data_size },
64 { C::data_copy_dst_addr,
event.dst_addr },
66 { C::data_copy_is_top_level, is_top_level ? 1 : 0 },
67 { C::data_copy_parent_id_inv, parent_id_inv },
70 { C::data_copy_offset_plus_size, data_offset + copy_size },
71 { C::data_copy_offset_plus_size_is_gt, data_offset + copy_size >
event.data_size ? 1 : 0 },
72 { C::data_copy_max_read_index, max_read_index },
76 { C::data_copy_max_read_addr, max_read_addr },
77 { C::data_copy_max_write_addr, max_write_addr },
87 bool read_address_overflow = max_read_addr >
MAX_MEM_ADDR;
88 bool write_address_overflow = max_write_addr >
MAX_MEM_ADDR;
89 if (read_address_overflow || write_address_overflow) {
92 { C::data_copy_sel_end, 1 },
94 { C::data_copy_src_out_of_range_err, read_address_overflow ? 1 : 0 },
95 { C::data_copy_dst_out_of_range_err, write_address_overflow ? 1 : 0 },
96 { C::data_copy_err, 1 },
102 auto reads_left = data_offset > max_read_index ? 0 : max_read_index - data_offset;
108 if (copy_size == 0) {
111 { C::data_copy_sel_start_no_err, 1 },
112 { C::data_copy_sel_end, 1 },
113 { C::data_copy_sel_write_count_is_zero, 1 },
122 for (uint32_t i = 0; i <
event.calldata.size(); i++) {
124 auto current_copy_size = copy_size - i;
125 bool end = (current_copy_size - 1) == 0;
127 bool is_padding_row = reads_left == 0;
130 auto read_addr =
event.data_addr + data_offset + i;
131 bool read_cd_col = is_cd_copy && is_top_level && !is_padding_row;
134 bool sel_mem_read = !is_padding_row && (is_rd_copy ||
event.read_context_id != 0);
135 FF value = is_padding_row ? 0 :
event.calldata[i];
140 { C::data_copy_clk,
event.execution_clk },
141 { C::data_copy_sel_cd_copy, is_cd_copy ? 1 : 0 },
142 { C::data_copy_sel_rd_copy, is_rd_copy ? 1 : 0 },
143 { C::data_copy_thirty_two, 32 },
145 { C::data_copy_src_context_id,
event.read_context_id },
146 { C::data_copy_dst_context_id,
event.write_context_id },
147 { C::data_copy_dst_addr,
event.dst_addr + i },
149 { C::data_copy_sel_start_no_err, start ? 1 : 0 },
150 { C::data_copy_sel_end, end ? 1 : 0 },
151 { C::data_copy_copy_size, current_copy_size },
152 { C::data_copy_write_count_minus_one_inv,
153 current_copy_size - 1 },
155 { C::data_copy_sel_mem_write, 1 },
157 { C::data_copy_is_top_level, is_top_level ? 1 : 0 },
158 { C::data_copy_parent_id_inv, parent_id_inv },
160 { C::data_copy_sel_mem_read, sel_mem_read ? 1 : 0 },
161 { C::data_copy_read_addr, read_addr },
162 { C::data_copy_read_addr_plus_one, read_cd_col ? read_addr + 1 : 0 },
164 { C::data_copy_reads_left_inv, reads_left },
165 { C::data_copy_padding, is_padding_row ? 1 : 0 },
166 { C::data_copy_value,
value },
168 { C::data_copy_cd_copy_col_read, read_cd_col ? 1 : 0 },
171 { C::data_copy_reads_left, reads_left },
172 { C::data_copy_offset_gt_max_read_index, (start && data_offset > max_read_index) ? 1 : 0 },
175 { C::data_copy_write_count_zero_inv, start ?
FF(copy_size) : 0 },
178 reads_left = reads_left == 0 ? 0 : reads_left - 1;
184 trace.invert_columns({ { C::data_copy_parent_id_inv,
185 C::data_copy_write_count_zero_inv,
186 C::data_copy_reads_left_inv,
187 C::data_copy_write_count_minus_one_inv } });