53 constexpr auto num_rows = 256 * 256;
55 trace.reserve_column(C::precomputed_bitwise_input_a, num_rows);
56 trace.reserve_column(C::precomputed_bitwise_input_b, num_rows);
57 trace.reserve_column(C::precomputed_bitwise_output_and, num_rows);
58 trace.reserve_column(C::precomputed_bitwise_output_or, num_rows);
59 trace.reserve_column(C::precomputed_bitwise_output_xor, num_rows);
64 for (uint32_t
a = 0;
a < 256;
a++) {
65 for (uint32_t
b = 0;
b < 256;
b++) {
68 { C::precomputed_bitwise_input_a,
FF(
a) },
69 { C::precomputed_bitwise_input_b,
FF(
b) },
70 { C::precomputed_bitwise_output_and,
FF(
a &
b) },
71 { C::precomputed_bitwise_output_or,
FF(
a |
b) },
72 { C::precomputed_bitwise_output_xor,
FF(
a ^
b) },
131 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
132 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
133 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
134 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
135 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
136 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
137 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
138 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
141 trace.reserve_column(C::precomputed_sha256_compression_round_constant, num_rows);
142 trace.reserve_column(C::precomputed_sel_sha256_compression, num_rows);
143 for (uint32_t i = 0; i < num_rows; i++) {
145 { { { C::precomputed_sel_sha256_compression, 1 },
146 { C::precomputed_sha256_compression_round_constant,
round_constants[i] } } });
181 C::precomputed_sel_op_dc_0, C::precomputed_sel_op_dc_1, C::precomputed_sel_op_dc_2,
182 C::precomputed_sel_op_dc_3, C::precomputed_sel_op_dc_4, C::precomputed_sel_op_dc_5,
183 C::precomputed_sel_op_dc_6, C::precomputed_sel_op_dc_7, C::precomputed_sel_op_dc_8,
184 C::precomputed_sel_op_dc_9, C::precomputed_sel_op_dc_10, C::precomputed_sel_op_dc_11,
185 C::precomputed_sel_op_dc_12, C::precomputed_sel_op_dc_13, C::precomputed_sel_op_dc_14,
186 C::precomputed_sel_op_dc_15, C::precomputed_sel_op_dc_16,
190 constexpr uint32_t num_rows = 1 << 8;
192 trace.reserve_column(C::precomputed_opcode_out_of_range, num_rows - num_opcodes);
193 for (uint32_t i = num_opcodes; i < num_rows; i++) {
194 trace.set(C::precomputed_opcode_out_of_range, i, 1);
198 trace.reserve_column(sel_op_dc_columns.at(i), num_opcodes);
200 trace.reserve_column(C::precomputed_exec_opcode, num_opcodes);
201 trace.reserve_column(C::precomputed_instr_size, num_opcodes);
206 trace.set(sel_op_dc_columns.at(i),
207 static_cast<uint32_t
>(wire_opcode),
208 wire_instruction_spec.op_dc_selectors.at(i));
210 trace.set(C::precomputed_exec_opcode,
211 static_cast<uint32_t
>(wire_opcode),
212 static_cast<uint32_t
>(wire_instruction_spec.exec_opcode));
213 trace.set(C::precomputed_instr_size,
static_cast<uint32_t
>(wire_opcode), wire_instruction_spec.size_in_bytes);
215 if (wire_instruction_spec.tag_operand_idx.has_value()) {
216 trace.set(C::precomputed_sel_has_tag,
static_cast<uint32_t
>(wire_opcode), 1);
218 if (wire_instruction_spec.tag_operand_idx.value() == 2) {
219 trace.set(C::precomputed_sel_tag_is_op2,
static_cast<uint32_t
>(wire_opcode), 1);
235 Column::precomputed_sel_mem_op_reg_0_, Column::precomputed_sel_mem_op_reg_1_,
236 Column::precomputed_sel_mem_op_reg_2_, Column::precomputed_sel_mem_op_reg_3_,
237 Column::precomputed_sel_mem_op_reg_4_, Column::precomputed_sel_mem_op_reg_5_,
240 Column::precomputed_rw_reg_0_, Column::precomputed_rw_reg_1_, Column::precomputed_rw_reg_2_,
241 Column::precomputed_rw_reg_3_, Column::precomputed_rw_reg_4_, Column::precomputed_rw_reg_5_,
244 Column::precomputed_sel_tag_check_reg_0_, Column::precomputed_sel_tag_check_reg_1_,
245 Column::precomputed_sel_tag_check_reg_2_, Column::precomputed_sel_tag_check_reg_3_,
246 Column::precomputed_sel_tag_check_reg_4_, Column::precomputed_sel_tag_check_reg_5_,
249 Column::precomputed_expected_tag_reg_0_, Column::precomputed_expected_tag_reg_1_,
250 Column::precomputed_expected_tag_reg_2_, Column::precomputed_expected_tag_reg_3_,
251 Column::precomputed_expected_tag_reg_4_, Column::precomputed_expected_tag_reg_5_,
255 Column::precomputed_sel_op_is_address_0_, Column::precomputed_sel_op_is_address_1_,
256 Column::precomputed_sel_op_is_address_2_, Column::precomputed_sel_op_is_address_3_,
257 Column::precomputed_sel_op_is_address_4_, Column::precomputed_sel_op_is_address_5_,
258 Column::precomputed_sel_op_is_address_6_,
263 trace.set(
static_cast<uint32_t
>(exec_opcode),
265 { C::precomputed_sel_exec_spec, 1 },
266 { C::precomputed_exec_opcode_opcode_gas, exec_instruction_spec.gas_cost.opcode_gas },
267 { C::precomputed_exec_opcode_base_da_gas, exec_instruction_spec.gas_cost.base_da },
268 { C::precomputed_exec_opcode_dynamic_l2_gas, exec_instruction_spec.gas_cost.dyn_l2 },
269 { C::precomputed_exec_opcode_dynamic_da_gas, exec_instruction_spec.gas_cost.dyn_da },
273 const auto& register_info = exec_instruction_spec.register_info;
275 trace.set(MEM_OP_REG_COLUMNS.at(i),
static_cast<uint32_t
>(exec_opcode), register_info.is_active(i) ? 1 : 0);
276 trace.set(RW_COLUMNS.at(i),
static_cast<uint32_t
>(exec_opcode), register_info.is_write(i) ? 1 : 0);
277 trace.set(DO_TAG_CHECK_COLUMNS.at(i),
278 static_cast<uint32_t
>(exec_opcode),
279 register_info.need_tag_check(i) ? 1 : 0);
280 trace.set(EXPECTED_TAG_COLUMNS.at(i),
281 static_cast<uint32_t
>(exec_opcode),
282 static_cast<uint32_t
>(register_info.expected_tag(i).value_or(
static_cast<ValueTag>(0))));
287 trace.set(SEL_OP_IS_ADDRESS_COLUMNS.at(i),
288 static_cast<uint32_t
>(exec_opcode),
289 i < exec_instruction_spec.num_addresses ? 1 : 0);
294 trace.set(
static_cast<uint32_t
>(exec_opcode),
295 { { { C::precomputed_subtrace_id,
get_subtrace_id(dispatch_to_subtrace.subtrace_selector) },
296 { C::precomputed_subtrace_operation_id, dispatch_to_subtrace.subtrace_operation_id },
297 { C::precomputed_dyn_gas_id, exec_instruction_spec.dyn_gas_id } } });
311 trace.reserve_column(C::precomputed_sel_to_radix_p_limb_counts, p_limbs_per_radix.size());
312 trace.reserve_column(C::precomputed_to_radix_safe_limbs, p_limbs_per_radix.size());
314 for (
size_t i = 0; i < p_limbs_per_radix.size(); ++i) {
315 size_t decomposition_len = p_limbs_per_radix[i].size();
316 trace.set(C::precomputed_sel_to_radix_p_limb_counts,
static_cast<uint32_t
>(i), 1);
318 trace.set(C::precomputed_to_radix_safe_limbs,
319 static_cast<uint32_t
>(i),
320 decomposition_len > 0 ? decomposition_len - 1 : 0);
321 trace.set(C::precomputed_to_radix_num_limbs_for_p,
static_cast<uint32_t
>(i), decomposition_len);
337 for (
size_t i = 0; i < p_limbs_per_radix.size(); ++i) {
338 size_t decomposition_len = p_limbs_per_radix[i].size();
339 for (
size_t j = 0; j < decomposition_len; ++j) {
340 trace.set(C::precomputed_sel_p_decomposition, row, 1);
341 trace.set(C::precomputed_p_decomposition_radix, row, i);
342 trace.set(C::precomputed_p_decomposition_limb_index, row, j);
343 trace.set(C::precomputed_p_decomposition_limb, row, p_limbs_per_radix[i][j]);
391 const uint32_t row =
static_cast<uint32_t
>(phase_value);
394 { C::precomputed_sel_phase, 1 },
395 { C::precomputed_is_public_call_request, spec.is_public_call_request ? 1 : 0 },
396 { C::precomputed_is_teardown, spec.is_teardown ? 1 : 0 },
397 { C::precomputed_is_collect_fee, spec.is_collect_fee ? 1 : 0 },
398 { C::precomputed_is_tree_padding, spec.is_tree_padding ? 1 : 0 },
399 { C::precomputed_is_cleanup, spec.is_cleanup ? 1 : 0 },
400 { C::precomputed_is_revertible, spec.is_revertible ? 1 : 0 },
401 { C::precomputed_read_pi_start_offset, spec.read_pi_start_offset },
402 { C::precomputed_read_pi_length_offset, spec.read_pi_length_offset },
403 { C::precomputed_sel_append_note_hash, spec.append_note_hash ? 1 : 0 },
404 { C::precomputed_sel_append_nullifier, spec.append_nullifier ? 1 : 0 },
405 { C::precomputed_sel_append_l2_l1_msg, spec.append_l2_l1_msg ? 1 : 0 },
406 { C::precomputed_next_phase_on_revert, spec.next_phase_on_revert },
409 trace.set(row, row_data);
439 constexpr uint32_t NUM_ROWS = 1 << 8;
443 for (uint8_t enum_value = 0; enum_value < NUM_VALID_ENV_VARS; enum_value++) {
445 trace.set(
static_cast<uint32_t
>(enum_value),
447 { C::precomputed_sel_envvar_pi_lookup_col0, envvar_spec.envvar_pi_lookup_col0 },
448 { C::precomputed_sel_envvar_pi_lookup_col1, envvar_spec.envvar_pi_lookup_col1 },
449 { C::precomputed_envvar_pi_row_idx, envvar_spec.envvar_pi_row_idx },
450 { C::precomputed_is_address, envvar_spec.is_address ? 1 : 0 },
451 { C::precomputed_is_sender, envvar_spec.is_sender ? 1 : 0 },
452 { C::precomputed_is_transactionfee, envvar_spec.is_transactionfee ? 1 : 0 },
453 { C::precomputed_is_isstaticcall, envvar_spec.is_isstaticcall ? 1 : 0 },
454 { C::precomputed_is_l2gasleft, envvar_spec.is_l2gasleft ? 1 : 0 },
455 { C::precomputed_is_dagasleft, envvar_spec.is_dagasleft ? 1 : 0 },
456 { C::precomputed_out_tag, envvar_spec.out_tag },
462 for (uint32_t i = NUM_VALID_ENV_VARS; i < NUM_ROWS; i++) {
463 trace.set(C::precomputed_invalid_envvar_enum, i, 1);