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).invert();
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 },
114 { C::data_copy_write_count_zero_inv, copy_size == 0 ? 0 :
FF(copy_size).invert() },
123 for (uint32_t i = 0; i <
event.calldata.size(); i++) {
125 auto current_copy_size = copy_size - i;
126 bool end = (current_copy_size - 1) == 0;
128 bool is_padding_row = reads_left == 0;
131 auto read_addr =
event.data_addr + data_offset + i;
132 bool read_cd_col = is_cd_copy && is_top_level && !is_padding_row;
135 bool sel_mem_read = !is_padding_row && (is_rd_copy ||
event.read_context_id != 0);
136 FF value = is_padding_row ? 0 :
event.calldata[i];
137 FF reads_left_inv = is_padding_row ? 0 :
FF(reads_left).
invert();
139 FF write_count_mins_one_inv = end ? 0 :
FF(current_copy_size - 1).
invert();
143 { C::data_copy_clk,
event.execution_clk },
144 { C::data_copy_sel_cd_copy, is_cd_copy ? 1 : 0 },
145 { C::data_copy_sel_rd_copy, is_rd_copy ? 1 : 0 },
146 { C::data_copy_thirty_two, 32 },
148 { C::data_copy_src_context_id,
event.read_context_id },
149 { C::data_copy_dst_context_id,
event.write_context_id },
150 { C::data_copy_dst_addr,
event.dst_addr + i },
152 { C::data_copy_sel_start_no_err, start ? 1 : 0 },
153 { C::data_copy_sel_end, end ? 1 : 0 },
154 { C::data_copy_copy_size, current_copy_size },
155 { C::data_copy_write_count_minus_one_inv, write_count_mins_one_inv },
157 { C::data_copy_sel_mem_write, 1 },
159 { C::data_copy_is_top_level, is_top_level ? 1 : 0 },
160 { C::data_copy_parent_id_inv, parent_id_inv },
162 { C::data_copy_sel_mem_read, sel_mem_read ? 1 : 0 },
163 { C::data_copy_read_addr, read_addr },
165 { C::data_copy_reads_left_inv, reads_left_inv },
166 { C::data_copy_padding, is_padding_row ? 1 : 0 },
167 { C::data_copy_value,
value },
169 { C::data_copy_cd_copy_col_read, read_cd_col ? 1 : 0 },
172 { C::data_copy_reads_left, reads_left },
173 { C::data_copy_offset_gt_max_read_index, (start && data_offset > max_read_index) ? 1 : 0 },
176 { C::data_copy_write_count_zero_inv, start ?
FF(copy_size).invert() : 0 },
179 reads_left = reads_left == 0 ? 0 : reads_left - 1;