144 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
145 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
146 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
147 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
148 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
149 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
150 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
151 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
154 trace.reserve_column(C::precomputed_sha256_compression_round_constant, num_rows);
155 trace.reserve_column(C::precomputed_sel_sha256_compression, num_rows);
156 for (uint32_t i = 0; i < num_rows; i++) {
158 { { { C::precomputed_sel_sha256_compression, 1 },
159 { C::precomputed_sha256_compression_round_constant,
round_constants[i] } } });
186 C::precomputed_sel_op_dc_0, C::precomputed_sel_op_dc_1, C::precomputed_sel_op_dc_2,
187 C::precomputed_sel_op_dc_3, C::precomputed_sel_op_dc_4, C::precomputed_sel_op_dc_5,
188 C::precomputed_sel_op_dc_6, C::precomputed_sel_op_dc_7, C::precomputed_sel_op_dc_8,
189 C::precomputed_sel_op_dc_9, C::precomputed_sel_op_dc_10, C::precomputed_sel_op_dc_11,
190 C::precomputed_sel_op_dc_12, C::precomputed_sel_op_dc_13, C::precomputed_sel_op_dc_14,
191 C::precomputed_sel_op_dc_15, C::precomputed_sel_op_dc_16, C::precomputed_sel_op_dc_17,
195 constexpr uint32_t num_rows = 1 << 8;
197 trace.reserve_column(C::precomputed_opcode_out_of_range, num_rows - num_opcodes);
198 for (uint32_t i = num_opcodes; i < num_rows; i++) {
199 trace.set(C::precomputed_opcode_out_of_range, i, 1);
203 trace.reserve_column(sel_op_dc_columns.at(i), num_opcodes);
205 trace.reserve_column(C::precomputed_exec_opcode, num_opcodes);
206 trace.reserve_column(C::precomputed_instr_size, num_opcodes);
211 trace.set(sel_op_dc_columns.at(i),
212 static_cast<uint32_t
>(wire_opcode),
213 wire_instruction_spec.op_dc_selectors.at(i));
215 trace.set(C::precomputed_exec_opcode,
216 static_cast<uint32_t
>(wire_opcode),
217 static_cast<uint32_t
>(wire_instruction_spec.exec_opcode));
218 trace.set(C::precomputed_instr_size,
static_cast<uint32_t
>(wire_opcode), wire_instruction_spec.size_in_bytes);
220 if (wire_instruction_spec.tag_operand_idx.has_value()) {
221 trace.set(C::precomputed_sel_has_tag,
static_cast<uint32_t
>(wire_opcode), 1);
223 if (wire_instruction_spec.tag_operand_idx.value() == 2) {
224 trace.set(C::precomputed_sel_tag_is_op2,
static_cast<uint32_t
>(wire_opcode), 1);
234 constexpr size_t NUM_REGISTERS = 7;
236 Column::precomputed_sel_mem_op_reg_0_, Column::precomputed_sel_mem_op_reg_1_,
237 Column::precomputed_sel_mem_op_reg_2_, Column::precomputed_sel_mem_op_reg_3_,
238 Column::precomputed_sel_mem_op_reg_4_, Column::precomputed_sel_mem_op_reg_5_,
239 Column::precomputed_sel_mem_op_reg_6_,
242 Column::precomputed_rw_reg_0_, Column::precomputed_rw_reg_1_, Column::precomputed_rw_reg_2_,
243 Column::precomputed_rw_reg_3_, Column::precomputed_rw_reg_4_, Column::precomputed_rw_reg_5_,
244 Column::precomputed_rw_reg_6_,
247 Column::precomputed_sel_tag_check_reg_0_, Column::precomputed_sel_tag_check_reg_1_,
248 Column::precomputed_sel_tag_check_reg_2_, Column::precomputed_sel_tag_check_reg_3_,
249 Column::precomputed_sel_tag_check_reg_4_, Column::precomputed_sel_tag_check_reg_5_,
250 Column::precomputed_sel_tag_check_reg_6_,
253 Column::precomputed_expected_tag_reg_0_, Column::precomputed_expected_tag_reg_1_,
254 Column::precomputed_expected_tag_reg_2_, Column::precomputed_expected_tag_reg_3_,
255 Column::precomputed_expected_tag_reg_4_, Column::precomputed_expected_tag_reg_5_,
256 Column::precomputed_expected_tag_reg_6_,
259 constexpr size_t NUM_OPERANDS = 7;
261 Column::precomputed_sel_op_is_address_0_, Column::precomputed_sel_op_is_address_1_,
262 Column::precomputed_sel_op_is_address_2_, Column::precomputed_sel_op_is_address_3_,
263 Column::precomputed_sel_op_is_address_4_, Column::precomputed_sel_op_is_address_5_,
264 Column::precomputed_sel_op_is_address_6_,
269 trace.set(
static_cast<uint32_t
>(exec_opcode),
271 { C::precomputed_sel_exec_spec, 1 },
272 { C::precomputed_exec_opcode_opcode_gas, exec_instruction_spec.gas_cost.opcode_gas },
273 { C::precomputed_exec_opcode_base_da_gas, exec_instruction_spec.gas_cost.base_da },
274 { C::precomputed_exec_opcode_dynamic_l2_gas, exec_instruction_spec.gas_cost.dyn_l2 },
275 { C::precomputed_exec_opcode_dynamic_da_gas, exec_instruction_spec.gas_cost.dyn_da },
280 for (
size_t i = 0; i < NUM_REGISTERS; i++) {
281 trace.set(MEM_OP_REG_COLUMNS.at(i),
static_cast<uint32_t
>(exec_opcode), register_info.is_active(i) ? 1 : 0);
282 trace.set(RW_COLUMNS.at(i),
static_cast<uint32_t
>(exec_opcode), register_info.is_write(i) ? 1 : 0);
283 trace.set(DO_TAG_CHECK_COLUMNS.at(i),
284 static_cast<uint32_t
>(exec_opcode),
285 register_info.need_tag_check(i) ? 1 : 0);
286 trace.set(EXPECTED_TAG_COLUMNS.at(i),
287 static_cast<uint32_t
>(exec_opcode),
288 static_cast<uint32_t
>(register_info.expected_tag(i).value_or(
static_cast<ValueTag>(0))));
292 for (
size_t i = 0; i < NUM_OPERANDS; i++) {
293 trace.set(SEL_OP_IS_ADDRESS_COLUMNS.at(i),
294 static_cast<uint32_t
>(exec_opcode),
295 i < exec_instruction_spec.num_addresses ? 1 : 0);
300 trace.set(
static_cast<uint32_t
>(exec_opcode),
301 { { { C::precomputed_subtrace_id,
get_subtrace_id(dispatch_to_subtrace.subtrace_selector) },
302 { C::precomputed_subtrace_operation_id, dispatch_to_subtrace.subtrace_operation_id },
303 { C::precomputed_dyn_gas_id, exec_instruction_spec.dyn_gas_id } } });
379 { C::precomputed_sel_phase, 1 },
381 { C::precomputed_sel_non_revertible_append_nullifier, 1 },
383 { C::precomputed_read_public_input_offset, nr_nullifiers.read_pi_offset },
384 { C::precomputed_read_public_input_length_offset, nr_nullifiers.read_pi_length_offset },
385 { C::precomputed_sel_can_emit_nullifier, 1 },
393 { C::precomputed_sel_phase, 1 },
395 { C::precomputed_sel_non_revertible_append_note_hash, 1 },
397 { C::precomputed_read_public_input_offset, nr_note_hash.read_pi_offset },
398 { C::precomputed_read_public_input_length_offset, nr_note_hash.read_pi_length_offset },
399 { C::precomputed_sel_can_emit_note_hash, 1 },
407 { C::precomputed_sel_phase, 1 },
409 { C::precomputed_sel_non_revertible_append_l2_l1_msg, 1 },
411 { C::precomputed_read_public_input_offset, nr_l2_to_l1_msgs.read_pi_offset },
412 { C::precomputed_read_public_input_length_offset, nr_l2_to_l1_msgs.read_pi_length_offset },
413 { C::precomputed_sel_can_emit_l2_l1_msg, 1 },
421 { C::precomputed_sel_phase, 1 },
423 { C::precomputed_is_public_call_request_phase, 1 },
425 { C::precomputed_read_public_input_offset, setup.read_pi_offset },
426 { C::precomputed_read_public_input_length_offset, setup.read_pi_length_offset },
427 { C::precomputed_sel_can_emit_note_hash, 1 },
428 { C::precomputed_sel_can_emit_nullifier, 1 },
429 { C::precomputed_sel_can_write_public_data, 1 },
430 { C::precomputed_sel_can_emit_unencrypted_log, 1 },
431 { C::precomputed_sel_can_emit_l2_l1_msg, 1 },
439 { C::precomputed_sel_phase, 1 },
441 { C::precomputed_sel_revertible_append_nullifier, 1 },
442 { C::precomputed_is_revertible, 1 },
445 { C::precomputed_read_public_input_offset, r_nullifiers.read_pi_offset },
446 { C::precomputed_read_public_input_length_offset, r_nullifiers.read_pi_length_offset },
447 { C::precomputed_sel_can_emit_nullifier, 1 },
455 { C::precomputed_sel_phase, 1 },
457 { C::precomputed_sel_revertible_append_note_hash, 1 },
458 { C::precomputed_is_revertible, 1 },
461 { C::precomputed_read_public_input_offset, r_note_hash.read_pi_offset },
462 { C::precomputed_read_public_input_length_offset, r_note_hash.read_pi_length_offset },
463 { C::precomputed_sel_can_emit_note_hash, 1 },
471 { C::precomputed_sel_phase, 1 },
473 { C::precomputed_sel_revertible_append_l2_l1_msg, 1 },
474 { C::precomputed_is_revertible, 1 },
477 { C::precomputed_read_public_input_offset, r_l2_to_l1_msgs.read_pi_offset },
478 { C::precomputed_read_public_input_length_offset, r_l2_to_l1_msgs.read_pi_length_offset },
479 { C::precomputed_sel_can_emit_l2_l1_msg, 1 },
487 { C::precomputed_sel_phase, 1 },
489 { C::precomputed_is_public_call_request_phase, 1 },
490 { C::precomputed_is_revertible, 1 },
493 { C::precomputed_read_public_input_offset, app_logic.read_pi_offset },
494 { C::precomputed_read_public_input_length_offset, app_logic.read_pi_length_offset },
495 { C::precomputed_sel_can_emit_note_hash, 1 },
496 { C::precomputed_sel_can_emit_nullifier, 1 },
497 { C::precomputed_sel_can_write_public_data, 1 },
498 { C::precomputed_sel_can_emit_unencrypted_log, 1 },
499 { C::precomputed_sel_can_emit_l2_l1_msg, 1 },
507 { C::precomputed_sel_phase, 1 },
509 { C::precomputed_is_public_call_request_phase, 1 },
510 { C::precomputed_is_revertible, 1 },
513 { C::precomputed_read_public_input_offset, teardown.read_pi_offset },
514 { C::precomputed_read_public_input_length_offset, teardown.read_pi_length_offset },
515 { C::precomputed_sel_can_emit_note_hash, 1 },
516 { C::precomputed_sel_can_emit_nullifier, 1 },
517 { C::precomputed_sel_can_write_public_data, 1 },
518 { C::precomputed_sel_can_emit_unencrypted_log, 1 },
519 { C::precomputed_sel_can_emit_l2_l1_msg, 1 },
527 { C::precomputed_sel_phase, 1 },
529 { C::precomputed_sel_collect_fee, 1 },
530 { C::precomputed_is_revertible, 0 },
532 { C::precomputed_read_public_input_offset, pay_gas.read_pi_offset },
533 { C::precomputed_read_public_input_length_offset, pay_gas.read_pi_length_offset },
534 { C::precomputed_sel_can_write_public_data, 1 },
541 { C::precomputed_sel_phase, 1 },
543 { C::precomputed_sel_tree_padding, 1 },
544 { C::precomputed_is_revertible, 0 },
545 { C::precomputed_sel_can_emit_note_hash, 1 },
546 { C::precomputed_sel_can_emit_nullifier, 1 },
553 { C::precomputed_sel_phase, 1 },
555 { C::precomputed_sel_cleanup, 1 },
556 { C::precomputed_is_revertible, 0 },