53 constexpr auto num_rows = 256 * 256;
55 static_assert(num_rows == (1U << 16),
56 "bitwise table must span 2^16 rows for sel_range_16 to be a sound outer selector for "
57 "the committed sel_bitwise granular selector (see precomputed.pil)");
58 trace.reserve_column(C::precomputed_bitwise_input_a, num_rows);
59 trace.reserve_column(C::precomputed_bitwise_input_b, num_rows);
60 trace.reserve_column(C::precomputed_bitwise_output_and, num_rows);
61 trace.reserve_column(C::precomputed_bitwise_output_or, num_rows);
62 trace.reserve_column(C::precomputed_bitwise_output_xor, num_rows);
67 for (uint32_t
a = 0;
a < 256;
a++) {
68 for (uint32_t
b = 0;
b < 256;
b++) {
71 { C::precomputed_bitwise_input_a,
FF(
a) },
72 { C::precomputed_bitwise_input_b,
FF(
b) },
73 { C::precomputed_bitwise_output_and,
FF(
a &
b) },
74 { C::precomputed_bitwise_output_or,
FF(
a |
b) },
75 { C::precomputed_bitwise_output_xor,
FF(
a ^
b) },
134 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
135 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
136 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
137 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
138 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
139 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
140 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
141 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
144 trace.reserve_column(C::precomputed_sha256_compression_round_constant, num_rows);
145 trace.reserve_column(C::precomputed_sel_sha256_compression, num_rows);
146 for (uint32_t i = 0; i < num_rows; i++) {
148 { { { C::precomputed_sel_sha256_compression, 1 },
149 { C::precomputed_sha256_compression_round_constant,
round_constants[i] } } });
184 C::precomputed_sel_op_dc_0, C::precomputed_sel_op_dc_1, C::precomputed_sel_op_dc_2,
185 C::precomputed_sel_op_dc_3, C::precomputed_sel_op_dc_4, C::precomputed_sel_op_dc_5,
186 C::precomputed_sel_op_dc_6, C::precomputed_sel_op_dc_7, C::precomputed_sel_op_dc_8,
187 C::precomputed_sel_op_dc_9, C::precomputed_sel_op_dc_10, C::precomputed_sel_op_dc_11,
188 C::precomputed_sel_op_dc_12, C::precomputed_sel_op_dc_13, C::precomputed_sel_op_dc_14,
189 C::precomputed_sel_op_dc_15,
193 constexpr uint32_t num_rows = 1 << 8;
195 trace.reserve_column(C::precomputed_opcode_out_of_range, num_rows - num_opcodes);
196 for (uint32_t i = num_opcodes; i < num_rows; i++) {
197 trace.set(C::precomputed_opcode_out_of_range, i, 1);
201 trace.reserve_column(sel_op_dc_columns.at(i), num_opcodes);
203 trace.reserve_column(C::precomputed_exec_opcode, num_opcodes);
204 trace.reserve_column(C::precomputed_instr_size, num_opcodes);
209 trace.set(sel_op_dc_columns.at(i),
210 static_cast<uint32_t
>(wire_opcode),
211 wire_instruction_spec.op_dc_selectors.at(i));
213 trace.set(C::precomputed_exec_opcode,
214 static_cast<uint32_t
>(wire_opcode),
215 static_cast<uint32_t
>(wire_instruction_spec.exec_opcode));
216 trace.set(C::precomputed_instr_size,
static_cast<uint32_t
>(wire_opcode), wire_instruction_spec.size_in_bytes);
218 if (wire_instruction_spec.tag_operand_idx.has_value()) {
219 trace.set(C::precomputed_sel_has_tag,
static_cast<uint32_t
>(wire_opcode), 1);
221 if (wire_instruction_spec.tag_operand_idx.value() == 2) {
222 trace.set(C::precomputed_sel_tag_is_op2,
static_cast<uint32_t
>(wire_opcode), 1);
238 Column::precomputed_sel_mem_op_reg_0_,
239 Column::precomputed_sel_mem_op_reg_1_,
240 Column::precomputed_sel_mem_op_reg_2_,
241 Column::precomputed_sel_mem_op_reg_3_,
244 Column::precomputed_rw_reg_0_,
245 Column::precomputed_rw_reg_1_,
246 Column::precomputed_rw_reg_2_,
247 Column::precomputed_rw_reg_3_,
250 Column::precomputed_sel_tag_check_reg_0_,
251 Column::precomputed_sel_tag_check_reg_1_,
252 Column::precomputed_sel_tag_check_reg_2_,
253 Column::precomputed_sel_tag_check_reg_3_,
256 Column::precomputed_expected_tag_reg_0_,
257 Column::precomputed_expected_tag_reg_1_,
258 Column::precomputed_expected_tag_reg_2_,
259 Column::precomputed_expected_tag_reg_3_,
263 Column::precomputed_sel_op_is_address_0_,
264 Column::precomputed_sel_op_is_address_1_,
265 Column::precomputed_sel_op_is_address_2_,
266 Column::precomputed_sel_op_is_address_3_,
267 Column::precomputed_sel_op_is_address_4_
272 trace.set(
static_cast<uint32_t
>(exec_opcode),
274 { C::precomputed_sel_exec_spec, 1 },
275 { C::precomputed_exec_opcode_opcode_gas, exec_instruction_spec.gas_cost.opcode_gas },
276 { C::precomputed_exec_opcode_base_da_gas, exec_instruction_spec.gas_cost.base_da },
277 { C::precomputed_exec_opcode_dynamic_l2_gas, exec_instruction_spec.gas_cost.dyn_l2 },
278 { C::precomputed_exec_opcode_dynamic_da_gas, exec_instruction_spec.gas_cost.dyn_da },
282 const auto& register_info = exec_instruction_spec.register_info;
283 for (
size_t i = 0; i < AVM_MAX_REGISTERS; i++) {
284 trace.set(MEM_OP_REG_COLUMNS.at(i),
static_cast<uint32_t
>(exec_opcode), register_info.is_active(i) ? 1 : 0);
285 trace.set(RW_COLUMNS.at(i),
static_cast<uint32_t
>(exec_opcode), register_info.is_write(i) ? 1 : 0);
286 trace.set(DO_TAG_CHECK_COLUMNS.at(i),
287 static_cast<uint32_t
>(exec_opcode),
288 register_info.need_tag_check(i) ? 1 : 0);
289 trace.set(EXPECTED_TAG_COLUMNS.at(i),
290 static_cast<uint32_t
>(exec_opcode),
291 static_cast<uint32_t
>(register_info.expected_tag(i).value_or(
static_cast<ValueTag>(0))));
295 for (
size_t i = 0; i < AVM_MAX_OPERANDS; i++) {
296 trace.set(SEL_OP_IS_ADDRESS_COLUMNS.at(i),
297 static_cast<uint32_t
>(exec_opcode),
298 i < exec_instruction_spec.num_addresses ? 1 : 0);
303 trace.set(
static_cast<uint32_t
>(exec_opcode),
304 { { { C::precomputed_subtrace_id,
get_subtrace_id(dispatch_to_subtrace.subtrace_selector) },
305 { C::precomputed_subtrace_operation_id, dispatch_to_subtrace.subtrace_operation_id },
306 { C::precomputed_dyn_gas_id, exec_instruction_spec.dyn_gas_id } } });
320 trace.reserve_column(C::precomputed_sel_to_radix_p_limb_counts, p_limbs_per_radix.size());
321 trace.reserve_column(C::precomputed_to_radix_safe_limbs, p_limbs_per_radix.size());
323 for (
size_t i = 0; i < p_limbs_per_radix.size(); ++i) {
324 size_t decomposition_len = p_limbs_per_radix[i].size();
325 trace.set(C::precomputed_sel_to_radix_p_limb_counts,
static_cast<uint32_t
>(i), 1);
327 trace.set(C::precomputed_to_radix_safe_limbs,
328 static_cast<uint32_t
>(i),
329 decomposition_len > 0 ? decomposition_len - 1 : 0);
330 trace.set(C::precomputed_to_radix_num_limbs_for_p,
static_cast<uint32_t
>(i), decomposition_len);
346 for (
size_t i = 0; i < p_limbs_per_radix.size(); ++i) {
347 size_t decomposition_len = p_limbs_per_radix[i].size();
348 for (
size_t j = 0; j < decomposition_len; ++j) {
349 trace.set(C::precomputed_sel_p_decomposition, row, 1);
350 trace.set(C::precomputed_p_decomposition_radix, row, i);
351 trace.set(C::precomputed_p_decomposition_limb_index, row, j);
352 trace.set(C::precomputed_p_decomposition_limb, row, p_limbs_per_radix[i][j]);
403 const uint32_t row =
static_cast<uint32_t
>(phase_value);
406 { C::precomputed_sel_phase, 1 },
407 { C::precomputed_is_public_call_request, spec.is_public_call_request ? 1 : 0 },
408 { C::precomputed_is_teardown, spec.is_teardown ? 1 : 0 },
409 { C::precomputed_is_collect_fee, spec.is_collect_fee ? 1 : 0 },
410 { C::precomputed_is_tree_padding, spec.is_tree_padding ? 1 : 0 },
411 { C::precomputed_is_cleanup, spec.is_cleanup ? 1 : 0 },
412 { C::precomputed_is_revertible, spec.is_revertible ? 1 : 0 },
413 { C::precomputed_read_pi_start_offset, spec.read_pi_start_offset },
414 { C::precomputed_read_pi_length_offset, spec.read_pi_length_offset },
415 { C::precomputed_sel_append_note_hash, spec.append_note_hash ? 1 : 0 },
416 { C::precomputed_sel_append_nullifier, spec.append_nullifier ? 1 : 0 },
417 { C::precomputed_sel_append_l2_l1_msg, spec.append_l2_l1_msg ? 1 : 0 },
418 { C::precomputed_next_phase_on_revert, spec.next_phase_on_revert },
421 trace.set(row, row_data);
451 constexpr uint32_t NUM_ROWS = 1 << 8;
455 for (uint8_t enum_value = 0; enum_value < NUM_VALID_ENV_VARS; enum_value++) {
457 trace.set(
static_cast<uint32_t
>(enum_value),
459 { C::precomputed_sel_envvar_pi_lookup_col0, envvar_spec.envvar_pi_lookup_col0 },
460 { C::precomputed_sel_envvar_pi_lookup_col1, envvar_spec.envvar_pi_lookup_col1 },
461 { C::precomputed_envvar_pi_row_idx, envvar_spec.envvar_pi_row_idx },
462 { C::precomputed_is_address, envvar_spec.is_address ? 1 : 0 },
463 { C::precomputed_is_sender, envvar_spec.is_sender ? 1 : 0 },
464 { C::precomputed_is_transactionfee, envvar_spec.is_transactionfee ? 1 : 0 },
465 { C::precomputed_is_isstaticcall, envvar_spec.is_isstaticcall ? 1 : 0 },
466 { C::precomputed_is_l2gasleft, envvar_spec.is_l2gasleft ? 1 : 0 },
467 { C::precomputed_is_dagasleft, envvar_spec.is_dagasleft ? 1 : 0 },
468 { C::precomputed_out_tag, envvar_spec.out_tag },
474 for (uint32_t i = NUM_VALID_ENV_VARS; i < NUM_ROWS; i++) {
475 trace.set(C::precomputed_invalid_envvar_enum, i, 1);
491 trace.set(
static_cast<uint32_t
>(enum_value),
493 { C::precomputed_is_valid_member_enum, spec.is_valid_member_enum ? 1 : 0 },
494 { C::precomputed_is_deployer, spec.is_deployer ? 1 : 0 },
495 { C::precomputed_is_class_id, spec.is_class_id ? 1 : 0 },
496 { C::precomputed_is_init_hash, spec.is_init_hash ? 1 : 0 },
497 { C::precomputed_is_immutables_hash, spec.is_immutables_hash ? 1 : 0 },