41 constexpr auto num_rows = 256 * 256 * 3;
42 trace.reserve_column(C::precomputed_sel_bitwise, num_rows);
43 trace.reserve_column(C::precomputed_bitwise_input_a, num_rows);
44 trace.reserve_column(C::precomputed_bitwise_input_b, num_rows);
45 trace.reserve_column(C::precomputed_bitwise_output, num_rows);
52 auto row_from_inputs = [](
BitwiseOperation op_id, uint32_t input_a, uint32_t input_b) -> uint32_t {
53 return (
static_cast<uint32_t
>(op_id) << 16) | (input_a << 8) | input_b;
55 auto compute_operation = [](
BitwiseOperation op_id, uint32_t
a, uint32_t
b) -> uint32_t {
65 assert(
false &&
"This should not happen");
70 for (uint32_t
a = 0;
a < 256;
a++) {
71 for (uint32_t
b = 0;
b < 256;
b++) {
72 trace.set(row_from_inputs(op_id,
a,
b),
74 { C::precomputed_sel_bitwise, 1 },
75 { C::precomputed_bitwise_op_id,
static_cast<uint8_t
>(op_id) },
76 { C::precomputed_bitwise_input_a,
FF(
a) },
77 { C::precomputed_bitwise_input_b,
FF(
b) },
78 { C::precomputed_bitwise_output,
FF(compute_operation(op_id,
a,
b)) },
135 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
136 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
137 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
138 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
139 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
140 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
141 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
142 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
145 trace.reserve_column(C::precomputed_sha256_compression_round_constant, num_rows);
146 trace.reserve_column(C::precomputed_sel_sha256_compression, num_rows);
147 for (uint32_t i = 0; i < num_rows; i++) {
149 { { { C::precomputed_sel_sha256_compression, 1 },
150 { C::precomputed_sha256_compression_round_constant,
round_constants[i] } } });
174 C::precomputed_sel_op_dc_0, C::precomputed_sel_op_dc_1, C::precomputed_sel_op_dc_2,
175 C::precomputed_sel_op_dc_3, C::precomputed_sel_op_dc_4, C::precomputed_sel_op_dc_5,
176 C::precomputed_sel_op_dc_6, C::precomputed_sel_op_dc_7, C::precomputed_sel_op_dc_8,
177 C::precomputed_sel_op_dc_9, C::precomputed_sel_op_dc_10, C::precomputed_sel_op_dc_11,
178 C::precomputed_sel_op_dc_12, C::precomputed_sel_op_dc_13, C::precomputed_sel_op_dc_14,
179 C::precomputed_sel_op_dc_15, C::precomputed_sel_op_dc_16, C::precomputed_sel_op_dc_17,
183 constexpr uint32_t num_rows = 1 << 8;
185 trace.reserve_column(C::precomputed_opcode_out_of_range, num_rows - num_opcodes);
186 for (uint32_t i = num_opcodes; i < num_rows; i++) {
187 trace.set(C::precomputed_opcode_out_of_range, i, 1);
191 trace.reserve_column(sel_op_dc_columns.at(i), num_opcodes);
193 trace.reserve_column(C::precomputed_exec_opcode, num_opcodes);
194 trace.reserve_column(C::precomputed_instr_size, num_opcodes);
199 trace.set(sel_op_dc_columns.at(i),
200 static_cast<uint32_t
>(wire_opcode),
201 wire_instruction_spec.op_dc_selectors.at(i));
203 trace.set(C::precomputed_exec_opcode,
204 static_cast<uint32_t
>(wire_opcode),
205 static_cast<uint32_t
>(wire_instruction_spec.exec_opcode));
206 trace.set(C::precomputed_instr_size,
static_cast<uint32_t
>(wire_opcode), wire_instruction_spec.size_in_bytes);
208 if (wire_instruction_spec.tag_operand_idx.has_value()) {
209 trace.set(C::precomputed_sel_has_tag,
static_cast<uint32_t
>(wire_opcode), 1);
211 if (wire_instruction_spec.tag_operand_idx.value() == 2) {
212 trace.set(C::precomputed_sel_tag_is_op2,
static_cast<uint32_t
>(wire_opcode), 1);
221 Column::precomputed_sel_mem_op_reg_0_, Column::precomputed_sel_mem_op_reg_1_,
222 Column::precomputed_sel_mem_op_reg_2_, Column::precomputed_sel_mem_op_reg_3_,
223 Column::precomputed_sel_mem_op_reg_4_, Column::precomputed_sel_mem_op_reg_5_,
226 Column::precomputed_rw_reg_0_, Column::precomputed_rw_reg_1_, Column::precomputed_rw_reg_2_,
227 Column::precomputed_rw_reg_3_, Column::precomputed_rw_reg_4_, Column::precomputed_rw_reg_5_,
230 Column::precomputed_sel_tag_check_reg_0_, Column::precomputed_sel_tag_check_reg_1_,
231 Column::precomputed_sel_tag_check_reg_2_, Column::precomputed_sel_tag_check_reg_3_,
232 Column::precomputed_sel_tag_check_reg_4_, Column::precomputed_sel_tag_check_reg_5_,
235 Column::precomputed_expected_tag_reg_0_, Column::precomputed_expected_tag_reg_1_,
236 Column::precomputed_expected_tag_reg_2_, Column::precomputed_expected_tag_reg_3_,
237 Column::precomputed_expected_tag_reg_4_, Column::precomputed_expected_tag_reg_5_,
241 Column::precomputed_sel_op_is_address_0_, Column::precomputed_sel_op_is_address_1_,
242 Column::precomputed_sel_op_is_address_2_, Column::precomputed_sel_op_is_address_3_,
243 Column::precomputed_sel_op_is_address_4_, Column::precomputed_sel_op_is_address_5_,
244 Column::precomputed_sel_op_is_address_6_,
249 trace.set(
static_cast<uint32_t
>(exec_opcode),
251 { C::precomputed_sel_exec_spec, 1 },
252 { C::precomputed_exec_opcode_opcode_gas, exec_instruction_spec.gas_cost.opcode_gas },
253 { C::precomputed_exec_opcode_base_da_gas, exec_instruction_spec.gas_cost.base_da },
254 { C::precomputed_exec_opcode_dynamic_l2_gas, exec_instruction_spec.gas_cost.dyn_l2 },
255 { C::precomputed_exec_opcode_dynamic_da_gas, exec_instruction_spec.gas_cost.dyn_da },
261 trace.set(MEM_OP_REG_COLUMNS.at(i),
static_cast<uint32_t
>(exec_opcode), register_info.is_active(i) ? 1 : 0);
262 trace.set(RW_COLUMNS.at(i),
static_cast<uint32_t
>(exec_opcode), register_info.is_write(i) ? 1 : 0);
263 trace.set(DO_TAG_CHECK_COLUMNS.at(i),
264 static_cast<uint32_t
>(exec_opcode),
265 register_info.need_tag_check(i) ? 1 : 0);
266 trace.set(EXPECTED_TAG_COLUMNS.at(i),
267 static_cast<uint32_t
>(exec_opcode),
268 static_cast<uint32_t
>(register_info.expected_tag(i).value_or(
static_cast<ValueTag>(0))));
273 trace.set(SEL_OP_IS_ADDRESS_COLUMNS.at(i),
274 static_cast<uint32_t
>(exec_opcode),
275 i < exec_instruction_spec.num_addresses ? 1 : 0);
280 trace.set(
static_cast<uint32_t
>(exec_opcode),
281 { { { C::precomputed_subtrace_id,
get_subtrace_id(dispatch_to_subtrace.subtrace_selector) },
282 { C::precomputed_subtrace_operation_id, dispatch_to_subtrace.subtrace_operation_id },
283 { C::precomputed_dyn_gas_id, exec_instruction_spec.dyn_gas_id } } });
291 trace.reserve_column(C::precomputed_sel_to_radix_p_limb_counts, p_limbs_per_radix.size());
292 trace.reserve_column(C::precomputed_to_radix_safe_limbs, p_limbs_per_radix.size());
294 for (
size_t i = 0; i < p_limbs_per_radix.size(); ++i) {
295 size_t decomposition_len = p_limbs_per_radix[i].size();
296 if (decomposition_len > 0) {
297 trace.set(C::precomputed_sel_to_radix_p_limb_counts,
static_cast<uint32_t
>(i), 1);
298 trace.set(C::precomputed_to_radix_safe_limbs,
static_cast<uint32_t
>(i), decomposition_len - 1);
299 trace.set(C::precomputed_to_radix_num_limbs_for_p,
static_cast<uint32_t
>(i), decomposition_len);
309 for (
size_t i = 0; i < p_limbs_per_radix.size(); ++i) {
310 size_t decomposition_len = p_limbs_per_radix[i].size();
311 for (
size_t j = 0; j < decomposition_len; ++j) {
312 trace.set(C::precomputed_sel_p_decomposition, row, 1);
313 trace.set(C::precomputed_p_decomposition_radix, row, i);
314 trace.set(C::precomputed_p_decomposition_limb_index, row, j);
315 trace.set(C::precomputed_p_decomposition_limb, row, p_limbs_per_radix[i][j]);
348 const uint32_t row =
static_cast<uint32_t
>(phase_value);
351 { C::precomputed_sel_phase, 1 },
352 { C::precomputed_is_public_call_request, spec.is_public_call_request ? 1 : 0 },
353 { C::precomputed_is_teardown, spec.is_teardown ? 1 : 0 },
354 { C::precomputed_is_collect_fee, spec.is_collect_fee ? 1 : 0 },
355 { C::precomputed_is_tree_padding, spec.is_tree_padding ? 1 : 0 },
356 { C::precomputed_is_cleanup, spec.is_cleanup ? 1 : 0 },
357 { C::precomputed_is_revertible, spec.is_revertible ? 1 : 0 },
358 { C::precomputed_read_pi_start_offset, spec.read_pi_start_offset },
359 { C::precomputed_read_pi_length_offset, spec.read_pi_length_offset },
360 { C::precomputed_sel_non_revertible_append_note_hash, spec.non_revertible_append_note_hash ? 1 : 0 },
361 { C::precomputed_sel_non_revertible_append_nullifier, spec.non_revertible_append_nullifier ? 1 : 0 },
362 { C::precomputed_sel_non_revertible_append_l2_l1_msg, spec.non_revertible_append_l2_l1_msg ? 1 : 0 },
363 { C::precomputed_sel_revertible_append_note_hash, spec.revertible_append_note_hash ? 1 : 0 },
364 { C::precomputed_sel_revertible_append_nullifier, spec.revertible_append_nullifier ? 1 : 0 },
365 { C::precomputed_sel_revertible_append_l2_l1_msg, spec.revertible_append_l2_l1_msg ? 1 : 0 },
366 { C::precomputed_next_phase_on_revert, spec.next_phase_on_revert },
369 trace.set(row, row_data);
391 constexpr uint32_t NUM_ROWS = 1 << 8;
395 for (uint32_t i = 0; i < NUM_ROWS; i++) {
396 trace.set(C::precomputed_invalid_envvar_enum, i, 1);
401 trace.set(
static_cast<uint32_t
>(enum_value),
403 { C::precomputed_invalid_envvar_enum, 0 },
404 { C::precomputed_sel_envvar_pi_lookup_col0, envvar_spec.envvar_pi_lookup_col0 },
405 { C::precomputed_sel_envvar_pi_lookup_col1, envvar_spec.envvar_pi_lookup_col1 },
406 { C::precomputed_envvar_pi_row_idx, envvar_spec.envvar_pi_row_idx },
407 { C::precomputed_is_address, envvar_spec.is_address ? 1 : 0 },
408 { C::precomputed_is_sender, envvar_spec.is_sender ? 1 : 0 },
409 { C::precomputed_is_transactionfee, envvar_spec.is_transactionfee ? 1 : 0 },
410 { C::precomputed_is_isstaticcall, envvar_spec.is_isstaticcall ? 1 : 0 },
411 { C::precomputed_is_l2gasleft, envvar_spec.is_l2gasleft ? 1 : 0 },
412 { C::precomputed_is_dagasleft, envvar_spec.is_dagasleft ? 1 : 0 },
413 { C::precomputed_out_tag, envvar_spec.out_tag },