From fffc4bc8e7a0497212b20ca8424f5e201781dacb Mon Sep 17 00:00:00 2001 From: Zach Langley Date: Wed, 17 Dec 2025 21:37:08 -0500 Subject: [PATCH 1/3] feat: update plonky3 to 0.4 (#2293) Updates to plonky3 v0.4.0. Syncs with https://github.com/openvm-org/stark-backend/pull/195 closes INT-4245 --------- Co-authored-by: Jonathan Wang <31040440+jonathanpwang@users.noreply.github.com> --- .github/workflows/benchmark-call.yml | 2 +- .github/workflows/lints.yml | 4 +- Cargo.lock | 320 +++++++----------- Cargo.toml | 32 +- benchmarks/execute/Cargo.toml | 1 - benchmarks/execute/benches/execute.rs | 3 +- benchmarks/guest/revm_snailtracer/src/main.rs | 1 - benchmarks/prove/Cargo.toml | 1 - benchmarks/prove/src/bin/ecrecover.rs | 6 +- crates/circuits/mod-builder/Cargo.toml | 2 + crates/circuits/mod-builder/src/builder.rs | 20 +- crates/circuits/mod-builder/src/core_chip.rs | 4 +- .../circuits/mod-builder/src/symbolic_expr.rs | 14 +- .../mod-builder/src/test_utils/bls12381.rs | 6 +- .../mod-builder/src/test_utils/bn254.rs | 10 +- crates/circuits/mod-builder/src/tests.rs | 2 +- crates/circuits/poseidon2-air/Cargo.toml | 1 - crates/circuits/poseidon2-air/src/air.rs | 21 +- crates/circuits/poseidon2-air/src/babybear.rs | 42 ++- crates/circuits/poseidon2-air/src/config.rs | 6 +- crates/circuits/poseidon2-air/src/lib.rs | 27 +- crates/circuits/poseidon2-air/src/permute.rs | 124 +++---- crates/circuits/poseidon2-air/src/tests.rs | 12 +- .../primitives/src/assert_less_than/mod.rs | 6 +- .../primitives/src/assert_less_than/tests.rs | 12 +- .../src/bigint/check_carry_mod_to_zero.rs | 10 +- .../src/bigint/check_carry_to_zero.rs | 6 +- crates/circuits/primitives/src/bigint/mod.rs | 6 +- .../circuits/primitives/src/bigint/utils.rs | 4 +- .../primitives/src/bitwise_op_lookup/bus.rs | 8 +- .../primitives/src/bitwise_op_lookup/mod.rs | 27 +- .../src/bitwise_op_lookup/tests/dummy.rs | 4 +- .../src/bitwise_op_lookup/tests/mod.rs | 38 +-- crates/circuits/primitives/src/encoder/mod.rs | 15 +- .../circuits/primitives/src/encoder/tests.rs | 6 +- .../circuits/primitives/src/is_equal/tests.rs | 29 +- .../primitives/src/is_equal_array/tests.rs | 36 +- .../primitives/src/is_less_than/mod.rs | 11 +- .../primitives/src/is_less_than/tests.rs | 12 +- .../primitives/src/is_less_than_array/mod.rs | 7 +- .../src/is_less_than_array/tests.rs | 16 +- .../circuits/primitives/src/is_zero/tests.rs | 34 +- crates/circuits/primitives/src/range/bus.rs | 18 +- crates/circuits/primitives/src/range/mod.rs | 11 +- .../primitives/src/range/tests/list/air.rs | 4 +- .../primitives/src/range/tests/list/trace.rs | 2 +- .../primitives/src/range/tests/mod.rs | 2 +- .../circuits/primitives/src/range_gate/mod.rs | 16 +- .../primitives/src/range_gate/tests.rs | 10 +- .../primitives/src/range_tuple/bus.rs | 4 +- .../primitives/src/range_tuple/mod.rs | 11 +- .../primitives/src/range_tuple/tests/mod.rs | 28 +- crates/circuits/primitives/src/utils.rs | 24 +- .../circuits/primitives/src/var_range/bus.rs | 8 +- .../circuits/primitives/src/var_range/mod.rs | 16 +- .../primitives/src/var_range/tests/dummy.rs | 6 +- .../primitives/src/var_range/tests/mod.rs | 36 +- crates/circuits/primitives/src/xor/bus.rs | 4 +- .../circuits/primitives/src/xor/lookup/mod.rs | 8 +- .../primitives/src/xor/lookup/tests.rs | 14 +- crates/circuits/sha256-air/src/air.rs | 16 +- crates/circuits/sha256-air/src/columns.rs | 4 +- crates/circuits/sha256-air/src/tests.rs | 10 +- crates/circuits/sha256-air/src/trace.rs | 57 ++-- crates/circuits/sha256-air/src/utils.rs | 26 +- crates/cli/Cargo.toml | 1 - crates/cli/src/input.rs | 4 +- crates/continuations/Cargo.toml | 1 + .../continuations/src/static_verifier/mod.rs | 9 +- .../continuations/src/verifier/common/mod.rs | 2 +- crates/continuations/src/verifier/leaf/mod.rs | 4 +- .../continuations/src/verifier/leaf/vars.rs | 4 +- crates/continuations/src/verifier/root/mod.rs | 20 +- crates/continuations/src/verifier/utils.rs | 11 +- crates/sdk/Cargo.toml | 2 +- crates/sdk/src/codec.rs | 22 +- crates/sdk/src/commit.rs | 42 +-- crates/sdk/src/config/global.rs | 4 +- crates/sdk/src/keygen/asm.rs | 16 +- crates/sdk/src/keygen/dummy.rs | 2 +- crates/sdk/src/keygen/mod.rs | 6 +- crates/sdk/src/keygen/static_verifier.rs | 2 +- crates/sdk/src/stdin.rs | 2 +- crates/sdk/src/types.rs | 10 +- crates/sdk/tests/integration_test.rs | 17 +- .../instructions/benches/program_serde.rs | 16 +- .../toolchain/instructions/src/instruction.rs | 6 +- crates/toolchain/instructions/src/lib.rs | 2 +- crates/toolchain/instructions/src/utils.rs | 4 +- crates/toolchain/transpiler/src/util.rs | 44 +-- crates/vm/Cargo.toml | 1 - crates/vm/derive/src/lib.rs | 5 +- crates/vm/src/arch/config.rs | 6 +- crates/vm/src/arch/execution.rs | 8 +- crates/vm/src/arch/hasher/poseidon2.rs | 8 +- crates/vm/src/arch/integration_api.rs | 8 +- crates/vm/src/arch/testing/cpu.rs | 39 ++- crates/vm/src/arch/testing/cuda.rs | 14 +- crates/vm/src/arch/testing/execution/air.rs | 2 +- crates/vm/src/arch/testing/execution/mod.rs | 6 +- crates/vm/src/arch/testing/memory/air.rs | 10 +- crates/vm/src/arch/testing/memory/cuda.rs | 6 +- crates/vm/src/arch/testing/memory/mod.rs | 16 +- crates/vm/src/arch/testing/program/air.rs | 8 +- crates/vm/src/arch/testing/program/mod.rs | 4 +- crates/vm/src/arch/vm.rs | 23 +- crates/vm/src/system/connector/mod.rs | 15 +- crates/vm/src/system/connector/tests.rs | 6 +- crates/vm/src/system/cuda/access_adapters.rs | 18 +- crates/vm/src/system/cuda/boundary.rs | 10 +- crates/vm/src/system/cuda/memory.rs | 3 +- crates/vm/src/system/cuda/merkle_tree/mod.rs | 18 +- crates/vm/src/system/cuda/program.rs | 6 +- crates/vm/src/system/memory/adapter/air.rs | 6 +- crates/vm/src/system/memory/adapter/mod.rs | 8 +- crates/vm/src/system/memory/controller/mod.rs | 10 +- crates/vm/src/system/memory/merkle/air.rs | 13 +- .../src/system/memory/merkle/public_values.rs | 4 +- .../vm/src/system/memory/merkle/tests/mod.rs | 12 +- crates/vm/src/system/memory/merkle/trace.rs | 6 +- crates/vm/src/system/memory/merkle/tree.rs | 16 +- .../system/memory/offline_checker/bridge.rs | 13 +- .../src/system/memory/offline_checker/bus.rs | 4 +- .../system/memory/offline_checker/columns.rs | 2 +- crates/vm/src/system/memory/persistent.rs | 20 +- crates/vm/src/system/memory/tests.rs | 47 +-- crates/vm/src/system/memory/volatile/mod.rs | 15 +- crates/vm/src/system/memory/volatile/tests.rs | 20 +- crates/vm/src/system/mod.rs | 22 +- crates/vm/src/system/native_adapter/mod.rs | 18 +- crates/vm/src/system/native_adapter/util.rs | 4 +- crates/vm/src/system/phantom/mod.rs | 16 +- crates/vm/src/system/phantom/tests.rs | 4 +- crates/vm/src/system/poseidon2/air.rs | 2 +- crates/vm/src/system/poseidon2/chip.rs | 18 +- crates/vm/src/system/poseidon2/mod.rs | 26 +- crates/vm/src/system/poseidon2/tests.rs | 12 +- crates/vm/src/system/poseidon2/trace.rs | 9 +- crates/vm/src/system/program/air.rs | 4 +- crates/vm/src/system/program/bus.rs | 2 +- crates/vm/src/system/program/tests/mod.rs | 10 +- crates/vm/src/system/program/trace.rs | 8 +- crates/vm/src/system/public_values/core.rs | 8 +- crates/vm/src/system/public_values/tests.rs | 51 ++- crates/vm/src/utils/test_utils.rs | 6 +- .../algebra/circuit/src/extension/mod.rs | 7 +- .../algebra/circuit/src/extension/modular.rs | 39 ++- extensions/algebra/circuit/src/fp2.rs | 2 +- .../algebra/circuit/src/fp2_chip/tests.rs | 18 +- .../algebra/circuit/src/modular_chip/is_eq.rs | 42 +-- .../algebra/circuit/src/modular_chip/tests.rs | 51 +-- extensions/algebra/transpiler/src/lib.rs | 10 +- extensions/bigint/circuit/Cargo.toml | 1 - extensions/bigint/circuit/src/common.rs | 8 +- .../bigint/circuit/src/extension/mod.rs | 5 +- extensions/bigint/circuit/src/mult.rs | 4 +- extensions/bigint/circuit/src/shift.rs | 4 +- extensions/bigint/circuit/src/tests.rs | 14 +- extensions/bigint/transpiler/src/lib.rs | 4 +- extensions/ecc/circuit/src/extension/mod.rs | 5 +- .../ecc/circuit/src/weierstrass_chip/tests.rs | 26 +- extensions/ecc/tests/src/lib.rs | 4 +- extensions/ecc/transpiler/src/lib.rs | 6 +- extensions/keccak256/circuit/Cargo.toml | 1 - .../keccak256/circuit/cuda/src/keccak256.cu | 7 +- extensions/keccak256/circuit/src/air.rs | 68 ++-- .../keccak256/circuit/src/extension/mod.rs | 4 +- extensions/keccak256/circuit/src/tests.rs | 28 +- extensions/keccak256/circuit/src/trace.rs | 54 ++- .../src/adapters/alu_native_adapter.rs | 14 +- .../src/adapters/branch_native_adapter.rs | 22 +- .../circuit/src/adapters/convert_adapter.rs | 15 +- .../src/adapters/loadstore_native_adapter.rs | 10 +- .../src/adapters/native_vectorized_adapter.rs | 12 +- .../native/circuit/src/branch_eq/core.rs | 2 +- .../native/circuit/src/branch_eq/tests.rs | 67 ++-- extensions/native/circuit/src/castf/core.rs | 12 +- extensions/native/circuit/src/castf/tests.rs | 16 +- .../native/circuit/src/extension/mod.rs | 22 +- .../circuit/src/field_arithmetic/core.rs | 4 +- .../circuit/src/field_arithmetic/tests.rs | 36 +- .../circuit/src/field_extension/core.rs | 14 +- .../circuit/src/field_extension/tests.rs | 30 +- .../native/circuit/src/fri/execution.rs | 4 +- extensions/native/circuit/src/fri/mod.rs | 48 ++- extensions/native/circuit/src/fri/tests.rs | 20 +- .../circuit/src/jal_rangecheck/execution.rs | 4 +- .../native/circuit/src/jal_rangecheck/mod.rs | 35 +- .../circuit/src/jal_rangecheck/tests.rs | 33 +- extensions/native/circuit/src/lib.rs | 7 +- .../native/circuit/src/loadstore/core.rs | 5 +- .../native/circuit/src/loadstore/tests.rs | 8 +- .../native/circuit/src/poseidon2/air.rs | 55 ++- .../native/circuit/src/poseidon2/chip.rs | 108 +++--- .../native/circuit/src/poseidon2/execution.rs | 41 ++- .../native/circuit/src/poseidon2/tests.rs | 64 ++-- extensions/native/circuit/src/utils.rs | 13 +- extensions/native/circuit/tests/arithmetic.rs | 103 +++--- extensions/native/circuit/tests/array.rs | 8 +- .../native/circuit/tests/conditionals.rs | 16 +- .../native/circuit/tests/cycle_tracker.rs | 6 +- extensions/native/circuit/tests/ext.rs | 24 +- extensions/native/circuit/tests/fibonacci.rs | 6 +- extensions/native/circuit/tests/for_loops.rs | 28 +- .../native/circuit/tests/fri_ro_eval.rs | 20 +- extensions/native/circuit/tests/hint.rs | 6 +- .../native/circuit/tests/integration_test.rs | 30 +- extensions/native/circuit/tests/io.rs | 4 +- extensions/native/circuit/tests/poseidon2.rs | 18 +- extensions/native/circuit/tests/ptr_struct.rs | 32 +- .../native/circuit/tests/public_values.rs | 14 +- .../native/circuit/tests/range_check.rs | 8 +- extensions/native/compiler/src/asm/code.rs | 2 +- .../native/compiler/src/asm/compiler.rs | 38 +-- extensions/native/compiler/src/asm/utils.rs | 12 +- .../src/constraints/halo2/baby_bear.rs | 16 +- .../src/constraints/halo2/compiler.rs | 10 +- .../src/constraints/halo2/poseidon2_perm.rs | 2 +- .../native/compiler/src/constraints/mod.rs | 6 +- .../native/compiler/src/conversion/mod.rs | 43 ++- extensions/native/compiler/src/ir/bits.rs | 8 +- extensions/native/compiler/src/ir/builder.rs | 10 +- extensions/native/compiler/src/ir/poseidon.rs | 6 +- extensions/native/compiler/src/ir/symbolic.rs | 132 ++------ extensions/native/compiler/src/ir/types.rs | 14 +- extensions/native/compiler/src/ir/utils.rs | 19 +- extensions/native/recursion/Cargo.toml | 2 +- .../native/recursion/src/challenger/duplex.rs | 15 +- .../recursion/src/challenger/multi_field32.rs | 7 +- extensions/native/recursion/src/commit.rs | 6 +- .../native/recursion/src/config/outer.rs | 20 +- extensions/native/recursion/src/fri/domain.rs | 43 ++- extensions/native/recursion/src/fri/hints.rs | 15 +- extensions/native/recursion/src/fri/mod.rs | 2 +- .../native/recursion/src/fri/two_adic_pcs.rs | 33 +- extensions/native/recursion/src/fri/types.rs | 6 +- .../native/recursion/src/fri/witness.rs | 9 +- extensions/native/recursion/src/halo2/mod.rs | 10 +- .../native/recursion/src/halo2/tests/mod.rs | 18 +- .../src/halo2/tests/multi_field32.rs | 30 +- .../src/halo2/tests/outer_poseidon2.rs | 28 +- .../native/recursion/src/halo2/utils.rs | 2 +- extensions/native/recursion/src/hints.rs | 71 ++-- .../native/recursion/src/outer_poseidon2.rs | 4 +- extensions/native/recursion/src/stark/mod.rs | 37 +- extensions/native/recursion/src/tests.rs | 3 +- extensions/native/recursion/src/utils.rs | 15 +- extensions/native/recursion/src/view.rs | 10 +- extensions/native/recursion/src/witness.rs | 14 +- .../native/recursion/tests/recursion.rs | 6 +- extensions/native/transpiler/src/lib.rs | 2 +- extensions/pairing/circuit/Cargo.toml | 1 + extensions/pairing/circuit/src/config.rs | 5 +- extensions/pairing/circuit/src/fp12.rs | 7 +- .../pairing/circuit/src/pairing_extension.rs | 4 +- extensions/pairing/guest/Cargo.toml | 4 +- .../halo2curves_shims/bls12_381/tests/mod.rs | 2 +- .../bls12_381/tests/test_line.rs | 2 +- .../bls12_381/tests/test_miller_loop.rs | 2 +- .../src/halo2curves_shims/bn254/tests/mod.rs | 2 +- .../bn254/tests/test_line.rs | 2 +- extensions/pairing/transpiler/src/lib.rs | 4 +- extensions/rv32-adapters/src/eq_mod.rs | 34 +- extensions/rv32-adapters/src/heap_branch.rs | 25 +- extensions/rv32-adapters/src/test_utils.rs | 14 +- extensions/rv32-adapters/src/vec_heap.rs | 38 +-- extensions/rv32im/circuit/Cargo.toml | 1 - extensions/rv32im/circuit/src/adapters/alu.rs | 33 +- .../rv32im/circuit/src/adapters/branch.rs | 22 +- .../rv32im/circuit/src/adapters/jalr.rs | 30 +- .../rv32im/circuit/src/adapters/loadstore.rs | 56 ++- extensions/rv32im/circuit/src/adapters/mod.rs | 8 +- extensions/rv32im/circuit/src/adapters/mul.rs | 26 +- .../rv32im/circuit/src/adapters/rdwrite.rs | 25 +- extensions/rv32im/circuit/src/auipc/core.rs | 21 +- extensions/rv32im/circuit/src/auipc/tests.rs | 22 +- .../rv32im/circuit/src/base_alu/core.rs | 16 +- .../rv32im/circuit/src/base_alu/tests.rs | 17 +- .../rv32im/circuit/src/branch_eq/core.rs | 22 +- .../rv32im/circuit/src/branch_eq/tests.rs | 24 +- .../rv32im/circuit/src/branch_lt/core.rs | 40 ++- .../rv32im/circuit/src/branch_lt/tests.rs | 22 +- extensions/rv32im/circuit/src/divrem/core.rs | 50 ++- extensions/rv32im/circuit/src/divrem/tests.rs | 28 +- .../rv32im/circuit/src/extension/mod.rs | 10 +- .../rv32im/circuit/src/hintstore/mod.rs | 73 ++-- .../rv32im/circuit/src/hintstore/tests.rs | 18 +- extensions/rv32im/circuit/src/jal_lui/core.rs | 26 +- .../rv32im/circuit/src/jal_lui/tests.rs | 18 +- extensions/rv32im/circuit/src/jalr/core.rs | 25 +- extensions/rv32im/circuit/src/jalr/tests.rs | 32 +- .../rv32im/circuit/src/less_than/core.rs | 36 +- .../rv32im/circuit/src/less_than/tests.rs | 14 +- extensions/rv32im/circuit/src/lib.rs | 7 +- .../circuit/src/load_sign_extend/core.rs | 17 +- .../circuit/src/load_sign_extend/tests.rs | 26 +- .../rv32im/circuit/src/loadstore/core.rs | 28 +- .../rv32im/circuit/src/loadstore/execution.rs | 8 +- .../rv32im/circuit/src/loadstore/tests.rs | 32 +- extensions/rv32im/circuit/src/mul/core.rs | 10 +- extensions/rv32im/circuit/src/mul/tests.rs | 14 +- extensions/rv32im/circuit/src/mulh/core.rs | 24 +- extensions/rv32im/circuit/src/mulh/tests.rs | 20 +- extensions/rv32im/circuit/src/shift/core.rs | 40 +-- extensions/rv32im/circuit/src/shift/tests.rs | 26 +- extensions/rv32im/circuit/src/test_utils.rs | 8 +- extensions/rv32im/tests/src/lib.rs | 16 +- extensions/rv32im/transpiler/src/lib.rs | 14 +- extensions/rv32im/transpiler/src/rrs.rs | 10 +- extensions/sha256/circuit/Cargo.toml | 1 - extensions/sha256/circuit/src/lib.rs | 5 +- .../sha256/circuit/src/sha256_chip/air.rs | 67 ++-- .../sha256/circuit/src/sha256_chip/tests.rs | 16 +- .../sha256/circuit/src/sha256_chip/trace.rs | 37 +- guest-libs/ff_derive/Cargo.toml | 2 +- guest-libs/ff_derive/src/lib.rs | 2 +- guest-libs/ff_derive/src/pow_fixed.rs | 2 +- guest-libs/k256/tests/lib.rs | 8 +- guest-libs/p256/tests/lib.rs | 8 +- guest-libs/pairing/Cargo.toml | 3 +- guest-libs/pairing/src/bls12_381/tests.rs | 2 +- guest-libs/pairing/src/bn254/tests.rs | 2 +- guest-libs/pairing/tests/lib.rs | 70 ++-- ...penvm_init_bls_final_exp_hint_bls12_381.rs | 2 +- .../openvm_init_bn_final_exp_hint_bn254.rs | 2 +- .../openvm_init_fp12_mul_bls12_381.rs | 2 +- .../programs/openvm_init_fp12_mul_bn254.rs | 2 +- .../openvm_init_pairing_check_bls12_381.rs | 2 +- .../openvm_init_pairing_check_bn254.rs | 2 +- .../openvm_init_pairing_line_bls12_381.rs | 2 +- .../openvm_init_pairing_line_bn254.rs | 2 +- ...envm_init_pairing_miller_loop_bls12_381.rs | 2 +- .../openvm_init_pairing_miller_loop_bn254.rs | 2 +- ...envm_init_pairing_miller_step_bls12_381.rs | 2 +- .../openvm_init_pairing_miller_step_bn254.rs | 2 +- 335 files changed, 2801 insertions(+), 2983 deletions(-) diff --git a/.github/workflows/benchmark-call.yml b/.github/workflows/benchmark-call.yml index 9b7230799f..c8c285fe18 100644 --- a/.github/workflows/benchmark-call.yml +++ b/.github/workflows/benchmark-call.yml @@ -157,7 +157,7 @@ jobs: run: | ALLOCATOR=${{ inputs.memory_allocator || github.event.inputs.memory_allocator }} if [[ ! "${{ inputs.instance_type || github.event.inputs.instance_type }}" =~ ^g ]]; then - FEATURE_FLAGS=${FEATURE_FLAGS},nightly-features + FEATURE_FLAGS=${FEATURE_FLAGS} if [[ "${{ inputs.e2e_bench }}" == "true" ]]; then FEATURE_FLAGS=${FEATURE_FLAGS},evm fi diff --git a/.github/workflows/lints.yml b/.github/workflows/lints.yml index 907bb874f2..8e8d32aeda 100644 --- a/.github/workflows/lints.yml +++ b/.github/workflows/lints.yml @@ -39,7 +39,7 @@ jobs: # list of all unique features across workspace generated using: # cargo metadata --format-version=1 --no-deps | jq -r '.packages[].features | to_entries[] | .key' | sort -u | tr '\n' ' ' && echo "" # (exclude mimalloc since it conflicts with jemalloc) - cargo clippy --all-targets --all --tests --features "aggregation bls12_381 bn254 build-elfs default entrypoint evm-prove evm-verify export-intrinsics export-libm function-span getrandom-unsupported halo2-compiler halo2curves heap-embedded-alloc jemalloc jemalloc-prof metrics nightly-features panic-handler parallel perf-metrics rust-runtime static-verifier std test-utils" -- -D warnings + cargo clippy --all-targets --all --tests --features "aggregation bls12_381 bn254 build-elfs default entrypoint evm-prove evm-verify export-intrinsics export-libm function-span getrandom-unsupported halo2-compiler halo2curves heap-embedded-alloc jemalloc jemalloc-prof metrics panic-handler parallel perf-metrics rust-runtime static-verifier std test-utils" -- -D warnings cargo clippy --all-targets --all --tests --no-default-features --features "mimalloc" -- -D warnings - name: Run fmt, clippy for guest run: | @@ -103,7 +103,7 @@ jobs: - name: Run clippy run: | # includes GPU specific features cuda and touchemall - cargo clippy --all-targets --all --tests --features "aggregation bls12_381 bn254 build-elfs cuda default entrypoint evm-prove evm-verify export-intrinsics export-libm function-span getrandom-unsupported halo2-compiler halo2curves heap-embedded-alloc jemalloc jemalloc-prof metrics nightly-features panic-handler parallel perf-metrics rust-runtime static-verifier std test-utils touchemall" -- -D warnings + cargo clippy --all-targets --all --tests --features "aggregation bls12_381 bn254 build-elfs cuda default entrypoint evm-prove evm-verify export-intrinsics export-libm function-span getrandom-unsupported halo2-compiler halo2curves heap-embedded-alloc jemalloc jemalloc-prof metrics panic-handler parallel perf-metrics rust-runtime static-verifier std test-utils touchemall" -- -D warnings cargo clippy --all-targets --all --tests --no-default-features --features "jemalloc jemalloc-prof" -- -D warnings - name: Run clang-tidy run: | diff --git a/Cargo.lock b/Cargo.lock index 5509556cdf..e67707a8da 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -528,7 +528,7 @@ dependencies = [ "alloy-rlp", "alloy-serde", "alloy-sol-types", - "itertools 0.14.0", + "itertools 0.13.0", "serde", "serde_json", "serde_with", @@ -3588,27 +3588,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" dependencies = [ "bitvec", - "byteorder", - "ff_derive", "rand_core 0.6.4", "subtle", ] -[[package]] -name = "ff_derive" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f10d12652036b0e99197587c6ba87a8fc3031986499973c030d8b44fcc151b60" -dependencies = [ - "addchain", - "num-bigint 0.3.3", - "num-integer", - "num-traits", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "figment" version = "0.10.19" @@ -3791,7 +3774,7 @@ dependencies = [ "dyn-clone", "foundry-compilers-artifacts", "foundry-compilers-core", - "itertools 0.14.0", + "itertools 0.13.0", "path-slash", "rayon", "semver 1.0.26", @@ -4044,12 +4027,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42012b0f064e01aa58b545fe3727f90f7dd4020f4a3ea735b50344965f5a57e9" -[[package]] -name = "gcd" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d758ba1b47b00caf47f24925c0074ecb20d6dfcffe7f6d53395c0465674841a" - [[package]] name = "generational-arena" version = "0.2.9" @@ -4322,35 +4299,6 @@ dependencies = [ "rayon", ] -[[package]] -name = "halo2curves" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b756596082144af6e57105a20403b7b80fe9dccd085700b74fae3af523b74dba" -dependencies = [ - "blake2", - "digest 0.10.7", - "ff 0.13.1", - "group 0.13.0", - "halo2derive", - "hex", - "lazy_static", - "num-bigint 0.4.6", - "num-integer", - "num-traits", - "pairing 0.23.0", - "paste", - "rand 0.8.5", - "rand_core 0.6.4", - "rayon", - "serde", - "serde_arrays", - "sha2 0.10.9", - "static_assertions", - "subtle", - "unroll", -] - [[package]] name = "halo2curves-axiom" version = "0.7.2" @@ -4406,20 +4354,6 @@ dependencies = [ "unroll", ] -[[package]] -name = "halo2derive" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdb99e7492b4f5ff469d238db464131b86c2eaac814a78715acba369f64d2c76" -dependencies = [ - "num-bigint 0.4.6", - "num-integer", - "num-traits", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "hashbrown" version = "0.12.3" @@ -5185,7 +5119,7 @@ dependencies = [ "openvm-stark-sdk", "openvm-toolchain-tests", "openvm-transpiler", - "rand 0.8.5", + "rand 0.9.2", "serde", "signature 2.2.0", ] @@ -5229,7 +5163,7 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" dependencies = [ - "spin", + "spin 0.9.8", ] [[package]] @@ -5850,18 +5784,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" -[[package]] -name = "nums" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf3c74f925fb8cfc49a8022f2afce48a0683b70f9e439885594e84c5edbf5b01" -dependencies = [ - "num-bigint 0.4.6", - "num-integer", - "num-traits", - "rand 0.8.5", -] - [[package]] name = "nybbles" version = "0.4.5" @@ -6086,7 +6008,7 @@ dependencies = [ "openvm-rv32im-circuit", "openvm-stark-backend", "openvm-stark-sdk", - "rand 0.8.5", + "rand 0.9.2", "serde", "serde_with", "strum 0.26.3", @@ -6190,7 +6112,7 @@ dependencies = [ "openvm-sha256-transpiler", "openvm-stark-sdk", "openvm-transpiler", - "rand 0.8.5", + "rand 0.9.2", "serde", "tracing", "tracing-subscriber 0.3.20", @@ -6215,7 +6137,7 @@ dependencies = [ "openvm-stark-backend", "openvm-stark-sdk", "openvm-transpiler", - "rand 0.8.5", + "rand 0.9.2", "rand_chacha 0.3.1", "tiny-keccak", "tokio", @@ -6266,7 +6188,7 @@ dependencies = [ "openvm-rv32im-transpiler", "openvm-stark-backend", "openvm-stark-sdk", - "rand 0.8.5", + "rand 0.9.2", "serde", "test-case", ] @@ -6338,7 +6260,7 @@ dependencies = [ "openvm-stark-sdk", "p3-baby-bear", "p3-field", - "rand 0.8.5", + "rand 0.9.2", "rustc-hash 2.1.1", "serde", "serde-big-array", @@ -6374,7 +6296,7 @@ dependencies = [ "openvm-cuda-common", "openvm-stark-backend", "openvm-stark-sdk", - "rand 0.8.5", + "rand 0.9.2", "test-case", "tracing", ] @@ -6398,6 +6320,7 @@ dependencies = [ "openvm-native-recursion", "openvm-stark-backend", "openvm-stark-sdk", + "p3-bn254", "serde", "static_assertions", ] @@ -6405,7 +6328,7 @@ dependencies = [ [[package]] name = "openvm-cuda-backend" version = "1.2.2" -source = "git+https://github.com/openvm-org/stark-backend.git?tag=v1.2.2#972f5dbecb6ab3ff7e3e978e9087235ad17c1de9" +source = "git+https://github.com/openvm-org/stark-backend.git?branch=develop-v1.3.0#40e0be820e8b889e00b67f7a679f1ec3480b7c84" dependencies = [ "bincode 2.0.1", "bincode_derive", @@ -6437,7 +6360,7 @@ dependencies = [ [[package]] name = "openvm-cuda-builder" version = "1.2.2" -source = "git+https://github.com/openvm-org/stark-backend.git?tag=v1.2.2#972f5dbecb6ab3ff7e3e978e9087235ad17c1de9" +source = "git+https://github.com/openvm-org/stark-backend.git?branch=develop-v1.3.0#40e0be820e8b889e00b67f7a679f1ec3480b7c84" dependencies = [ "cc", "glob", @@ -6446,7 +6369,7 @@ dependencies = [ [[package]] name = "openvm-cuda-common" version = "1.2.2" -source = "git+https://github.com/openvm-org/stark-backend.git?tag=v1.2.2#972f5dbecb6ab3ff7e3e978e9087235ad17c1de9" +source = "git+https://github.com/openvm-org/stark-backend.git?branch=develop-v1.3.0#40e0be820e8b889e00b67f7a679f1ec3480b7c84" dependencies = [ "bytesize", "ctor", @@ -6493,7 +6416,7 @@ dependencies = [ "openvm-rv32-adapters", "openvm-stark-backend", "openvm-stark-sdk", - "rand 0.8.5", + "rand 0.9.2", "serde", "serde_with", "strum 0.26.3", @@ -6598,7 +6521,7 @@ dependencies = [ "openvm-instructions-derive", "openvm-stark-backend", "p3-baby-bear", - "rand 0.8.5", + "rand 0.9.2", "serde", "strum 0.26.3", "strum_macros 0.26.4", @@ -6654,7 +6577,7 @@ dependencies = [ "openvm-stark-backend", "openvm-stark-sdk", "p3-keccak-air", - "rand 0.8.5", + "rand 0.9.2", "serde", "strum 0.26.3", "tiny-keccak", @@ -6707,6 +6630,7 @@ dependencies = [ "openvm-stark-backend", "openvm-stark-sdk", "rand 0.8.5", + "rand 0.9.2", "tracing", ] @@ -6737,7 +6661,7 @@ dependencies = [ "openvm-stark-sdk", "p3-field", "p3-symmetric", - "rand 0.8.5", + "rand 0.9.2", "serde", "static_assertions", "strum 0.26.3", @@ -6798,6 +6722,7 @@ dependencies = [ "p3-merkle-tree", "p3-symmetric", "rand 0.8.5", + "rand 0.9.2", "serde", "serde_json", "serde_with", @@ -6879,6 +6804,7 @@ dependencies = [ "openvm-stark-backend", "openvm-stark-sdk", "rand 0.8.5", + "rand 0.9.2", "serde", "strum 0.26.3", ] @@ -6939,11 +6865,10 @@ dependencies = [ "openvm-cuda-common", "openvm-stark-backend", "openvm-stark-sdk", - "p3-monty-31", "p3-poseidon2", "p3-poseidon2-air", "p3-symmetric", - "rand 0.8.5", + "rand 0.9.2", "zkhash", ] @@ -6973,7 +6898,7 @@ dependencies = [ "openvm-rv32im-circuit", "openvm-stark-backend", "openvm-stark-sdk", - "rand 0.8.5", + "rand 0.9.2", ] [[package]] @@ -6997,7 +6922,7 @@ dependencies = [ "openvm-rv32im-transpiler", "openvm-stark-backend", "openvm-stark-sdk", - "rand 0.8.5", + "rand 0.9.2", "serde", "strum 0.26.3", "test-case", @@ -7102,8 +7027,9 @@ dependencies = [ "openvm-stark-backend", "openvm-stark-sdk", "openvm-transpiler", + "p3-bn254", "p3-fri", - "rand 0.8.5", + "rand 0.9.2", "rrs-lib", "serde", "serde_json", @@ -7142,7 +7068,7 @@ dependencies = [ "openvm-circuit-primitives", "openvm-stark-backend", "openvm-stark-sdk", - "rand 0.8.5", + "rand 0.9.2", "sha2 0.10.9", ] @@ -7166,7 +7092,7 @@ dependencies = [ "openvm-sha256-transpiler", "openvm-stark-backend", "openvm-stark-sdk", - "rand 0.8.5", + "rand 0.9.2", "serde", "sha2 0.10.9", "strum 0.26.3", @@ -7195,7 +7121,7 @@ dependencies = [ [[package]] name = "openvm-stark-backend" version = "1.2.2" -source = "git+https://github.com/openvm-org/stark-backend.git?tag=v1.2.2#972f5dbecb6ab3ff7e3e978e9087235ad17c1de9" +source = "git+https://github.com/openvm-org/stark-backend.git?branch=develop-v1.3.0#40e0be820e8b889e00b67f7a679f1ec3480b7c84" dependencies = [ "bitcode", "cfg-if", @@ -7225,7 +7151,7 @@ dependencies = [ [[package]] name = "openvm-stark-sdk" version = "1.2.2" -source = "git+https://github.com/openvm-org/stark-backend.git?tag=v1.2.2#972f5dbecb6ab3ff7e3e978e9087235ad17c1de9" +source = "git+https://github.com/openvm-org/stark-backend.git?branch=develop-v1.3.0#40e0be820e8b889e00b67f7a679f1ec3480b7c84" dependencies = [ "dashmap", "derivative", @@ -7235,10 +7161,11 @@ dependencies = [ "metrics", "metrics-tracing-context", "metrics-util", + "num-bigint 0.4.6", "openvm-stark-backend", "p3-baby-bear", "p3-blake3", - "p3-bn254-fr", + "p3-bn254", "p3-dft", "p3-fri", "p3-goldilocks", @@ -7248,7 +7175,7 @@ dependencies = [ "p3-poseidon", "p3-poseidon2", "p3-symmetric", - "rand 0.8.5", + "rand 0.9.2", "serde", "serde_json", "static_assertions", @@ -7279,7 +7206,7 @@ dependencies = [ "openvm-stark-backend", "openvm-stark-sdk", "openvm-transpiler", - "rand 0.8.5", + "rand 0.9.2", "serde", "tempfile", "test-case", @@ -7372,7 +7299,7 @@ dependencies = [ "openvm-stark-sdk", "openvm-toolchain-tests", "openvm-transpiler", - "rand 0.8.5", + "rand 0.9.2", "serde", ] @@ -7390,8 +7317,8 @@ dependencies = [ [[package]] name = "p3-air" -version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?rev=539bbc84085efb609f4f62cb03cf49588388abdb#539bbc84085efb609f4f62cb03cf49588388abdb" +version = "0.4.0" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=1eed8e6#1eed8e6dd4ef6d29868dd5c25e525b49c07ec5ad" dependencies = [ "p3-field", "p3-matrix", @@ -7399,22 +7326,22 @@ dependencies = [ [[package]] name = "p3-baby-bear" -version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?rev=539bbc84085efb609f4f62cb03cf49588388abdb#539bbc84085efb609f4f62cb03cf49588388abdb" +version = "0.4.0" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=1eed8e6#1eed8e6dd4ef6d29868dd5c25e525b49c07ec5ad" dependencies = [ + "p3-challenger", "p3-field", "p3-mds", "p3-monty-31", "p3-poseidon2", "p3-symmetric", - "rand 0.8.5", - "serde", + "rand 0.9.2", ] [[package]] name = "p3-blake3" -version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?rev=539bbc84085efb609f4f62cb03cf49588388abdb#539bbc84085efb609f4f62cb03cf49588388abdb" +version = "0.4.0" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=1eed8e6#1eed8e6dd4ef6d29868dd5c25e525b49c07ec5ad" dependencies = [ "blake3", "p3-symmetric", @@ -7422,27 +7349,28 @@ dependencies = [ ] [[package]] -name = "p3-bn254-fr" -version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?rev=539bbc84085efb609f4f62cb03cf49588388abdb#539bbc84085efb609f4f62cb03cf49588388abdb" +name = "p3-bn254" +version = "0.4.0" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=1eed8e6#1eed8e6dd4ef6d29868dd5c25e525b49c07ec5ad" dependencies = [ - "ff 0.13.1", - "halo2curves", "num-bigint 0.4.6", "p3-field", "p3-poseidon2", "p3-symmetric", - "rand 0.8.5", + "p3-util", + "paste", + "rand 0.9.2", "serde", ] [[package]] name = "p3-challenger" -version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?rev=539bbc84085efb609f4f62cb03cf49588388abdb#539bbc84085efb609f4f62cb03cf49588388abdb" +version = "0.4.0" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=1eed8e6#1eed8e6dd4ef6d29868dd5c25e525b49c07ec5ad" dependencies = [ "p3-field", "p3-maybe-rayon", + "p3-monty-31", "p3-symmetric", "p3-util", "tracing", @@ -7450,8 +7378,8 @@ dependencies = [ [[package]] name = "p3-commit" -version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?rev=539bbc84085efb609f4f62cb03cf49588388abdb#539bbc84085efb609f4f62cb03cf49588388abdb" +version = "0.4.0" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=1eed8e6#1eed8e6dd4ef6d29868dd5c25e525b49c07ec5ad" dependencies = [ "itertools 0.14.0", "p3-challenger", @@ -7464,38 +7392,37 @@ dependencies = [ [[package]] name = "p3-dft" -version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?rev=539bbc84085efb609f4f62cb03cf49588388abdb#539bbc84085efb609f4f62cb03cf49588388abdb" +version = "0.4.0" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=1eed8e6#1eed8e6dd4ef6d29868dd5c25e525b49c07ec5ad" dependencies = [ "itertools 0.14.0", "p3-field", "p3-matrix", "p3-maybe-rayon", "p3-util", + "spin 0.10.0", "tracing", ] [[package]] name = "p3-field" -version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?rev=539bbc84085efb609f4f62cb03cf49588388abdb#539bbc84085efb609f4f62cb03cf49588388abdb" +version = "0.4.0" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=1eed8e6#1eed8e6dd4ef6d29868dd5c25e525b49c07ec5ad" dependencies = [ "itertools 0.14.0", "num-bigint 0.4.6", - "num-integer", - "num-traits", - "nums", "p3-maybe-rayon", "p3-util", - "rand 0.8.5", + "paste", + "rand 0.9.2", "serde", "tracing", ] [[package]] name = "p3-fri" -version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?rev=539bbc84085efb609f4f62cb03cf49588388abdb#539bbc84085efb609f4f62cb03cf49588388abdb" +version = "0.4.0" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=1eed8e6#1eed8e6dd4ef6d29868dd5c25e525b49c07ec5ad" dependencies = [ "itertools 0.14.0", "p3-challenger", @@ -7506,32 +7433,34 @@ dependencies = [ "p3-matrix", "p3-maybe-rayon", "p3-util", - "rand 0.8.5", + "rand 0.9.2", "serde", + "thiserror 2.0.15", "tracing", ] [[package]] name = "p3-goldilocks" -version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?rev=539bbc84085efb609f4f62cb03cf49588388abdb#539bbc84085efb609f4f62cb03cf49588388abdb" +version = "0.4.0" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=1eed8e6#1eed8e6dd4ef6d29868dd5c25e525b49c07ec5ad" dependencies = [ "num-bigint 0.4.6", + "p3-challenger", "p3-dft", "p3-field", "p3-mds", - "p3-poseidon", "p3-poseidon2", "p3-symmetric", "p3-util", - "rand 0.8.5", + "paste", + "rand 0.9.2", "serde", ] [[package]] name = "p3-interpolation" -version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?rev=539bbc84085efb609f4f62cb03cf49588388abdb#539bbc84085efb609f4f62cb03cf49588388abdb" +version = "0.4.0" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=1eed8e6#1eed8e6dd4ef6d29868dd5c25e525b49c07ec5ad" dependencies = [ "p3-field", "p3-matrix", @@ -7541,10 +7470,9 @@ dependencies = [ [[package]] name = "p3-keccak" -version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?rev=539bbc84085efb609f4f62cb03cf49588388abdb#539bbc84085efb609f4f62cb03cf49588388abdb" +version = "0.4.0" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=1eed8e6#1eed8e6dd4ef6d29868dd5c25e525b49c07ec5ad" dependencies = [ - "itertools 0.14.0", "p3-field", "p3-symmetric", "p3-util", @@ -7553,42 +7481,41 @@ dependencies = [ [[package]] name = "p3-keccak-air" -version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?rev=539bbc84085efb609f4f62cb03cf49588388abdb#539bbc84085efb609f4f62cb03cf49588388abdb" +version = "0.4.0" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=1eed8e6#1eed8e6dd4ef6d29868dd5c25e525b49c07ec5ad" dependencies = [ "p3-air", "p3-field", "p3-matrix", "p3-maybe-rayon", "p3-util", - "rand 0.8.5", + "rand 0.9.2", "tracing", ] [[package]] name = "p3-koala-bear" -version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?rev=539bbc84085efb609f4f62cb03cf49588388abdb#539bbc84085efb609f4f62cb03cf49588388abdb" +version = "0.4.0" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=1eed8e6#1eed8e6dd4ef6d29868dd5c25e525b49c07ec5ad" dependencies = [ + "p3-challenger", "p3-field", - "p3-mds", "p3-monty-31", "p3-poseidon2", "p3-symmetric", - "rand 0.8.5", - "serde", + "rand 0.9.2", ] [[package]] name = "p3-matrix" -version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?rev=539bbc84085efb609f4f62cb03cf49588388abdb#539bbc84085efb609f4f62cb03cf49588388abdb" +version = "0.4.0" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=1eed8e6#1eed8e6dd4ef6d29868dd5c25e525b49c07ec5ad" dependencies = [ "itertools 0.14.0", "p3-field", "p3-maybe-rayon", "p3-util", - "rand 0.8.5", + "rand 0.9.2", "serde", "tracing", "transpose", @@ -7596,30 +7523,28 @@ dependencies = [ [[package]] name = "p3-maybe-rayon" -version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?rev=539bbc84085efb609f4f62cb03cf49588388abdb#539bbc84085efb609f4f62cb03cf49588388abdb" +version = "0.4.0" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=1eed8e6#1eed8e6dd4ef6d29868dd5c25e525b49c07ec5ad" dependencies = [ "rayon", ] [[package]] name = "p3-mds" -version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?rev=539bbc84085efb609f4f62cb03cf49588388abdb#539bbc84085efb609f4f62cb03cf49588388abdb" +version = "0.4.0" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=1eed8e6#1eed8e6dd4ef6d29868dd5c25e525b49c07ec5ad" dependencies = [ - "itertools 0.14.0", "p3-dft", "p3-field", - "p3-matrix", "p3-symmetric", "p3-util", - "rand 0.8.5", + "rand 0.9.2", ] [[package]] name = "p3-merkle-tree" -version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?rev=539bbc84085efb609f4f62cb03cf49588388abdb#539bbc84085efb609f4f62cb03cf49588388abdb" +version = "0.4.0" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=1eed8e6#1eed8e6dd4ef6d29868dd5c25e525b49c07ec5ad" dependencies = [ "itertools 0.14.0", "p3-commit", @@ -7628,15 +7553,16 @@ dependencies = [ "p3-maybe-rayon", "p3-symmetric", "p3-util", - "rand 0.8.5", + "rand 0.9.2", "serde", + "thiserror 2.0.15", "tracing", ] [[package]] name = "p3-monty-31" -version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?rev=539bbc84085efb609f4f62cb03cf49588388abdb#539bbc84085efb609f4f62cb03cf49588388abdb" +version = "0.4.0" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=1eed8e6#1eed8e6dd4ef6d29868dd5c25e525b49c07ec5ad" dependencies = [ "itertools 0.14.0", "num-bigint 0.4.6", @@ -7648,55 +7574,55 @@ dependencies = [ "p3-poseidon2", "p3-symmetric", "p3-util", - "rand 0.8.5", + "paste", + "rand 0.9.2", "serde", + "spin 0.10.0", "tracing", "transpose", ] [[package]] name = "p3-poseidon" -version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?rev=539bbc84085efb609f4f62cb03cf49588388abdb#539bbc84085efb609f4f62cb03cf49588388abdb" +version = "0.4.0" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=1eed8e6#1eed8e6dd4ef6d29868dd5c25e525b49c07ec5ad" dependencies = [ "p3-field", "p3-mds", "p3-symmetric", - "rand 0.8.5", + "rand 0.9.2", ] [[package]] name = "p3-poseidon2" -version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?rev=539bbc84085efb609f4f62cb03cf49588388abdb#539bbc84085efb609f4f62cb03cf49588388abdb" +version = "0.4.0" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=1eed8e6#1eed8e6dd4ef6d29868dd5c25e525b49c07ec5ad" dependencies = [ - "gcd", "p3-field", "p3-mds", "p3-symmetric", - "rand 0.8.5", + "p3-util", + "rand 0.9.2", ] [[package]] name = "p3-poseidon2-air" -version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?rev=539bbc84085efb609f4f62cb03cf49588388abdb#539bbc84085efb609f4f62cb03cf49588388abdb" +version = "0.4.0" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=1eed8e6#1eed8e6dd4ef6d29868dd5c25e525b49c07ec5ad" dependencies = [ "p3-air", "p3-field", "p3-matrix", "p3-maybe-rayon", "p3-poseidon2", - "p3-util", - "rand 0.8.5", - "tikv-jemallocator", + "rand 0.9.2", "tracing", ] [[package]] name = "p3-symmetric" -version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?rev=539bbc84085efb609f4f62cb03cf49588388abdb#539bbc84085efb609f4f62cb03cf49588388abdb" +version = "0.4.0" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=1eed8e6#1eed8e6dd4ef6d29868dd5c25e525b49c07ec5ad" dependencies = [ "itertools 0.14.0", "p3-field", @@ -7705,8 +7631,8 @@ dependencies = [ [[package]] name = "p3-uni-stark" -version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?rev=539bbc84085efb609f4f62cb03cf49588388abdb#539bbc84085efb609f4f62cb03cf49588388abdb" +version = "0.4.0" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=1eed8e6#1eed8e6dd4ef6d29868dd5c25e525b49c07ec5ad" dependencies = [ "itertools 0.14.0", "p3-air", @@ -7718,13 +7644,14 @@ dependencies = [ "p3-maybe-rayon", "p3-util", "serde", + "thiserror 2.0.15", "tracing", ] [[package]] name = "p3-util" -version = "0.1.0" -source = "git+https://github.com/Plonky3/Plonky3.git?rev=539bbc84085efb609f4f62cb03cf49588388abdb#539bbc84085efb609f4f62cb03cf49588388abdb" +version = "0.4.0" +source = "git+https://github.com/Plonky3/Plonky3.git?rev=1eed8e6#1eed8e6dd4ef6d29868dd5c25e525b49c07ec5ad" dependencies = [ "serde", ] @@ -10102,7 +10029,7 @@ dependencies = [ "derive_more 2.0.1", "dunce", "inturn", - "itertools 0.14.0", + "itertools 0.10.5", "itoa", "normalize-path", "once_map", @@ -10113,7 +10040,7 @@ dependencies = [ "solar-config", "solar-data-structures", "solar-macros", - "thiserror 2.0.15", + "thiserror 1.0.69", "tracing", "unicode-width 0.2.2", ] @@ -10138,7 +10065,7 @@ dependencies = [ "alloy-primitives", "bitflags", "bumpalo", - "itertools 0.14.0", + "itertools 0.10.5", "memchr", "num-bigint 0.4.6", "num-rational", @@ -10215,6 +10142,15 @@ version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +[[package]] +name = "spin" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5fe4ccb98d9c292d56fec89a5e07da7fc4cf0dc11e156b41793132775d3e591" +dependencies = [ + "lock_api", +] + [[package]] name = "spki" version = "0.6.0" @@ -10462,7 +10398,7 @@ dependencies = [ "serde_json", "sha2 0.10.9", "tempfile", - "thiserror 2.0.15", + "thiserror 1.0.69", "url", "zip", ] diff --git a/Cargo.toml b/Cargo.toml index 8ecd91572f..370cc257df 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -113,11 +113,11 @@ lto = "thin" [workspace.dependencies] # Stark Backend -openvm-stark-backend = { git = "https://github.com/openvm-org/stark-backend.git", tag = "v1.2.2", default-features = false } -openvm-stark-sdk = { git = "https://github.com/openvm-org/stark-backend.git", tag = "v1.2.2", default-features = false } -openvm-cuda-backend = { git = "https://github.com/openvm-org/stark-backend.git", tag = "v1.2.2", default-features = false } -openvm-cuda-builder = { git = "https://github.com/openvm-org/stark-backend.git", tag = "v1.2.2", default-features = false } -openvm-cuda-common = { git = "https://github.com/openvm-org/stark-backend.git", tag = "v1.2.2", default-features = false } +openvm-stark-backend = { git = "https://github.com/openvm-org/stark-backend.git", branch = "develop-v1.3.0", default-features = false } +openvm-stark-sdk = { git = "https://github.com/openvm-org/stark-backend.git", branch = "develop-v1.3.0", default-features = false } +openvm-cuda-backend = { git = "https://github.com/openvm-org/stark-backend.git", branch = "develop-v1.3.0", default-features = false } +openvm-cuda-builder = { git = "https://github.com/openvm-org/stark-backend.git", branch = "develop-v1.3.0", default-features = false } +openvm-cuda-common = { git = "https://github.com/openvm-org/stark-backend.git", branch = "develop-v1.3.0", default-features = false } # OpenVM openvm-sdk = { path = "crates/sdk", default-features = false } @@ -177,16 +177,16 @@ openvm-verify-stark = { path = "guest-libs/verify_stark", default-features = fal openvm-benchmarks-utils = { path = "benchmarks/utils", default-features = false } # Plonky3 -p3-field = { git = "https://github.com/Plonky3/Plonky3.git", rev = "539bbc84085efb609f4f62cb03cf49588388abdb", default-features = false } -p3-baby-bear = { git = "https://github.com/Plonky3/Plonky3.git", rev = "539bbc84085efb609f4f62cb03cf49588388abdb", default-features = false } -p3-dft = { git = "https://github.com/Plonky3/Plonky3.git", rev = "539bbc84085efb609f4f62cb03cf49588388abdb", default-features = false } -p3-fri = { git = "https://github.com/Plonky3/Plonky3.git", rev = "539bbc84085efb609f4f62cb03cf49588388abdb", default-features = false } -p3-keccak-air = { git = "https://github.com/Plonky3/Plonky3.git", rev = "539bbc84085efb609f4f62cb03cf49588388abdb", default-features = false } -p3-merkle-tree = { git = "https://github.com/Plonky3/Plonky3.git", rev = "539bbc84085efb609f4f62cb03cf49588388abdb", default-features = false } -p3-monty-31 = { git = "https://github.com/Plonky3/Plonky3.git", rev = "539bbc84085efb609f4f62cb03cf49588388abdb", default-features = false } -p3-poseidon2 = { git = "https://github.com/Plonky3/Plonky3.git", rev = "539bbc84085efb609f4f62cb03cf49588388abdb", default-features = false } -p3-poseidon2-air = { git = "https://github.com/Plonky3/Plonky3.git", rev = "539bbc84085efb609f4f62cb03cf49588388abdb", default-features = false } -p3-symmetric = { git = "https://github.com/Plonky3/Plonky3.git", rev = "539bbc84085efb609f4f62cb03cf49588388abdb", default-features = false } +p3-field = { git = "https://github.com/Plonky3/Plonky3.git", rev = "1eed8e6", default-features = false } +p3-baby-bear = { git = "https://github.com/Plonky3/Plonky3.git", rev = "1eed8e6", default-features = false } +p3-bn254 = { git = "https://github.com/Plonky3/Plonky3.git", rev = "1eed8e6", default-features = false } +p3-dft = { git = "https://github.com/Plonky3/Plonky3.git", rev = "1eed8e6", default-features = false } +p3-fri = { git = "https://github.com/Plonky3/Plonky3.git", rev = "1eed8e6", default-features = false } +p3-keccak-air = { git = "https://github.com/Plonky3/Plonky3.git", rev = "1eed8e6", default-features = false } +p3-merkle-tree = { git = "https://github.com/Plonky3/Plonky3.git", rev = "1eed8e6", default-features = false } +p3-poseidon2 = { git = "https://github.com/Plonky3/Plonky3.git", rev = "1eed8e6", default-features = false } +p3-poseidon2-air = { git = "https://github.com/Plonky3/Plonky3.git", rev = "1eed8e6", default-features = false } +p3-symmetric = { git = "https://github.com/Plonky3/Plonky3.git", rev = "1eed8e6", default-features = false } zkhash = { git = "https://github.com/HorizenLabs/poseidon2.git", rev = "bb476b9" } snark-verifier-sdk = { version = "0.2.0", default-features = false, features = ["loader_halo2", "halo2-axiom"] } @@ -221,7 +221,7 @@ rustc-hash = "2.0.0" static_assertions = "1.1.0" getset = "0.1.3" rrs-lib = "0.1.0" -rand = { version = "0.8.5", default-features = false } +rand = { version = "0.9.2", default-features = false, features = ["std", "os_rng", "std_rng"] } hex = { version = "0.4.3", default-features = false } serde-big-array = "0.5.1" dashmap = "6.1.0" diff --git a/benchmarks/execute/Cargo.toml b/benchmarks/execute/Cargo.toml index b9b4b96776..36b9247385 100644 --- a/benchmarks/execute/Cargo.toml +++ b/benchmarks/execute/Cargo.toml @@ -51,7 +51,6 @@ aot = ["openvm-sdk/aot"] mimalloc = ["openvm-circuit/mimalloc"] jemalloc = ["openvm-circuit/jemalloc"] jemalloc-prof = ["openvm-circuit/jemalloc-prof"] -nightly-features = ["openvm-circuit/nightly-features"] perf-metrics = [ "openvm-circuit/perf-metrics", "openvm-transpiler/function-span", diff --git a/benchmarks/execute/benches/execute.rs b/benchmarks/execute/benches/execute.rs index 199ad87943..875f3bc93b 100644 --- a/benchmarks/execute/benches/execute.rs +++ b/benchmarks/execute/benches/execute.rs @@ -56,7 +56,6 @@ use openvm_stark_sdk::{ self, config::{StarkGenericConfig, Val}, keygen::types::MultiStarkProvingKey, - p3_field::PrimeField32, proof::Proof, prover::{ cpu::{CpuBackend, CpuDevice}, @@ -195,7 +194,7 @@ impl VmBuilder for ExecuteBuilder where SC: StarkGenericConfig, E: StarkEngine, PD = CpuDevice>, - Val: PrimeField32, + Val: VmField, { type VmConfig = ExecuteConfig; type SystemChipInventory = SystemChipInventory; diff --git a/benchmarks/guest/revm_snailtracer/src/main.rs b/benchmarks/guest/revm_snailtracer/src/main.rs index a266ec21c4..7c6dde154c 100644 --- a/benchmarks/guest/revm_snailtracer/src/main.rs +++ b/benchmarks/guest/revm_snailtracer/src/main.rs @@ -1,5 +1,4 @@ use openvm as _; - use revm::{ db::BenchmarkDB, primitives::{address, bytes, hex, Bytecode, Bytes, TxKind}, diff --git a/benchmarks/prove/Cargo.toml b/benchmarks/prove/Cargo.toml index bdd5639026..9fcd1ceb46 100644 --- a/benchmarks/prove/Cargo.toml +++ b/benchmarks/prove/Cargo.toml @@ -47,7 +47,6 @@ parallel = ["openvm-sdk/parallel"] mimalloc = ["openvm-sdk/mimalloc"] jemalloc = ["openvm-sdk/jemalloc"] jemalloc-prof = ["openvm-sdk/jemalloc-prof"] -nightly-features = ["openvm-sdk/nightly-features"] cuda = [ "openvm-circuit/cuda", diff --git a/benchmarks/prove/src/bin/ecrecover.rs b/benchmarks/prove/src/bin/ecrecover.rs index 8c02d13334..dca0789139 100644 --- a/benchmarks/prove/src/bin/ecrecover.rs +++ b/benchmarks/prove/src/bin/ecrecover.rs @@ -3,7 +3,7 @@ use eyre::Result; use k256::ecdsa::{SigningKey, VerifyingKey}; use openvm_benchmarks_prove::util::BenchmarkCli; use openvm_sdk::config::{SdkVmBuilder, SdkVmConfig}; -use openvm_stark_backend::p3_field::FieldAlgebra; +use openvm_stark_backend::p3_field::PrimeCharacteristicRing; use openvm_stark_sdk::{bench::run_with_metric_collection, p3_baby_bear::BabyBear}; use rand_chacha::{rand_core::SeedableRng, ChaCha8Rng}; use tiny_keccak::{Hasher, Keccak}; @@ -21,7 +21,7 @@ fn make_input(signing_key: &SigningKey, msg: &[u8]) -> Vec { input.push(v); input.extend_from_slice(signature.to_bytes().as_ref()); - input.into_iter().map(BabyBear::from_canonical_u8).collect() + input.into_iter().map(BabyBear::from_u8).collect() } fn main() -> Result<()> { @@ -46,7 +46,7 @@ fn main() -> Result<()> { expected_address[..12].fill(0); // 20 bytes as the address. let mut input_stream = vec![expected_address .into_iter() - .map(BabyBear::from_canonical_u8) + .map(BabyBear::from_u8) .collect::>()]; let msg = ["Elliptic", "Curve", "Digital", "Signature", "Algorithm"]; diff --git a/crates/circuits/mod-builder/Cargo.toml b/crates/circuits/mod-builder/Cargo.toml index 7242123372..cf3a9e5ad3 100644 --- a/crates/circuits/mod-builder/Cargo.toml +++ b/crates/circuits/mod-builder/Cargo.toml @@ -18,6 +18,7 @@ halo2curves-axiom = { workspace = true, optional = true } openvm-pairing-guest = { workspace = true, optional = true } rand.workspace = true +rand08 = { package = "rand", version = "0.8.5", features = ["std_rng"] } num-bigint.workspace = true num-traits.workspace = true tracing.workspace = true @@ -36,6 +37,7 @@ openvm-circuit-primitives = { workspace = true } openvm-pairing-guest = { workspace = true, features = ["halo2curves"] } halo2curves-axiom = { workspace = true } openvm-circuit = { workspace = true, features = ["test-utils"] } +rand08 = { package = "rand", version = "0.8.5", features = ["std_rng"] } [features] default = [] diff --git a/crates/circuits/mod-builder/src/builder.rs b/crates/circuits/mod-builder/src/builder.rs index 75c31f579a..2515e8d857 100644 --- a/crates/circuits/mod-builder/src/builder.rs +++ b/crates/circuits/mod-builder/src/builder.rs @@ -16,7 +16,7 @@ use openvm_circuit_primitives::{ use openvm_stark_backend::{ interaction::InteractionBuilder, p3_air::{Air, AirBuilder, BaseAir}, - p3_field::{Field, FieldAlgebra, PrimeField64}, + p3_field::{Field, PrimeCharacteristicRing, PrimeField64}, p3_matrix::Matrix, rap::{BaseAirWithPublicValues, PartitionedBaseAir}, }; @@ -331,7 +331,7 @@ impl BaseAir for FieldExpr { impl Air for FieldExpr { fn eval(&self, builder: &mut AB) { let main = builder.main(); - let local = main.row_slice(0); + let local = main.row_slice(0).expect("window should have two elements"); SubAir::eval(self, builder, &local); } } @@ -394,7 +394,7 @@ impl SubAir for FieldExpr { for (lhs, rhs) in zip_eq(&reads, expected) { builder .when(is_setup.clone()) - .assert_eq(lhs.clone(), AB::F::from_canonical_usize(rhs)); + .assert_eq(lhs.clone(), AB::F::from_usize(rhs)); } } @@ -406,9 +406,9 @@ impl SubAir for FieldExpr { .map(|(_, limbs)| { let limbs_expr: Vec<_> = limbs .iter() - .map(|limb| AB::Expr::from_canonical_usize(*limb)) + .map(|limb| AB::Expr::from_usize(*limb)) .collect(); - OverflowInt::from_canonical_unsigned_limbs(limbs_expr, self.limb_bits) + OverflowInt::from_unsigned_limbs(limbs_expr, self.limb_bits) }) .collect(); @@ -487,7 +487,7 @@ impl TraceSubRowGenerator for FieldExpr { .iter() .map(|x| OverflowInt::::from_biguint(x, self.limb_bits, Some(self.num_limbs))) .collect::>(); - let zero = OverflowInt::::from_canonical_unsigned_limbs(vec![0], limb_bits); + let zero = OverflowInt::::from_unsigned_limbs(vec![0], limb_bits); let mut vars_overflow = vec![zero; self.num_variables]; // Note: in cases where the prime fits in less limbs than `num_limbs`, we use the smaller // number of limbs. @@ -498,7 +498,7 @@ impl TraceSubRowGenerator for FieldExpr { .iter() .map(|(_, limbs)| { let limbs_isize: Vec<_> = limbs.iter().map(|i| *i as isize).collect(); - OverflowInt::from_canonical_unsigned_limbs(limbs_isize, self.limb_bits) + OverflowInt::from_unsigned_limbs(limbs_isize, self.limb_bits) }) .collect(); @@ -525,7 +525,7 @@ impl TraceSubRowGenerator for FieldExpr { for &q in q_limbs.iter() { range_checker.add_count((q + (1 << limb_bits)) as u32, limb_bits + 1); } - let q_overflow = OverflowInt::from_canonical_signed_limbs(q_limbs.clone(), limb_bits); + let q_overflow = OverflowInt::from_signed_limbs(q_limbs.clone(), limb_bits); // compute carries of (expr - q * p) let expr = self.constraints[i].evaluate_overflow_isize( &input_overflow, @@ -658,8 +658,8 @@ fn load_overflow( ) -> Vec> { let mut result = vec![]; for x in arr.into_iter() { - let limbs: Vec = x.iter().map(|x| (*x).into()).collect(); - result.push(OverflowInt::::from_canonical_unsigned_limbs( + let limbs: Vec = x.iter().cloned().map(|x| x.into()).collect(); + result.push(OverflowInt::::from_unsigned_limbs( limbs, limb_bits, )); } diff --git a/crates/circuits/mod-builder/src/core_chip.rs b/crates/circuits/mod-builder/src/core_chip.rs index 719e1e0cf4..d84d881b0d 100644 --- a/crates/circuits/mod-builder/src/core_chip.rs +++ b/crates/circuits/mod-builder/src/core_chip.rs @@ -19,7 +19,7 @@ use openvm_instructions::{instruction::Instruction, program::DEFAULT_PC_STEP}; use openvm_stark_backend::{ interaction::InteractionBuilder, p3_air::BaseAir, - p3_field::{Field, FieldAlgebra, PrimeField32}, + p3_field::{Field, PrimeCharacteristicRing, PrimeField32}, rap::BaseAirWithPublicValues, }; use openvm_stark_sdk::p3_baby_bear::BabyBear; @@ -147,7 +147,7 @@ where .chain(Some(last_opcode_flag)); let expected_opcode = opcode_flags .zip(self.local_opcode_idx.iter().map(|&i| i + self.offset)) - .map(|(flag, global_idx)| flag * AB::Expr::from_canonical_usize(global_idx)) + .map(|(flag, global_idx)| flag * AB::Expr::from_usize(global_idx)) .sum(); let instruction = MinimalInstruction { diff --git a/crates/circuits/mod-builder/src/symbolic_expr.rs b/crates/circuits/mod-builder/src/symbolic_expr.rs index ef5e3dcd28..b84a01027a 100644 --- a/crates/circuits/mod-builder/src/symbolic_expr.rs +++ b/crates/circuits/mod-builder/src/symbolic_expr.rs @@ -10,7 +10,9 @@ use num_traits::{FromPrimitive, One, Zero}; use openvm_circuit_primitives::bigint::{ check_carry_to_zero::get_carry_max_abs_and_bits, OverflowInt, }; -use openvm_stark_backend::{p3_air::AirBuilder, p3_field::FieldAlgebra, p3_util::log2_ceil_usize}; +use openvm_stark_backend::{ + p3_air::AirBuilder, p3_field::PrimeCharacteristicRing, p3_util::log2_ceil_usize, +}; /// Example: If there are 4 inputs (x1, y1, x2, y2), and one intermediate variable lambda, /// Mul(Var(0), Var(0)) - Input(0) - Input(2) => @@ -459,9 +461,9 @@ impl SymbolicExpr { fn isize_to_expr(s: isize) -> AB::Expr { if s >= 0 { - AB::Expr::from_canonical_usize(s as usize) + AB::Expr::from_usize(s as usize) } else { - -AB::Expr::from_canonical_usize(s.unsigned_abs()) + -AB::Expr::from_usize(s.unsigned_abs()) } } @@ -502,7 +504,7 @@ impl SymbolicExpr { let left = lhs.evaluate_overflow_expr::(inputs, variables, constants, flags); let right = rhs.evaluate_overflow_expr::(inputs, variables, constants, flags); let num_limbs = max(left.num_limbs(), right.num_limbs()); - let flag = flags[*flag_id]; + let flag = &flags[*flag_id]; let mut res = vec![]; for i in 0..num_limbs { res.push( @@ -510,12 +512,12 @@ impl SymbolicExpr { left.limb(i).clone() } else { AB::Expr::ZERO - }) * flag.into() + }) * flag.clone() + (if i < right.num_limbs() { right.limb(i).clone() } else { AB::Expr::ZERO - }) * (AB::Expr::ONE - flag.into()), + }) * (AB::Expr::ONE - flag.clone()), ); } OverflowInt::from_computed_limbs( diff --git a/crates/circuits/mod-builder/src/test_utils/bls12381.rs b/crates/circuits/mod-builder/src/test_utils/bls12381.rs index efcce8f599..c3e7c35516 100644 --- a/crates/circuits/mod-builder/src/test_utils/bls12381.rs +++ b/crates/circuits/mod-builder/src/test_utils/bls12381.rs @@ -4,7 +4,7 @@ use halo2curves_axiom::{ }; use num_bigint::BigUint; use openvm_pairing_guest::algebra::field::FieldExtension; -use openvm_stark_sdk::utils::create_seeded_rng_with_seed; +use rand08::{rngs::StdRng, SeedableRng}; pub fn bls12381_fq_to_biguint(fq: Fq) -> BigUint { let bytes = fq.to_bytes(); @@ -23,7 +23,7 @@ pub fn bls12381_fq12_to_biguint_vec(x: Fq12) -> Vec { } pub fn bls12381_fq12_random(seed: u64) -> Vec { - let seed = create_seeded_rng_with_seed(seed); - let fq = Fq12::random(seed); + let mut rng = StdRng::seed_from_u64(seed); + let fq = Fq12::random(&mut rng); bls12381_fq12_to_biguint_vec(fq) } diff --git a/crates/circuits/mod-builder/src/test_utils/bn254.rs b/crates/circuits/mod-builder/src/test_utils/bn254.rs index 65fdb48959..2d2c6f8a71 100644 --- a/crates/circuits/mod-builder/src/test_utils/bn254.rs +++ b/crates/circuits/mod-builder/src/test_utils/bn254.rs @@ -4,7 +4,7 @@ use halo2curves_axiom::{ }; use num_bigint::BigUint; use openvm_pairing_guest::algebra::field::FieldExtension; -use openvm_stark_sdk::utils::create_seeded_rng_with_seed; +use rand08::{rngs::StdRng, SeedableRng}; pub fn bn254_fq_to_biguint(fq: Fq) -> BigUint { let bytes = fq.to_bytes(); @@ -23,11 +23,11 @@ pub fn bn254_fq12_to_biguint_vec(x: Fq12) -> Vec { } pub fn bn254_fq2_random(seed: u64) -> Fq2 { - let seed = create_seeded_rng_with_seed(seed); - Fq2::random(seed) + let mut rng = StdRng::seed_from_u64(seed); + Fq2::random(&mut rng) } pub fn bn254_fq12_random(seed: u64) -> Fq12 { - let seed = create_seeded_rng_with_seed(seed); - Fq12::random(seed) + let mut rng = StdRng::seed_from_u64(seed); + Fq12::random(&mut rng) } diff --git a/crates/circuits/mod-builder/src/tests.rs b/crates/circuits/mod-builder/src/tests.rs index e9bffa1653..5e84232776 100644 --- a/crates/circuits/mod-builder/src/tests.rs +++ b/crates/circuits/mod-builder/src/tests.rs @@ -4,7 +4,7 @@ use num_bigint::BigUint; use num_traits::One; use openvm_circuit_primitives::{bigint::utils::*, TraceSubRowGenerator}; use openvm_stark_backend::{ - p3_air::BaseAir, p3_field::FieldAlgebra, p3_matrix::dense::RowMajorMatrix, + p3_air::BaseAir, p3_field::PrimeCharacteristicRing, p3_matrix::dense::RowMajorMatrix, }; use openvm_stark_sdk::{ any_rap_arc_vec, config::baby_bear_blake3::BabyBearBlake3Engine, engine::StarkFriEngine, diff --git a/crates/circuits/poseidon2-air/Cargo.toml b/crates/circuits/poseidon2-air/Cargo.toml index 485cd4d8c9..af4edd1f3e 100644 --- a/crates/circuits/poseidon2-air/Cargo.toml +++ b/crates/circuits/poseidon2-air/Cargo.toml @@ -9,7 +9,6 @@ repository.workspace = true license.workspace = true [dependencies] -p3-monty-31 = { workspace = true } p3-symmetric = { workspace = true } p3-poseidon2 = { workspace = true } p3-poseidon2-air = { workspace = true } diff --git a/crates/circuits/poseidon2-air/src/air.rs b/crates/circuits/poseidon2-air/src/air.rs index 777d933ac3..4ce5c4e7ee 100644 --- a/crates/circuits/poseidon2-air/src/air.rs +++ b/crates/circuits/poseidon2-air/src/air.rs @@ -1,6 +1,6 @@ use openvm_stark_backend::{ p3_air::{Air, AirBuilder, BaseAir}, - p3_field::Field, + p3_field::{Field, PrimeCharacteristicRing}, rap::{BaseAirWithPublicValues, PartitionedBaseAir}, }; use p3_poseidon2_air::{Poseidon2Air, Poseidon2Cols}; @@ -31,17 +31,21 @@ pub type Plonky3Poseidon2Air = Pos >; #[derive(Debug)] -pub enum Poseidon2SubAir { +pub enum Poseidon2SubAir { BabyBearMds(Plonky3Poseidon2Air), } -impl Poseidon2SubAir { +impl + Poseidon2SubAir +{ pub fn new(constants: Plonky3RoundConstants) -> Self { Self::BabyBearMds(Plonky3Poseidon2Air::new(constants)) } } -impl BaseAir for Poseidon2SubAir { +impl BaseAir + for Poseidon2SubAir +{ fn width(&self) -> usize { match self { Self::BabyBearMds(air) => air.width(), @@ -49,17 +53,18 @@ impl BaseAir for Poseidon2SubAir BaseAirWithPublicValues +impl BaseAirWithPublicValues for Poseidon2SubAir { } -impl PartitionedBaseAir +impl PartitionedBaseAir for Poseidon2SubAir { } -impl Air - for Poseidon2SubAir +impl Air for Poseidon2SubAir +where + AB::F: Field + PrimeCharacteristicRing, { fn eval(&self, builder: &mut AB) { match self { diff --git a/crates/circuits/poseidon2-air/src/babybear.rs b/crates/circuits/poseidon2-air/src/babybear.rs index e12b60bfb4..f45f8f9596 100644 --- a/crates/circuits/poseidon2-air/src/babybear.rs +++ b/crates/circuits/poseidon2-air/src/babybear.rs @@ -1,7 +1,9 @@ use std::array::from_fn; use lazy_static::lazy_static; -use openvm_stark_backend::p3_field::FieldAlgebra; +use openvm_stark_backend::p3_field::{ + integers::QuotientMap, PrimeCharacteristicRing, PrimeField32, +}; use openvm_stark_sdk::p3_baby_bear::BabyBear; use zkhash::{ ark_ff::PrimeField as _, fields::babybear::FpBabyBear as HorizenBabyBear, @@ -14,7 +16,7 @@ use super::{ }; pub(crate) fn horizen_to_p3_babybear(horizen_babybear: HorizenBabyBear) -> BabyBear { - BabyBear::from_canonical_u64(horizen_babybear.into_bigint().0[0]) + BabyBear::from_u64(horizen_babybear.into_bigint().0[0]) } pub(crate) fn horizen_round_consts() -> Poseidon2Constants { @@ -53,12 +55,36 @@ lazy_static! { horizen_round_consts().ending_full_round_constants; } -pub(crate) fn babybear_internal_linear_layer( - state: &mut [FA; WIDTH], - int_diag_m1_matrix: &[FA::F; WIDTH], +/// The vector `[-2, 1, 2, 1/2, 3, 4, -1/2, -3, -4, 1/2^8, 1/4, 1/8, 1/2^27, -1/2^8, -1/16, +/// -1/2^27]` saved as an array of BabyBear elements. Copied from plonky3's Poseidon2 +/// implementation to preserve the exact constraint structure. +pub const INTERNAL_DIAG_MONTY_16: [BabyBear; 16] = BabyBear::new_array([ + BabyBear::ORDER_U32 - 2, + 1, + 2, + (BabyBear::ORDER_U32 + 1) >> 1, + 3, + 4, + (BabyBear::ORDER_U32 - 1) >> 1, + BabyBear::ORDER_U32 - 3, + BabyBear::ORDER_U32 - 4, + BabyBear::ORDER_U32 - ((BabyBear::ORDER_U32 - 1) >> 8), + BabyBear::ORDER_U32 - ((BabyBear::ORDER_U32 - 1) >> 2), + BabyBear::ORDER_U32 - ((BabyBear::ORDER_U32 - 1) >> 3), + BabyBear::ORDER_U32 - 15, + (BabyBear::ORDER_U32 - 1) >> 8, + (BabyBear::ORDER_U32 - 1) >> 4, + 15, +]); + +pub(crate) fn babybear_internal_linear_layer( + state: &mut [R; POSEIDON2_WIDTH], + diag_m1_matrix: &[BabyBear; POSEIDON2_WIDTH], ) { - let sum = state.iter().cloned().sum::(); - for (input, diag_m1) in state.iter_mut().zip(int_diag_m1_matrix) { - *input = sum.clone() + FA::from_f(*diag_m1) * input.clone(); + let sum: R = state.iter().cloned().sum(); + for (val, &diag_elem) in state.iter_mut().zip(diag_m1_matrix.iter()) { + let diag_sub = R::PrimeSubfield::from_int(diag_elem.as_canonical_u32()); + let diag_r = R::from_prime_subfield(diag_sub); + *val = sum.clone() + diag_r * val.clone(); } } diff --git a/crates/circuits/poseidon2-air/src/config.rs b/crates/circuits/poseidon2-air/src/config.rs index 6007f0b4fb..e98974d4ff 100644 --- a/crates/circuits/poseidon2-air/src/config.rs +++ b/crates/circuits/poseidon2-air/src/config.rs @@ -1,4 +1,4 @@ -use openvm_stark_backend::p3_field::{Field, PrimeField32}; +use openvm_stark_backend::p3_field::{Field, PrimeCharacteristicRing, PrimeField32}; use openvm_stark_sdk::p3_baby_bear::BabyBear; use p3_poseidon2::ExternalLayerConstants; use p3_poseidon2_air::RoundConstants; @@ -31,7 +31,7 @@ pub struct Poseidon2Constants { pub ending_full_round_constants: [[F; POSEIDON2_WIDTH]; BABY_BEAR_POSEIDON2_HALF_FULL_ROUNDS], } -impl From> for Plonky3RoundConstants { +impl From> for Plonky3RoundConstants { fn from(constants: Poseidon2Constants) -> Self { Plonky3RoundConstants::new( constants.beginning_full_round_constants, @@ -58,7 +58,7 @@ impl Poseidon2Constants { // Round constants for only BabyBear, but we convert to `F` due to some annoyances with generics. // This should only be used concretely when `F = BabyBear`. fn default_baby_bear_rc() -> Poseidon2Constants { - let convert_field = |f: BabyBear| F::from_canonical_u32(f.as_canonical_u32()); + let convert_field = |f: BabyBear| F::from_u32(f.as_canonical_u32()); Poseidon2Constants { beginning_full_round_constants: BABYBEAR_BEGIN_EXT_CONSTS.map(|x| x.map(convert_field)), partial_round_constants: BABYBEAR_PARTIAL_CONSTS.map(convert_field), diff --git a/crates/circuits/poseidon2-air/src/lib.rs b/crates/circuits/poseidon2-air/src/lib.rs index 60cd3924d9..305deef3d4 100644 --- a/crates/circuits/poseidon2-air/src/lib.rs +++ b/crates/circuits/poseidon2-air/src/lib.rs @@ -8,7 +8,7 @@ use std::sync::Arc; use openvm_stark_backend::{ - p3_field::{Field, PrimeField}, + p3_field::{InjectiveMonomial, PrimeField}, p3_matrix::dense::RowMajorMatrix, }; pub use openvm_stark_sdk::p3_baby_bear; @@ -46,14 +46,21 @@ pub const BABY_BEAR_POSEIDON2_SBOX_DEGREE: u64 = 7; /// `SBOX_REGISTERS` affects the max constraint degree of the AIR. See [p3_poseidon2_air] for more /// details. #[derive(Debug, Clone)] -pub struct Poseidon2SubChip { +pub struct Poseidon2SubChip< + F: PrimeField + InjectiveMonomial, + const SBOX_REGISTERS: usize, +> { // This is Arc purely because Poseidon2Air cannot derive Clone pub air: Arc>, pub(crate) executor: Poseidon2Executor, pub(crate) constants: Plonky3RoundConstants, } -impl Poseidon2SubChip { +impl< + F: PrimeField + InjectiveMonomial, + const SBOX_REGISTERS: usize, + > Poseidon2SubChip +{ pub fn new(constants: Poseidon2Constants) -> Self { let (external_constants, internal_constants) = constants.to_external_internal_constants(); Self { @@ -80,6 +87,12 @@ impl Poseidon2SubChip generate_trace_rows::< F, BabyBearPoseidon2LinearLayers, @@ -88,17 +101,17 @@ impl Poseidon2SubChip(inputs, &self.constants), + >(inputs, &self.constants, 0), } } } #[derive(Clone, Debug)] -pub enum Poseidon2Executor { +pub enum Poseidon2Executor> { BabyBearMds(Plonky3Poseidon2Executor), } -impl Poseidon2Executor { +impl> Poseidon2Executor { pub fn new( external_constants: ExternalLayerConstants, internal_constants: Vec, @@ -111,7 +124,7 @@ impl Poseidon2Executor { } pub type Plonky3Poseidon2Executor = Poseidon2< - ::Packing, + F, Poseidon2ExternalLayer, Poseidon2InternalLayer, POSEIDON2_WIDTH, diff --git a/crates/circuits/poseidon2-air/src/permute.rs b/crates/circuits/poseidon2-air/src/permute.rs index 7b00605609..8e9fc63b03 100644 --- a/crates/circuits/poseidon2-air/src/permute.rs +++ b/crates/circuits/poseidon2-air/src/permute.rs @@ -1,74 +1,47 @@ -use std::{any::TypeId, marker::PhantomData}; +use std::marker::PhantomData; use derivative::Derivative; -use openvm_stark_backend::p3_field::FieldAlgebra; -use openvm_stark_sdk::p3_baby_bear::{BabyBear, BabyBearInternalLayerParameters}; -use p3_monty_31::InternalLayerBaseParameters; +use openvm_stark_backend::p3_field::{Field, InjectiveMonomial, PrimeCharacteristicRing}; use p3_poseidon2::{ add_rc_and_sbox_generic, mds_light_permutation, ExternalLayer, ExternalLayerConstants, ExternalLayerConstructor, GenericPoseidon2LinearLayers, InternalLayer, InternalLayerConstructor, MDSMat4, }; -use super::{babybear_internal_linear_layer, BABY_BEAR_POSEIDON2_SBOX_DEGREE}; +use super::{ + babybear_internal_linear_layer, BABY_BEAR_POSEIDON2_SBOX_DEGREE, INTERNAL_DIAG_MONTY_16, +}; const WIDTH: usize = crate::POSEIDON2_WIDTH; -pub trait Poseidon2MatrixConfig: Clone + Sync { - fn int_diag_m1_matrix() -> [F; WIDTH]; -} - -/// This type needs to implement GenericPoseidon2LinearLayers generic in F so that our -/// Poseidon2SubAir can also be generic in F, but in reality each implementation of this struct's -/// functions should be field specific. To circumvent this, Poseidon2LinearLayers is generic in F -/// but **currently requires** that F is BabyBear. +/// Linear layers for BabyBear Poseidon2 using the Plonky3 interfaces, but with a +/// hand-rolled internal layer to preserve the previous constraint DAG. #[derive(Debug, Clone)] pub struct BabyBearPoseidon2LinearLayers; -// This is the same as the implementation for -// GenericPoseidon2LinearLayersMonty31 except -// that we drop the clause that FA needs be multipliable by BabyBear. -// TODO[jpw/stephen]: This is clearly not the best way to do this, but it would -// require some reworking in plonky3 to get around the generics. -impl GenericPoseidon2LinearLayers for BabyBearPoseidon2LinearLayers { - fn internal_linear_layer(state: &mut [FA; WIDTH]) { - let diag_m1_matrix = &>::INTERNAL_DIAG_MONTY; - assert_eq!( - TypeId::of::(), - TypeId::of::(), - "BabyBear is the only supported field type" - ); - // SAFETY: TypeId check above ensures FA::F is BabyBear, so transmute is valid - let diag_m1_matrix = - unsafe { std::mem::transmute::<&[BabyBear; WIDTH], &[FA::F; WIDTH]>(diag_m1_matrix) }; - babybear_internal_linear_layer(state, diag_m1_matrix); +impl GenericPoseidon2LinearLayers<16> for BabyBearPoseidon2LinearLayers { + fn internal_linear_layer(state: &mut [R; WIDTH]) { + // Use the old-style internal layer (sum + diag * state[i]) to keep the + // Poseidon2 AIR identical to the previous release. + babybear_internal_linear_layer(state, &INTERNAL_DIAG_MONTY_16); } - fn external_linear_layer(state: &mut [FA; WIDTH]) { + fn external_linear_layer(state: &mut [R; WIDTH]) { mds_light_permutation(state, &MDSMat4); } } -// Below are generic implementations of the Poseidon2 Internal and External Layers -// generic in the field. These are currently used for the runtime poseidon2 -// execution even though they are less optimized than the Monty31 specific -// implementations in Plonky3. We could use those more optimized implementations, -// but it would require many unsafe transmutes. - #[derive(Debug, Derivative)] #[derivative(Clone)] -pub struct Poseidon2InternalLayer { +pub struct Poseidon2InternalLayer { pub internal_constants: Vec, _marker: PhantomData, } -impl InternalLayerConstructor - for Poseidon2InternalLayer +impl InternalLayerConstructor + for Poseidon2InternalLayer { - fn new_from_constants(internal_constants: Vec) -> Self { + fn new_from_constants(internal_constants: Vec) -> Self { Self { internal_constants, _marker: PhantomData, @@ -76,32 +49,35 @@ impl InternalLayerConstructor } } -impl - InternalLayer - for Poseidon2InternalLayer +impl< + F: Field + InjectiveMonomial, + LinearLayers, + const W: usize, + > InternalLayer + for Poseidon2InternalLayer where - LinearLayers: GenericPoseidon2LinearLayers, + LinearLayers: GenericPoseidon2LinearLayers, { /// Perform the internal layers of the Poseidon2 permutation on the given state. - fn permute_state(&self, state: &mut [FA; WIDTH]) { + fn permute_state(&self, state: &mut [F; W]) { self.internal_constants.iter().for_each(|&rc| { - add_rc_and_sbox_generic::<_, BABY_BEAR_POSEIDON2_SBOX_DEGREE>(&mut state[0], rc); + add_rc_and_sbox_generic::<_, _, BABY_BEAR_POSEIDON2_SBOX_DEGREE>(&mut state[0], rc); LinearLayers::internal_linear_layer(state); - }) + }); } } #[derive(Debug, Derivative)] #[derivative(Clone)] -pub struct Poseidon2ExternalLayer { - pub constants: ExternalLayerConstants, +pub struct Poseidon2ExternalLayer { + pub constants: ExternalLayerConstants, _marker: PhantomData, } -impl ExternalLayerConstructor - for Poseidon2ExternalLayer +impl + ExternalLayerConstructor for Poseidon2ExternalLayer { - fn new_from_constants(external_layer_constants: ExternalLayerConstants) -> Self { + fn new_from_constants(external_layer_constants: ExternalLayerConstants) -> Self { Self { constants: external_layer_constants, _marker: PhantomData, @@ -109,37 +85,41 @@ impl ExternalLayerConstructo } } -impl - ExternalLayer - for Poseidon2ExternalLayer +impl< + F: Field + InjectiveMonomial, + LinearLayers, + const W: usize, + > ExternalLayer + for Poseidon2ExternalLayer where - LinearLayers: GenericPoseidon2LinearLayers, + LinearLayers: GenericPoseidon2LinearLayers, { - fn permute_state_initial(&self, state: &mut [FA; WIDTH]) { + fn permute_state_initial(&self, state: &mut [F; W]) { LinearLayers::external_linear_layer(state); - external_permute_state::( - state, - self.constants.get_initial_constants(), - ); + external_permute_state::(state, self.constants.get_initial_constants()); } - fn permute_state_terminal(&self, state: &mut [FA; WIDTH]) { - external_permute_state::( + fn permute_state_terminal(&self, state: &mut [F; W]) { + external_permute_state::( state, self.constants.get_terminal_constants(), ); } } -fn external_permute_state( - state: &mut [FA; WIDTH], - constants: &[[FA::F; WIDTH]], +fn external_permute_state< + F: Field + InjectiveMonomial, + LinearLayers, + const W: usize, +>( + state: &mut [F; W], + constants: &[[F; W]], ) where - LinearLayers: GenericPoseidon2LinearLayers, + LinearLayers: GenericPoseidon2LinearLayers, { for elem in constants.iter() { state.iter_mut().zip(elem.iter()).for_each(|(s, &rc)| { - add_rc_and_sbox_generic::<_, BABY_BEAR_POSEIDON2_SBOX_DEGREE>(s, rc) + add_rc_and_sbox_generic::<_, _, BABY_BEAR_POSEIDON2_SBOX_DEGREE>(s, rc) }); LinearLayers::external_linear_layer(state); } diff --git a/crates/circuits/poseidon2-air/src/tests.rs b/crates/circuits/poseidon2-air/src/tests.rs index 463c6925ac..844aea20e4 100644 --- a/crates/circuits/poseidon2-air/src/tests.rs +++ b/crates/circuits/poseidon2-air/src/tests.rs @@ -1,7 +1,7 @@ use std::{array::from_fn, sync::Arc}; use openvm_stark_backend::{ - p3_air::BaseAir, p3_field::FieldAlgebra, utils::disable_debug_builder, + p3_air::BaseAir, p3_field::PrimeCharacteristicRing, utils::disable_debug_builder, verifier::VerificationError, }; use openvm_stark_sdk::{ @@ -34,7 +34,7 @@ fn run_poseidon2_subchip_test(subchip: Arc>, rng: let states: Vec<[BabyBear; 16]> = (0..num_rows) .map(|_| { let vec: Vec = (0..16) - .map(|_| BabyBear::from_canonical_u32(rng.next_u32() % (1 << 30))) + .map(|_| BabyBear::from_u32(rng.next_u32() % (1 << 30))) .collect(); vec.try_into().unwrap() }) @@ -56,8 +56,8 @@ fn run_poseidon2_subchip_test(subchip: Arc>, rng: // negative test disable_debug_builder(); for _ in 0..10 { - let rand_idx = rng.gen_range(0..subchip.air.width()); - let rand_inc = BabyBear::from_canonical_u32(rng.gen_range(1..=1 << 27)); + let rand_idx = rng.random_range(0..subchip.air.width()); + let rand_inc = BabyBear::from_u32(rng.random_range(1..=1 << 27)); poseidon2_trace.row_mut((1 << 4) - 1)[rand_idx] += rand_inc; assert_eq!( engine @@ -93,7 +93,7 @@ fn test_poseidon2_random_constants() { let beginning_full_round_constants = from_fn(|i| beginning_full_round_constants_vec[i]); let ending_full_round_constants_vec = external_constants.get_terminal_constants(); let ending_full_round_constants = from_fn(|i| ending_full_round_constants_vec[i]); - let partial_round_constants = from_fn(|_| BabyBear::from_wrapped_u32(rng.next_u32())); + let partial_round_constants = from_fn(|_| BabyBear::from_u32(rng.next_u32())); let constants = Poseidon2Constants { beginning_full_round_constants, partial_round_constants, @@ -115,7 +115,7 @@ fn test_cuda_tracegen_poseidon2() { // Generate random states and prepare GPU inputs let mut rng = create_seeded_rng(); let cpu_inputs: Vec<[F; WIDTH]> = (0..N) - .map(|_| std::array::from_fn(|_| F::from_canonical_u32(rng.gen_range(0..F::ORDER_U32)))) + .map(|_| std::array::from_fn(|_| F::from_u32(rng.random_range(0..F::ORDER_U32)))) .collect(); // Flatten inputs in row-major order for GPU (same layout as cpu_inputs) diff --git a/crates/circuits/primitives/src/assert_less_than/mod.rs b/crates/circuits/primitives/src/assert_less_than/mod.rs index 53054c713a..3a8920bb47 100644 --- a/crates/circuits/primitives/src/assert_less_than/mod.rs +++ b/crates/circuits/primitives/src/assert_less_than/mod.rs @@ -3,7 +3,7 @@ use openvm_circuit_primitives_derive::AlignedBorrow; use openvm_stark_backend::{ interaction::InteractionBuilder, p3_air::AirBuilder, - p3_field::{Field, FieldAlgebra}, + p3_field::{Field, PrimeCharacteristicRing}, }; use crate::{ @@ -109,7 +109,7 @@ impl AssertLtSubAir { /// Constraints between `io` and `aux` are only enforced when `count != 0`. /// This means `aux` can be all zero independent on what `io` is by setting `count = 0`. #[inline(always)] - fn eval_without_range_checks( + fn eval_without_range_checks>( &self, builder: &mut AB, io: AssertLessThanIo, @@ -127,7 +127,7 @@ impl AssertLtSubAir { .iter() .enumerate() .fold(AB::Expr::ZERO, |acc, (i, &val)| { - acc + val * AB::Expr::from_canonical_usize(1 << (i * self.range_max_bits())) + acc + val * AB::Expr::from_usize(1 << (i * self.range_max_bits())) }); // constrain that y - x - 1 is equal to the constructed lower value. diff --git a/crates/circuits/primitives/src/assert_less_than/tests.rs b/crates/circuits/primitives/src/assert_less_than/tests.rs index c448cbc9de..c9502d3f62 100644 --- a/crates/circuits/primitives/src/assert_less_than/tests.rs +++ b/crates/circuits/primitives/src/assert_less_than/tests.rs @@ -7,7 +7,7 @@ use derive_new::new; use openvm_circuit_primitives_derive::AlignedBorrow; use openvm_stark_backend::{ p3_air::{Air, BaseAir}, - p3_field::{Field, FieldAlgebra}, + p3_field::{Field, PrimeCharacteristicRing}, p3_matrix::{ dense::{DenseMatrix, RowMajorMatrix}, Matrix, @@ -60,7 +60,7 @@ impl Air for AssertLtTestAir = (*local).borrow(); let io = AssertLessThanIo::new(local.x, local.y, local.count); @@ -92,8 +92,8 @@ impl AssertLessThanChip { .zip(self.pairs) .for_each(|(row, (x, y))| { let row: &mut AssertLessThanCols = row.borrow_mut(); - row.x = F::from_canonical_u32(x); - row.y = F::from_canonical_u32(y); + row.x = F::from_u32(x); + row.y = F::from_u32(y); row.count = F::ONE; self.air .0 @@ -203,7 +203,7 @@ fn test_assert_less_than_negative_2() { let range_trace = range_checker.generate_trace(); // Make the trace invalid - trace.values[3] = FieldAlgebra::from_canonical_u64(1 << decomp as u64); + trace.values[3] = PrimeCharacteristicRing::from_u64(1 << decomp as u64); disable_debug_builder(); assert_eq!( @@ -273,7 +273,7 @@ fn test_cuda_assert_less_than_tracegen() { expected_cpu_matrix_vals .into_iter() .flatten() - .map(F::from_canonical_u32) + .map(F::from_u32) .collect(), 3 + AUX_LEN, )); diff --git a/crates/circuits/primitives/src/bigint/check_carry_mod_to_zero.rs b/crates/circuits/primitives/src/bigint/check_carry_mod_to_zero.rs index 35b00c63b2..59d4bb52e5 100644 --- a/crates/circuits/primitives/src/bigint/check_carry_mod_to_zero.rs +++ b/crates/circuits/primitives/src/bigint/check_carry_mod_to_zero.rs @@ -2,7 +2,7 @@ use itertools::Itertools; use num_bigint::BigUint; use openvm_stark_backend::{ interaction::{BusIndex, InteractionBuilder}, - p3_field::FieldAlgebra, + p3_field::PrimeCharacteristicRing, }; use super::{ @@ -75,7 +75,7 @@ impl SubAir for CheckCarryModToZeroSubAir { AB::Expr: 'a, { let CheckCarryModToZeroCols { quotient, carries } = cols; - let q_offset = AB::F::from_canonical_usize(1 << self.check_carry_to_zero.limb_bits); + let q_offset = AB::F::from_usize(1 << self.check_carry_to_zero.limb_bits); for &q in quotient.iter() { range_check( builder, @@ -88,14 +88,14 @@ impl SubAir for CheckCarryModToZeroSubAir { } let limb_bits = self.check_carry_to_zero.limb_bits; let q_limbs = quotient.iter().map(|&x| x.into()).collect(); - let overflow_q = OverflowInt::::from_canonical_signed_limbs(q_limbs, limb_bits); + let overflow_q = OverflowInt::::from_signed_limbs(q_limbs, limb_bits); let p_limbs = self .modulus_limbs .iter() - .map(|&x| AB::Expr::from_canonical_usize(x)) + .map(|&x| AB::Expr::from_usize(x)) .collect_vec(); let overflow_p = - OverflowInt::from_canonical_unsigned_limbs(p_limbs, self.check_carry_to_zero.limb_bits); + OverflowInt::from_unsigned_limbs(p_limbs, self.check_carry_to_zero.limb_bits); let expr = expr - overflow_q * overflow_p; self.check_carry_to_zero diff --git a/crates/circuits/primitives/src/bigint/check_carry_to_zero.rs b/crates/circuits/primitives/src/bigint/check_carry_to_zero.rs index d1bf124dd8..ef862f3edc 100644 --- a/crates/circuits/primitives/src/bigint/check_carry_to_zero.rs +++ b/crates/circuits/primitives/src/bigint/check_carry_to_zero.rs @@ -1,6 +1,6 @@ use openvm_stark_backend::{ interaction::{BusIndex, InteractionBuilder}, - p3_field::{Field, FieldAlgebra}, + p3_field::{Field, PrimeCharacteristicRing}, }; use super::{utils::range_check, OverflowInt}; @@ -90,7 +90,7 @@ impl SubAir for CheckCarryToZeroSubAir { self.range_checker_bus, self.decomp, carry_abs_bits, - carry + AB::F::from_canonical_usize(carry_min_value_abs), + carry + AB::F::from_usize(carry_min_value_abs), is_valid.clone(), ); } @@ -100,7 +100,7 @@ impl SubAir for CheckCarryToZeroSubAir { for (i, limb) in expr.limbs.iter().enumerate() { builder.assert_eq( limb.clone() + previous_carry.clone(), - cols.carries[i] * AB::F::from_canonical_usize(1 << self.limb_bits), + cols.carries[i] * AB::F::from_usize(1 << self.limb_bits), ); previous_carry = cols.carries[i].into(); } diff --git a/crates/circuits/primitives/src/bigint/mod.rs b/crates/circuits/primitives/src/bigint/mod.rs index 83305a2689..4d1dfb2b56 100644 --- a/crates/circuits/primitives/src/bigint/mod.rs +++ b/crates/circuits/primitives/src/bigint/mod.rs @@ -28,7 +28,7 @@ pub struct OverflowInt { impl OverflowInt { // Note: sign or unsigned are not about the type T. // It's how we will range check the limbs. If the limbs are non-negative, use this one. - pub fn from_canonical_unsigned_limbs(x: Vec, limb_bits: usize) -> OverflowInt { + pub fn from_unsigned_limbs(x: Vec, limb_bits: usize) -> OverflowInt { OverflowInt { limbs: x, max_overflow_bits: limb_bits, @@ -38,7 +38,7 @@ impl OverflowInt { // Limbs can be negative. So the max_overflow_bits and limb_max_abs are different from the range // check result. - pub fn from_canonical_signed_limbs(x: Vec, limb_bits: usize) -> OverflowInt { + pub fn from_signed_limbs(x: Vec, limb_bits: usize) -> OverflowInt { OverflowInt { limbs: x, max_overflow_bits: limb_bits + 1, @@ -120,7 +120,7 @@ impl OverflowInt { None => utils::big_uint_to_limbs(x, limb_bits), }; let limbs: Vec = limbs.iter().map(|x| *x as isize).collect(); - OverflowInt::from_canonical_unsigned_limbs(limbs, limb_bits) + OverflowInt::from_unsigned_limbs(limbs, limb_bits) } pub fn calculate_carries(&self, limb_bits: usize) -> Vec { diff --git a/crates/circuits/primitives/src/bigint/utils.rs b/crates/circuits/primitives/src/bigint/utils.rs index 8c772f8e1a..a1ef9f4d61 100644 --- a/crates/circuits/primitives/src/bigint/utils.rs +++ b/crates/circuits/primitives/src/bigint/utils.rs @@ -126,8 +126,6 @@ pub fn take_limb(deque: &mut VecDeque, limb_size: usize) -> usize { pub fn vec_isize_to_f(x: Vec) -> Vec { x.iter() - .map(|x| { - F::from_canonical_usize(x.unsigned_abs()) * if x >= &0 { F::ONE } else { F::NEG_ONE } - }) + .map(|x| F::from_usize(x.unsigned_abs()) * if x >= &0 { F::ONE } else { F::NEG_ONE }) .collect() } diff --git a/crates/circuits/primitives/src/bitwise_op_lookup/bus.rs b/crates/circuits/primitives/src/bitwise_op_lookup/bus.rs index 25d9ff3e4c..9a1c62dd66 100644 --- a/crates/circuits/primitives/src/bitwise_op_lookup/bus.rs +++ b/crates/circuits/primitives/src/bitwise_op_lookup/bus.rs @@ -1,6 +1,6 @@ use openvm_stark_backend::{ interaction::{BusIndex, InteractionBuilder, LookupBus}, - p3_field::FieldAlgebra, + p3_field::PrimeCharacteristicRing, }; #[derive(Clone, Copy, Debug, PartialEq, Eq)] @@ -22,7 +22,7 @@ impl BitwiseOperationLookupBus { y: impl Into, ) -> BitwiseOperationLookupBusInteraction where - T: FieldAlgebra, + T: PrimeCharacteristicRing, { self.push(x, y, T::ZERO, T::ZERO, true) } @@ -35,7 +35,7 @@ impl BitwiseOperationLookupBus { z: impl Into, ) -> BitwiseOperationLookupBusInteraction where - T: FieldAlgebra, + T: PrimeCharacteristicRing, { self.push(x, y, z, T::ONE, true) } @@ -80,7 +80,7 @@ pub struct BitwiseOperationLookupBusInteraction { is_lookup: bool, } -impl BitwiseOperationLookupBusInteraction { +impl BitwiseOperationLookupBusInteraction { pub fn eval(self, builder: &mut AB, count: impl Into) where AB: InteractionBuilder, diff --git a/crates/circuits/primitives/src/bitwise_op_lookup/mod.rs b/crates/circuits/primitives/src/bitwise_op_lookup/mod.rs index f55b913c71..435fdbedd8 100644 --- a/crates/circuits/primitives/src/bitwise_op_lookup/mod.rs +++ b/crates/circuits/primitives/src/bitwise_op_lookup/mod.rs @@ -9,7 +9,7 @@ use openvm_stark_backend::{ config::{StarkGenericConfig, Val}, interaction::InteractionBuilder, p3_air::{Air, BaseAir, PairBuilder}, - p3_field::{Field, FieldAlgebra}, + p3_field::{Field, PrimeCharacteristicRing}, p3_matrix::{dense::RowMajorMatrix, Matrix}, prover::{cpu::CpuBackend, types::AirProvingContext}, rap::{get_air_name, BaseAirWithPublicValues, PartitionedBaseAir}, @@ -70,13 +70,8 @@ impl BaseAir for BitwiseOperationLookupAir Option> { let rows: Vec = (0..(1 << NUM_BITS)) .flat_map(|x: u32| { - (0..(1 << NUM_BITS)).flat_map(move |y: u32| { - [ - F::from_canonical_u32(x), - F::from_canonical_u32(y), - F::from_canonical_u32(x ^ y), - ] - }) + (0..(1 << NUM_BITS)) + .flat_map(move |y: u32| [F::from_u32(x), F::from_u32(y), F::from_u32(x ^ y)]) }) .collect(); Some(RowMajorMatrix::new( @@ -91,11 +86,13 @@ impl Air { fn eval(&self, builder: &mut AB) { let preprocessed = builder.preprocessed(); - let prep_local = preprocessed.row_slice(0); + let prep_local = preprocessed + .row_slice(0) + .expect("window should have two elements"); let prep_local: &BitwiseOperationLookupPreprocessedCols = (*prep_local).borrow(); let main = builder.main(); - let local = main.row_slice(0); + let local = main.row_slice(0).expect("window should have two elements"); let local: &BitwiseOperationLookupCols = (*local).borrow(); self.bus @@ -167,12 +164,10 @@ impl BitwiseOperationLookupChip { let mut rows = F::zero_vec(self.count_range.len() * NUM_BITWISE_OP_LOOKUP_COLS); for (n, row) in rows.chunks_mut(NUM_BITWISE_OP_LOOKUP_COLS).enumerate() { let cols: &mut BitwiseOperationLookupCols = row.borrow_mut(); - cols.mult_range = F::from_canonical_u32( - self.count_range[n].swap(0, std::sync::atomic::Ordering::SeqCst), - ); - cols.mult_xor = F::from_canonical_u32( - self.count_xor[n].swap(0, std::sync::atomic::Ordering::SeqCst), - ); + cols.mult_range = + F::from_u32(self.count_range[n].swap(0, std::sync::atomic::Ordering::SeqCst)); + cols.mult_xor = + F::from_u32(self.count_xor[n].swap(0, std::sync::atomic::Ordering::SeqCst)); } RowMajorMatrix::new(rows, NUM_BITWISE_OP_LOOKUP_COLS) } diff --git a/crates/circuits/primitives/src/bitwise_op_lookup/tests/dummy.rs b/crates/circuits/primitives/src/bitwise_op_lookup/tests/dummy.rs index afe04592f1..129471fb7f 100644 --- a/crates/circuits/primitives/src/bitwise_op_lookup/tests/dummy.rs +++ b/crates/circuits/primitives/src/bitwise_op_lookup/tests/dummy.rs @@ -1,7 +1,7 @@ use openvm_stark_backend::{ interaction::InteractionBuilder, p3_air::{Air, AirBuilder, BaseAir}, - p3_field::{Field, FieldAlgebra}, + p3_field::{Field, PrimeCharacteristicRing}, p3_matrix::{dense::RowMajorMatrix, Matrix}, rap::{BaseAirWithPublicValues, PartitionedBaseAir}, }; @@ -33,7 +33,7 @@ impl BaseAir for DummyAir { impl Air for DummyAir { fn eval(&self, builder: &mut AB) { let main = builder.main(); - let local = main.row_slice(0); + let local = main.row_slice(0).expect("window should have two elements"); self.bus .push(local[0], local[1], local[2], local[3], true) .eval(builder, AB::F::ONE); diff --git a/crates/circuits/primitives/src/bitwise_op_lookup/tests/mod.rs b/crates/circuits/primitives/src/bitwise_op_lookup/tests/mod.rs index 9f53f7975d..5aed4553ca 100644 --- a/crates/circuits/primitives/src/bitwise_op_lookup/tests/mod.rs +++ b/crates/circuits/primitives/src/bitwise_op_lookup/tests/mod.rs @@ -2,7 +2,7 @@ use std::{iter, sync::Arc}; use dummy::DummyAir; use openvm_stark_backend::{ - p3_field::FieldAlgebra, + p3_field::PrimeCharacteristicRing, p3_matrix::dense::RowMajorMatrix, p3_maybe_rayon::prelude::{IntoParallelRefIterator, ParallelIterator}, utils::disable_debug_builder, @@ -52,12 +52,12 @@ fn generate_rng_values( .map(|_| { (0..list_len) .map(|_| { - let op = match rng.gen_range(0..2) { + let op = match rng.random_range(0..2) { 0 => BitwiseOperation::Range, _ => BitwiseOperation::Xor, }; - let x = rng.gen_range(0..(1 << NUM_BITS)); - let y = rng.gen_range(0..(1 << NUM_BITS)); + let x = rng.random_range(0..(1 << NUM_BITS)); + let y = rng.random_range(0..(1 << NUM_BITS)); let z = match op { BitwiseOperation::Range => 0, BitwiseOperation::Xor => x ^ y, @@ -103,7 +103,7 @@ fn test_bitwise_operation_lookup() { }; [x, y, z, op as u32].into_iter() }) - .map(FieldAlgebra::from_canonical_u32) + .map(PrimeCharacteristicRing::from_u32) .collect(), 4, ) @@ -137,7 +137,7 @@ fn run_negative_test(bad_row: (u32, u32, u32, BitwiseOperation)) { }; [x, y, z, op as u32].into_iter() }) - .map(FieldAlgebra::from_canonical_u32) + .map(PrimeCharacteristicRing::from_u32) .collect(), 4, ), @@ -201,9 +201,9 @@ fn test_cuda_bitwise_op_lookup() { let random_values = (0..NUM_INPUTS) .flat_map(|_| { - let x = rng.gen::() & BIT_MASK; - let y = rng.gen::() & BIT_MASK; - let op = rng.gen_bool(0.5); + let x = rng.random::() & BIT_MASK; + let y = rng.random::() & BIT_MASK; + let op = rng.random_bool(0.5); [x, y, op as u32] }) .collect::>(); @@ -239,9 +239,9 @@ fn test_cuda_bitwise_op_lookup_hybrid() { let gpu_random_values = (0..NUM_INPUTS) .flat_map(|_| { - let x = rng.gen::() & BIT_MASK; - let y = rng.gen::() & BIT_MASK; - let op = rng.gen_bool(0.5); + let x = rng.random::() & BIT_MASK; + let y = rng.random::() & BIT_MASK; + let op = rng.random_bool(0.5); [x, y, op as u32] }) .collect::>(); @@ -250,9 +250,9 @@ fn test_cuda_bitwise_op_lookup_hybrid() { let cpu_chip = bitwise.cpu_chip.clone().unwrap(); let cpu_values = (0..NUM_INPUTS) .map(|_| { - let x = rng.gen::() & BIT_MASK; - let y = rng.gen::() & BIT_MASK; - let op_xor = rng.gen_bool(0.5); + let x = rng.random::() & BIT_MASK; + let y = rng.random::() & BIT_MASK; + let op_xor = rng.random_bool(0.5); let z = if op_xor { cpu_chip.request_xor(x, y) } else { @@ -267,10 +267,10 @@ fn test_cuda_bitwise_op_lookup_hybrid() { .chain( cpu_values .iter() - .map(|v| F::from_canonical_u32(v[0])) - .chain(cpu_values.iter().map(|v| F::from_canonical_u32(v[1]))) - .chain(cpu_values.iter().map(|v| F::from_canonical_u32(v[2]))) - .chain(cpu_values.iter().map(|v| F::from_canonical_u32(v[3]))), + .map(|v| F::from_u32(v[0])) + .chain(cpu_values.iter().map(|v| F::from_u32(v[1]))) + .chain(cpu_values.iter().map(|v| F::from_u32(v[2]))) + .chain(cpu_values.iter().map(|v| F::from_u32(v[3]))), ) .collect::>() .to_device() diff --git a/crates/circuits/primitives/src/encoder/mod.rs b/crates/circuits/primitives/src/encoder/mod.rs index f91fda438b..5a72a33429 100644 --- a/crates/circuits/primitives/src/encoder/mod.rs +++ b/crates/circuits/primitives/src/encoder/mod.rs @@ -2,7 +2,7 @@ use std::ops::RangeInclusive; use openvm_stark_backend::{ interaction::InteractionBuilder, - p3_field::{Field, FieldAlgebra}, + p3_field::{Field, PrimeCharacteristicRing}, }; use crate::SubAir; @@ -97,8 +97,8 @@ impl Encoder { // First part: product for each coordinate for (i, &coord) in pt.iter().enumerate() { for j in 0..coord { - expr *= vars[i] - AB::Expr::from_canonical_u32(j); - denom *= AB::F::from_canonical_u32(coord - j); + expr *= vars[i] - AB::Expr::from_u32(j); + denom *= AB::F::from_u32(coord - j); } } @@ -107,8 +107,8 @@ impl Encoder { let sum: u32 = pt.iter().sum(); let var_sum = vars.iter().fold(AB::Expr::ZERO, |acc, &v| acc + v); for j in 0..(self.max_flag_degree - sum) { - expr *= AB::Expr::from_canonical_u32(self.max_flag_degree - j) - var_sum.clone(); - denom *= AB::F::from_canonical_u32(j + 1); + expr *= AB::Expr::from_u32(self.max_flag_degree - j) - var_sum.clone(); + denom *= AB::F::from_u32(j + 1); } } expr * denom.inverse() @@ -190,8 +190,7 @@ impl Encoder { flag_idx_vals .iter() .fold(AB::Expr::ZERO, |acc, (flag_idx, val)| { - acc + self.get_flag_expr::(*flag_idx, vars) - * AB::Expr::from_canonical_usize(*val) + acc + self.get_flag_expr::(*flag_idx, vars) * AB::Expr::from_usize(*val) }) } } @@ -215,7 +214,7 @@ impl SubAir for Encoder { let falling_factorial = |lin: AB::Expr| { let mut res = AB::Expr::ONE; for i in 0..=self.max_flag_degree { - res *= lin.clone() - AB::Expr::from_canonical_u32(i); + res *= lin.clone() - AB::Expr::from_u32(i); } res }; diff --git a/crates/circuits/primitives/src/encoder/tests.rs b/crates/circuits/primitives/src/encoder/tests.rs index 4c86037407..e346a32df2 100644 --- a/crates/circuits/primitives/src/encoder/tests.rs +++ b/crates/circuits/primitives/src/encoder/tests.rs @@ -3,7 +3,7 @@ use std::sync::Arc; use openvm_cuda_backend::{ base::DeviceMatrix, data_transporter::assert_eq_host_and_device_matrix, types::F, }; -use openvm_stark_backend::{p3_field::FieldAlgebra, p3_matrix::dense::RowMajorMatrix}; +use openvm_stark_backend::{p3_field::PrimeCharacteristicRing, p3_matrix::dense::RowMajorMatrix}; use crate::{cuda_abi::encoder, encoder::Encoder}; @@ -23,7 +23,7 @@ fn test_cuda_encoder_with_invalid_row() { let cpu_matrix = Arc::new(RowMajorMatrix::::new( values .into_iter() - .flat_map(|v| v.into_iter().map(F::from_canonical_u32)) + .flat_map(|v| v.into_iter().map(F::from_u32)) .collect(), expected_k, )); @@ -58,7 +58,7 @@ fn test_cuda_encoder_without_invalid_row() { let cpu_matrix = Arc::new(RowMajorMatrix::::new( values .into_iter() - .flat_map(|v| v.into_iter().map(F::from_canonical_u32)) + .flat_map(|v| v.into_iter().map(F::from_u32)) .collect(), expected_k, )); diff --git a/crates/circuits/primitives/src/is_equal/tests.rs b/crates/circuits/primitives/src/is_equal/tests.rs index 35a2d36b11..8099375620 100644 --- a/crates/circuits/primitives/src/is_equal/tests.rs +++ b/crates/circuits/primitives/src/is_equal/tests.rs @@ -3,7 +3,7 @@ use std::borrow::{Borrow, BorrowMut}; use openvm_circuit_primitives_derive::AlignedBorrow; use openvm_stark_backend::{ p3_air::{Air, AirBuilder, BaseAir}, - p3_field::{Field, FieldAlgebra}, + p3_field::{Field, PrimeCharacteristicRing}, p3_matrix::{dense::RowMajorMatrix, Matrix}, p3_maybe_rayon::prelude::*, rap::{BaseAirWithPublicValues, PartitionedBaseAir}, @@ -49,11 +49,14 @@ impl BaseAir for IsEqTestAir { IsEqualCols::::width() } } -impl Air for IsEqTestAir { +impl Air for IsEqTestAir +where + AB: AirBuilder, +{ fn eval(&self, builder: &mut AB) { let main = builder.main(); - let local = main.row_slice(0); + let local = main.row_slice(0).expect("window should have two elements"); let local: &IsEqualCols<_> = (*local).borrow(); let io = IsEqualIo::new( local.x.into(), @@ -94,8 +97,8 @@ impl IsEqualChip { [0,23,97] )] fn test_single_is_equal(x: u32, y: u32) { - let x = FieldAlgebra::from_canonical_u32(x); - let y = FieldAlgebra::from_canonical_u32(y); + let x = PrimeCharacteristicRing::from_u32(x); + let y = PrimeCharacteristicRing::from_u32(y); let chip = IsEqualChip { pairs: vec![(x, y)], @@ -115,18 +118,18 @@ fn test_single_is_equal(x: u32, y: u32) { [0,23,97] )] fn test_single_is_zero_fail(x: u32, y: u32) { - let x = FieldAlgebra::from_canonical_u32(x); - let y = FieldAlgebra::from_canonical_u32(y); + let x = PrimeCharacteristicRing::from_u32(x); + let y = PrimeCharacteristicRing::from_u32(y); let chip = IsEqualChip { pairs: vec![(x, y)], }; let mut trace = chip.generate_trace(); - trace.values[2] = if trace.values[2] == FieldAlgebra::ONE { - FieldAlgebra::ZERO + trace.values[2] = if trace.values[2] == PrimeCharacteristicRing::ONE { + PrimeCharacteristicRing::ZERO } else { - FieldAlgebra::ONE + PrimeCharacteristicRing::ONE }; disable_debug_builder(); @@ -150,15 +153,15 @@ fn test_cuda_is_equal_against_cpu_full() { let n = 1 << log_height; let vec_x: Vec = (0..n) - .map(|_| F::from_canonical_u32(rng.gen_range(0..F::ORDER_U32))) + .map(|_| F::from_u32(rng.random_range(0..F::ORDER_U32))) .collect(); let vec_y: Vec = (0..n) .map(|i| { - if rng.gen_bool(0.5) { + if rng.random_bool(0.5) { vec_x[i] // 50 % chance: equal to x } else { - F::from_canonical_u32(rng.gen_range(0..F::ORDER_U32)) // 50% chance to be random + F::from_u32(rng.random_range(0..F::ORDER_U32)) // 50% chance to be random } }) .collect(); diff --git a/crates/circuits/primitives/src/is_equal_array/tests.rs b/crates/circuits/primitives/src/is_equal_array/tests.rs index 94b772decd..6688e019e6 100644 --- a/crates/circuits/primitives/src/is_equal_array/tests.rs +++ b/crates/circuits/primitives/src/is_equal_array/tests.rs @@ -6,7 +6,7 @@ use std::{ use openvm_circuit_primitives_derive::AlignedBorrow; use openvm_stark_backend::{ p3_air::{Air, AirBuilder, BaseAir}, - p3_field::{Field, FieldAlgebra}, + p3_field::{Field, PrimeCharacteristicRing}, p3_matrix::{dense::RowMajorMatrix, Matrix}, p3_maybe_rayon::prelude::*, rap::{BaseAirWithPublicValues, PartitionedBaseAir}, @@ -52,10 +52,14 @@ impl BaseAir for IsEqArrayTestAir { IsEqArrayCols::::width() } } -impl Air for IsEqArrayTestAir { +impl Air for IsEqArrayTestAir +where + AB::Var: Copy, + AB::F: Field, +{ fn eval(&self, builder: &mut AB) { let main = builder.main(); - let local = main.row_slice(0); + let local = main.row_slice(0).expect("window should have two elements"); let local: &IsEqArrayCols = (*local).borrow(); let io = IsEqArrayIo { x: local.x.map(Into::into), @@ -102,15 +106,15 @@ impl IsEqArrayChip { #[test_case([92, 27, 32], [92, 27, 32], 1; "92, 27, 32 == 92, 27, 32")] #[test_case([1, 27, 4], [1, 2, 43], 0; "1, 27, 4 != 1, 2, 43")] fn test_is_eq_array_single_row(x: [u32; 3], y: [u32; 3], is_equal: u32) { - let x = x.map(FieldAlgebra::from_canonical_u32); - let y = y.map(FieldAlgebra::from_canonical_u32); + let x = x.map(PrimeCharacteristicRing::from_u32); + let y = y.map(PrimeCharacteristicRing::from_u32); let chip = IsEqArrayChip::new(vec![(x, y)]); let air = chip.air; let trace = chip.generate_trace(); let row: &IsEqArrayCols = trace.values.as_slice().borrow(); - assert_eq!(row.out, FieldAlgebra::from_canonical_u32(is_equal)); + assert_eq!(row.out, PrimeCharacteristicRing::from_u32(is_equal)); BabyBearPoseidon2Engine::run_simple_test_no_pis_fast(any_rap_arc_vec![air], vec![trace]) .expect("Verification failed"); @@ -127,8 +131,8 @@ fn test_is_eq_array_multi_rows() { .into_iter() .map(|(x, y)| { ( - x.map(FieldAlgebra::from_canonical_u32), - y.map(FieldAlgebra::from_canonical_u32), + x.map(PrimeCharacteristicRing::from_u32), + y.map(PrimeCharacteristicRing::from_u32), ) }) .collect(); @@ -149,8 +153,8 @@ fn test_is_eq_array_multi_rows() { #[test_case([92, 27, 32], [92, 27, 32]; "92, 27, 32 == 92, 27, 32")] #[test_case([1, 27, 4], [1, 2, 43]; "1, 27, 4 != 1, 2, 43")] fn test_is_eq_array_single_row_fail(x: [u32; 3], y: [u32; 3]) { - let x = x.map(FieldAlgebra::from_canonical_u32); - let y = y.map(FieldAlgebra::from_canonical_u32); + let x = x.map(PrimeCharacteristicRing::from_u32); + let y = y.map(PrimeCharacteristicRing::from_u32); let chip = IsEqArrayChip::new(vec![(x, y)]); let air = chip.air; @@ -174,7 +178,7 @@ fn test_is_eq_array_fail_rand() { let mut rng = create_seeded_rng(); let pairs: Vec<_> = (0..height) .map(|_| { - let x = from_fn(|_| FieldAlgebra::from_wrapped_u32(rng.gen::())); + let x = from_fn(|_| BabyBear::from_u32(rng.random::())); (x, x) }) .collect(); @@ -186,7 +190,7 @@ fn test_is_eq_array_fail_rand() { for i in 0..height { for j in 0..N { let mut prank_trace = trace.clone(); - prank_trace.row_mut(i)[j] += FieldAlgebra::from_wrapped_u32(rng.gen::() + 1); + prank_trace.row_mut(i)[j] += BabyBear::from_u32(rng.random::() + 1); assert_eq!( BabyBearPoseidon2Engine::run_simple_test_no_pis_fast( any_rap_arc_vec![air], @@ -209,14 +213,14 @@ fn test_cuda_simple_is_equal_array_tracegen() { let vec_x: Vec = vec![1u32, 2, 3, 4, 5, 6, 7, 8, 9u32, 10, 11, 12, 13, 14, 15, 16] .into_iter() - .map(F::from_canonical_u32) + .map(F::from_u32) .collect(); let vec_y: Vec = vec![ 1u32, 3, 3, 4, 5, 6, 10, 8, 9u32, 10, 11, 12, 13, 200, 15, 16, ] .into_iter() - .map(F::from_canonical_u32) + .map(F::from_u32) .collect(); let inputs_x = vec_x.as_slice().to_device().unwrap(); @@ -255,11 +259,11 @@ fn test_cuda_random_is_equal_array_tracegen() { let n = 1 << log_height; let vec_x: Vec = (0..n * ARRAY_LEN) - .map(|_| F::from_canonical_u32(rng.gen_range(0..F::ORDER_U32))) + .map(|_| F::from_u32(rng.random_range(0..F::ORDER_U32))) .collect(); let vec_y: Vec = (0..n * ARRAY_LEN) - .map(|_| F::from_canonical_u32(rng.gen_range(0..F::ORDER_U32))) + .map(|_| F::from_u32(rng.random_range(0..F::ORDER_U32))) .collect(); let inputs_x = vec_x.as_slice().to_device().unwrap(); diff --git a/crates/circuits/primitives/src/is_less_than/mod.rs b/crates/circuits/primitives/src/is_less_than/mod.rs index b4fc8948f8..33125d060f 100644 --- a/crates/circuits/primitives/src/is_less_than/mod.rs +++ b/crates/circuits/primitives/src/is_less_than/mod.rs @@ -1,7 +1,7 @@ use openvm_stark_backend::{ interaction::InteractionBuilder, p3_air::AirBuilder, - p3_field::{Field, FieldAlgebra}, + p3_field::{Field, PrimeCharacteristicRing}, }; use crate::{ @@ -108,7 +108,7 @@ impl IsLtSubAir { /// Constraints between `io` and `aux` are only enforced when `condition != 0`. /// This means `aux` can be all zero independent on what `io` is by setting `condition = 0`. #[inline(always)] - pub(crate) fn eval_without_range_checks( + pub(crate) fn eval_without_range_checks>( &self, builder: &mut AB, y_minus_x: impl Into, @@ -119,8 +119,7 @@ impl IsLtSubAir { assert_eq!(lower_decomp.len(), self.decomp_limbs); // this is the desired intermediate value (i.e. y - x - 1) // deg(intermed_val) = deg(io) - let intermed_val = - y_minus_x.into() + AB::Expr::from_canonical_usize((1 << self.max_bits) - 1); + let intermed_val = y_minus_x.into() + AB::Expr::from_usize((1 << self.max_bits) - 1); // Construct lower from lower_decomp: // - each limb of lower_decomp will be range checked @@ -129,12 +128,12 @@ impl IsLtSubAir { .iter() .enumerate() .fold(AB::Expr::ZERO, |acc, (i, &val)| { - acc + val * AB::Expr::from_canonical_usize(1 << (i * self.range_max_bits())) + acc + val * AB::Expr::from_usize(1 << (i * self.range_max_bits())) }); let out = out.into(); // constrain that the lower + out * 2^max_bits is the correct intermediate sum - let check_val = lower + out.clone() * AB::Expr::from_canonical_usize(1 << self.max_bits); + let check_val = lower + out.clone() * AB::Expr::from_usize(1 << self.max_bits); // the degree of this constraint is expected to be deg(count) + max(deg(intermed_val), // deg(lower)) builder.when(condition).assert_eq(intermed_val, check_val); diff --git a/crates/circuits/primitives/src/is_less_than/tests.rs b/crates/circuits/primitives/src/is_less_than/tests.rs index ed74d59859..c39fd34c9d 100644 --- a/crates/circuits/primitives/src/is_less_than/tests.rs +++ b/crates/circuits/primitives/src/is_less_than/tests.rs @@ -4,7 +4,7 @@ use derive_new::new; use openvm_stark_backend::{ interaction::InteractionBuilder, p3_air::{Air, BaseAir}, - p3_field::{Field, FieldAlgebra, PrimeField32}, + p3_field::{Field, PrimeCharacteristicRing, PrimeField32}, p3_matrix::{dense::RowMajorMatrix, Matrix}, p3_maybe_rayon::prelude::*, rap::{BaseAirWithPublicValues, PartitionedBaseAir}, @@ -58,7 +58,7 @@ impl Air for IsLtTestAir { fn eval(&self, builder: &mut AB) { let main = builder.main(); - let local = main.row_slice(0); + let local = main.row_slice(0).expect("window should have two elements"); let (io, lower_decomp) = local.split_at(3); let [x, y, out] = [io[0], io[1], io[2]]; @@ -91,8 +91,8 @@ impl IsLessThanChip { .zip(self.pairs) .for_each(|(row, (x, y))| { let row = IsLessThanColsMut::from_mut_slice(row); - *row.x = F::from_canonical_u32(x); - *row.y = F::from_canonical_u32(y); + *row.x = F::from_u32(x); + *row.y = F::from_u32(y); self.air .0 .generate_subrow((&self.range_checker, x, y), (row.lower_decomp, row.out)); @@ -169,7 +169,7 @@ fn test_is_less_than_negative() { let mut trace = chip.generate_trace(); let range_trace = range_checker.generate_trace(); - trace.values[2] = FieldAlgebra::from_canonical_u64(0); + trace.values[2] = PrimeCharacteristicRing::from_u64(0); disable_debug_builder(); assert_eq!( @@ -221,7 +221,7 @@ fn test_cuda_less_than_tracegen() { expected_cpu_matrix_vals .into_iter() .flatten() - .map(F::from_canonical_u32) + .map(F::from_u32) .collect(), 3 + AUX_LEN, )); diff --git a/crates/circuits/primitives/src/is_less_than_array/mod.rs b/crates/circuits/primitives/src/is_less_than_array/mod.rs index 5113a83ad7..b617df398d 100644 --- a/crates/circuits/primitives/src/is_less_than_array/mod.rs +++ b/crates/circuits/primitives/src/is_less_than_array/mod.rs @@ -3,7 +3,7 @@ use openvm_circuit_primitives_derive::AlignedBorrow; use openvm_stark_backend::{ interaction::InteractionBuilder, p3_air::AirBuilder, - p3_field::{FieldAlgebra, PrimeField32}, + p3_field::{PrimeCharacteristicRing, PrimeField32}, }; use crate::{ @@ -113,7 +113,7 @@ impl IsLtArraySubAir { /// Constrain that `out` is boolean equal to `x < y` (lexicographic comparison) /// **without** doing range checks on `lt_decomp`. - fn eval_without_range_checks( + fn eval_without_range_checks>( &self, builder: &mut AB, io: IsLtArrayIo, @@ -238,8 +238,7 @@ impl TraceSubRowGenerator for IsLtArraySub } } // diff_val can be "negative" but shifted_diff is in [0, 2^{max_bits+1}) - let shifted_diff = - (diff_val + F::from_canonical_u32((1 << self.max_bits()) - 1)).as_canonical_u32(); + let shifted_diff = (diff_val + F::from_u32((1 << self.max_bits()) - 1)).as_canonical_u32(); let lower_u32 = shifted_diff & ((1 << self.max_bits()) - 1); *out = F::from_bool(shifted_diff != lower_u32); diff --git a/crates/circuits/primitives/src/is_less_than_array/tests.rs b/crates/circuits/primitives/src/is_less_than_array/tests.rs index a0ff5381b6..423c62b457 100644 --- a/crates/circuits/primitives/src/is_less_than_array/tests.rs +++ b/crates/circuits/primitives/src/is_less_than_array/tests.rs @@ -6,7 +6,7 @@ use std::{ use openvm_circuit_primitives_derive::AlignedBorrow; use openvm_stark_backend::{ p3_air::{Air, BaseAir}, - p3_field::{Field, FieldAlgebra}, + p3_field::{Field, PrimeCharacteristicRing}, p3_matrix::{dense::RowMajorMatrix, Matrix}, p3_maybe_rayon::prelude::*, rap::{BaseAirWithPublicValues, PartitionedBaseAir}, @@ -60,7 +60,7 @@ impl Air { fn eval(&self, builder: &mut AB) { let main = builder.main(); - let local = main.row_slice(0); + let local = main.row_slice(0).expect("window should have two elements"); let local: &IsLtArrayCols = (*local).borrow(); let io = IsLtArrayIo { @@ -104,8 +104,8 @@ impl IsLtArrayChip { .zip(self.pairs) .for_each(|(row, (x, y))| { let row: &mut IsLtArrayCols<_, NUM, AUX_LEN> = row.borrow_mut(); - row.x = x.map(F::from_canonical_u32); - row.y = y.map(F::from_canonical_u32); + row.x = x.map(F::from_u32); + row.y = y.map(F::from_u32); self.air.0.generate_subrow( (&self.range_checker, &row.x, &row.y), ((&mut row.aux).into(), &mut row.out), @@ -122,8 +122,8 @@ impl IsLtArrayChip { .zip(self.pairs) .for_each(|(row, (x, y))| { let row: &mut IsLtArrayCols<_, NUM, AUX_LEN> = row.borrow_mut(); - row.x = x.map(F::from_canonical_u32); - row.y = y.map(F::from_canonical_u32); + row.x = x.map(F::from_u32); + row.y = y.map(F::from_u32); row.out = F::ZERO; let aux: IsLtArrayAuxColsMut<_> = (&mut row.aux).into(); aux.diff_marker @@ -185,7 +185,7 @@ fn test_is_less_than_tuple_chip_negative() { let mut trace = chip.generate_trace(); let range_checker_trace = range_checker.generate_trace(); - trace.values[2] = FieldAlgebra::from_canonical_u64(0); + trace.values[2] = PrimeCharacteristicRing::from_u64(0); disable_debug_builder(); assert_eq!( @@ -270,7 +270,7 @@ fn test_cuda_less_than_array_tracegen() { expected_cpu_matrix_vals .into_iter() .flatten() - .map(F::from_canonical_u32) + .map(F::from_u32) .collect(), 3 * ARRAY_LEN + AUX_LEN + 2, )); diff --git a/crates/circuits/primitives/src/is_zero/tests.rs b/crates/circuits/primitives/src/is_zero/tests.rs index dbdd31185a..9945d97951 100644 --- a/crates/circuits/primitives/src/is_zero/tests.rs +++ b/crates/circuits/primitives/src/is_zero/tests.rs @@ -3,7 +3,7 @@ use std::borrow::{Borrow, BorrowMut}; use openvm_circuit_primitives_derive::AlignedBorrow; use openvm_stark_backend::{ p3_air::{Air, AirBuilder, BaseAir}, - p3_field::{Field, FieldAlgebra}, + p3_field::{Field, PrimeCharacteristicRing}, p3_matrix::{dense::RowMajorMatrix, Matrix}, p3_maybe_rayon::prelude::*, rap::{BaseAirWithPublicValues, PartitionedBaseAir}, @@ -49,11 +49,15 @@ impl BaseAir for IsZeroTestAir { IsZeroCols::::width() } } -impl Air for IsZeroTestAir { +impl Air for IsZeroTestAir +where + AB: AirBuilder, + AB::F: Field, +{ fn eval(&self, builder: &mut AB) { let main = builder.main(); - let local = main.row_slice(0); + let local = main.row_slice(0).expect("window should have two elements"); let local: &IsZeroCols<_> = (*local).borrow(); let io = IsZeroIo::new(local.x.into(), local.out.into(), AB::Expr::ONE); @@ -92,11 +96,14 @@ impl IsZeroChip { #[test_case(97 ; "97 => 0")] #[test_case(0 ; "0 => 1")] fn test_single_is_zero(x: u32) { - let chip = IsZeroChip::new(vec![BabyBear::from_canonical_u32(x)]); + let chip = IsZeroChip::new(vec![BabyBear::from_u32(x)]); let air = chip.air; let trace = chip.generate_trace(); - assert_eq!(trace.get(0, 1), FieldAlgebra::from_bool(x == 0)); + assert_eq!( + trace.get(0, 1).expect("matrix index out of bounds"), + PrimeCharacteristicRing::from_bool(x == 0) + ); BabyBearPoseidon2Engine::run_simple_test_no_pis_fast(any_rap_arc_vec![air], vec![trace]) .expect("Verification failed"); @@ -107,7 +114,7 @@ fn test_single_is_zero(x: u32) { fn test_vec_is_zero(x_vec: [u32; 4], expected: [u32; 4]) { let x_vec = x_vec .into_iter() - .map(FieldAlgebra::from_canonical_u32) + .map(PrimeCharacteristicRing::from_u32) .collect(); let chip = IsZeroChip::new(x_vec); let air = chip.air; @@ -116,7 +123,7 @@ fn test_vec_is_zero(x_vec: [u32; 4], expected: [u32; 4]) { for (i, value) in expected.iter().enumerate() { assert_eq!( trace.values[3 * i + 1], - FieldAlgebra::from_canonical_u32(*value) + PrimeCharacteristicRing::from_u32(*value) ); } @@ -127,7 +134,7 @@ fn test_vec_is_zero(x_vec: [u32; 4], expected: [u32; 4]) { #[test_case(97 ; "97 => 0")] #[test_case(0 ; "0 => 1")] fn test_single_is_zero_fail(x: u32) { - let x = FieldAlgebra::from_canonical_u32(x); + let x = PrimeCharacteristicRing::from_u32(x); let chip = IsZeroChip::new(vec![x]); let air = chip.air; let mut trace = chip.generate_trace(); @@ -145,10 +152,7 @@ fn test_single_is_zero_fail(x: u32) { #[test_case([1, 2, 7, 0], [0, 0, 0, 1] ; "1, 2, 7, 0 => 0, 0, 0, 1")] #[test_case([97, 0, 179, 0], [0, 1, 0, 1] ; "97, 0, 179, 0 => 0, 1, 0, 1")] fn test_vec_is_zero_fail(x_vec: [u32; 4], expected: [u32; 4]) { - let x_vec: Vec = x_vec - .into_iter() - .map(BabyBear::from_canonical_u32) - .collect(); + let x_vec: Vec = x_vec.into_iter().map(BabyBear::from_u32).collect(); let chip = IsZeroChip::new(x_vec); let air = chip.air; let mut trace = chip.generate_trace(); @@ -177,13 +181,13 @@ fn test_cuda_is_zero_against_cpu_full() { let n = 1 << log_height; let vec_x: Vec = (0..n) .map(|_| { - if rng.gen_bool(0.5) { + if rng.random_bool(0.5) { 0 // 50% chance to be zero } else { - rng.gen_range(0..F::ORDER_U32) // 50% chance to be random + rng.random_range(0..F::ORDER_U32) // 50% chance to be random } }) - .map(F::from_canonical_u32) + .map(F::from_u32) .collect(); let input_buffer = vec_x.as_slice().to_device().unwrap(); diff --git a/crates/circuits/primitives/src/range/bus.rs b/crates/circuits/primitives/src/range/bus.rs index e7315dd635..971b5401b0 100644 --- a/crates/circuits/primitives/src/range/bus.rs +++ b/crates/circuits/primitives/src/range/bus.rs @@ -1,6 +1,6 @@ use openvm_stark_backend::{ interaction::{BusIndex, InteractionBuilder, LookupBus}, - p3_field::{FieldAlgebra, PrimeField32}, + p3_field::{PrimeCharacteristicRing, PrimeField32}, }; /// Represents a bus for `x` where `x` must lie in the range `[0, range_max)`. @@ -22,16 +22,16 @@ impl RangeCheckBus { /// /// This can be used when `2^max_bits < self.range_max` **if `2 * self.range_max` is less than /// the field modulus**. - pub fn range_check( + pub fn range_check( &self, - x: impl Into, + x: impl Into, max_bits: usize, - ) -> BitsCheckBusInteraction + ) -> BitsCheckBusInteraction where - T::F: PrimeField32, + R::PrimeSubfield: PrimeField32, { debug_assert!((1 << max_bits) <= self.range_max); - debug_assert!(self.range_max < T::F::ORDER_U32 / 2); + debug_assert!(self.range_max < R::PrimeSubfield::ORDER_U32 / 2); let shift = self.range_max - (1 << max_bits); BitsCheckBusInteraction { x: x.into(), @@ -76,7 +76,7 @@ pub struct RangeCheckBusInteraction { pub is_lookup: bool, } -impl RangeCheckBusInteraction { +impl RangeCheckBusInteraction { /// Finalizes and sends/receives over the RangeCheck bus. pub fn eval(self, builder: &mut AB, count: impl Into) where @@ -90,7 +90,7 @@ impl RangeCheckBusInteraction { } } -impl BitsCheckBusInteraction { +impl BitsCheckBusInteraction { /// Send interaction(s) to range check for max bits over the RangeCheck bus. pub fn eval(self, builder: &mut AB, count: impl Into) where @@ -107,7 +107,7 @@ impl BitsCheckBusInteraction { // implies `x < 2^max_bits`. self.bus.lookup_key( builder, - [self.x.clone() + AB::Expr::from_canonical_u32(self.shift)], + [self.x.clone() + AB::Expr::from_u32(self.shift)], count.clone(), ); } diff --git a/crates/circuits/primitives/src/range/mod.rs b/crates/circuits/primitives/src/range/mod.rs index dc94c03c9c..e5fba471e6 100644 --- a/crates/circuits/primitives/src/range/mod.rs +++ b/crates/circuits/primitives/src/range/mod.rs @@ -63,7 +63,7 @@ impl BaseAir for RangeCheckerAir { fn preprocessed_trace(&self) -> Option> { // Create lookup table with all values 0..range_max - let column = (0..self.range_max()).map(F::from_canonical_u32).collect(); + let column = (0..self.range_max()).map(F::from_u32).collect(); Some(RowMajorMatrix::new_col(column)) } } @@ -71,10 +71,12 @@ impl BaseAir for RangeCheckerAir { impl Air for RangeCheckerAir { fn eval(&self, builder: &mut AB) { let preprocessed = builder.preprocessed(); - let prep_local = preprocessed.row_slice(0); + let prep_local = preprocessed + .row_slice(0) + .expect("window should have two elements"); let prep_local: &RangePreprocessedCols = (*prep_local).borrow(); let main = builder.main(); - let local = main.row_slice(0); + let local = main.row_slice(0).expect("window should have two elements"); let local: &RangeCols = (*local).borrow(); // Omit creating separate bridge.rs file for brevity self.bus @@ -121,8 +123,7 @@ impl RangeCheckerChip { for (n, row) in rows.chunks_exact_mut(NUM_RANGE_COLS).enumerate() { let cols: &mut RangeCols = (*row).borrow_mut(); // Set multiplicity for each value in range - cols.mult = - F::from_canonical_u32(self.count[n].swap(0, std::sync::atomic::Ordering::Relaxed)); + cols.mult = F::from_u32(self.count[n].swap(0, std::sync::atomic::Ordering::Relaxed)); } RowMajorMatrix::new(rows, NUM_RANGE_COLS) } diff --git a/crates/circuits/primitives/src/range/tests/list/air.rs b/crates/circuits/primitives/src/range/tests/list/air.rs index ab0dece72b..659cdf0f5d 100644 --- a/crates/circuits/primitives/src/range/tests/list/air.rs +++ b/crates/circuits/primitives/src/range/tests/list/air.rs @@ -3,7 +3,7 @@ use std::borrow::Borrow; use openvm_stark_backend::{ interaction::InteractionBuilder, p3_air::{Air, BaseAir}, - p3_field::{Field, FieldAlgebra}, + p3_field::{Field, PrimeCharacteristicRing}, p3_matrix::Matrix, rap::{BaseAirWithPublicValues, PartitionedBaseAir}, }; @@ -28,7 +28,7 @@ impl BaseAir for ListAir { impl Air for ListAir { fn eval(&self, builder: &mut AB) { let main = builder.main(); - let local = main.row_slice(0); + let local = main.row_slice(0).expect("window should have two elements"); let local: &ListCols = (*local).borrow(); // We do not implement SubAirBridge trait for brevity diff --git a/crates/circuits/primitives/src/range/tests/list/trace.rs b/crates/circuits/primitives/src/range/tests/list/trace.rs index 8e59b6e4f1..cd66493382 100644 --- a/crates/circuits/primitives/src/range/tests/list/trace.rs +++ b/crates/circuits/primitives/src/range/tests/list/trace.rs @@ -6,7 +6,7 @@ impl ListChip { pub fn generate_trace(&self) -> RowMajorMatrix { let mut rows = vec![]; for val in self.vals.iter() { - rows.push(vec![F::from_canonical_u32(*val)]); + rows.push(vec![F::from_u32(*val)]); self.range_checker.add_count(*val); } diff --git a/crates/circuits/primitives/src/range/tests/mod.rs b/crates/circuits/primitives/src/range/tests/mod.rs index d0d94e9dde..112ea17846 100644 --- a/crates/circuits/primitives/src/range/tests/mod.rs +++ b/crates/circuits/primitives/src/range/tests/mod.rs @@ -33,7 +33,7 @@ fn test_list_range_checker() { let lists_vals = (0..num_lists) .map(|_| { (0..LIST_LEN) - .map(|_| rng.gen::() % MAX) + .map(|_| rng.random::() % MAX) .collect::>() }) .collect::>>(); diff --git a/crates/circuits/primitives/src/range_gate/mod.rs b/crates/circuits/primitives/src/range_gate/mod.rs index c013bcda59..1073b578c3 100644 --- a/crates/circuits/primitives/src/range_gate/mod.rs +++ b/crates/circuits/primitives/src/range_gate/mod.rs @@ -13,7 +13,7 @@ use openvm_circuit_primitives_derive::AlignedBorrow; use openvm_stark_backend::{ interaction::{BusIndex, InteractionBuilder}, p3_air::{Air, AirBuilder, BaseAir}, - p3_field::{Field, FieldAlgebra}, + p3_field::{Field, PrimeCharacteristicRing}, p3_matrix::{dense::RowMajorMatrix, Matrix}, p3_util::indices_arr, rap::{BaseAirWithPublicValues, PartitionedBaseAir}, @@ -62,7 +62,10 @@ impl Air for RangeCheckerGateAir { fn eval(&self, builder: &mut AB) { let main = builder.main(); - let (local, next) = (main.row_slice(0), main.row_slice(1)); + let (local, next) = ( + main.row_slice(0).expect("window should have two elements"), + main.row_slice(1).expect("window should have two elements"), + ); let local: &RangeGateCols = (*local).borrow(); let next: &RangeGateCols = (*next).borrow(); @@ -76,10 +79,9 @@ impl Air for RangeCheckerGateAir { .assert_eq(local.counter + AB::Expr::ONE, next.counter); // Constrain the last counter value to ensure trace height equals range_max // This is critical as the trace height is not part of the verification key - builder.when_last_row().assert_eq( - local.counter, - AB::F::from_canonical_u32(self.bus.range_max - 1), - ); + builder + .when_last_row() + .assert_eq(local.counter, AB::F::from_u32(self.bus.range_max - 1)); // Omit creating separate bridge.rs file for brevity self.bus.receive(local.counter).eval(builder, local.mult); } @@ -144,7 +146,7 @@ impl RangeCheckerGateChip { .enumerate() .flat_map(|(i, count)| { let c = count.swap(0, std::sync::atomic::Ordering::Relaxed); - vec![F::from_canonical_usize(i), F::from_canonical_u32(c)] + vec![F::from_usize(i), F::from_u32(c)] }) .collect(); RowMajorMatrix::new(rows, NUM_RANGE_GATE_COLS) diff --git a/crates/circuits/primitives/src/range_gate/tests.rs b/crates/circuits/primitives/src/range_gate/tests.rs index 4391d32f1f..c85f3dcd49 100644 --- a/crates/circuits/primitives/src/range_gate/tests.rs +++ b/crates/circuits/primitives/src/range_gate/tests.rs @@ -1,8 +1,8 @@ use std::{iter, sync::Arc}; use openvm_stark_backend::{ - p3_field::FieldAlgebra, p3_matrix::dense::RowMajorMatrix, p3_maybe_rayon::prelude::*, - utils::disable_debug_builder, verifier::VerificationError, AirRef, + p3_field::PrimeCharacteristicRing, p3_matrix::dense::RowMajorMatrix, + p3_maybe_rayon::prelude::*, utils::disable_debug_builder, verifier::VerificationError, AirRef, }; use openvm_stark_sdk::{ any_rap_arc_vec, config::baby_bear_blake3::BabyBearBlake3Engine, @@ -31,7 +31,7 @@ fn test_range_gate_chip() { let lists_vals = (0..num_lists) .map(|_| { (0..LIST_LEN) - .map(|_| rng.gen::() % MAX) + .map(|_| rng.random::() % MAX) .collect::>() }) .collect::>>(); @@ -50,7 +50,7 @@ fn test_range_gate_chip() { range_checker.add_count(v); iter::once(1).chain(iter::once(v)) }) - .map(FieldAlgebra::from_wrapped_u32) + .map(PrimeCharacteristicRing::from_u32) .collect(), 2, ) @@ -91,7 +91,7 @@ fn negative_test_range_gate_chip() { range_checker.count[i as usize].load(std::sync::atomic::Ordering::Relaxed); iter::once(i + 1).chain(iter::once(count)) }) - .map(FieldAlgebra::from_wrapped_u32) + .map(PrimeCharacteristicRing::from_u32) .collect(), 2, ); diff --git a/crates/circuits/primitives/src/range_tuple/bus.rs b/crates/circuits/primitives/src/range_tuple/bus.rs index fc86146b2c..a4f51bcbc1 100644 --- a/crates/circuits/primitives/src/range_tuple/bus.rs +++ b/crates/circuits/primitives/src/range_tuple/bus.rs @@ -1,6 +1,6 @@ use openvm_stark_backend::{ interaction::{BusIndex, InteractionBuilder, LookupBus}, - p3_field::FieldAlgebra, + p3_field::PrimeCharacteristicRing, }; #[derive(Clone, Copy, Debug, PartialEq, Eq)] @@ -53,7 +53,7 @@ pub struct RangeTupleCheckerBusInteraction { pub is_lookup: bool, } -impl RangeTupleCheckerBusInteraction { +impl RangeTupleCheckerBusInteraction { pub fn eval(self, builder: &mut AB, count: impl Into) where AB: InteractionBuilder, diff --git a/crates/circuits/primitives/src/range_tuple/mod.rs b/crates/circuits/primitives/src/range_tuple/mod.rs index b7dabcce89..04504542a5 100644 --- a/crates/circuits/primitives/src/range_tuple/mod.rs +++ b/crates/circuits/primitives/src/range_tuple/mod.rs @@ -79,10 +79,7 @@ impl BaseAir for RangeTupleCheckerAir { } } Some(RowMajorMatrix::new( - unrolled_matrix - .iter() - .map(|&v| F::from_canonical_u32(v)) - .collect(), + unrolled_matrix.iter().map(|&v| F::from_u32(v)).collect(), N, )) } @@ -91,12 +88,12 @@ impl BaseAir for RangeTupleCheckerAir { impl Air for RangeTupleCheckerAir { fn eval(&self, builder: &mut AB) { let preprocessed = builder.preprocessed(); - let prep_local = preprocessed.row_slice(0); + let prep_local = preprocessed.row_slice(0).unwrap(); let prep_local = RangeTuplePreprocessedCols { tuple: (*prep_local).to_vec(), }; let main = builder.main(); - let local = main.row_slice(0); + let local = main.row_slice(0).expect("window should have two elements"); let local = RangeTupleCols { mult: (*local)[0] }; self.bus.receive(prep_local.tuple).eval(builder, local.mult); @@ -157,7 +154,7 @@ impl RangeTupleCheckerChip { let rows = self .count .iter() - .map(|c| F::from_canonical_u32(c.swap(0, std::sync::atomic::Ordering::Relaxed))) + .map(|c| F::from_u32(c.swap(0, std::sync::atomic::Ordering::Relaxed))) .collect::>(); RowMajorMatrix::new(rows, 1) } diff --git a/crates/circuits/primitives/src/range_tuple/tests/mod.rs b/crates/circuits/primitives/src/range_tuple/tests/mod.rs index a8f41b9bb5..458495e2ca 100644 --- a/crates/circuits/primitives/src/range_tuple/tests/mod.rs +++ b/crates/circuits/primitives/src/range_tuple/tests/mod.rs @@ -1,8 +1,8 @@ use std::{array, iter, sync::Arc}; use openvm_stark_backend::{ - p3_field::FieldAlgebra, p3_matrix::dense::RowMajorMatrix, p3_maybe_rayon::prelude::*, - utils::disable_debug_builder, verifier::VerificationError, AirRef, + p3_field::PrimeCharacteristicRing, p3_matrix::dense::RowMajorMatrix, + p3_maybe_rayon::prelude::*, utils::disable_debug_builder, verifier::VerificationError, AirRef, }; use openvm_stark_sdk::{ any_rap_arc_vec, config::baby_bear_blake3::BabyBearBlake3Engine, @@ -37,7 +37,7 @@ fn test_range_tuple_chip() { const LIST_LEN: usize = 64; let bus_index = 0; - let sizes: [u32; 3] = array::from_fn(|_| 1 << rng.gen_range(1..5)); + let sizes: [u32; 3] = array::from_fn(|_| 1 << rng.random_range(1..5)); let bus = RangeTupleCheckerBus::new(bus_index, sizes); let range_checker = RangeTupleCheckerChip::new(bus); @@ -46,7 +46,7 @@ fn test_range_tuple_chip() { let mut gen_tuple = || { sizes .iter() - .map(|&size| rng.gen_range(0..size)) + .map(|&size| rng.random_range(0..size)) .collect::>() }; @@ -78,7 +78,7 @@ fn test_range_tuple_chip() { range_checker.add_count(&v); iter::once(1).chain(v) }) - .map(FieldAlgebra::from_wrapped_u32) + .map(PrimeCharacteristicRing::from_u32) .collect(), sizes.len() + 1, ) @@ -115,7 +115,7 @@ fn negative_test_range_tuple_chip() { let mut range_trace = range_checker.generate_trace(); // Corrupt the trace to make it invalid - range_trace.values[0] = BabyBear::from_wrapped_u32(99); + range_trace.values[0] = BabyBear::from_u32(99); disable_debug_builder(); assert_eq!( @@ -148,13 +148,13 @@ fn test_cuda_range_tuple() { const NUM_INPUTS: usize = 1 << 16; let mut rng = create_seeded_rng(); - let sizes: [u32; TUPLE_SIZE] = from_fn(|_| 1 << rng.gen_range(1..5)); + let sizes: [u32; TUPLE_SIZE] = from_fn(|_| 1 << rng.random_range(1..5)); let bus = RangeTupleCheckerBus::::new(0, sizes); let random_values = (0..NUM_INPUTS) .flat_map(|_| { sizes .iter() - .map(|&size| rng.gen_range(0..size)) + .map(|&size| rng.random_range(0..size)) .collect::>() }) .collect::>(); @@ -182,7 +182,7 @@ fn test_cuda_range_tuple_hybrid() { const NUM_INPUTS: usize = 1 << 16; let mut rng = create_seeded_rng(); - let sizes: [u32; TUPLE_SIZE] = from_fn(|_| 1 << rng.gen_range(1..5)); + let sizes: [u32; TUPLE_SIZE] = from_fn(|_| 1 << rng.random_range(1..5)); let bus = RangeTupleCheckerBus::::new(0, sizes); let range_tuple_checker = Arc::new(RangeTupleCheckerChipGPU::hybrid(Arc::new( RangeTupleCheckerChip::new(bus), @@ -192,7 +192,7 @@ fn test_cuda_range_tuple_hybrid() { .flat_map(|_| { sizes .iter() - .map(|&size| rng.gen_range(0..size)) + .map(|&size| rng.random_range(0..size)) .collect::>() }) .collect::>(); @@ -203,7 +203,7 @@ fn test_cuda_range_tuple_hybrid() { .map(|_| { let values = sizes .iter() - .map(|&size| rng.gen_range(0..size)) + .map(|&size| rng.random_range(0..size)) .collect::>(); cpu_chip.add_count(&values); values @@ -214,9 +214,9 @@ fn test_cuda_range_tuple_hybrid() { .chain( cpu_values .iter() - .map(|v| F::from_canonical_u32(v[0])) - .chain(cpu_values.iter().map(|v| F::from_canonical_u32(v[1]))) - .chain(cpu_values.iter().map(|v| F::from_canonical_u32(v[2]))), + .map(|v| F::from_u32(v[0])) + .chain(cpu_values.iter().map(|v| F::from_u32(v[1]))) + .chain(cpu_values.iter().map(|v| F::from_u32(v[2]))), ) .collect::>() .to_device() diff --git a/crates/circuits/primitives/src/utils.rs b/crates/circuits/primitives/src/utils.rs index c457024df4..ae5ed8b4d5 100644 --- a/crates/circuits/primitives/src/utils.rs +++ b/crates/circuits/primitives/src/utils.rs @@ -1,7 +1,7 @@ use itertools::zip_eq; use openvm_stark_backend::{ p3_air::{AirBuilder, VirtualPairCol}, - p3_field::{Field, FieldAlgebra}, + p3_field::{Field, PrimeCharacteristicRing}, }; /// Return either 0 if n is zero or the next power of two of n. @@ -14,28 +14,32 @@ pub const fn next_power_of_two_or_zero(n: usize) -> usize { } } -pub fn not(a: impl Into) -> F { +pub fn not(a: impl Into) -> F { F::ONE - a.into() } -pub fn and(a: impl Into, b: impl Into) -> F { +pub fn and(a: impl Into, b: impl Into) -> F { a.into() * b.into() } /// Assumes that a and b are boolean -pub fn or(a: impl Into, b: impl Into) -> F { +pub fn or(a: impl Into, b: impl Into) -> F { let a = a.into(); let b = b.into(); a.clone() + b.clone() - and(a, b) } /// Assumes that a and b are boolean -pub fn implies(a: impl Into, b: impl Into) -> F { +pub fn implies(a: impl Into, b: impl Into) -> F { or(F::ONE - a.into(), b.into()) } /// Assumes that `cond` is boolean. Returns `a` if `cond` is true, otherwise returns `b`. -pub fn select(cond: impl Into, a: impl Into, b: impl Into) -> F { +pub fn select( + cond: impl Into, + a: impl Into, + b: impl Into, +) -> F { let cond = cond.into(); cond.clone() * a.into() + (F::ONE - cond) * b.into() } @@ -50,11 +54,11 @@ pub fn to_vcols(cols: &[usize]) -> Vec> { pub fn fill_slc_to_f(dest: &mut [F], src: &[u32]) { dest.iter_mut() .zip(src.iter()) - .for_each(|(d, s)| *d = F::from_canonical_u32(*s)); + .for_each(|(d, s)| *d = F::from_u32(*s)); } pub fn to_field_vec(src: &[u32]) -> Vec { - src.iter().map(|s| F::from_canonical_u32(*s)).collect() + src.iter().map(|s| F::from_u32(*s)).collect() } pub fn assert_array_eq, I2: Into, const N: usize>( @@ -69,8 +73,8 @@ pub fn assert_array_eq, I2: Into, c /// Composes a list of limb values into a single field element #[inline] -pub fn compose(a: &[impl Into + Clone], limb_size: usize) -> F { +pub fn compose(a: &[impl Into + Clone], limb_size: usize) -> F { a.iter().enumerate().fold(F::ZERO, |acc, (i, x)| { - acc + x.clone().into() * F::from_canonical_usize(1 << (i * limb_size)) + acc + x.clone().into() * F::from_usize(1 << (i * limb_size)) }) } diff --git a/crates/circuits/primitives/src/var_range/bus.rs b/crates/circuits/primitives/src/var_range/bus.rs index 436178d661..5450e4869e 100644 --- a/crates/circuits/primitives/src/var_range/bus.rs +++ b/crates/circuits/primitives/src/var_range/bus.rs @@ -1,6 +1,6 @@ use openvm_stark_backend::{ interaction::{BusIndex, InteractionBuilder, LookupBus}, - p3_field::FieldAlgebra, + p3_field::PrimeCharacteristicRing, }; // Represents a bus for (x, bits) where either (x, bits) = (0, 0) or @@ -50,10 +50,10 @@ impl VariableRangeCheckerBus { max_bits: usize, ) -> VariableRangeCheckerBusInteraction where - T: FieldAlgebra, + T: PrimeCharacteristicRing, { debug_assert!(max_bits <= self.range_max_bits); - self.push(value, T::from_canonical_usize(max_bits), true) + self.push(value, T::from_usize(max_bits), true) } pub fn push( @@ -79,7 +79,7 @@ pub struct VariableRangeCheckerBusInteraction { pub is_lookup: bool, } -impl VariableRangeCheckerBusInteraction { +impl VariableRangeCheckerBusInteraction { pub fn eval(self, builder: &mut AB, count: impl Into) where AB: InteractionBuilder, diff --git a/crates/circuits/primitives/src/var_range/mod.rs b/crates/circuits/primitives/src/var_range/mod.rs index a325cd09e1..72b7af8b75 100644 --- a/crates/circuits/primitives/src/var_range/mod.rs +++ b/crates/circuits/primitives/src/var_range/mod.rs @@ -75,9 +75,8 @@ impl BaseAir for VariableRangeCheckerAir { let rows: Vec = [F::ZERO; NUM_VARIABLE_RANGE_PREPROCESSED_COLS] .into_iter() .chain((0..=self.range_max_bits()).flat_map(|bits| { - (0..(1 << bits)).flat_map(move |value| { - [F::from_canonical_u32(value), F::from_canonical_usize(bits)].into_iter() - }) + (0..(1 << bits)) + .flat_map(move |value| [F::from_u32(value), F::from_usize(bits)].into_iter()) })) .collect(); Some(RowMajorMatrix::new( @@ -90,10 +89,12 @@ impl BaseAir for VariableRangeCheckerAir { impl Air for VariableRangeCheckerAir { fn eval(&self, builder: &mut AB) { let preprocessed = builder.preprocessed(); - let prep_local = preprocessed.row_slice(0); + let prep_local = preprocessed + .row_slice(0) + .expect("window should have two elements"); let prep_local: &VariableRangePreprocessedCols = (*prep_local).borrow(); let main = builder.main(); - let local = main.row_slice(0); + let local = main.row_slice(0).expect("window should have two elements"); let local: &VariableRangeCols = (*local).borrow(); // Omit creating separate bridge.rs file for brevity self.bus @@ -162,8 +163,7 @@ impl VariableRangeCheckerChip { let mut rows = F::zero_vec(self.count.len() * NUM_VARIABLE_RANGE_COLS); for (n, row) in rows.chunks_mut(NUM_VARIABLE_RANGE_COLS).enumerate() { let cols: &mut VariableRangeCols = row.borrow_mut(); - cols.mult = - F::from_canonical_u32(self.count[n].swap(0, std::sync::atomic::Ordering::Relaxed)); + cols.mult = F::from_u32(self.count[n].swap(0, std::sync::atomic::Ordering::Relaxed)); } RowMajorMatrix::new(rows, NUM_VARIABLE_RANGE_COLS) } @@ -180,7 +180,7 @@ impl VariableRangeCheckerChip { let mut bits_remaining = bits; for limb in limbs.iter_mut() { let limb_u32 = value & mask; - *limb = F::from_canonical_u32(limb_u32); + *limb = F::from_u32(limb_u32); self.add_count(limb_u32, bits_remaining.min(self.range_max_bits())); value >>= self.range_max_bits(); diff --git a/crates/circuits/primitives/src/var_range/tests/dummy.rs b/crates/circuits/primitives/src/var_range/tests/dummy.rs index d8fd241a77..4ab4964cec 100644 --- a/crates/circuits/primitives/src/var_range/tests/dummy.rs +++ b/crates/circuits/primitives/src/var_range/tests/dummy.rs @@ -1,7 +1,7 @@ use openvm_stark_backend::{ interaction::InteractionBuilder, p3_air::{Air, AirBuilder, BaseAir}, - p3_field::{Field, FieldAlgebra}, + p3_field::{Field, PrimeCharacteristicRing}, p3_matrix::{dense::RowMajorMatrix, Matrix}, rap::{BaseAirWithPublicValues, PartitionedBaseAir}, }; @@ -35,7 +35,7 @@ impl Air for TestSendAir { fn eval(&self, builder: &mut AB) { let main = builder.main(); // local = [value, max_bits] - let local = main.row_slice(0); + let local = main.row_slice(0).expect("window should have two elements"); self.bus.send(local[0], local[1]).eval(builder, AB::F::ONE); } } @@ -68,7 +68,7 @@ impl Air for TestRangeCheckAir { fn eval(&self, builder: &mut AB) { let main = builder.main(); // local = [value] - let local = main.row_slice(0); + let local = main.row_slice(0).expect("window should have two elements"); self.bus .range_check(local[0], self.max_bits) .eval(builder, AB::F::ONE); diff --git a/crates/circuits/primitives/src/var_range/tests/mod.rs b/crates/circuits/primitives/src/var_range/tests/mod.rs index 46a050fe75..d5d2010957 100644 --- a/crates/circuits/primitives/src/var_range/tests/mod.rs +++ b/crates/circuits/primitives/src/var_range/tests/mod.rs @@ -1,8 +1,8 @@ use std::{iter, sync::Arc}; use openvm_stark_backend::{ - p3_field::FieldAlgebra, p3_matrix::dense::RowMajorMatrix, p3_maybe_rayon::prelude::*, - utils::disable_debug_builder, verifier::VerificationError, AirRef, + p3_field::PrimeCharacteristicRing, p3_matrix::dense::RowMajorMatrix, + p3_maybe_rayon::prelude::*, utils::disable_debug_builder, verifier::VerificationError, AirRef, }; use openvm_stark_sdk::{ any_rap_arc_vec, config::baby_bear_blake3::BabyBearBlake3Engine, engine::StarkFriEngine, @@ -50,8 +50,8 @@ fn test_variable_range_checker_chip_send() { .map(|_| { (0..LIST_LEN) .map(|_| { - let bits = rng.gen_range(0..=MAX_BITS); - let val = rng.gen_range(0..(1 << bits)); + let bits = rng.random_range(0..=MAX_BITS); + let val = rng.random_range(0..(1 << bits)); [val, bits] }) .collect::>() @@ -79,7 +79,7 @@ fn test_variable_range_checker_chip_send() { var_range_checker.add_count(val, bits as usize); iter::once(val).chain(iter::once(bits)) }) - .map(FieldAlgebra::from_canonical_u32) + .map(PrimeCharacteristicRing::from_u32) .collect(), 2, ) @@ -112,8 +112,8 @@ fn negative_test_variable_range_checker_chip_send() { // generate randomized valid values-bits pairs with one invalid pair (i.e. [4, 2]) let list_vals = (0..(LIST_LEN - 1)) .map(|_| { - let bits = rng.gen_range(0..=MAX_BITS); - let val = rng.gen_range(0..(1 << bits)); + let bits = rng.random_range(0..=MAX_BITS); + let val = rng.random_range(0..(1 << bits)); [val, bits] }) .chain(iter::once([4, 2])) @@ -131,7 +131,7 @@ fn negative_test_variable_range_checker_chip_send() { var_range_checker.add_count(val, bits as usize); iter::once(val).chain(iter::once(bits)) }) - .map(FieldAlgebra::from_canonical_u32) + .map(PrimeCharacteristicRing::from_u32) .collect(), 2, ); @@ -164,7 +164,7 @@ fn test_variable_range_checker_chip_range_check() { let lists_vals = (0..num_lists) .map(|_| { (0..LIST_LEN) - .map(|_| rng.gen_range(0..MAX_VAL)) + .map(|_| rng.random_range(0..MAX_VAL)) .collect::>() }) .collect::>>(); @@ -190,7 +190,7 @@ fn test_variable_range_checker_chip_range_check() { var_range_checker.add_count(val, MAX_BITS); iter::once(val) }) - .map(FieldAlgebra::from_canonical_u32) + .map(PrimeCharacteristicRing::from_u32) .collect(), 1, ) @@ -224,7 +224,7 @@ fn negative_test_variable_range_checker_chip_range_check() { // generate randomized valid values with one invalid value (i.e. MAX_VAL) let list_vals = (0..(LIST_LEN - 1)) - .map(|_| rng.gen_range(0..MAX_VAL)) + .map(|_| rng.random_range(0..MAX_VAL)) .chain(iter::once(MAX_VAL)) .collect::>(); @@ -240,7 +240,7 @@ fn negative_test_variable_range_checker_chip_range_check() { var_range_checker.add_count(val, MAX_BITS); iter::once(val) }) - .map(FieldAlgebra::from_canonical_u32) + .map(PrimeCharacteristicRing::from_u32) .collect(), 1, ); @@ -265,7 +265,7 @@ fn test_cuda_var_range() { let mut rng = create_seeded_rng(); let bus = VariableRangeCheckerBus::new(1, RANGE_MAX_BITS); let random_values: Vec = (0..NUM_INPUTS) - .map(|_| rng.gen::() & RANGE_BIT_MASK) + .map(|_| rng.random::() & RANGE_BIT_MASK) .collect(); let range_checker = Arc::new(VariableRangeCheckerChipGPU::new(bus)); @@ -298,16 +298,16 @@ fn test_cuda_var_range_hybrid() { ))); let gpu_random_values: Vec = (0..NUM_INPUTS) - .map(|_| rng.gen::() & RANGE_BIT_MASK) + .map(|_| rng.random::() & RANGE_BIT_MASK) .collect(); let gpu_dummy_chip = DummyInteractionChipGPU::new(range_checker.clone(), gpu_random_values); let cpu_chip = range_checker.cpu_chip.clone().unwrap(); let cpu_pairs = (0..NUM_INPUTS) .map(|_| { - let bits = rng.gen_range(0..=(RANGE_MAX_BITS as u32)); + let bits = rng.random_range(0..=(RANGE_MAX_BITS as u32)); let mask = (1 << bits) - 1; - let value = rng.gen::() & mask; + let value = rng.random::() & mask; cpu_chip.add_count(value, bits as usize); [value, bits] }) @@ -317,8 +317,8 @@ fn test_cuda_var_range_hybrid() { .chain( cpu_pairs .iter() - .map(|pair| F::from_canonical_u32(pair[0])) - .chain(cpu_pairs.iter().map(|pair| F::from_canonical_u32(pair[1]))), + .map(|pair| F::from_u32(pair[0])) + .chain(cpu_pairs.iter().map(|pair| F::from_u32(pair[1]))), ) .collect::>() .to_device() diff --git a/crates/circuits/primitives/src/xor/bus.rs b/crates/circuits/primitives/src/xor/bus.rs index c01b78e873..eab11947bb 100644 --- a/crates/circuits/primitives/src/xor/bus.rs +++ b/crates/circuits/primitives/src/xor/bus.rs @@ -1,6 +1,6 @@ use openvm_stark_backend::{ interaction::{InteractionBuilder, LookupBus}, - p3_field::FieldAlgebra, + p3_field::PrimeCharacteristicRing, }; /// Represents a bus for `(x, y, x ^ y)` identified by a unique bus index (`usize`). @@ -53,7 +53,7 @@ pub struct XorBusInteraction { pub is_lookup: bool, } -impl XorBusInteraction { +impl XorBusInteraction { /// Finalizes and sends/receives over the Xor bus. pub fn eval(self, builder: &mut AB, count: impl Into) where diff --git a/crates/circuits/primitives/src/xor/lookup/mod.rs b/crates/circuits/primitives/src/xor/lookup/mod.rs index af9175183d..6ee5d395b6 100644 --- a/crates/circuits/primitives/src/xor/lookup/mod.rs +++ b/crates/circuits/primitives/src/xor/lookup/mod.rs @@ -71,7 +71,7 @@ impl BaseAir for XorLookupAir { let x = i / (1 << M); let y = i % (1 << M); let z = x ^ y; - [x, y, z].map(F::from_canonical_u32) + [x, y, z].map(F::from_u32) }) .collect(); @@ -87,9 +87,9 @@ where let main = builder.main(); let preprocessed = builder.preprocessed(); - let prep_local = preprocessed.row_slice(0); + let prep_local = preprocessed.row_slice(0).unwrap(); let prep_local: &XorLookupPreprocessedCols = (*prep_local).borrow(); - let local = main.row_slice(0); + let local = main.row_slice(0).expect("window should have two elements"); let local: &XorLookupCols = (*local).borrow(); self.bus @@ -162,7 +162,7 @@ impl XorLookupChip { debug_assert_eq!(count_x.len(), 1 << M); count_x .iter() - .map(|count_xy| F::from_canonical_u32(count_xy.load(atomic::Ordering::SeqCst))) + .map(|count_xy| F::from_u32(count_xy.load(atomic::Ordering::SeqCst))) }) .collect(); diff --git a/crates/circuits/primitives/src/xor/lookup/tests.rs b/crates/circuits/primitives/src/xor/lookup/tests.rs index 237e9615c4..a9fbacffcb 100644 --- a/crates/circuits/primitives/src/xor/lookup/tests.rs +++ b/crates/circuits/primitives/src/xor/lookup/tests.rs @@ -1,7 +1,7 @@ use std::{iter, sync::Arc}; use openvm_stark_backend::{ - interaction::BusIndex, p3_field::FieldAlgebra, p3_matrix::dense::RowMajorMatrix, + interaction::BusIndex, p3_field::PrimeCharacteristicRing, p3_matrix::dense::RowMajorMatrix, p3_maybe_rayon::prelude::*, utils::disable_debug_builder, verifier::VerificationError, AirRef, }; use openvm_stark_sdk::{ @@ -33,8 +33,8 @@ fn test_xor_limbs_chip() { .map(|_| { (0..XOR_REQUESTS) .map(|_| { - let x = rng.gen::() % MAX_INPUT; - let y = rng.gen::() % MAX_INPUT; + let x = rng.random::() % MAX_INPUT; + let y = rng.random::() % MAX_INPUT; (1, vec![x, y]) }) @@ -58,7 +58,7 @@ fn test_xor_limbs_chip() { let z = xor_chip.request(x, y); iter::once(count).chain(fields).chain(iter::once(z)) }) - .map(FieldAlgebra::from_wrapped_u32) + .map(PrimeCharacteristicRing::from_u32) .collect(), 4, ) @@ -96,8 +96,8 @@ fn negative_test_xor_limbs_chip() { let pairs = (0..XOR_REQUESTS) .map(|_| { - let x = rng.gen::() % MAX_INPUT; - let y = rng.gen::() % MAX_INPUT; + let x = rng.random::() % MAX_INPUT; + let y = rng.random::() % MAX_INPUT; (1, vec![x, y]) }) @@ -122,7 +122,7 @@ fn negative_test_xor_limbs_chip() { iter::once(count).chain(fields).chain(iter::once(z)) } }) - .map(FieldAlgebra::from_wrapped_u32) + .map(PrimeCharacteristicRing::from_u32) .collect(), 4, ); diff --git a/crates/circuits/sha256-air/src/air.rs b/crates/circuits/sha256-air/src/air.rs index b27af6ffa9..304074113c 100644 --- a/crates/circuits/sha256-air/src/air.rs +++ b/crates/circuits/sha256-air/src/air.rs @@ -9,7 +9,7 @@ use openvm_circuit_primitives::{ use openvm_stark_backend::{ interaction::{BusIndex, InteractionBuilder, PermutationCheckBus}, p3_air::{AirBuilder, BaseAir}, - p3_field::{Field, FieldAlgebra}, + p3_field::{Field, PrimeCharacteristicRing}, p3_matrix::Matrix, }; @@ -74,7 +74,7 @@ impl Sha256Air { /// Implements some sanity constraints on the row index, flags, and work variables fn eval_row(&self, builder: &mut AB, start_col: usize) { let main = builder.main(); - let local = main.row_slice(0); + let local = main.row_slice(0).expect("window should have two elements"); // Doesn't matter which column struct we use here as we are only interested in the common // columns @@ -153,7 +153,7 @@ impl Sha256Air { ) .assert_eq( a_limb, - AB::Expr::from_canonical_u32( + AB::Expr::from_u32( u32_into_u16s(SHA256_H[SHA256_ROUNDS_PER_ROW - i - 1])[j], ), ); @@ -165,7 +165,7 @@ impl Sha256Air { ) .assert_eq( e_limb, - AB::Expr::from_canonical_u32( + AB::Expr::from_u32( u32_into_u16s(SHA256_H[SHA256_ROUNDS_PER_ROW - i + 3])[j], ), ); @@ -214,7 +214,7 @@ impl Sha256Air { let final_hash_limb = compose::(&next.final_hash[i][j * 2..(j + 1) * 2], 8); - carry = AB::Expr::from(AB::F::from_canonical_u32(1 << 16).inverse()) + carry = AB::Expr::from(AB::F::from_u32(1 << 16).inverse()) * (next.prev_hash[i][j] + work_var_limb + carry - final_hash_limb); builder .when(next.flags.is_digest_row) @@ -232,8 +232,8 @@ impl Sha256Air { fn eval_transitions(&self, builder: &mut AB, start_col: usize) { let main = builder.main(); - let local = main.row_slice(0); - let next = main.row_slice(1); + let local = main.row_slice(0).expect("window should have two elements"); + let next = main.row_slice(1).expect("window should have two elements"); // Doesn't matter what column structs we use here let local_cols: &Sha256RoundCols = @@ -281,7 +281,7 @@ impl Sha256Air { let delta = local_cols.flags.is_round_row * AB::Expr::ONE + local_cols.flags.is_digest_row * next_cols.flags.is_round_row - * AB::Expr::from_canonical_u32(16) + * AB::Expr::from_u32(16) * AB::Expr::NEG_ONE + local_cols.flags.is_digest_row * next_is_padding_row.clone() * AB::Expr::ONE; diff --git a/crates/circuits/sha256-air/src/columns.rs b/crates/circuits/sha256-air/src/columns.rs index 1c735394c3..f7f22fff6a 100644 --- a/crates/circuits/sha256-air/src/columns.rs +++ b/crates/circuits/sha256-air/src/columns.rs @@ -1,7 +1,7 @@ //! WARNING: the order of fields in the structs is important, do not change it use openvm_circuit_primitives::{utils::not, AlignedBorrow}; -use openvm_stark_backend::p3_field::FieldAlgebra; +use openvm_stark_backend::p3_field::PrimeCharacteristicRing; use super::{ SHA256_HASH_WORDS, SHA256_ROUNDS_PER_ROW, SHA256_ROW_VAR_CNT, SHA256_WORD_BITS, @@ -133,7 +133,7 @@ impl> Sha256FlagsCols { // function. pub fn is_padding_row(&self) -> O where - O: FieldAlgebra, + O: PrimeCharacteristicRing, { not(self.is_not_padding_row()) } diff --git a/crates/circuits/sha256-air/src/tests.rs b/crates/circuits/sha256-air/src/tests.rs index 7ad0229185..f6bf855190 100644 --- a/crates/circuits/sha256-air/src/tests.rs +++ b/crates/circuits/sha256-air/src/tests.rs @@ -15,7 +15,7 @@ use openvm_stark_backend::{ config::{StarkGenericConfig, Val}, interaction::{BusIndex, InteractionBuilder}, p3_air::{Air, BaseAir}, - p3_field::{Field, FieldAlgebra, PrimeField32}, + p3_field::{Field, PrimeCharacteristicRing, PrimeField32}, p3_matrix::{dense::RowMajorMatrix, Matrix}, prover::{cpu::CpuBackend, types::AirProvingContext}, rap::{BaseAirWithPublicValues, PartitionedBaseAir}, @@ -92,12 +92,12 @@ where let bitwise_chip = Arc::new(BitwiseOperationLookupChip::::new( bitwise_bus, )); - let len = rng.gen_range(1..100); + let len = rng.random_range(1..100); let random_records: Vec<_> = (0..len) .map(|i| { ( - array::from_fn(|_| rng.gen::()), - rng.gen::() || i == len - 1, + array::from_fn(|_| rng.random::()), + rng.random::() || i == len - 1, ) }) .collect(); @@ -134,7 +134,7 @@ fn negative_sha256_test_bad_final_hash() { // Set the final_hash to all zeros let modify_trace = |trace: &mut RowMajorMatrix| { trace.row_chunks_exact_mut(1).for_each(|row| { - let mut row_slice = row.row_slice(0).to_vec(); + let mut row_slice = row.row_slice(0).expect("row exists").to_vec(); let cols: &mut Sha256DigestCols = row_slice[..SHA256_DIGEST_WIDTH].borrow_mut(); if cols.flags.is_last_block.is_one() && cols.flags.is_digest_row.is_one() { for i in 0..SHA256_HASH_WORDS { diff --git a/crates/circuits/sha256-air/src/trace.rs b/crates/circuits/sha256-air/src/trace.rs index 8cbaebbc55..45607413d5 100644 --- a/crates/circuits/sha256-air/src/trace.rs +++ b/crates/circuits/sha256-air/src/trace.rs @@ -96,10 +96,9 @@ impl Sha256FillerHelper { cols.flags.is_first_4_rows = if i < 4 { F::ONE } else { F::ZERO }; cols.flags.is_digest_row = F::ZERO; cols.flags.is_last_block = F::from_bool(is_last_block); - cols.flags.row_idx = - get_flag_pt_array(&self.row_idx_encoder, i).map(F::from_canonical_u32); - cols.flags.global_block_idx = F::from_canonical_u32(global_block_idx); - cols.flags.local_block_idx = F::from_canonical_u32(local_block_idx); + cols.flags.row_idx = get_flag_pt_array(&self.row_idx_encoder, i).map(F::from_u32); + cols.flags.global_block_idx = F::from_u32(global_block_idx); + cols.flags.local_block_idx = F::from_u32(local_block_idx); // W_idx = M_idx if i < 4 { @@ -134,9 +133,9 @@ impl Sha256FillerHelper { } let carry = (sum - w_limbs[k]) >> 16; cols.message_schedule.carry_or_buffer[j][k * 2] = - F::from_canonical_u32(carry & 1); + F::from_u32(carry & 1); cols.message_schedule.carry_or_buffer[j][k * 2 + 1] = - F::from_canonical_u32(carry >> 1); + F::from_u32(carry >> 1); } // update the message schedule message_schedule[idx] = w; @@ -183,8 +182,8 @@ impl Sha256FillerHelper { } let carry_a = (a_limb - a_limbs[k]) >> 16; let carry_e = (e_limb - e_limbs[k]) >> 16; - cols.work_vars.carry_a[j][k] = F::from_canonical_u32(carry_a); - cols.work_vars.carry_e[j][k] = F::from_canonical_u32(carry_e); + cols.work_vars.carry_a[j][k] = F::from_u32(carry_a); + cols.work_vars.carry_e[j][k] = F::from_u32(carry_e); bitwise_lookup_chip.request_range(carry_a, carry_e); } @@ -206,11 +205,10 @@ impl Sha256FillerHelper { let w_4 = u32_into_u16s(message_schedule[idx - 4]); let sig_0_w_3 = u32_into_u16s(small_sig0(message_schedule[idx - 3])); cols.schedule_helper.intermed_4[j] = - array::from_fn(|k| F::from_canonical_u32(w_4[k] + sig_0_w_3[k])); + array::from_fn(|k| F::from_u32(w_4[k] + sig_0_w_3[k])); if j < SHA256_ROUNDS_PER_ROW - 1 { let w_3 = message_schedule[idx - 3]; - cols.schedule_helper.w_3[j] = - u32_into_u16s(w_3).map(F::from_canonical_u32); + cols.schedule_helper.w_3[j] = u32_into_u16s(w_3).map(F::from_u32); } } } @@ -221,17 +219,16 @@ impl Sha256FillerHelper { row[get_range(trace_start_col, SHA256_DIGEST_WIDTH)].borrow_mut(); for j in 0..SHA256_ROUNDS_PER_ROW - 1 { let w_3 = message_schedule[i * SHA256_ROUNDS_PER_ROW + j - 3]; - cols.schedule_helper.w_3[j] = u32_into_u16s(w_3).map(F::from_canonical_u32); + cols.schedule_helper.w_3[j] = u32_into_u16s(w_3).map(F::from_u32); } cols.flags.is_round_row = F::ZERO; cols.flags.is_first_4_rows = F::ZERO; cols.flags.is_digest_row = F::ONE; cols.flags.is_last_block = F::from_bool(is_last_block); - cols.flags.row_idx = - get_flag_pt_array(&self.row_idx_encoder, 16).map(F::from_canonical_u32); - cols.flags.global_block_idx = F::from_canonical_u32(global_block_idx); + cols.flags.row_idx = get_flag_pt_array(&self.row_idx_encoder, 16).map(F::from_u32); + cols.flags.global_block_idx = F::from_u32(global_block_idx); - cols.flags.local_block_idx = F::from_canonical_u32(local_block_idx); + cols.flags.local_block_idx = F::from_u32(local_block_idx); let final_hash: [u32; SHA256_HASH_WORDS] = array::from_fn(|i| work_vars[i].wrapping_add(prev_hash[i])); let final_hash_limbs: [[u8; SHA256_WORD_U8S]; SHA256_HASH_WORDS] = @@ -244,10 +241,9 @@ impl Sha256FillerHelper { bitwise_lookup_chip.request_range(chunk[0] as u32, chunk[1] as u32); } } - cols.final_hash = array::from_fn(|i| { - array::from_fn(|j| F::from_canonical_u8(final_hash_limbs[i][j])) - }); - cols.prev_hash = prev_hash.map(|f| u32_into_u16s(f).map(F::from_canonical_u32)); + cols.final_hash = + array::from_fn(|i| array::from_fn(|j| F::from_u8(final_hash_limbs[i][j]))); + cols.prev_hash = prev_hash.map(|f| u32_into_u16s(f).map(F::from_u32)); let hash = if is_last_block { SHA256_H.map(u32_into_bits_field::) } else { @@ -337,8 +333,7 @@ impl Sha256FillerHelper { self: &Sha256FillerHelper, cols: &mut Sha256RoundCols, ) { - cols.flags.row_idx = - get_flag_pt_array(&self.row_idx_encoder, 17).map(F::from_canonical_u32); + cols.flags.row_idx = get_flag_pt_array(&self.row_idx_encoder, 17).map(F::from_u32); let hash = SHA256_H.map(u32_into_bits_field::); @@ -347,12 +342,10 @@ impl Sha256FillerHelper { cols.work_vars.e[i] = hash[SHA256_ROUNDS_PER_ROW - i + 3]; } - cols.work_vars.carry_a = array::from_fn(|i| { - array::from_fn(|j| F::from_canonical_u32(SHA256_INVALID_CARRY_A[i][j])) - }); - cols.work_vars.carry_e = array::from_fn(|i| { - array::from_fn(|j| F::from_canonical_u32(SHA256_INVALID_CARRY_E[i][j])) - }); + cols.work_vars.carry_a = + array::from_fn(|i| array::from_fn(|j| F::from_u32(SHA256_INVALID_CARRY_A[i][j]))); + cols.work_vars.carry_e = + array::from_fn(|i| array::from_fn(|j| F::from_u32(SHA256_INVALID_CARRY_E[i][j]))); } /// The following functions do the calculations in native field since they will be called on @@ -394,7 +387,7 @@ impl Sha256FillerHelper { next_cols.work_vars.carry_e[i][j - 1] } - cur_e_limb; - let carry_e = sum * (F::from_canonical_u32(1 << 16).inverse()); + let carry_e = sum * (F::from_u32(1 << 16).inverse()); let sum = t1_limb_sum + t2_limb_sum @@ -404,7 +397,7 @@ impl Sha256FillerHelper { next_cols.work_vars.carry_a[i][j - 1] } - cur_a_limb; - let carry_a = sum * (F::from_canonical_u32(1 << 16).inverse()); + let carry_a = sum * (F::from_u32(1 << 16).inverse()); next_cols.work_vars.carry_e[i][j] = carry_e; next_cols.work_vars.carry_a[i][j] = carry_a; } @@ -457,10 +450,10 @@ impl Sha256FillerHelper { for j in 0..SHA256_WORD_U16S { let carry = next_cols.message_schedule.carry_or_buffer[i][j * 2] + F::TWO * next_cols.message_schedule.carry_or_buffer[i][j * 2 + 1]; - let sum = sig_w_2[j] + w_7[j] - carry * F::from_canonical_u32(1 << 16) - w_cur[j] + let sum = sig_w_2[j] + w_7[j] - carry * F::from_u32(1 << 16) - w_cur[j] + if j > 0 { next_cols.message_schedule.carry_or_buffer[i][j * 2 - 2] - + F::from_canonical_u32(2) + + F::from_u32(2) * next_cols.message_schedule.carry_or_buffer[i][j * 2 - 1] } else { F::ZERO diff --git a/crates/circuits/sha256-air/src/utils.rs b/crates/circuits/sha256-air/src/utils.rs index ba598f2604..8e15fcee18 100644 --- a/crates/circuits/sha256-air/src/utils.rs +++ b/crates/circuits/sha256-air/src/utils.rs @@ -5,7 +5,7 @@ use openvm_circuit_primitives::{ encoder::Encoder, utils::{not, select}, }; -use openvm_stark_backend::{p3_air::AirBuilder, p3_field::FieldAlgebra}; +use openvm_stark_backend::{p3_air::AirBuilder, p3_field::PrimeCharacteristicRing}; use super::{Sha256DigestCols, Sha256RoundCols}; @@ -81,7 +81,7 @@ pub fn get_sha256_num_blocks(len: u32) -> u32 { } /// Convert a u32 into a list of bits in little endian then convert each bit into a field element -pub fn u32_into_bits_field(num: u32) -> [F; SHA256_WORD_BITS] { +pub fn u32_into_bits_field(num: u32) -> [F; SHA256_WORD_BITS] { array::from_fn(|i| F::from_bool((num >> i) & 1 == 1)) } @@ -101,7 +101,7 @@ pub fn limbs_into_u32(limbs: [u32; NUM_LIMBS]) -> u32 { /// Rotates `bits` right by `n` bits, assumes `bits` is in little-endian #[inline] -pub(crate) fn rotr( +pub(crate) fn rotr( bits: &[impl Into + Clone; SHA256_WORD_BITS], n: usize, ) -> [F; SHA256_WORD_BITS] { @@ -110,7 +110,7 @@ pub(crate) fn rotr( /// Shifts `bits` right by `n` bits, assumes `bits` is in little-endian #[inline] -pub(crate) fn shr( +pub(crate) fn shr( bits: &[impl Into + Clone; SHA256_WORD_BITS], n: usize, ) -> [F; SHA256_WORD_BITS] { @@ -125,7 +125,7 @@ pub(crate) fn shr( /// Computes x ^ y ^ z, where x, y, z are assumed to be boolean #[inline] -pub(crate) fn xor_bit( +pub(crate) fn xor_bit( x: impl Into, y: impl Into, z: impl Into, @@ -139,7 +139,7 @@ pub(crate) fn xor_bit( /// Computes x ^ y ^ z, where x, y, z are [SHA256_WORD_BITS] bit numbers #[inline] -pub(crate) fn xor( +pub(crate) fn xor( x: &[impl Into + Clone; SHA256_WORD_BITS], y: &[impl Into + Clone; SHA256_WORD_BITS], z: &[impl Into + Clone; SHA256_WORD_BITS], @@ -155,7 +155,7 @@ pub fn ch(x: u32, y: u32, z: u32) -> u32 { /// Computes Ch(x,y,z), where x, y, z are [SHA256_WORD_BITS] bit numbers #[inline] -pub(crate) fn ch_field( +pub(crate) fn ch_field( x: &[impl Into + Clone; SHA256_WORD_BITS], y: &[impl Into + Clone; SHA256_WORD_BITS], z: &[impl Into + Clone; SHA256_WORD_BITS], @@ -170,7 +170,7 @@ pub fn maj(x: u32, y: u32, z: u32) -> u32 { /// Computes Maj(x,y,z), where x, y, z are [SHA256_WORD_BITS] bit numbers #[inline] -pub(crate) fn maj_field( +pub(crate) fn maj_field( x: &[impl Into + Clone; SHA256_WORD_BITS], y: &[impl Into + Clone; SHA256_WORD_BITS], z: &[impl Into + Clone; SHA256_WORD_BITS], @@ -192,7 +192,7 @@ pub fn big_sig0(x: u32) -> u32 { /// Computes BigSigma0(x), where x is a [SHA256_WORD_BITS] bit number in little-endian #[inline] -pub(crate) fn big_sig0_field( +pub(crate) fn big_sig0_field( x: &[impl Into + Clone; SHA256_WORD_BITS], ) -> [F; SHA256_WORD_BITS] { xor(&rotr::(x, 2), &rotr::(x, 13), &rotr::(x, 22)) @@ -205,7 +205,7 @@ pub fn big_sig1(x: u32) -> u32 { /// Computes BigSigma1(x), where x is a [SHA256_WORD_BITS] bit number in little-endian #[inline] -pub(crate) fn big_sig1_field( +pub(crate) fn big_sig1_field( x: &[impl Into + Clone; SHA256_WORD_BITS], ) -> [F; SHA256_WORD_BITS] { xor(&rotr::(x, 6), &rotr::(x, 11), &rotr::(x, 25)) @@ -218,7 +218,7 @@ pub fn small_sig0(x: u32) -> u32 { /// Computes SmallSigma0(x), where x is a [SHA256_WORD_BITS] bit number in little-endian #[inline] -pub(crate) fn small_sig0_field( +pub(crate) fn small_sig0_field( x: &[impl Into + Clone; SHA256_WORD_BITS], ) -> [F; SHA256_WORD_BITS] { xor(&rotr::(x, 7), &rotr::(x, 18), &shr::(x, 3)) @@ -231,7 +231,7 @@ pub fn small_sig1(x: u32) -> u32 { /// Computes SmallSigma1(x), where x is a [SHA256_WORD_BITS] bit number in little-endian #[inline] -pub(crate) fn small_sig1_field( +pub(crate) fn small_sig1_field( x: &[impl Into + Clone; SHA256_WORD_BITS], ) -> [F; SHA256_WORD_BITS] { xor(&rotr::(x, 17), &rotr::(x, 19), &shr::(x, 10)) @@ -265,7 +265,7 @@ pub fn constraint_word_addition( limb_sum += term[i].clone().into(); } let expected_sum_limb = compose::(&expected_sum[i * 16..(i + 1) * 16], 1) - + carries[i].clone().into() * AB::Expr::from_canonical_u32(1 << 16); + + carries[i].clone().into() * AB::Expr::from_u32(1 << 16); builder.assert_eq(limb_sum, expected_sum_limb); } } diff --git a/crates/cli/Cargo.toml b/crates/cli/Cargo.toml index 433b3fa293..7c865cd73f 100644 --- a/crates/cli/Cargo.toml +++ b/crates/cli/Cargo.toml @@ -56,6 +56,5 @@ parallel = ["openvm-sdk/parallel"] mimalloc = ["openvm-sdk/mimalloc"] jemalloc = ["openvm-sdk/jemalloc"] jemalloc-prof = ["openvm-sdk/jemalloc-prof"] -nightly-features = ["openvm-sdk/nightly-features"] cuda = ["openvm-sdk/cuda"] ci = [] diff --git a/crates/cli/src/input.rs b/crates/cli/src/input.rs index 8fdb9f8c00..b1c18b4afd 100644 --- a/crates/cli/src/input.rs +++ b/crates/cli/src/input.rs @@ -2,7 +2,7 @@ use std::{fs::read, path::PathBuf, str::FromStr}; use eyre::Result; use openvm_sdk::{StdIn, F}; -use openvm_stark_backend::p3_field::FieldAlgebra; +use openvm_stark_backend::p3_field::PrimeCharacteristicRing; /// Input can be either: /// (1) one single hex string @@ -68,7 +68,7 @@ pub fn read_bytes_into_stdin(stdin: &mut StdIn, bytes: &[u8]) -> Result<()> { let mut fields = Vec::with_capacity(data.len() / 4); for chunk in data.chunks_exact(4) { let value = u32::from_le_bytes(chunk.try_into().unwrap()); - fields.push(F::from_canonical_u32(value)); + fields.push(F::from_u32(value)); } stdin.write_field(&fields); Ok(()) diff --git a/crates/continuations/Cargo.toml b/crates/continuations/Cargo.toml index 3d09a6d9b0..ebe53404cd 100644 --- a/crates/continuations/Cargo.toml +++ b/crates/continuations/Cargo.toml @@ -13,6 +13,7 @@ openvm-native-recursion.workspace = true openvm-stark-backend.workspace = true openvm-stark-sdk.workspace = true openvm-circuit.workspace = true +p3-bn254.workspace = true derivative.workspace = true serde.workspace = true diff --git a/crates/continuations/src/static_verifier/mod.rs b/crates/continuations/src/static_verifier/mod.rs index 6e32323fe9..132a73cd7b 100644 --- a/crates/continuations/src/static_verifier/mod.rs +++ b/crates/continuations/src/static_verifier/mod.rs @@ -12,9 +12,8 @@ use openvm_native_recursion::{ witness::Witnessable, }; use openvm_stark_backend::keygen::types::MultiStarkVerifyingKey; -use openvm_stark_sdk::{ - config::FriParameters, openvm_stark_backend::proof::Proof, p3_bn254_fr::Bn254Fr, -}; +use openvm_stark_sdk::{config::FriParameters, openvm_stark_backend::proof::Proof}; +use p3_bn254::Bn254; use crate::{ verifier::{ @@ -30,7 +29,7 @@ use crate::{ /// This trait implementation defines what the public values of the /// final EVM proof will be. pub trait StaticVerifierPvHandler { - /// Returns the number of public values, as [Bn254Fr] field elements. + /// Returns the number of public values, as [Bn254] field elements. fn handle_public_values( &self, builder: &mut Builder, @@ -72,7 +71,7 @@ impl StaticVerifierPvHandler for DefaultStaticVerifierPvHandler { pub struct StaticVerifierConfig { pub root_verifier_fri_params: FriParameters, pub special_air_ids: SpecialAirIds, - pub root_verifier_program_commit: [Bn254Fr; 1], + pub root_verifier_program_commit: [Bn254; 1], } impl StaticVerifierConfig { diff --git a/crates/continuations/src/verifier/common/mod.rs b/crates/continuations/src/verifier/common/mod.rs index edcd66bb11..7d99e0ee4e 100644 --- a/crates/continuations/src/verifier/common/mod.rs +++ b/crates/continuations/src/verifier/common/mod.rs @@ -9,7 +9,7 @@ use openvm_circuit::{ }; use openvm_native_compiler::{ir::Config, prelude::*}; use openvm_native_recursion::{digest::DigestVariable, vars::StarkProofVariable}; -use openvm_stark_sdk::openvm_stark_backend::p3_field::FieldAlgebra; +use openvm_stark_sdk::openvm_stark_backend::p3_field::PrimeCharacteristicRing; use crate::verifier::internal::types::InternalVmVerifierPvs; diff --git a/crates/continuations/src/verifier/leaf/mod.rs b/crates/continuations/src/verifier/leaf/mod.rs index 7ab08cdb0b..ba5b20d290 100644 --- a/crates/continuations/src/verifier/leaf/mod.rs +++ b/crates/continuations/src/verifier/leaf/mod.rs @@ -11,8 +11,8 @@ use openvm_native_recursion::{ use openvm_stark_sdk::{ config::{baby_bear_poseidon2::BabyBearPoseidon2Config, FriParameters}, openvm_stark_backend::{ - keygen::types::MultiStarkVerifyingKey, p3_field::FieldAlgebra, p3_util::log2_strict_usize, - proof::Proof, + keygen::types::MultiStarkVerifyingKey, p3_field::PrimeCharacteristicRing, + p3_util::log2_strict_usize, proof::Proof, }, }; diff --git a/crates/continuations/src/verifier/leaf/vars.rs b/crates/continuations/src/verifier/leaf/vars.rs index 860621f395..88e920bff1 100644 --- a/crates/continuations/src/verifier/leaf/vars.rs +++ b/crates/continuations/src/verifier/leaf/vars.rs @@ -4,7 +4,7 @@ use openvm_native_compiler::prelude::*; use openvm_native_recursion::hints::Hintable; use openvm_stark_sdk::openvm_stark_backend::{ config::{StarkGenericConfig, Val}, - p3_field::FieldAlgebra, + p3_field::PrimeCharacteristicRing, proof::Proof, }; @@ -55,7 +55,7 @@ impl Hintable for UserPublicValuesRootProof { } } fn write(&self) -> Vec::N>> { - let len = <::N>::from_canonical_usize(self.sibling_hashes.len()); + let len = <::N>::from_usize(self.sibling_hashes.len()); let mut stream = len.write(); stream.extend( self.sibling_hashes diff --git a/crates/continuations/src/verifier/root/mod.rs b/crates/continuations/src/verifier/root/mod.rs index b6f2816b1e..b825810f5e 100644 --- a/crates/continuations/src/verifier/root/mod.rs +++ b/crates/continuations/src/verifier/root/mod.rs @@ -9,7 +9,9 @@ use openvm_native_recursion::{ use openvm_stark_backend::proof::Proof; use openvm_stark_sdk::{ config::FriParameters, - openvm_stark_backend::{keygen::types::MultiStarkVerifyingKey, p3_field::FieldAlgebra}, + openvm_stark_backend::{ + keygen::types::MultiStarkVerifyingKey, p3_field::PrimeCharacteristicRing, + }, }; use crate::{ @@ -78,17 +80,15 @@ impl RootVmVerifierConfig { let num_public_values = self.num_user_public_values + DIGEST_SIZE * 2; let num_bytes = num_public_values * BYTE_PER_WORD; // Move heap pointer in order to keep input arguments from address space 2. - let heap_addr: Var = builder.eval(F::from_canonical_u32( - HEAP_START_ADDRESS as u32 + num_bytes as u32, - )); + let heap_addr: Var = + builder.eval(F::from_u32(HEAP_START_ADDRESS as u32 + num_bytes as u32)); builder.store_heap_ptr(Ptr { address: heap_addr }); let expected_pvs: Vec> = (0..num_public_values) .map(|i| { let fs: [Felt<_>; BYTE_PER_WORD] = array::from_fn(|j| { let ptr = Ptr { - address: builder.eval(F::from_canonical_u32( - HEAP_START_ADDRESS as u32 + (i * 4) as u32, - )), + address: builder + .eval(F::from_u32(HEAP_START_ADDRESS as u32 + (i * 4) as u32)), }; let idx = MemIndex { index: RVar::from(j), @@ -101,9 +101,9 @@ impl RootVmVerifierConfig { }); builder.eval( fs[0] - + fs[1] * F::from_canonical_u32(1 << 8) - + fs[2] * F::from_canonical_u32(1 << 16) - + fs[3] * F::from_canonical_u32(1 << 24), + + fs[1] * F::from_u32(1 << 8) + + fs[2] * F::from_u32(1 << 16) + + fs[3] * F::from_u32(1 << 24), ) }) .collect(); diff --git a/crates/continuations/src/verifier/utils.rs b/crates/continuations/src/verifier/utils.rs index 2420e0ea03..041fd3ea18 100644 --- a/crates/continuations/src/verifier/utils.rs +++ b/crates/continuations/src/verifier/utils.rs @@ -4,16 +4,17 @@ use openvm_native_compiler::prelude::*; use openvm_native_recursion::{config::outer::OuterConfig, hints::Hintable, types::InnerConfig}; use openvm_stark_backend::p3_field::PrimeField32; use openvm_stark_sdk::{ - openvm_stark_backend::p3_field::FieldAlgebra, p3_baby_bear::BabyBear, p3_bn254_fr::Bn254Fr, + openvm_stark_backend::p3_field::PrimeCharacteristicRing, p3_baby_bear::BabyBear, }; +use p3_bn254::Bn254; pub fn compress_babybear_var_to_bn254( builder: &mut Builder, - var: [Var; DIGEST_SIZE], -) -> Var { + var: [Var; DIGEST_SIZE], +) -> Var { let mut ret = SymbolicVar::ZERO; - let order = Bn254Fr::from_canonical_u32(BabyBear::ORDER_U32); - let mut base = Bn254Fr::ONE; + let order = Bn254::from_u32(BabyBear::ORDER_U32); + let mut base = Bn254::ONE; var.iter().for_each(|&x| { ret += x * base; base *= order; diff --git a/crates/sdk/Cargo.toml b/crates/sdk/Cargo.toml index bb9e0e4f89..e9afd90137 100644 --- a/crates/sdk/Cargo.toml +++ b/crates/sdk/Cargo.toml @@ -35,6 +35,7 @@ openvm-cuda-backend = { workspace = true, optional = true } openvm-circuit = { workspace = true } openvm-continuations = { workspace = true } openvm = { workspace = true } +p3-bn254 = { workspace = true } alloy-sol-types = { workspace = true, optional = true, features = ["json"] } bitcode = { workspace = true } @@ -120,7 +121,6 @@ parallel = ["openvm-circuit/parallel"] mimalloc = ["openvm-circuit/mimalloc"] jemalloc = ["openvm-circuit/jemalloc"] jemalloc-prof = ["openvm-circuit/jemalloc-prof"] -nightly-features = ["openvm-circuit/nightly-features"] cuda = [ "dep:openvm-cuda-backend", diff --git a/crates/sdk/src/codec.rs b/crates/sdk/src/codec.rs index dd4508b5ef..8fbe88cd5b 100644 --- a/crates/sdk/src/codec.rs +++ b/crates/sdk/src/codec.rs @@ -12,7 +12,7 @@ use openvm_stark_backend::{ config::{Com, PcsProof}, interaction::{fri_log_up::FriLogUpPartialProof, RapPhaseSeqKind}, p3_field::{ - extension::BinomialExtensionField, FieldAlgebra, FieldExtensionAlgebra, PrimeField32, + extension::BinomialExtensionField, BasedVectorSpace, PrimeCharacteristicRing, PrimeField32, }, proof::{AdjacentOpenedValues, AirProofData, Commitments, OpenedValues, OpeningProof, Proof}, }; @@ -203,16 +203,18 @@ impl Encode for InnerFriProof { /// ``` /// pub struct FriProof> { /// pub commit_phase_commits: Vec, + /// pub commit_pow_witnesses: Vec, /// pub query_proofs: Vec>>>, /// pub final_poly: Vec, - /// pub pow_witness: F, + /// pub query_pow_witness: F, /// } /// ``` fn encode(&self, writer: &mut W) -> Result<()> { encode_commitments(&self.commit_phase_commits, writer)?; + encode_slice(&self.commit_pow_witnesses, writer)?; encode_slice(&self.query_proofs, writer)?; encode_slice(&self.final_poly, writer)?; - self.pow_witness.encode(writer)?; + self.query_pow_witness.encode(writer)?; Ok(()) } } @@ -271,7 +273,7 @@ impl Encode for Option> { impl Encode for Challenge { fn encode(&self, writer: &mut W) -> Result<()> { - let base_slice: &[F] = self.as_base_slice(); + let base_slice: &[F] = self.as_basis_coefficients_slice(); // Fixed length slice, so don't encode length for val in base_slice { val.encode(writer)?; @@ -513,15 +515,17 @@ impl Decode for AirProofData { impl Decode for InnerFriProof { fn decode(reader: &mut R) -> Result { let commit_phase_commits = decode_commitments(reader)?; + let commit_pow_witnesses = decode_vec(reader)?; let query_proofs = decode_vec(reader)?; let final_poly = decode_vec(reader)?; - let pow_witness = F::decode(reader)?; + let query_pow_witness = F::decode(reader)?; Ok(InnerFriProof { commit_phase_commits, + commit_pow_witnesses, query_proofs, final_poly, - pow_witness, + query_pow_witness, }) } } @@ -578,7 +582,7 @@ impl Decode for Option> { } // Reconstruct the field element from the u32 value - let logup_pow_witness = F::from_canonical_u32(value); + let logup_pow_witness = F::from_u32(value); Ok(Some(FriLogUpPartialProof { logup_pow_witness })) } } @@ -592,7 +596,7 @@ impl Decode for Challenge { } // Construct the extension field from base elements - Ok(Challenge::from_base_slice(&base_elements)) + Ok(Challenge::from_basis_coefficients_slice(&base_elements).unwrap()) } } @@ -624,7 +628,7 @@ impl Decode for F { reader.read_exact(&mut bytes)?; let value = u32::from_le_bytes(bytes); - Ok(F::from_canonical_u32(value)) + Ok(F::from_u32(value)) } } diff --git a/crates/sdk/src/commit.rs b/crates/sdk/src/commit.rs index e5950c5b17..36debf5251 100644 --- a/crates/sdk/src/commit.rs +++ b/crates/sdk/src/commit.rs @@ -7,15 +7,15 @@ use openvm_native_compiler::ir::DIGEST_SIZE; use openvm_stark_backend::{ config::{Com, StarkGenericConfig, Val}, engine::StarkEngine, - p3_field::PrimeField32, + p3_field::{PrimeField, PrimeField32}, }; use openvm_stark_sdk::{ config::{baby_bear_poseidon2::BabyBearPoseidon2Engine, FriParameters}, engine::StarkFriEngine, - openvm_stark_backend::p3_field::FieldAlgebra, + openvm_stark_backend::p3_field::PrimeCharacteristicRing, p3_baby_bear::BabyBear, - p3_bn254_fr::Bn254Fr, }; +use p3_bn254::Bn254; use serde::{Deserialize, Serialize}; use serde_with::serde_as; use tracing::instrument; @@ -23,7 +23,7 @@ use tracing::instrument; use crate::{types::BN254_BYTES, F, SC}; /// Wrapper for an array of big-endian bytes, representing an unsigned big integer. Each commit can -/// be converted to a Bn254Fr using the trivial identification as natural numbers or into a `u32` +/// be converted to a Bn254 using the trivial identification as natural numbers or into a `u32` /// digest by decomposing the big integer base-`F::MODULUS`. #[serde_as] #[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] @@ -38,7 +38,7 @@ impl CommitBytes { &self.0 } - pub fn to_bn254(&self) -> Bn254Fr { + pub fn to_bn254(&self) -> Bn254 { bytes_to_bn254(&self.0) } @@ -46,7 +46,7 @@ impl CommitBytes { bytes_to_u32_digest(&self.0) } - pub fn from_bn254(bn254: Bn254Fr) -> Self { + pub fn from_bn254(bn254: Bn254) -> Self { Self(bn254_to_bytes(bn254)) } @@ -132,31 +132,33 @@ pub fn commit_app_exe( Arc::new(VmCommittedExe::::commit(exe, app_engine.config().pcs())) } -pub(crate) fn babybear_digest_to_bn254(digest: &[F; DIGEST_SIZE]) -> Bn254Fr { - let mut ret = Bn254Fr::ZERO; - let order = Bn254Fr::from_canonical_u32(BabyBear::ORDER_U32); - let mut base = Bn254Fr::ONE; +pub(crate) fn babybear_digest_to_bn254(digest: &[F; DIGEST_SIZE]) -> Bn254 { + let mut ret = Bn254::ZERO; + let order = Bn254::from_u32(BabyBear::ORDER_U32); + let mut base = Bn254::ONE; digest.iter().for_each(|&x| { - ret += base * Bn254Fr::from_canonical_u32(x.as_canonical_u32()); + ret += base * Bn254::from_u32(x.as_canonical_u32()); base *= order; }); ret } -fn bytes_to_bn254(bytes: &[u8; BN254_BYTES]) -> Bn254Fr { - let order = Bn254Fr::from_canonical_u32(1 << 8); - let mut ret = Bn254Fr::ZERO; - let mut base = Bn254Fr::ONE; +fn bytes_to_bn254(bytes: &[u8; BN254_BYTES]) -> Bn254 { + let order = Bn254::from_u32(1 << 8); + let mut ret = Bn254::ZERO; + let mut base = Bn254::ONE; for byte in bytes.iter().rev() { - ret += base * Bn254Fr::from_canonical_u8(*byte); + ret += base * Bn254::from_u8(*byte); base *= order; } ret } -fn bn254_to_bytes(bn254: Bn254Fr) -> [u8; BN254_BYTES] { - let mut ret = bn254.value.to_bytes(); - ret.reverse(); +fn bn254_to_bytes(bn254: Bn254) -> [u8; BN254_BYTES] { + let mut ret = [0u8; BN254_BYTES]; + let bytes = bn254.as_canonical_biguint().to_bytes_be(); + let start = BN254_BYTES - bytes.len(); + ret[start..].copy_from_slice(&bytes); ret } @@ -180,5 +182,5 @@ fn bytes_to_u32_digest(bytes: &[u8; BN254_BYTES]) -> [u32; DIGEST_SIZE] { } fn u32_digest_to_bytes(digest: &[u32; DIGEST_SIZE]) -> [u8; BN254_BYTES] { - bn254_to_bytes(babybear_digest_to_bn254(&digest.map(F::from_canonical_u32))) + bn254_to_bytes(babybear_digest_to_bn254(&digest.map(F::from_u32))) } diff --git a/crates/sdk/src/config/global.rs b/crates/sdk/src/config/global.rs index 9699b1ed34..b8e7e38ab2 100644 --- a/crates/sdk/src/config/global.rs +++ b/crates/sdk/src/config/global.rs @@ -38,7 +38,7 @@ use openvm_sha256_transpiler::Sha256TranspilerExtension; use openvm_stark_backend::{ config::{StarkGenericConfig, Val}, engine::StarkEngine, - p3_field::{Field, PrimeField32}, + p3_field::Field, prover::cpu::{CpuBackend, CpuDevice}, }; use openvm_transpiler::transpiler::Transpiler; @@ -365,7 +365,7 @@ impl VmBuilder for SdkVmCpuBuilder where SC: StarkGenericConfig, E: StarkEngine, PD = CpuDevice>, - Val: PrimeField32, + Val: VmField, { type VmConfig = SdkVmConfig; type SystemChipInventory = SystemChipInventory; diff --git a/crates/sdk/src/keygen/asm.rs b/crates/sdk/src/keygen/asm.rs index 5c8779abbe..b5711468d8 100644 --- a/crates/sdk/src/keygen/asm.rs +++ b/crates/sdk/src/keygen/asm.rs @@ -5,7 +5,7 @@ use openvm_circuit::arch::instructions::{ }; use openvm_continuations::F; use openvm_native_compiler::{asm::A0, conversion::AS, NativeJalOpcode}; -use openvm_stark_backend::p3_field::{FieldAlgebra, PrimeField32}; +use openvm_stark_backend::p3_field::{PrimeCharacteristicRing, PrimeField32}; use rrs_lib::instruction_formats::IType; const OPCODE: u32 = 0x0b; @@ -61,14 +61,14 @@ fn handle_pc_diff(program: &mut Program) -> usize { pc_diff += LONG_FORM_NATIVE_INSTRUCTION_WIDTH - 1; let jal = Instruction:: { opcode: NativeJalOpcode::JAL.global_opcode(), - a: F::from_canonical_usize(A0 as usize), // A0 + a: F::from_usize(A0 as usize), // A0 // +1 means the next instruction after the gap - b: F::from_canonical_usize(PC_STEP * (pc_diff + 1)), - c: F::from_canonical_usize(0), - d: F::from_canonical_u32(AS::Native as u32), - e: F::from_canonical_usize(0), - f: F::from_canonical_usize(0), - g: F::from_canonical_usize(0), + b: F::from_usize(PC_STEP * (pc_diff + 1)), + c: F::from_usize(0), + d: F::from_u32(AS::Native as u32), + e: F::from_usize(0), + f: F::from_usize(0), + g: F::from_usize(0), }; program.push_instruction(jal); pc_diff diff --git a/crates/sdk/src/keygen/dummy.rs b/crates/sdk/src/keygen/dummy.rs index 4a9b20e4db..677a4b6ec0 100644 --- a/crates/sdk/src/keygen/dummy.rs +++ b/crates/sdk/src/keygen/dummy.rs @@ -37,7 +37,7 @@ use openvm_stark_sdk::{ FriParameters, }, engine::StarkFriEngine, - openvm_stark_backend::{p3_field::FieldAlgebra, proof::Proof}, + openvm_stark_backend::{p3_field::PrimeCharacteristicRing, proof::Proof}, }; use crate::{ diff --git a/crates/sdk/src/keygen/mod.rs b/crates/sdk/src/keygen/mod.rs index ddf0c2b570..f3f0ed4cc9 100644 --- a/crates/sdk/src/keygen/mod.rs +++ b/crates/sdk/src/keygen/mod.rs @@ -14,7 +14,7 @@ use openvm_native_compiler::ir::DIGEST_SIZE; use openvm_stark_backend::{ config::Val, engine::StarkEngine, - p3_field::{FieldExtensionAlgebra, PrimeField32, TwoAdicField}, + p3_field::{BasedVectorSpace, PrimeField32, TwoAdicField}, }; use openvm_stark_sdk::{ config::{ @@ -246,7 +246,7 @@ fn check_recursive_verifier_size( after_challenge_rounds.resize(widths.len(), (0, 0, 2)); } for (i, &width) in widths.iter().enumerate() { - after_challenge_rounds[i].0 += SC::Challenge::D * width; + after_challenge_rounds[i].0 += SC::Challenge::DIMENSION * width; after_challenge_rounds[i].1 += 1; } } @@ -255,7 +255,7 @@ fn check_recursive_verifier_size( let quotient_round = ( vk.per_air .iter() - .map(|vk| SC::Challenge::D * vk.quotient_degree as usize) + .map(|vk| SC::Challenge::DIMENSION * vk.quotient_degree as usize) .sum(), vk.per_air.len(), 1, diff --git a/crates/sdk/src/keygen/static_verifier.rs b/crates/sdk/src/keygen/static_verifier.rs index 51f86d059e..bd1fb5ff4e 100644 --- a/crates/sdk/src/keygen/static_verifier.rs +++ b/crates/sdk/src/keygen/static_verifier.rs @@ -10,7 +10,7 @@ use openvm_native_recursion::{ hints::Hintable, witness::Witnessable, }; -use openvm_stark_sdk::openvm_stark_backend::{p3_field::FieldAlgebra, proof::Proof}; +use openvm_stark_sdk::openvm_stark_backend::{p3_field::PrimeCharacteristicRing, proof::Proof}; use crate::{keygen::RootVerifierProvingKey, prover::RootVerifierLocalProver, RootSC, F, SC}; diff --git a/crates/sdk/src/stdin.rs b/crates/sdk/src/stdin.rs index db5bfbb52e..b552ef8f38 100644 --- a/crates/sdk/src/stdin.rs +++ b/crates/sdk/src/stdin.rs @@ -31,7 +31,7 @@ impl StdIn { } pub fn write_bytes(&mut self, data: &[u8]) { - let field_data = data.iter().map(|b| F::from_canonical_u8(*b)).collect(); + let field_data = data.iter().map(|b| F::from_u8(*b)).collect(); self.buffer.push_back(field_data); } diff --git a/crates/sdk/src/types.rs b/crates/sdk/src/types.rs index 5ec45eff40..b6c8c161c1 100644 --- a/crates/sdk/src/types.rs +++ b/crates/sdk/src/types.rs @@ -23,11 +23,11 @@ use crate::{ OPENVM_VERSION, }; -/// Number of bytes in a Bn254Fr. +/// Number of bytes in a Bn254. pub(crate) const BN254_BYTES: usize = 32; -/// Number of Bn254Fr in `accumulator` field. +/// Number of Bn254 in `accumulator` field. pub const NUM_BN254_ACCUMULATOR: usize = 12; -/// Number of Bn254Fr in `proof` field for a circuit with only 1 advice column. +/// Number of Bn254 in `proof` field for a circuit with only 1 advice column. #[cfg(feature = "evm-prove")] const NUM_BN254_PROOF: usize = 43; @@ -66,7 +66,7 @@ pub struct ProofData { /// KZG accumulator. pub accumulator: Vec, #[serde_as(as = "serde_with::hex::Hex")] - /// Bn254Fr proof in little-endian bytes. The circuit only has 1 advice column, so the proof is + /// Bn254 proof in little-endian bytes. The circuit only has 1 advice column, so the proof is /// of length `NUM_BN254_PROOF * BN254_BYTES`. pub proof: Vec, } @@ -79,7 +79,7 @@ pub struct EvmProof { /// versions. pub version: String, #[serde(flatten)] - /// Bn254Fr public value app commits. + /// Bn254 public value app commits. pub app_commit: AppExecutionCommit, #[serde_as(as = "serde_with::hex::Hex")] /// User public values packed into bytes. diff --git a/crates/sdk/tests/integration_test.rs b/crates/sdk/tests/integration_test.rs index 734024325f..e826c8251d 100644 --- a/crates/sdk/tests/integration_test.rs +++ b/crates/sdk/tests/integration_test.rs @@ -32,7 +32,7 @@ use openvm_stark_sdk::{ setup_tracing, FriParameters, }, engine::StarkFriEngine, - openvm_stark_backend::p3_field::FieldAlgebra, + openvm_stark_backend::p3_field::PrimeCharacteristicRing, p3_baby_bear::BabyBear, }; #[cfg(feature = "evm-verify")] @@ -50,7 +50,7 @@ use { vars::StarkProofVariable, }, openvm_sdk::types::{EvmHalo2Verifier, EvmProof}, - openvm_stark_sdk::p3_bn254_fr::Bn254Fr, + openvm_stark_sdk::p3_bn254::Bn254, snark_verifier_sdk::evm::evm_verify, }; @@ -187,10 +187,7 @@ fn test_public_values_and_leaf_verification() -> eyre::Result<()> { assert_eq!(leaf_vm_pvs.app_commit, expected_app_commit); assert_eq!(leaf_vm_pvs.connector.is_terminate, F::ZERO); - assert_eq!( - leaf_vm_pvs.connector.initial_pc, - F::from_canonical_u32(pc_start) - ); + assert_eq!(leaf_vm_pvs.connector.initial_pc, F::from_u32(pc_start)); ( leaf_vm_pvs.connector.final_pc, leaf_vm_pvs.memory.final_root, @@ -334,8 +331,8 @@ fn test_static_verifier_custom_pv_handler() -> eyre::Result<()> { // Define custom public values handler and implement StaticVerifierPvHandler trait on it pub struct CustomPvHandler { - pub exe_commit: Bn254Fr, - pub leaf_verifier_commit: Bn254Fr, + pub exe_commit: Bn254, + pub leaf_verifier_commit: Bn254, } impl StaticVerifierPvHandler for CustomPvHandler { @@ -361,8 +358,8 @@ fn test_static_verifier_custom_pv_handler() -> eyre::Result<()> { println!("self.exe_commit: {:?}", self.exe_commit); println!("self.leaf_verifier_commit: {:?}", self.leaf_verifier_commit); - let expected_exe_commit: Var = builder.constant(self.exe_commit); - let expected_leaf_commit: Var = builder.constant(self.leaf_verifier_commit); + let expected_exe_commit: Var = builder.constant(self.exe_commit); + let expected_leaf_commit: Var = builder.constant(self.leaf_verifier_commit); builder.assert_var_eq(exe_commit, expected_exe_commit); builder.assert_var_eq(leaf_commit, expected_leaf_commit); diff --git a/crates/toolchain/instructions/benches/program_serde.rs b/crates/toolchain/instructions/benches/program_serde.rs index 240d184ab4..0b7f0d15a3 100644 --- a/crates/toolchain/instructions/benches/program_serde.rs +++ b/crates/toolchain/instructions/benches/program_serde.rs @@ -9,14 +9,14 @@ type F = BabyBear; fn random_instruction(rng: &mut impl Rng) -> Instruction { Instruction::new( - VmOpcode::from_usize(rng.gen()), - rng.gen(), - rng.gen(), - rng.gen(), - rng.gen(), - rng.gen(), - rng.gen(), - rng.gen(), + VmOpcode::from_usize(rng.random::() as usize), + rng.random(), + rng.random(), + rng.random(), + rng.random(), + rng.random(), + rng.random(), + rng.random(), ) } diff --git a/crates/toolchain/instructions/src/instruction.rs b/crates/toolchain/instructions/src/instruction.rs index 4b0f31e271..c1561a6aba 100644 --- a/crates/toolchain/instructions/src/instruction.rs +++ b/crates/toolchain/instructions/src/instruction.rs @@ -37,7 +37,7 @@ impl Instruction { } pub fn from_usize(opcode: VmOpcode, operands: [usize; N]) -> Self { - let mut operands = operands.map(F::from_canonical_usize).to_vec(); + let mut operands = operands.map(F::from_usize).to_vec(); operands.resize(NUM_OPERANDS, F::ZERO); Self { opcode, @@ -79,7 +79,7 @@ impl Instruction { opcode: SystemOpcode::PHANTOM.global_opcode(), a, b, - c: F::from_canonical_u32((discriminant.0 as u32) | ((c_upper as u32) << 16)), + c: F::from_u32((discriminant.0 as u32) | ((c_upper as u32) << 16)), ..Default::default() } } @@ -87,7 +87,7 @@ impl Instruction { pub fn debug(discriminant: PhantomDiscriminant) -> Self { Self { opcode: SystemOpcode::PHANTOM.global_opcode(), - c: F::from_canonical_u32(discriminant.0 as u32), + c: F::from_u32(discriminant.0 as u32), ..Default::default() } } diff --git a/crates/toolchain/instructions/src/lib.rs b/crates/toolchain/instructions/src/lib.rs index 76e7200cbb..02d830baad 100644 --- a/crates/toolchain/instructions/src/lib.rs +++ b/crates/toolchain/instructions/src/lib.rs @@ -59,7 +59,7 @@ impl VmOpcode { /// Convert the VmOpcode into a field element pub fn to_field(&self) -> F { - F::from_canonical_usize(self.as_usize()) + F::from_usize(self.as_usize()) } } diff --git a/crates/toolchain/instructions/src/utils.rs b/crates/toolchain/instructions/src/utils.rs index 93a3896ae2..4f025bb176 100644 --- a/crates/toolchain/instructions/src/utils.rs +++ b/crates/toolchain/instructions/src/utils.rs @@ -15,7 +15,7 @@ pub fn parse_biguint_auto(s: &str) -> Option { pub fn isize_to_field(value: isize) -> F { if value < 0 { - return F::NEG_ONE * F::from_canonical_usize(value.unsigned_abs()); + return F::NEG_ONE * F::from_usize(value.unsigned_abs()); } - F::from_canonical_usize(value as usize) + F::from_usize(value as usize) } diff --git a/crates/toolchain/transpiler/src/util.rs b/crates/toolchain/transpiler/src/util.rs index c5711653ff..13aca2f44c 100644 --- a/crates/toolchain/transpiler/src/util.rs +++ b/crates/toolchain/transpiler/src/util.rs @@ -29,11 +29,11 @@ pub fn from_r_type( } Instruction::new( VmOpcode::from_usize(opcode), - F::from_canonical_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rd), - F::from_canonical_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rs1), - F::from_canonical_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rs2), - F::ONE, // rd and rs1 are registers - F::from_canonical_usize(e_as), // rs2 can be mem (eg modular arith) + F::from_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rd), + F::from_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rs1), + F::from_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rs2), + F::ONE, // rd and rs1 are registers + F::from_usize(e_as), // rs2 can be mem (eg modular arith) F::ZERO, F::ZERO, ) @@ -47,9 +47,9 @@ pub fn from_i_type(opcode: usize, dec_insn: &IType) -> Instruct } Instruction::new( VmOpcode::from_usize(opcode), - F::from_canonical_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rd), - F::from_canonical_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rs1), - F::from_canonical_u32(i12_to_u24(dec_insn.imm)), + F::from_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rd), + F::from_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rs1), + F::from_u32(i12_to_u24(dec_insn.imm)), F::ONE, // rd and rs1 are registers F::ZERO, // rs2 is an immediate F::ZERO, @@ -61,9 +61,9 @@ pub fn from_i_type(opcode: usize, dec_insn: &IType) -> Instruct pub fn from_load(opcode: usize, dec_insn: &IType) -> Instruction { Instruction::new( VmOpcode::from_usize(opcode), - F::from_canonical_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rd), - F::from_canonical_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rs1), - F::from_canonical_u32((dec_insn.imm as u32) & 0xffff), + F::from_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rd), + F::from_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rs1), + F::from_u32((dec_insn.imm as u32) & 0xffff), F::ONE, // rd is a register F::TWO, // we load from memory F::from_bool(dec_insn.rd != 0), // we may need to use this flag in the operation @@ -79,9 +79,9 @@ pub fn from_i_type_shamt(opcode: usize, dec_insn: &ITypeShamt) } Instruction::new( VmOpcode::from_usize(opcode), - F::from_canonical_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rd), - F::from_canonical_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rs1), - F::from_canonical_u32(dec_insn.shamt), + F::from_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rd), + F::from_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rs1), + F::from_u32(dec_insn.shamt), F::ONE, // rd and rs1 are registers F::ZERO, // rs2 is an immediate F::ZERO, @@ -93,9 +93,9 @@ pub fn from_i_type_shamt(opcode: usize, dec_insn: &ITypeShamt) pub fn from_s_type(opcode: usize, dec_insn: &SType) -> Instruction { Instruction::new( VmOpcode::from_usize(opcode), - F::from_canonical_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rs2), - F::from_canonical_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rs1), - F::from_canonical_u32((dec_insn.imm as u32) & 0xffff), + F::from_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rs2), + F::from_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rs1), + F::from_u32((dec_insn.imm as u32) & 0xffff), F::ONE, F::TWO, F::ONE, @@ -107,8 +107,8 @@ pub fn from_s_type(opcode: usize, dec_insn: &SType) -> Instruct pub fn from_b_type(opcode: usize, dec_insn: &BType) -> Instruction { Instruction::new( VmOpcode::from_usize(opcode), - F::from_canonical_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rs1), - F::from_canonical_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rs2), + F::from_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rs1), + F::from_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rs2), isize_to_field(dec_insn.imm as isize), F::ONE, // rs1 is a register F::ONE, // rs2 is a register @@ -121,7 +121,7 @@ pub fn from_b_type(opcode: usize, dec_insn: &BType) -> Instruct pub fn from_j_type(opcode: usize, dec_insn: &JType) -> Instruction { Instruction::new( VmOpcode::from_usize(opcode), - F::from_canonical_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rd), + F::from_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rd), F::ZERO, isize_to_field(dec_insn.imm as isize), F::ONE, // rd is a register @@ -138,9 +138,9 @@ pub fn from_u_type(opcode: usize, dec_insn: &UType) -> Instruct } Instruction::new( VmOpcode::from_usize(opcode), - F::from_canonical_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rd), + F::from_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rd), F::ZERO, - F::from_canonical_u32((dec_insn.imm as u32 >> 12) & 0xfffff), + F::from_u32((dec_insn.imm as u32 >> 12) & 0xfffff), F::ONE, // rd is a register F::ZERO, F::ZERO, diff --git a/crates/vm/Cargo.toml b/crates/vm/Cargo.toml index 55eba48863..99ef3fb5bf 100644 --- a/crates/vm/Cargo.toml +++ b/crates/vm/Cargo.toml @@ -97,7 +97,6 @@ unprotected = [] mimalloc = ["openvm-stark-backend/mimalloc"] jemalloc = ["openvm-stark-backend/jemalloc"] jemalloc-prof = ["openvm-stark-backend/jemalloc-prof"] -nightly-features = ["openvm-stark-sdk?/nightly-features"] cuda = [ "dep:openvm-stark-sdk", # for BabyBearPoseidon2Config "openvm-circuit-primitives/cuda", diff --git a/crates/vm/derive/src/lib.rs b/crates/vm/derive/src/lib.rs index 4b3f78c673..c6a117ce8b 100644 --- a/crates/vm/derive/src/lib.rs +++ b/crates/vm/derive/src/lib.rs @@ -902,6 +902,7 @@ fn generate_config_traits_impl(name: &Ident, inner: &DataStruct) -> syn::Result< let mut create_airs = Vec::new(); let mut execution_where_predicates: Vec = Vec::new(); let mut circuit_where_predicates: Vec = Vec::new(); + execution_where_predicates.push(parse_quote! { F: ::openvm_circuit::arch::VmField }); let source_field_ty = source_field.ty.clone(); @@ -952,13 +953,13 @@ fn generate_config_traits_impl(name: &Ident, inner: &DataStruct) -> syn::Result< ::openvm_circuit::derive::PreflightExecutor, )] #[cfg_attr(feature = "aot", derive(::openvm_circuit::derive::AotExecutor, ::openvm_circuit::derive::AotMeteredExecutor))] - pub enum #executor_type { + pub enum #executor_type #execution_where_clause { #[any_enum] #source_name_upper(#source_executor_type), #(#executor_enum_fields)* } - impl ::openvm_circuit::arch::VmExecutionConfig for #name #execution_where_clause { + impl ::openvm_circuit::arch::VmExecutionConfig for #name #execution_where_clause { type Executor = #executor_type; fn create_executors( diff --git a/crates/vm/src/arch/config.rs b/crates/vm/src/arch/config.rs index 3ffbfb74e0..b640ef5c1e 100644 --- a/crates/vm/src/arch/config.rs +++ b/crates/vm/src/arch/config.rs @@ -471,9 +471,9 @@ impl AddressSpaceHostLayout for MemoryCellType { unsafe fn to_field(&self, value: &[u8]) -> F { match self { Self::Null => unreachable!(), - Self::U8 => F::from_canonical_u8(*value.get_unchecked(0)), - Self::U16 => F::from_canonical_u16(core::ptr::read(value.as_ptr() as *const u16)), - Self::U32 => F::from_canonical_u32(core::ptr::read(value.as_ptr() as *const u32)), + Self::U8 => F::from_u8(*value.get_unchecked(0)), + Self::U16 => F::from_u16(core::ptr::read(value.as_ptr() as *const u16)), + Self::U32 => F::from_u32(core::ptr::read(value.as_ptr() as *const u32)), Self::Native { .. } => core::ptr::read(value.as_ptr() as *const F), } } diff --git a/crates/vm/src/arch/execution.rs b/crates/vm/src/arch/execution.rs index 234dfbd5b9..44e1f94275 100644 --- a/crates/vm/src/arch/execution.rs +++ b/crates/vm/src/arch/execution.rs @@ -5,7 +5,7 @@ use openvm_instructions::{ }; use openvm_stark_backend::{ interaction::{BusIndex, InteractionBuilder, PermutationCheckBus}, - p3_field::FieldAlgebra, + p3_field::PrimeCharacteristicRing, }; use rand::rngs::StdRng; use serde::{Deserialize, Serialize}; @@ -448,7 +448,7 @@ impl ExecutionBridge { timestamp_change: impl Into, ) -> ExecutionBridgeInteractor { let to_state = ExecutionState { - pc: from_state.pc.clone().into() + AB::Expr::from_canonical_u32(DEFAULT_PC_STEP), + pc: from_state.pc.clone().into() + AB::Expr::from_u32(DEFAULT_PC_STEP), timestamp: from_state.timestamp.clone().into() + timestamp_change.into(), }; self.execute(opcode, operands, from_state, to_state) @@ -491,10 +491,10 @@ impl ExecutionBridgeInteractor { } } -impl From<(u32, Option)> for PcIncOrSet { +impl From<(u32, Option)> for PcIncOrSet { fn from((pc_inc, to_pc): (u32, Option)) -> Self { match to_pc { - None => PcIncOrSet::Inc(T::from_canonical_u32(pc_inc)), + None => PcIncOrSet::Inc(T::from_u32(pc_inc)), Some(to_pc) => PcIncOrSet::Set(to_pc), } } diff --git a/crates/vm/src/arch/hasher/poseidon2.rs b/crates/vm/src/arch/hasher/poseidon2.rs index fd04f8c693..9ce808cfd7 100644 --- a/crates/vm/src/arch/hasher/poseidon2.rs +++ b/crates/vm/src/arch/hasher/poseidon2.rs @@ -4,7 +4,7 @@ use std::{ }; use openvm_poseidon2_air::p3_symmetric::Permutation; -use openvm_stark_backend::p3_field::{FieldAlgebra, PrimeField32}; +use openvm_stark_backend::p3_field::{PrimeCharacteristicRing, PrimeField32}; use p3_baby_bear::{BabyBear, Poseidon2BabyBear}; use crate::{ @@ -33,12 +33,12 @@ impl Hasher<{ CHUNK }, F> for Poseidon2Hasher { fn compress(&self, lhs: &[F; CHUNK], rhs: &[F; CHUNK]) -> [F; CHUNK] { let mut state = from_fn(|i| { if i < CHUNK { - BabyBear::from_canonical_u32(lhs[i].as_canonical_u32()) + BabyBear::from_u32(lhs[i].as_canonical_u32()) } else { - BabyBear::from_canonical_u32(rhs[i - CHUNK].as_canonical_u32()) + BabyBear::from_u32(rhs[i - CHUNK].as_canonical_u32()) } }); self.poseidon2.permute_mut(&mut state); - array::from_fn(|i| F::from_canonical_u32(state[i].as_canonical_u32())) + array::from_fn(|i| F::from_u32(state[i].as_canonical_u32())) } } diff --git a/crates/vm/src/arch/integration_api.rs b/crates/vm/src/arch/integration_api.rs index 1105cb40a8..df8b4f522c 100644 --- a/crates/vm/src/arch/integration_api.rs +++ b/crates/vm/src/arch/integration_api.rs @@ -5,7 +5,7 @@ use openvm_instructions::{instruction::Instruction, LocalOpcode}; use openvm_stark_backend::{ config::{StarkGenericConfig, Val}, p3_air::{Air, AirBuilder, BaseAir}, - p3_field::FieldAlgebra, + p3_field::PrimeCharacteristicRing, p3_matrix::{dense::RowMajorMatrix, Matrix}, p3_maybe_rayon::prelude::*, prover::{cpu::CpuBackend, types::AirProvingContext}, @@ -71,7 +71,7 @@ where fn start_offset(&self) -> usize; fn start_offset_expr(&self) -> AB::Expr { - AB::Expr::from_canonical_usize(self.start_offset()) + AB::Expr::from_usize(self.start_offset()) } fn expr_to_global_expr(&self, local_expr: impl Into) -> AB::Expr { @@ -79,7 +79,7 @@ where } fn opcode_to_global_expr(&self, local_opcode: impl LocalOpcode) -> AB::Expr { - self.expr_to_global_expr(AB::Expr::from_canonical_usize(local_opcode.local_usize())) + self.expr_to_global_expr(AB::Expr::from_usize(local_opcode.local_usize())) } } @@ -251,7 +251,7 @@ where { fn eval(&self, builder: &mut AB) { let main = builder.main(); - let local = main.row_slice(0); + let local = main.row_slice(0).expect("window should have two elements"); let local: &[AB::Var] = (*local).borrow(); let (local_adapter, local_core) = local.split_at(self.adapter.width()); diff --git a/crates/vm/src/arch/testing/cpu.rs b/crates/vm/src/arch/testing/cpu.rs index 105962bc11..ca5ea1a473 100644 --- a/crates/vm/src/arch/testing/cpu.rs +++ b/crates/vm/src/arch/testing/cpu.rs @@ -9,7 +9,6 @@ use openvm_stark_backend::{ config::{StarkGenericConfig, Val}, engine::VerificationData, interaction::PermutationCheckBus, - p3_field::{Field, PrimeField32}, p3_matrix::dense::RowMajorMatrix, p3_util::log2_strict_usize, prover::{ @@ -41,7 +40,7 @@ use crate::{ MEMORY_MERKLE_BUS, POSEIDON2_DIRECT_BUS, RANGE_CHECKER_BUS, READ_INSTRUCTION_BUS, }, vm_poseidon2_config, Arena, ExecutionBridge, ExecutionBus, ExecutionState, - MatrixRecordArena, MemoryConfig, PreflightExecutor, Streams, VmStateMut, + MatrixRecordArena, MemoryConfig, PreflightExecutor, Streams, VmField, VmStateMut, }, system::{ memory::{ @@ -56,7 +55,7 @@ use crate::{ }, }; -pub struct VmChipTestBuilder { +pub struct VmChipTestBuilder { pub memory: MemoryTester, pub streams: Streams, pub rng: StdRng, @@ -70,7 +69,7 @@ pub struct VmChipTestBuilder { impl TestBuilder for VmChipTestBuilder where - F: PrimeField32, + F: VmField, { fn execute(&mut self, executor: &mut E, arena: &mut RA, instruction: &Instruction) where @@ -135,7 +134,7 @@ where value: [usize; N], ) { self.memory - .write(address_space, pointer, value.map(F::from_canonical_usize)); + .write(address_space, pointer, value.map(F::from_usize)); } fn write_cell(&mut self, address_space: usize, pointer: usize, value: F) { @@ -183,7 +182,7 @@ where ) -> (usize, usize) { let register = self.get_default_register(reg_increment); let pointer = self.get_default_pointer(pointer_increment); - self.write(1, register, pointer.to_le_bytes().map(F::from_canonical_u8)); + self.write(1, register, pointer.to_le_bytes().map(F::from_u8)); (register, pointer) } @@ -200,7 +199,7 @@ where } } -impl VmChipTestBuilder { +impl VmChipTestBuilder { pub fn new( controller: MemoryController, memory: TracingMemory, @@ -238,11 +237,7 @@ impl VmChipTestBuilder { pointer: usize, writes: Vec<[F; NUM_LIMBS]>, ) { - self.write( - 1usize, - register, - pointer.to_le_bytes().map(F::from_canonical_u8), - ); + self.write(1usize, register, pointer.to_le_bytes().map(F::from_u8)); if NUM_LIMBS.is_power_of_two() { for (i, &write) in writes.iter().enumerate() { self.write(2usize, pointer + i * NUM_LIMBS, write); @@ -318,7 +313,7 @@ impl VmChipTestBuilder { } } -impl VmChipTestBuilder { +impl VmChipTestBuilder { pub fn default_persistent() -> Self { let mut mem_config = MemoryConfig::default(); mem_config.addr_spaces[RV32_REGISTER_AS as usize].num_cells = 1 << 29; @@ -396,7 +391,7 @@ impl VmChipTestBuilder { } } -impl Default for VmChipTestBuilder { +impl Default for VmChipTestBuilder { fn default() -> Self { let mut mem_config = MemoryConfig::default(); // TODO[jpw]: this is because old tests use `gen_pointer` on address space 1; this can be @@ -407,12 +402,19 @@ impl Default for VmChipTestBuilder { } } -pub struct VmChipTester { +pub struct VmChipTester +where + Val: VmField, +{ pub memory: Option>>, pub air_ctxs: Vec<(AirRef, AirProvingContext>)>, } -impl Default for VmChipTester { +impl Default for VmChipTester +where + SC: StarkGenericConfig, + Val: VmField, +{ fn default() -> Self { Self { memory: None, @@ -421,9 +423,10 @@ impl Default for VmChipTester { } } -impl VmChipTester +impl VmChipTester where - Val: PrimeField32, + SC: StarkGenericConfig, + Val: VmField, { pub fn load( mut self, diff --git a/crates/vm/src/arch/testing/cuda.rs b/crates/vm/src/arch/testing/cuda.rs index aa00cb814b..2c6ff41fd1 100644 --- a/crates/vm/src/arch/testing/cuda.rs +++ b/crates/vm/src/arch/testing/cuda.rs @@ -26,7 +26,7 @@ use openvm_stark_backend::{ config::Val, interaction::{LookupBus, PermutationCheckBus}, p3_air::BaseAir, - p3_field::{FieldAlgebra, PrimeField32}, + p3_field::{PrimeCharacteristicRing, PrimeField32}, prover::{cpu::CpuBackend, types::AirProvingContext}, rap::AnyRap, utils::disable_debug_builder, @@ -111,7 +111,7 @@ impl TestBuilder for GpuChipTestBuilder { E: PreflightExecutor, RA: Arena, { - let initial_pc = self.rng.gen_range(0..(1 << PC_BITS)); + let initial_pc = self.rng.random_range(0..(1 << PC_BITS)); self.execute_with_pc(executor, arena, instruction, initial_pc); } @@ -177,7 +177,7 @@ impl TestBuilder for GpuChipTestBuilder { pointer: usize, value: [usize; N], ) { - self.write(address_space, pointer, value.map(F::from_canonical_usize)); + self.write(address_space, pointer, value.map(F::from_usize)); } fn address_bits(&self) -> usize { @@ -217,7 +217,7 @@ impl TestBuilder for GpuChipTestBuilder { ) -> (usize, usize) { let register = self.get_default_register(reg_increment); let pointer = self.get_default_pointer(pointer_increment); - self.write(1, register, pointer.to_le_bytes().map(F::from_canonical_u8)); + self.write(1, register, pointer.to_le_bytes().map(F::from_u8)); (register, pointer) } @@ -375,11 +375,7 @@ impl GpuChipTestBuilder { pointer: usize, writes: Vec<[F; NUM_LIMBS]>, ) { - self.write( - 1usize, - register, - pointer.to_le_bytes().map(F::from_canonical_u8), - ); + self.write(1usize, register, pointer.to_le_bytes().map(F::from_u8)); if NUM_LIMBS.is_power_of_two() { for (i, &write) in writes.iter().enumerate() { self.write(2usize, pointer + i * NUM_LIMBS, write); diff --git a/crates/vm/src/arch/testing/execution/air.rs b/crates/vm/src/arch/testing/execution/air.rs index 225f0c5c15..b8a100702d 100644 --- a/crates/vm/src/arch/testing/execution/air.rs +++ b/crates/vm/src/arch/testing/execution/air.rs @@ -36,7 +36,7 @@ impl BaseAir for ExecutionDummyAir { impl Air for ExecutionDummyAir { fn eval(&self, builder: &mut AB) { let main = builder.main(); - let local = main.row_slice(0); + let local = main.row_slice(0).expect("row 0 present"); let local: &DummyExecutionInteractionCols = (*local).borrow(); self.bus .execute(builder, local.count, local.initial_state, local.final_state); diff --git a/crates/vm/src/arch/testing/execution/mod.rs b/crates/vm/src/arch/testing/execution/mod.rs index 91e0d9993e..bdaf1b37fd 100644 --- a/crates/vm/src/arch/testing/execution/mod.rs +++ b/crates/vm/src/arch/testing/execution/mod.rs @@ -3,7 +3,7 @@ use std::{borrow::BorrowMut, mem::size_of, sync::Arc}; use air::DummyExecutionInteractionCols; use openvm_stark_backend::{ config::{StarkGenericConfig, Val}, - p3_field::{Field, FieldAlgebra, PrimeField32}, + p3_field::{Field, PrimeCharacteristicRing, PrimeField32}, p3_matrix::dense::RowMajorMatrix, prover::{cpu::CpuBackend, types::AirProvingContext}, Chip, ChipUsageGetter, @@ -38,8 +38,8 @@ impl ExecutionTester { ) { self.records.push(DummyExecutionInteractionCols { count: F::NEG_ONE, // send - initial_state: initial_state.map(F::from_canonical_u32), - final_state: final_state.map(F::from_canonical_u32), + initial_state: initial_state.map(F::from_u32), + final_state: final_state.map(F::from_u32), }) } diff --git a/crates/vm/src/arch/testing/memory/air.rs b/crates/vm/src/arch/testing/memory/air.rs index efca131ae8..49a3571293 100644 --- a/crates/vm/src/arch/testing/memory/air.rs +++ b/crates/vm/src/arch/testing/memory/air.rs @@ -4,7 +4,7 @@ use openvm_stark_backend::{ config::{StarkGenericConfig, Val}, interaction::InteractionBuilder, p3_air::{Air, BaseAir}, - p3_field::{FieldAlgebra, PrimeField32}, + p3_field::{PrimeCharacteristicRing, PrimeField32}, p3_matrix::{dense::RowMajorMatrix, Matrix}, prover::{cpu::CpuBackend, types::AirProvingContext}, rap::{BaseAirWithPublicValues, PartitionedBaseAir}, @@ -78,7 +78,7 @@ impl BaseAir for MemoryDummyAir { impl Air for MemoryDummyAir { fn eval(&self, builder: &mut AB) { let main = builder.main(); - let local = main.row_slice(0); + let local = main.row_slice(0).expect("window should have two elements"); let local = DummyMemoryInteractionColsRef::from_slice(&local); self.bus @@ -117,10 +117,10 @@ impl MemoryDummyChip { pub fn push(&mut self, addr_space: u32, ptr: u32, data: &[F], timestamp: u32, count: F) { assert_eq!(data.len(), self.air.block_size); - self.trace.push(F::from_canonical_u32(addr_space)); - self.trace.push(F::from_canonical_u32(ptr)); + self.trace.push(F::from_u32(addr_space)); + self.trace.push(F::from_u32(ptr)); self.trace.extend_from_slice(data); - self.trace.push(F::from_canonical_u32(timestamp)); + self.trace.push(F::from_u32(timestamp)); self.trace.push(count); } } diff --git a/crates/vm/src/arch/testing/memory/cuda.rs b/crates/vm/src/arch/testing/memory/cuda.rs index 5bfe40358c..32af573fbf 100644 --- a/crates/vm/src/arch/testing/memory/cuda.rs +++ b/crates/vm/src/arch/testing/memory/cuda.rs @@ -14,7 +14,7 @@ use openvm_circuit_primitives::var_range::{VariableRangeCheckerBus, VariableRang use openvm_cuda_backend::{base::DeviceMatrix, prover_backend::GpuBackend, types::F}; use openvm_cuda_common::copy::MemCopyH2D; use openvm_stark_backend::{ - p3_field::{FieldAlgebra, PrimeField32}, + p3_field::{PrimeCharacteristicRing, PrimeField32}, prover::types::AirProvingContext, Chip, ChipUsageGetter, }; @@ -103,7 +103,7 @@ impl DeviceMemoryTester { let (t_prev, data) = if addr_space <= 3 { let (t_prev, data) = unsafe { self.memory.read::(addr_space as u32, ptr as u32) }; - (t_prev, data.map(F::from_canonical_u8)) + (t_prev, data.map(F::from_u8)) } else { unsafe { self.memory.read::(addr_space as u32, ptr as u32) } }; @@ -130,7 +130,7 @@ impl DeviceMemoryTester { data.map(|x| x.as_canonical_u32() as u8), ) }; - (t_prev, data_prev.map(F::from_canonical_u8)) + (t_prev, data_prev.map(F::from_u8)) } else { unsafe { self.memory diff --git a/crates/vm/src/arch/testing/memory/mod.rs b/crates/vm/src/arch/testing/memory/mod.rs index c5bea140ae..b622bc2f76 100644 --- a/crates/vm/src/arch/testing/memory/mod.rs +++ b/crates/vm/src/arch/testing/memory/mod.rs @@ -1,10 +1,12 @@ use std::collections::HashMap; use air::{MemoryDummyAir, MemoryDummyChip}; -use openvm_stark_backend::p3_field::{Field, PrimeField32}; use rand::Rng; -use crate::system::memory::{online::TracingMemory, MemoryController}; +use crate::{ + arch::VmField, + system::memory::{online::TracingMemory, MemoryController}, +}; pub mod air; @@ -17,14 +19,14 @@ pub use cuda::*; /// Stores a log of raw messages to send/receive to the [MemoryBus]. /// /// It will create a [air::MemoryDummyAir] to add messages to MemoryBus. -pub struct MemoryTester { +pub struct MemoryTester { /// Map from `block_size` to [MemoryDummyChip] of that block size pub chip_for_block: HashMap>, pub memory: TracingMemory, pub(super) controller: MemoryController, } -impl MemoryTester { +impl MemoryTester { pub fn new(controller: MemoryController, memory: TracingMemory) -> Self { let bus = controller.memory_bus; let mut chip_for_block = HashMap::new(); @@ -46,7 +48,7 @@ impl MemoryTester { // TODO: this could be improved if we added a TracingMemory::get_f function let (t_prev, data) = if addr_space <= 3 { let (t_prev, data) = unsafe { memory.read::(addr_space as u32, ptr as u32) }; - (t_prev, data.map(F::from_canonical_u8)) + (t_prev, data.map(F::from_u8)) } else { unsafe { memory.read::(addr_space as u32, ptr as u32) } }; @@ -76,7 +78,7 @@ impl MemoryTester { data.map(|x| x.as_canonical_u32() as u8), ) }; - (t_prev, data_prev.map(F::from_canonical_u8)) + (t_prev, data_prev.map(F::from_u8)) } else { unsafe { memory.write::(addr_space as u32, ptr as u32, data) } }; @@ -98,5 +100,5 @@ where R: Rng + ?Sized, { const MAX_MEMORY: usize = 1 << 29; - rng.gen_range(0..MAX_MEMORY - len) / len * len + rng.random_range(0..MAX_MEMORY - len) / len * len } diff --git a/crates/vm/src/arch/testing/program/air.rs b/crates/vm/src/arch/testing/program/air.rs index 241a1d19bd..2c84ccf182 100644 --- a/crates/vm/src/arch/testing/program/air.rs +++ b/crates/vm/src/arch/testing/program/air.rs @@ -25,8 +25,12 @@ impl BaseAir for ProgramDummyAir { impl Air for ProgramDummyAir { fn eval(&self, builder: &mut AB) { let main = builder.main(); - let local = main.row_slice(0); - let local = local.iter().map(|x| (*x).into()).collect::>(); + let local = main.row_slice(0).expect("row 0 present"); + let local = local + .iter() + .cloned() + .map(Into::into) + .collect::>(); self.bus.inner.add_key_with_lookups( builder, local[..local.len() - 1].iter().cloned(), diff --git a/crates/vm/src/arch/testing/program/mod.rs b/crates/vm/src/arch/testing/program/mod.rs index 7f8d52ab4b..2461df0b69 100644 --- a/crates/vm/src/arch/testing/program/mod.rs +++ b/crates/vm/src/arch/testing/program/mod.rs @@ -3,7 +3,7 @@ use std::{borrow::BorrowMut, mem::size_of, sync::Arc}; use openvm_instructions::instruction::Instruction; use openvm_stark_backend::{ config::{StarkGenericConfig, Val}, - p3_field::{Field, FieldAlgebra, PrimeField32}, + p3_field::{Field, PrimeCharacteristicRing, PrimeField32}, p3_matrix::dense::RowMajorMatrix, prover::{cpu::CpuBackend, types::AirProvingContext}, Chip, ChipUsageGetter, @@ -36,7 +36,7 @@ impl ProgramTester { pub fn execute(&mut self, instruction: &Instruction, initial_state: &ExecutionState) { self.records.push(ProgramExecutionCols { - pc: F::from_canonical_u32(initial_state.pc), + pc: F::from_u32(initial_state.pc), opcode: instruction.opcode.to_field(), a: instruction.a, b: instruction.b, diff --git a/crates/vm/src/arch/vm.rs b/crates/vm/src/arch/vm.rs index 68555050fe..2870dcab19 100644 --- a/crates/vm/src/arch/vm.rs +++ b/crates/vm/src/arch/vm.rs @@ -25,7 +25,9 @@ use openvm_stark_backend::{ config::{Com, StarkGenericConfig, Val}, engine::StarkEngine, keygen::types::{MultiStarkProvingKey, MultiStarkVerifyingKey}, - p3_field::{FieldAlgebra, FieldExtensionAlgebra, PrimeField32, TwoAdicField}, + p3_field::{ + BasedVectorSpace, InjectiveMonomial, PrimeCharacteristicRing, PrimeField32, TwoAdicField, + }, p3_util::{log2_ceil_usize, log2_strict_usize}, proof::Proof, prover::{ @@ -71,6 +73,12 @@ use crate::{ }, }; +/// Canonical field bound for VM execution/circuit code. +pub const BABYBEAR_S_BOX_DEGREE: u64 = 7; + +pub trait VmField: PrimeField32 + InjectiveMonomial {} +impl VmField for T where T: PrimeField32 + InjectiveMonomial {} + #[derive(Error, Debug)] pub enum GenerationError { #[error("unexpected number of arenas: {actual} (expected num_airs={expected})")] @@ -946,7 +954,7 @@ where .vk .params .width - .total_width(<::Challenge>::D); + .total_width(<::Challenge>::DIMENSION); let num_interactions = pk.vk.symbolic_constraints.interactions.len(); (constant_trace_height, air_names, width, num_interactions) }) @@ -977,7 +985,7 @@ where pk.vk .params .width - .total_width(<::Challenge>::D) + .total_width(<::Challenge>::DIMENSION) }) .collect(); @@ -1325,7 +1333,7 @@ where prev_final_pc = Some(pvs.final_pc); let expected_is_terminate = i == proofs.len() - 1; - if pvs.is_terminate != FieldAlgebra::from_bool(expected_is_terminate) { + if pvs.is_terminate != PrimeCharacteristicRing::from_bool(expected_is_terminate) { return Err(VmVerificationError::IsTerminateMismatch { expected: expected_is_terminate, actual: pvs.is_terminate.as_canonical_u32() != 0, @@ -1337,7 +1345,7 @@ where } else { DEFAULT_SUSPEND_EXIT_CODE }; - if pvs.exit_code != FieldAlgebra::from_canonical_u32(expected_exit_code) { + if pvs.exit_code != PrimeCharacteristicRing::from_u32(expected_exit_code) { return Err(VmVerificationError::ExitCodeMismatch { expected: expected_exit_code, actual: pvs.exit_code.as_canonical_u32(), @@ -1539,8 +1547,9 @@ mod vm_metrics { for (pk, height) in zip(&self.pk.per_air, heights.iter()) { let width = &pk.vk.params.width; main_cells_used += width.main_width() * *height; - total_cells_used += - width.total_width(::Challenge::D) * *height; + total_cells_used += width + .total_width(::Challenge::DIMENSION) + * *height; } tracing::debug!(?heights); tracing::info!(main_cells_used, total_cells_used); diff --git a/crates/vm/src/system/connector/mod.rs b/crates/vm/src/system/connector/mod.rs index 6785a027a5..b480c4faa8 100644 --- a/crates/vm/src/system/connector/mod.rs +++ b/crates/vm/src/system/connector/mod.rs @@ -13,7 +13,7 @@ use openvm_stark_backend::{ config::{StarkGenericConfig, Val}, interaction::InteractionBuilder, p3_air::{Air, AirBuilder, AirBuilderWithPublicValues, BaseAir, PairBuilder}, - p3_field::{Field, FieldAlgebra, PrimeField32}, + p3_field::{Field, PrimeCharacteristicRing, PrimeField32}, p3_matrix::{dense::RowMajorMatrix, Matrix}, prover::{cpu::CpuBackend, types::AirProvingContext}, rap::{BaseAirWithPublicValues, PartitionedBaseAir}, @@ -156,8 +156,13 @@ impl Air fn eval(&self, builder: &mut AB) { let main = builder.main(); let preprocessed = builder.preprocessed(); - let prep_local = preprocessed.row_slice(0); - let (begin, end) = (main.row_slice(0), main.row_slice(1)); + let prep_local = preprocessed + .row_slice(0) + .expect("window should have two elements"); + let (begin, end) = ( + main.row_slice(0).expect("window should have two elements"), + main.row_slice(1).expect("window should have two elements"), + ); let begin: &ConnectorCols = (*begin).borrow(); let end: &ConnectorCols = (*end).borrow(); @@ -190,7 +195,7 @@ impl Air self.program_bus.lookup_instruction( builder, end.pc, - AB::Expr::from_canonical_usize(TERMINATE.global_opcode().as_usize()), + AB::Expr::from_usize(TERMINATE.global_opcode().as_usize()), [AB::Expr::ZERO, AB::Expr::ZERO, end.exit_code.into()], (AB::Expr::ONE - prep_local[0]) * end.is_terminate, ); @@ -284,7 +289,7 @@ where self.range_checker .add_count(state.timestamp >> range_max_bits, high_bits); - state.map(Val::::from_canonical_u32) + state.map(Val::::from_u32) }); let trace = Arc::new(RowMajorMatrix::new( diff --git a/crates/vm/src/system/connector/tests.rs b/crates/vm/src/system/connector/tests.rs index 40a0a66e0d..df90303417 100644 --- a/crates/vm/src/system/connector/tests.rs +++ b/crates/vm/src/system/connector/tests.rs @@ -9,7 +9,7 @@ use openvm_instructions::{ use openvm_stark_backend::{ config::StarkGenericConfig, engine::StarkEngine, - p3_field::FieldAlgebra, + p3_field::PrimeCharacteristicRing, prover::{cpu::CpuBackend, types::AirProvingContext}, }; use openvm_stark_sdk::{ @@ -43,7 +43,7 @@ fn test_vm_connector_happy_path() { test_impl(true, exit_code, |air_ctx| { let pvs: &VmConnectorPvs = air_ctx.public_values.as_slice().borrow(); assert_eq!(pvs.is_terminate, F::ONE); - assert_eq!(pvs.exit_code, F::from_canonical_u32(exit_code)); + assert_eq!(pvs.exit_code, F::from_u32(exit_code)); }); } @@ -52,7 +52,7 @@ fn test_vm_connector_wrong_exit_code() { let exit_code = 1789; test_impl(false, exit_code, |air_ctx| { let pvs: &mut VmConnectorPvs = air_ctx.public_values.as_mut_slice().borrow_mut(); - pvs.exit_code = F::from_canonical_u32(exit_code + 1); + pvs.exit_code = F::from_u32(exit_code + 1); }); } diff --git a/crates/vm/src/system/cuda/access_adapters.rs b/crates/vm/src/system/cuda/access_adapters.rs index 2796460464..445405b5ca 100644 --- a/crates/vm/src/system/cuda/access_adapters.rs +++ b/crates/vm/src/system/cuda/access_adapters.rs @@ -168,7 +168,7 @@ mod tests { }; use openvm_circuit_primitives::var_range::VariableRangeCheckerBus; use openvm_cuda_backend::{data_transporter::assert_eq_host_and_device_matrix, prelude::SC}; - use openvm_stark_backend::{p3_field::FieldAlgebra, prover::hal::MatrixDimensions}; + use openvm_stark_backend::{p3_field::PrimeCharacteristicRing, prover::hal::MatrixDimensions}; use rand::{rngs::StdRng, Rng, SeedableRng}; use super::*; @@ -191,36 +191,36 @@ mod tests { let max_log_block_size = 4; let its = 1000; for _ in 0..its { - let addr_sp = rng.gen_range(1..=aligns.len()); + let addr_sp = rng.random_range(1..=aligns.len()); let align: usize = aligns[addr_sp - 1]; let value_bound: u32 = value_bounds[addr_sp - 1]; - let ptr = rng.gen_range(0..max_ptr / align) * align; - let log_len = rng.gen_range(align.trailing_zeros()..=max_log_block_size); + let ptr = rng.random_range(0..max_ptr / align) * align; + let log_len = rng.random_range(align.trailing_zeros()..=max_log_block_size); match log_len { 0 => tester.write::<1>( addr_sp, ptr, - array::from_fn(|_| F::from_canonical_u32(rng.gen_range(0..value_bound))), + array::from_fn(|_| F::from_u32(rng.random_range(0..value_bound))), ), 1 => tester.write::<2>( addr_sp, ptr, - array::from_fn(|_| F::from_canonical_u32(rng.gen_range(0..value_bound))), + array::from_fn(|_| F::from_u32(rng.random_range(0..value_bound))), ), 2 => tester.write::<4>( addr_sp, ptr, - array::from_fn(|_| F::from_canonical_u32(rng.gen_range(0..value_bound))), + array::from_fn(|_| F::from_u32(rng.random_range(0..value_bound))), ), 3 => tester.write::<8>( addr_sp, ptr, - array::from_fn(|_| F::from_canonical_u32(rng.gen_range(0..value_bound))), + array::from_fn(|_| F::from_u32(rng.random_range(0..value_bound))), ), 4 => tester.write::<16>( addr_sp, ptr, - array::from_fn(|_| F::from_canonical_u32(rng.gen_range(0..value_bound))), + array::from_fn(|_| F::from_u32(rng.random_range(0..value_bound))), ), _ => unreachable!(), } diff --git a/crates/vm/src/system/cuda/boundary.rs b/crates/vm/src/system/cuda/boundary.rs index 3b19e7bcc5..10f6dd08fd 100644 --- a/crates/vm/src/system/cuda/boundary.rs +++ b/crates/vm/src/system/cuda/boundary.rs @@ -198,7 +198,7 @@ mod tests { Chip, }; use openvm_stark_sdk::utils::create_seeded_rng; - use p3_field::FieldAlgebra; + use p3_field::PrimeCharacteristicRing; use rand::Rng; use super::{BoundaryChipGPU, VariableRangeCheckerChipGPU}; @@ -214,15 +214,15 @@ mod tests { let mut distinct_addresses = HashSet::new(); while distinct_addresses.len() < NUM_ADDRESSES { - let addr_space = rng.gen_range(0..MAX_ADDRESS_SPACE); - let pointer = rng.gen_range(0..(1 << LIMB_BITS)); + let addr_space = rng.random_range(0..MAX_ADDRESS_SPACE); + let pointer = rng.random_range(0..(1 << LIMB_BITS)); distinct_addresses.insert((addr_space, pointer)); } let mut final_memory = TimestampedEquipartition::::new(); for (addr_space, pointer) in distinct_addresses.iter().cloned() { - let final_data = F::from_canonical_u32(rng.gen_range(0..(1 << LIMB_BITS))); - let final_clk = rng.gen_range(1..(1 << LIMB_BITS)) as u32; + let final_data = F::from_u32(rng.random_range(0..(1 << LIMB_BITS))); + let final_clk = rng.random_range(1..(1 << LIMB_BITS)) as u32; final_memory.push(( (addr_space, pointer), diff --git a/crates/vm/src/system/cuda/memory.rs b/crates/vm/src/system/cuda/memory.rs index 51d7b3677e..13be5c4e7c 100644 --- a/crates/vm/src/system/cuda/memory.rs +++ b/crates/vm/src/system/cuda/memory.rs @@ -15,7 +15,8 @@ use openvm_cuda_common::{ memory_manager::MemTracker, }; use openvm_stark_backend::{ - p3_field::FieldAlgebra, p3_util::log2_ceil_usize, prover::types::AirProvingContext, Chip, + p3_field::PrimeCharacteristicRing, p3_util::log2_ceil_usize, prover::types::AirProvingContext, + Chip, }; use super::{ diff --git a/crates/vm/src/system/cuda/merkle_tree/mod.rs b/crates/vm/src/system/cuda/merkle_tree/mod.rs index ec0a91de76..6b5c389240 100644 --- a/crates/vm/src/system/cuda/merkle_tree/mod.rs +++ b/crates/vm/src/system/cuda/merkle_tree/mod.rs @@ -18,7 +18,7 @@ use openvm_stark_backend::{ p3_util::log2_ceil_usize, prover::types::AirProvingContext, }; -use p3_field::FieldAlgebra; +use p3_field::PrimeCharacteristicRing; use super::{poseidon2::SharedBuffer, Poseidon2PeripheryChipGPU, DIGEST_WIDTH}; @@ -448,7 +448,7 @@ mod tests { NATIVE_AS, }; use openvm_stark_sdk::utils::create_seeded_rng; - use p3_field::{FieldAlgebra, PrimeField32}; + use p3_field::{PrimeCharacteristicRing, PrimeField32}; use rand::Rng; use super::MemoryMerkleTree; @@ -476,7 +476,7 @@ mod tests { initial_memory.write::( idx as u32, i as u32, - [rng.gen_range(0..space.layout.size()) as u8], + [rng.random_range(0..space.layout.size()) as u8], ); } } @@ -485,7 +485,7 @@ mod tests { initial_memory.write::( idx as u32, i as u32, - [rng.gen_range(0..space.layout.size()) as u16], + [rng.random_range(0..space.layout.size()) as u16], ); } } @@ -494,7 +494,7 @@ mod tests { initial_memory.write::( idx as u32, i as u32, - [rng.gen_range(0..space.layout.size()) as u32], + [rng.random_range(0..space.layout.size()) as u32], ); } } @@ -503,7 +503,7 @@ mod tests { initial_memory.write::( idx as u32, i as u32, - [F::from_canonical_u32(rng.gen_range(0..F::ORDER_U32))], + [F::from_u32(rng.random_range(0..F::ORDER_U32))], ); } } @@ -562,7 +562,7 @@ mod tests { .flat_map(|(i, cnf)| { let mut ptrs = Vec::new(); for j in 0..(cnf.num_cells / DIGEST_WIDTH) { - if rng.gen_bool(0.333) { + if rng.random_bool(0.333) { ptrs.push((i as u32, (j * DIGEST_WIDTH) as u32)); } } @@ -571,7 +571,7 @@ mod tests { .collect::>(); let new_data = touched_ptrs .iter() - .map(|_| std::array::from_fn(|_| F::from_canonical_u32(rng.gen_range(0..F::ORDER_U32)))) + .map(|_| std::array::from_fn(|_| F::from_u32(rng.random_range(0..F::ORDER_U32)))) .collect::>(); assert!(!touched_ptrs.is_empty()); cpu_merkle_tree.finalize( @@ -590,7 +590,7 @@ mod tests { ( address, TimestampedValues { - timestamp: rng.gen_range(0..(1u32 << mem_config.timestamp_max_bits)), + timestamp: rng.random_range(0..(1u32 << mem_config.timestamp_max_bits)), values: data, }, ) diff --git a/crates/vm/src/system/cuda/program.rs b/crates/vm/src/system/cuda/program.rs index 2e254afec5..1b0d9bc918 100644 --- a/crates/vm/src/system/cuda/program.rs +++ b/crates/vm/src/system/cuda/program.rs @@ -16,7 +16,7 @@ use openvm_stark_backend::{ }, Chip, }; -use p3_field::FieldAlgebra; +use p3_field::PrimeCharacteristicRing; use crate::cuda_abi::program; @@ -35,7 +35,7 @@ impl ProgramChipGPU { .into_iter() .map(|(pc, instruction, _)| { [ - F::from_canonical_u32(pc), + F::from_u32(pc), instruction.opcode.to_field(), instruction.a, instruction.b, @@ -105,7 +105,7 @@ impl Chip, GpuBackend> for ProgramChipGPU { filtered_exec_freqs .into_iter() - .map(F::from_canonical_u32) + .map(F::from_u32) .collect::>() .copy_to(&mut buffer) .unwrap(); diff --git a/crates/vm/src/system/memory/adapter/air.rs b/crates/vm/src/system/memory/adapter/air.rs index bcc367b0ec..b4a020eafc 100644 --- a/crates/vm/src/system/memory/adapter/air.rs +++ b/crates/vm/src/system/memory/adapter/air.rs @@ -7,7 +7,7 @@ use openvm_circuit_primitives::{ use openvm_stark_backend::{ interaction::InteractionBuilder, p3_air::{Air, AirBuilder, BaseAir}, - p3_field::FieldAlgebra, + p3_field::PrimeCharacteristicRing, p3_matrix::Matrix, rap::{BaseAirWithPublicValues, PartitionedBaseAir}, }; @@ -34,7 +34,7 @@ impl Air for AccessAdapterAir { fn eval(&self, builder: &mut AB) { let main = builder.main(); - let local = main.row_slice(0); + let local = main.row_slice(0).expect("window should have two elements"); let local: &AccessAdapterCols = (*local).borrow(); builder.assert_bool(local.is_split); @@ -87,7 +87,7 @@ impl Air for AccessAdapterAir { .send( MemoryAddress::new( local.address.address_space, - local.address.pointer + AB::Expr::from_canonical_usize(N / 2), + local.address.pointer + AB::Expr::from_usize(N / 2), ), local.values[N / 2..].to_vec(), local.right_timestamp, diff --git a/crates/vm/src/system/memory/adapter/mod.rs b/crates/vm/src/system/memory/adapter/mod.rs index 8b0797dcf6..9e06b20a22 100644 --- a/crates/vm/src/system/memory/adapter/mod.rs +++ b/crates/vm/src/system/memory/adapter/mod.rs @@ -383,8 +383,8 @@ impl GenericAccessAdapterChipTrait for AccessAdapterChip GenericAccessAdapterChipTrait for AccessAdapterChip = Vec<((u32, u32), Timestam pub type Equipartition = BTreeMap<(u32, u32), [F; N]>; #[derive(Getters, MutGetters)] -pub struct MemoryController { +pub struct MemoryController { pub memory_bus: MemoryBus, pub interface_chip: MemoryInterface, pub range_checker: SharedVariableRangeCheckerChip, @@ -120,7 +120,7 @@ impl PersistentMemoryTraceHeights { } } -impl MemoryController { +impl MemoryController { pub(crate) fn continuation_enabled(&self) -> bool { match &self.interface_chip { MemoryInterface::Volatile { .. } => false, @@ -367,7 +367,7 @@ impl MemoryAuxColsFactory<'_, F> { self.generate_timestamp_lt(prev_timestamp, timestamp, &mut buffer.timestamp_lt_aux); // Safety: even if prev_timestamp were obtained by transmute_ref from // `buffer.prev_timestamp`, this should still work because it is a direct assignment - buffer.prev_timestamp = F::from_canonical_u32(prev_timestamp); + buffer.prev_timestamp = F::from_u32(prev_timestamp); } /// # Safety diff --git a/crates/vm/src/system/memory/merkle/air.rs b/crates/vm/src/system/memory/merkle/air.rs index 003aa31f78..1cb9d961b6 100644 --- a/crates/vm/src/system/memory/merkle/air.rs +++ b/crates/vm/src/system/memory/merkle/air.rs @@ -3,7 +3,7 @@ use std::{borrow::Borrow, iter}; use openvm_stark_backend::{ interaction::{InteractionBuilder, PermutationCheckBus}, p3_air::{Air, AirBuilder, AirBuilderWithPublicValues, BaseAir}, - p3_field::{Field, FieldAlgebra}, + p3_field::{Field, PrimeCharacteristicRing}, p3_matrix::Matrix, rap::{BaseAirWithPublicValues, PartitionedBaseAir}, }; @@ -34,7 +34,10 @@ impl Ai { fn eval(&self, builder: &mut AB) { let main = builder.main(); - let (local, next) = (main.row_slice(0), main.row_slice(1)); + let (local, next) = ( + main.row_slice(0).expect("window should have two elements"), + main.row_slice(1).expect("window should have two elements"), + ); let local: &MemoryMerkleCols<_, CHUNK> = (*local).borrow(); let next: &MemoryMerkleCols<_, CHUNK> = (*next).borrow(); @@ -81,14 +84,14 @@ impl Ai .when_transition() .when_ne( local.parent_height, - AB::F::from_canonical_usize(self.memory_dimensions.address_height + 1), + AB::F::from_usize(self.memory_dimensions.address_height + 1), ) .assert_eq(local.height_section, next.height_section); builder .when_transition() .when_ne( next.parent_height, - AB::F::from_canonical_usize(self.memory_dimensions.address_height), + AB::F::from_usize(self.memory_dimensions.address_height), ) .assert_eq(local.height_section, next.height_section); // two adjacent rows with `is_root` = 1 should have @@ -101,7 +104,7 @@ impl Ai // roots should have correct height builder.when(local.is_root).assert_eq( local.parent_height, - AB::Expr::from_canonical_usize(self.memory_dimensions.overall_height()), + AB::Expr::from_usize(self.memory_dimensions.overall_height()), ); // constrain public values diff --git a/crates/vm/src/system/memory/merkle/public_values.rs b/crates/vm/src/system/memory/merkle/public_values.rs index 282722dab8..d40377ea50 100644 --- a/crates/vm/src/system/memory/merkle/public_values.rs +++ b/crates/vm/src/system/memory/merkle/public_values.rs @@ -60,7 +60,7 @@ impl UserPublicValuesProof { ) -> Self { let public_values = extract_public_values(num_public_values, final_memory) .iter() - .map(|&x| F::from_canonical_u8(x)) + .map(|&x| F::from_u8(x)) .collect_vec(); let public_values_commit = hasher.merkle_root(&public_values); let proof = compute_merkle_proof_to_user_public_values_root( @@ -198,7 +198,7 @@ pub fn extract_public_values(num_public_values: usize, final_memory: &MemoryImag #[cfg(test)] mod tests { - use openvm_stark_backend::p3_field::FieldAlgebra; + use openvm_stark_backend::p3_field::PrimeCharacteristicRing; use openvm_stark_sdk::p3_baby_bear::BabyBear; use super::UserPublicValuesProof; diff --git a/crates/vm/src/system/memory/merkle/tests/mod.rs b/crates/vm/src/system/memory/merkle/tests/mod.rs index 09d996393e..91b983f8be 100644 --- a/crates/vm/src/system/memory/merkle/tests/mod.rs +++ b/crates/vm/src/system/memory/merkle/tests/mod.rs @@ -7,7 +7,7 @@ use std::{ use openvm_stark_backend::{ interaction::{PermutationCheckBus, PermutationInteractionType}, - p3_field::FieldAlgebra, + p3_field::PrimeCharacteristicRing, p3_matrix::dense::RowMajorMatrix, prover::types::AirProvingContext, }; @@ -116,9 +116,9 @@ fn test( }); dummy_interaction_trace_rows.extend([ expand_direction, - BabyBear::from_canonical_usize(height), - BabyBear::from_canonical_u32(as_label), - BabyBear::from_canonical_u32(address_label), + BabyBear::from_usize(height), + BabyBear::from_u32(as_label), + BabyBear::from_u32(address_label), ]); dummy_interaction_trace_rows.extend(hash); }; @@ -229,7 +229,7 @@ fn random_test( if is_initial && num_initial_addresses != 0 { num_initial_addresses -= 1; - let value = BabyBear::from_canonical_u32(next_u32() % max_value); + let value = BabyBear::from_u32(next_u32() % max_value); unsafe { initial_memory.write(address_space, pointer, [value]); final_memory.write(address_space, pointer, [value]); @@ -239,7 +239,7 @@ fn random_test( num_touched_addresses -= 1; touched_labels.insert((address_space, label)); if value_changes || !is_initial { - let value = BabyBear::from_canonical_u32(next_u32() % max_value); + let value = BabyBear::from_u32(next_u32() % max_value); unsafe { final_memory.write(address_space, pointer, [value]); } diff --git a/crates/vm/src/system/memory/merkle/trace.rs b/crates/vm/src/system/memory/merkle/trace.rs index c3d916bed8..c31266bd18 100644 --- a/crates/vm/src/system/memory/merkle/trace.rs +++ b/crates/vm/src/system/memory/merkle/trace.rs @@ -14,7 +14,7 @@ use openvm_stark_backend::{ use tracing::instrument; use crate::{ - arch::hasher::HasherChip, + arch::{hasher::HasherChip, VmField}, system::{ memory::{ merkle::{tree::MerkleTree, FinalState, MemoryMerkleChip, MemoryMerkleCols}, @@ -108,7 +108,7 @@ pub trait SerialReceiver { fn receive(&self, msg: T); } -impl<'a, F: PrimeField32, const SBOX_REGISTERS: usize> SerialReceiver<&'a [F]> +impl<'a, F: VmField, const SBOX_REGISTERS: usize> SerialReceiver<&'a [F]> for Poseidon2PeripheryBaseChip { /// Receives a permutation preimage, pads with zeros to the permutation width, and records. @@ -122,7 +122,7 @@ impl<'a, F: PrimeField32, const SBOX_REGISTERS: usize> SerialReceiver<&'a [F]> } } -impl<'a, F: PrimeField32> SerialReceiver<&'a [F]> for Poseidon2PeripheryChip { +impl<'a, F: VmField> SerialReceiver<&'a [F]> for Poseidon2PeripheryChip { fn receive(&self, perm_preimage: &'a [F]) { match self { Poseidon2PeripheryChip::Register0(chip) => chip.receive(perm_preimage), diff --git a/crates/vm/src/system/memory/merkle/tree.rs b/crates/vm/src/system/memory/merkle/tree.rs index 44bf812fd6..a7ad01f3ae 100644 --- a/crates/vm/src/system/memory/merkle/tree.rs +++ b/crates/vm/src/system/memory/merkle/tree.rs @@ -155,12 +155,10 @@ impl MerkleTree { height_section: F::from_bool( height > md.address_height, ), - parent_height: F::from_canonical_usize(height), + parent_height: F::from_usize(height), is_root: F::from_bool(height == md.overall_height()), - parent_as_label: F::from_canonical_u32(parent_as_label), - parent_address_label: F::from_canonical_u32( - parent_address_label, - ), + parent_as_label: F::from_u32(parent_as_label), + parent_address_label: F::from_u32(parent_address_label), parent_hash: par_old_values, left_child_hash: *old_left, right_child_hash: *old_right, @@ -172,12 +170,10 @@ impl MerkleTree { height_section: F::from_bool( height > md.address_height, ), - parent_height: F::from_canonical_usize(height), + parent_height: F::from_usize(height), is_root: F::from_bool(height == md.overall_height()), - parent_as_label: F::from_canonical_u32(parent_as_label), - parent_address_label: F::from_canonical_u32( - parent_address_label, - ), + parent_as_label: F::from_u32(parent_as_label), + parent_address_label: F::from_u32(parent_address_label), parent_hash: combined, left_child_hash: *left, right_child_hash: *right, diff --git a/crates/vm/src/system/memory/offline_checker/bridge.rs b/crates/vm/src/system/memory/offline_checker/bridge.rs index 85773fc56d..d5d6e418da 100644 --- a/crates/vm/src/system/memory/offline_checker/bridge.rs +++ b/crates/vm/src/system/memory/offline_checker/bridge.rs @@ -7,7 +7,7 @@ use openvm_circuit_primitives::{ SubAir, }; use openvm_stark_backend::{ - interaction::InteractionBuilder, p3_air::AirBuilder, p3_field::FieldAlgebra, + interaction::InteractionBuilder, p3_air::AirBuilder, p3_field::PrimeCharacteristicRing, }; use super::bus::MemoryBus; @@ -125,7 +125,9 @@ pub struct MemoryReadOperation<'a, T, V, const N: usize> { /// The max degree of constraints is: /// eval_timestamps: deg(enabled) + max(1, deg(self.timestamp)) /// eval_bulk_access: refer to private function MemoryOfflineChecker::eval_bulk_access -impl, const N: usize> MemoryReadOperation<'_, F, V, N> { +impl, const N: usize> + MemoryReadOperation<'_, F, V, N> +{ /// Evaluate constraints and send/receive interactions. pub fn eval(self, builder: &mut AB, enabled: impl Into) where @@ -179,7 +181,7 @@ pub struct MemoryReadOrImmediateOperation<'a, T, V> { /// is_immediate check: deg(aux.is_immediate) + max(deg(data), deg(address.pointer)) /// eval_timestamps: deg(enabled) + max(1, deg(self.timestamp)) /// eval_bulk_access: refer to private function MemoryOfflineChecker::eval_bulk_access -impl> MemoryReadOrImmediateOperation<'_, F, V> { +impl> MemoryReadOrImmediateOperation<'_, F, V> { /// Evaluate constraints and send/receive interactions. pub fn eval(self, builder: &mut AB, enabled: impl Into) where @@ -209,6 +211,7 @@ impl> MemoryReadOrImmediateOperation<'_, F, V enabled.clone(), ); + #[allow(clippy::cloned_ref_to_slice_refs)] self.offline_checker.eval_bulk_access( builder, self.address, @@ -240,7 +243,9 @@ pub struct MemoryWriteOperation<'a, T, V, const N: usize> { /// The max degree of constraints is: /// eval_timestamps: deg(enabled) + max(1, deg(self.timestamp)) /// eval_bulk_access: refer to private function MemoryOfflineChecker::eval_bulk_access -impl, const N: usize> MemoryWriteOperation<'_, T, V, N> { +impl, const N: usize> + MemoryWriteOperation<'_, T, V, N> +{ /// Evaluate constraints and send/receive interactions. `enabled` must be boolean. pub fn eval(self, builder: &mut AB, enabled: impl Into) where diff --git a/crates/vm/src/system/memory/offline_checker/bus.rs b/crates/vm/src/system/memory/offline_checker/bus.rs index d15f5798ea..e41a5eeee9 100644 --- a/crates/vm/src/system/memory/offline_checker/bus.rs +++ b/crates/vm/src/system/memory/offline_checker/bus.rs @@ -2,7 +2,7 @@ use std::iter; use openvm_stark_backend::{ interaction::{BusIndex, InteractionBuilder, PermutationCheckBus}, - p3_field::FieldAlgebra, + p3_field::PrimeCharacteristicRing, }; use crate::system::memory::MemoryAddress; @@ -74,7 +74,7 @@ pub struct MemoryBusInteraction { pub timestamp: T, } -impl MemoryBusInteraction { +impl MemoryBusInteraction { /// Finalizes and sends/receives the memory operation with the specified direction over the bus. /// /// A read corresponds to a receive, and a write corresponds to a send. diff --git a/crates/vm/src/system/memory/offline_checker/columns.rs b/crates/vm/src/system/memory/offline_checker/columns.rs index ef9821f859..c41ff905f5 100644 --- a/crates/vm/src/system/memory/offline_checker/columns.rs +++ b/crates/vm/src/system/memory/offline_checker/columns.rs @@ -69,7 +69,7 @@ impl MemoryReadAuxCols { pub fn new(prev_timestamp: u32, timestamp_lt_aux: LessThanAuxCols) -> Self { Self { base: MemoryBaseAuxCols { - prev_timestamp: F::from_canonical_u32(prev_timestamp), + prev_timestamp: F::from_u32(prev_timestamp), timestamp_lt_aux, }, } diff --git a/crates/vm/src/system/memory/persistent.rs b/crates/vm/src/system/memory/persistent.rs index eeb22cbfd6..37a39f7c40 100644 --- a/crates/vm/src/system/memory/persistent.rs +++ b/crates/vm/src/system/memory/persistent.rs @@ -10,7 +10,7 @@ use openvm_stark_backend::{ config::{StarkGenericConfig, Val}, interaction::{InteractionBuilder, PermutationCheckBus}, p3_air::{Air, AirBuilder, BaseAir}, - p3_field::{FieldAlgebra, PrimeField32}, + p3_field::{PrimeCharacteristicRing, PrimeField32}, p3_matrix::{dense::RowMajorMatrix, Matrix}, p3_maybe_rayon::prelude::*, prover::{cpu::CpuBackend, types::AirProvingContext}, @@ -72,7 +72,7 @@ impl PartitionedBaseAir for PersistentBoundaryAir Air for PersistentBoundaryAir { fn eval(&self, builder: &mut AB) { let main = builder.main(); - let local = main.row_slice(0); + let local = main.row_slice(0).expect("window should have two elements"); let local: &PersistentBoundaryCols = (*local).borrow(); // `direction` should be -1, 0, 1 @@ -93,7 +93,7 @@ impl Air for PersistentBoundaryA // direction = -1 => is_final = 1 local.expand_direction.into(), AB::Expr::ZERO, - local.address_space - AB::F::from_canonical_u32(ADDR_SPACE_OFFSET), + local.address_space - AB::F::from_u32(ADDR_SPACE_OFFSET), local.leaf_label.into(), ]; expand_fields.extend(local.hash.map(Into::into)); @@ -113,7 +113,7 @@ impl Air for PersistentBoundaryA .send( MemoryAddress::new( local.address_space, - local.leaf_label * AB::F::from_canonical_usize(CHUNK), + local.leaf_label * AB::F::from_usize(CHUNK), ), local.values.to_vec(), local.timestamp, @@ -277,20 +277,20 @@ where let (initial_row, final_row) = row.split_at_mut(width); *initial_row.borrow_mut() = PersistentBoundaryCols { expand_direction: Val::::ONE, - address_space: Val::::from_canonical_u32(touched_label.address_space), - leaf_label: Val::::from_canonical_u32(touched_label.label), + address_space: Val::::from_u32(touched_label.address_space), + leaf_label: Val::::from_u32(touched_label.label), values: touched_label.init_values, hash: touched_label.init_hash, - timestamp: Val::::from_canonical_u32(INITIAL_TIMESTAMP), + timestamp: Val::::from_u32(INITIAL_TIMESTAMP), }; *final_row.borrow_mut() = PersistentBoundaryCols { expand_direction: Val::::NEG_ONE, - address_space: Val::::from_canonical_u32(touched_label.address_space), - leaf_label: Val::::from_canonical_u32(touched_label.label), + address_space: Val::::from_u32(touched_label.address_space), + leaf_label: Val::::from_u32(touched_label.label), values: touched_label.final_values, hash: touched_label.final_hash, - timestamp: Val::::from_canonical_u32(touched_label.final_timestamp), + timestamp: Val::::from_u32(touched_label.final_timestamp), }; }); Arc::new(RowMajorMatrix::new(rows, width)) diff --git a/crates/vm/src/system/memory/tests.rs b/crates/vm/src/system/memory/tests.rs index 2cfeaf0665..604b717abc 100644 --- a/crates/vm/src/system/memory/tests.rs +++ b/crates/vm/src/system/memory/tests.rs @@ -4,9 +4,9 @@ use openvm_instructions::{ riscv::{RV32_MEMORY_AS, RV32_REGISTER_AS}, NATIVE_AS, }; -use openvm_stark_backend::p3_field::FieldAlgebra; +use openvm_stark_backend::p3_field::PrimeCharacteristicRing; use openvm_stark_sdk::{p3_baby_bear::BabyBear, utils::create_seeded_rng}; -use rand::{distributions::Standard, prelude::Distribution, thread_rng, Rng}; +use rand::{rngs::StdRng, Rng}; use test_case::test_case; use crate::{ @@ -30,36 +30,36 @@ fn test_memory_write_by_tester(tester: &mut impl TestBuilder, its: usize) { let value_bounds = [256, 256, 256, (1 << 30)]; let max_log_block_size = 4; for _ in 0..its { - let addr_sp = rng.gen_range(1..=aligns.len()); + let addr_sp = rng.random_range(1..=aligns.len()); let align: usize = aligns[addr_sp - 1]; let value_bound: u32 = value_bounds[addr_sp - 1]; - let ptr = rng.gen_range(0..max_ptr / align) * align; - let log_len = rng.gen_range(align.trailing_zeros()..=max_log_block_size); + let ptr = rng.random_range(0..max_ptr / align) * align; + let log_len = rng.random_range(align.trailing_zeros()..=max_log_block_size); match log_len { 0 => tester.write::<1>( addr_sp, ptr, - array::from_fn(|_| F::from_canonical_u32(rng.gen_range(0..value_bound))), + array::from_fn(|_| F::from_u32(rng.random_range(0..value_bound))), ), 1 => tester.write::<2>( addr_sp, ptr, - array::from_fn(|_| F::from_canonical_u32(rng.gen_range(0..value_bound))), + array::from_fn(|_| F::from_u32(rng.random_range(0..value_bound))), ), 2 => tester.write::<4>( addr_sp, ptr, - array::from_fn(|_| F::from_canonical_u32(rng.gen_range(0..value_bound))), + array::from_fn(|_| F::from_u32(rng.random_range(0..value_bound))), ), 3 => tester.write::<8>( addr_sp, ptr, - array::from_fn(|_| F::from_canonical_u32(rng.gen_range(0..value_bound))), + array::from_fn(|_| F::from_u32(rng.random_range(0..value_bound))), ), 4 => tester.write::<16>( addr_sp, ptr, - array::from_fn(|_| F::from_canonical_u32(rng.gen_range(0..value_bound))), + array::from_fn(|_| F::from_u32(rng.random_range(0..value_bound))), ), _ => unreachable!(), } @@ -84,21 +84,20 @@ fn test_memory_write_persistent(its: usize) { tester.simple_test().expect("Verification failed"); } -fn test_no_adapter_records_for_singleton_accesses(address_space: u32) -where - T: Copy + Debug, - Standard: Distribution, -{ +fn test_no_adapter_records_for_singleton_accesses( + address_space: u32, + mut sample: impl FnMut(&mut StdRng) -> T, +) { let memory_config = MemoryConfig::default(); let mut memory = TracingMemory::new(&memory_config, BLOCK_SIZE, 0); let max_ptr = (memory_config.addr_spaces[address_space as usize].num_cells / BLOCK_SIZE) as u32; - let mut rng = thread_rng(); + let mut rng = create_seeded_rng(); for _ in 0..1000 { - let pointer = rng.gen_range(0..max_ptr) * BLOCK_SIZE as u32; + let pointer = rng.random_range(0..max_ptr) * BLOCK_SIZE as u32; - if rng.gen_bool(0.5) { - let data: [T; BLOCK_SIZE] = array::from_fn(|_| rng.gen()); + if rng.random_bool(0.5) { + let data: [T; BLOCK_SIZE] = array::from_fn(|_| sample(&mut rng)); unsafe { memory.write::(address_space, pointer, data); } @@ -113,10 +112,12 @@ where #[test] fn test_no_adapter_records() { - test_no_adapter_records_for_singleton_accesses::(RV32_REGISTER_AS); - test_no_adapter_records_for_singleton_accesses::(RV32_MEMORY_AS); - test_no_adapter_records_for_singleton_accesses::(PUBLIC_VALUES_AS); - test_no_adapter_records_for_singleton_accesses::(NATIVE_AS); + test_no_adapter_records_for_singleton_accesses::(RV32_REGISTER_AS, |rng| rng.random()); + test_no_adapter_records_for_singleton_accesses::(RV32_MEMORY_AS, |rng| rng.random()); + test_no_adapter_records_for_singleton_accesses::(PUBLIC_VALUES_AS, |rng| rng.random()); + test_no_adapter_records_for_singleton_accesses::(NATIVE_AS, |rng| { + F::from_u32(rng.random_range(0..(1 << 30))) + }); } #[cfg(feature = "cuda")] diff --git a/crates/vm/src/system/memory/volatile/mod.rs b/crates/vm/src/system/memory/volatile/mod.rs index 9296c91247..40d005c4d3 100644 --- a/crates/vm/src/system/memory/volatile/mod.rs +++ b/crates/vm/src/system/memory/volatile/mod.rs @@ -18,7 +18,7 @@ use openvm_stark_backend::{ config::{StarkGenericConfig, Val}, interaction::InteractionBuilder, p3_air::{Air, AirBuilder, BaseAir}, - p3_field::{Field, FieldAlgebra, PrimeField32}, + p3_field::{Field, PrimeCharacteristicRing, PrimeField32}, p3_matrix::{dense::RowMajorMatrix, Matrix}, p3_maybe_rayon::prelude::*, prover::{cpu::CpuBackend, types::AirProvingContext}, @@ -116,7 +116,7 @@ impl Air for VolatileBoundaryAir { fn eval(&self, builder: &mut AB) { let main = builder.main(); - let [local, next] = [0, 1].map(|i| main.row_slice(i)); + let [local, next] = [0, 1].map(|i| main.row_slice(i).expect("window row present")); let local: &VolatileBoundaryCols<_> = (*local).borrow(); let next: &VolatileBoundaryCols<_> = (*next).borrow(); @@ -272,7 +272,7 @@ where range_checker.decompose(*ptr, self.pointer_max_bits, &mut row.pointer_limbs); row.initial_data = Val::::ZERO; row.final_data = data; - row.final_timestamp = Val::::from_canonical_u32(timestamped_values.timestamp); + row.final_timestamp = Val::::from_u32(timestamped_values.timestamp); row.is_valid = Val::::ONE; // If next.is_valid == 1: @@ -282,13 +282,10 @@ where addr_lt_air.0.generate_subrow( ( self.range_checker.as_ref(), + &[Val::::from_u32(*addr_space), Val::::from_u32(*ptr)], &[ - Val::::from_canonical_u32(*addr_space), - Val::::from_canonical_u32(*ptr), - ], - &[ - Val::::from_canonical_u32(next_addr_space), - Val::::from_canonical_u32(next_ptr), + Val::::from_u32(next_addr_space), + Val::::from_u32(next_ptr), ], ), ((&mut row.addr_lt_aux).into(), &mut out), diff --git a/crates/vm/src/system/memory/volatile/tests.rs b/crates/vm/src/system/memory/volatile/tests.rs index a0c484793b..6ecf8264a7 100644 --- a/crates/vm/src/system/memory/volatile/tests.rs +++ b/crates/vm/src/system/memory/volatile/tests.rs @@ -3,7 +3,7 @@ use std::{collections::HashSet, iter, sync::Arc}; use openvm_circuit_primitives::var_range::{VariableRangeCheckerBus, VariableRangeCheckerChip}; use openvm_stark_backend::{ interaction::BusIndex, - p3_field::FieldAlgebra, + p3_field::PrimeCharacteristicRing, p3_matrix::dense::RowMajorMatrix, prover::{cpu::CpuBackend, types::AirProvingContext}, AirRef, Chip, @@ -40,8 +40,8 @@ fn boundary_air_test() { let num_addresses = 10; let mut distinct_addresses = HashSet::new(); while distinct_addresses.len() < num_addresses { - let addr_space = rng.gen_range(0..MAX_ADDRESS_SPACE); - let pointer = rng.gen_range(0..MAX_VAL); + let addr_space = rng.random_range(0..MAX_ADDRESS_SPACE); + let pointer = rng.random_range(0..MAX_VAL); distinct_addresses.insert((addr_space, pointer)); } @@ -53,8 +53,8 @@ fn boundary_air_test() { let mut final_memory = TimestampedEquipartition::new(); for (addr_space, pointer) in distinct_addresses.iter().cloned() { - let final_data = Val::from_canonical_u32(rng.gen_range(0..MAX_VAL)); - let final_clk = rng.gen_range(1..MAX_VAL) as u32; + let final_data = Val::from_u32(rng.random_range(0..MAX_VAL)); + let final_clk = rng.random_range(1..MAX_VAL) as u32; final_memory.push(( (addr_space, pointer), @@ -77,8 +77,8 @@ fn boundary_air_test() { .flat_map(|(addr_space, pointer)| { vec![ Val::ONE, - Val::from_canonical_u32(*addr_space), - Val::from_canonical_u32(*pointer), + Val::from_u32(*addr_space), + Val::from_u32(*pointer), Val::ZERO, Val::ZERO, ] @@ -99,10 +99,10 @@ fn boundary_air_test() { vec![ Val::ONE, - Val::from_canonical_u32(*addr_space), - Val::from_canonical_u32(*pointer), + Val::from_u32(*addr_space), + Val::from_u32(*pointer), timestamped_value.values[0], - Val::from_canonical_u32(timestamped_value.timestamp), + Val::from_u32(timestamped_value.timestamp), ] }) .chain(iter::repeat_n(Val::ZERO, 5 * diff_height)) diff --git a/crates/vm/src/system/mod.rs b/crates/vm/src/system/mod.rs index d1ecb2daf1..fa11f0952d 100644 --- a/crates/vm/src/system/mod.rs +++ b/crates/vm/src/system/mod.rs @@ -32,7 +32,8 @@ use crate::{ ChipInventoryError, DenseRecordArena, ExecutionBridge, ExecutionBus, ExecutionState, ExecutorInventory, ExecutorInventoryError, MatrixRecordArena, PhantomSubExecutor, RowMajorMatrixArena, SystemConfig, VmAirWrapper, VmBuilder, VmChipComplex, VmChipWrapper, - VmCircuitConfig, VmExecutionConfig, CONNECTOR_AIR_ID, PROGRAM_AIR_ID, PUBLIC_VALUES_AIR_ID, + VmCircuitConfig, VmExecutionConfig, VmField, CONNECTOR_AIR_ID, PROGRAM_AIR_ID, + PUBLIC_VALUES_AIR_ID, }, system::{ connector::VmConnectorChip, @@ -293,7 +294,11 @@ impl VmExecutionConfig for SystemConfig { } } -impl VmCircuitConfig for SystemConfig { +impl VmCircuitConfig for SystemConfig +where + SC: StarkGenericConfig, + Val: VmField, +{ /// Every VM circuit within the OpenVM circuit architecture **must** be initialized from the /// [SystemConfig]. fn create_airs(&self) -> Result, AirInventoryError> { @@ -355,7 +360,10 @@ impl VmCircuitConfig for SystemConfig { /// Base system chips for CPU backend. These chips must exactly correspond to the AIRs in /// [SystemAirInventory]. -pub struct SystemChipInventory { +pub struct SystemChipInventory +where + Val: VmField, +{ pub program_chip: ProgramChip, pub connector_chip: VmConnectorChip>, /// Contains all memory chips @@ -367,7 +375,7 @@ pub struct SystemChipInventory { // the buses for tracegen. We leave it to use old interfaces. impl SystemChipInventory where - Val: PrimeField32, + Val: VmField, { pub fn new( config: &SystemConfig, @@ -434,7 +442,7 @@ impl SystemChipComplex> for SystemChipInventory where RA: RowMajorMatrixArena>, SC: StarkGenericConfig, - Val: PrimeField32, + Val: VmField, { fn load_program(&mut self, cached_program_trace: CommittedTraceData>) { let _ = self.program_chip.cached.replace(cached_program_trace); @@ -548,7 +556,7 @@ impl VmBuilder for SystemCpuBuilder where SC: StarkGenericConfig, E: StarkEngine, PD = CpuDevice>, - Val: PrimeField32, + Val: VmField, { type VmConfig = SystemConfig; type RecordArena = MatrixRecordArena>; @@ -623,7 +631,7 @@ where impl SystemWithFixedTraceHeights for SystemChipInventory where - Val: PrimeField32, + Val: VmField, { /// Warning: this does not set the override for the PublicValuesChip. The PublicValuesChip /// override must be set via the RecordArena. diff --git a/crates/vm/src/system/native_adapter/mod.rs b/crates/vm/src/system/native_adapter/mod.rs index c871d2e4ae..52247f807c 100644 --- a/crates/vm/src/system/native_adapter/mod.rs +++ b/crates/vm/src/system/native_adapter/mod.rs @@ -23,7 +23,7 @@ use openvm_instructions::{ use openvm_stark_backend::{ interaction::InteractionBuilder, p3_air::BaseAir, - p3_field::{Field, FieldAlgebra, PrimeField32}, + p3_field::{Field, PrimeCharacteristicRing, PrimeField32}, }; use util::{tracing_read_or_imm_native, tracing_write_native}; @@ -83,7 +83,7 @@ impl VmAdapterAir let mut timestamp_delta = 0usize; let mut timestamp_pp = || { timestamp_delta += 1; - timestamp + AB::F::from_canonical_usize(timestamp_delta - 1) + timestamp + AB::F::from_usize(timestamp_delta - 1) }; for (i, r_cols) in cols.reads_aux.iter().enumerate() { @@ -140,7 +140,7 @@ impl VmAdapterAir addr_c.address_space, ], cols.from_state, - AB::F::from_canonical_usize(timestamp_delta), + AB::F::from_usize(timestamp_delta), (DEFAULT_PC_STEP, ctx.to_pc), ) .eval(builder, ctx.instruction.is_valid); @@ -275,7 +275,7 @@ impl AdapterTraceFiller adapter_row.writes_aux[0].write_aux.as_mut(), ); adapter_row.writes_aux[0].address.pointer = record.write_ptr[0]; - adapter_row.writes_aux[0].address.address_space = F::from_canonical_u32(NATIVE_AS); + adapter_row.writes_aux[0].address.address_space = F::from_u32(NATIVE_AS); } adapter_row @@ -294,9 +294,9 @@ impl AdapterTraceFiller read_cols.read_aux.as_mut(), ); read_cols.address.pointer = *ptr_or_imm; - read_cols.address.address_space = F::from_canonical_u32(RV32_IMM_AS); + read_cols.address.address_space = F::from_u32(RV32_IMM_AS); } else { - read_cols.read_aux.is_zero_aux = F::from_canonical_u32(NATIVE_AS).inverse(); + read_cols.read_aux.is_zero_aux = F::from_u32(NATIVE_AS).inverse(); read_cols.read_aux.is_immediate = F::ZERO; mem_helper.fill( read_record.prev_timestamp, @@ -304,11 +304,11 @@ impl AdapterTraceFiller read_cols.read_aux.as_mut(), ); read_cols.address.pointer = *ptr_or_imm; - read_cols.address.address_space = F::from_canonical_u32(NATIVE_AS); + read_cols.address.address_space = F::from_u32(NATIVE_AS); } }); - adapter_row.from_state.timestamp = F::from_canonical_u32(record.from_timestamp); - adapter_row.from_state.pc = F::from_canonical_u32(record.from_pc); + adapter_row.from_state.timestamp = F::from_u32(record.from_timestamp); + adapter_row.from_state.pc = F::from_u32(record.from_pc); } } diff --git a/crates/vm/src/system/native_adapter/util.rs b/crates/vm/src/system/native_adapter/util.rs index d4486d5bc2..8eb6222eee 100644 --- a/crates/vm/src/system/native_adapter/util.rs +++ b/crates/vm/src/system/native_adapter/util.rs @@ -164,7 +164,7 @@ pub fn tracing_write_native_inplace( F: PrimeField32, { let (t_prev, data_prev) = timed_write_native(memory, ptr, vals); - cols.base.set_prev(F::from_canonical_u32(t_prev)); + cols.base.set_prev(F::from_u32(t_prev)); cols.prev_data = data_prev; } @@ -181,7 +181,7 @@ where F: PrimeField32, { debug_assert!( - addr_space == F::ZERO || addr_space == F::from_canonical_u32(NATIVE_AS), + addr_space == F::ZERO || addr_space == F::from_u32(NATIVE_AS), "addr_space={addr_space} is not valid" ); diff --git a/crates/vm/src/system/phantom/mod.rs b/crates/vm/src/system/phantom/mod.rs index 1112c812a2..752ea5e0fa 100644 --- a/crates/vm/src/system/phantom/mod.rs +++ b/crates/vm/src/system/phantom/mod.rs @@ -16,7 +16,7 @@ use openvm_instructions::{ use openvm_stark_backend::{ interaction::InteractionBuilder, p3_air::{Air, AirBuilder, BaseAir}, - p3_field::{Field, FieldAlgebra, PrimeField32}, + p3_field::{Field, PrimeCharacteristicRing, PrimeField32}, p3_matrix::Matrix, rap::{BaseAirWithPublicValues, PartitionedBaseAir}, }; @@ -72,7 +72,7 @@ impl BaseAirWithPublicValues for PhantomAir {} impl Air for PhantomAir { fn eval(&self, builder: &mut AB) { let main = builder.main(); - let local = main.row_slice(0); + let local = main.row_slice(0).expect("window should have two elements"); let &PhantomCols { pc, operands, @@ -86,7 +86,7 @@ impl Air for PhantomAir { operands, ExecutionState::::new(pc, timestamp), AB::Expr::ONE, - PcIncOrSet::Inc(AB::Expr::from_canonical_u32(DEFAULT_PC_STEP)), + PcIncOrSet::Inc(AB::Expr::from_u32(DEFAULT_PC_STEP)), ) .eval(builder, is_valid); } @@ -206,11 +206,11 @@ impl TraceFiller for PhantomFiller { // SAFETY: must assign in reverse order of column struct to prevent overwriting // borrowed data row.is_valid = F::ONE; - row.timestamp = F::from_canonical_u32(record.timestamp); - row.operands[2] = F::from_canonical_u32(record.operands[2]); - row.operands[1] = F::from_canonical_u32(record.operands[1]); - row.operands[0] = F::from_canonical_u32(record.operands[0]); - row.pc = F::from_canonical_u32(record.pc) + row.timestamp = F::from_u32(record.timestamp); + row.operands[2] = F::from_u32(record.operands[2]); + row.operands[1] = F::from_u32(record.operands[1]); + row.operands[0] = F::from_u32(record.operands[0]); + row.pc = F::from_u32(record.pc) } } diff --git a/crates/vm/src/system/phantom/tests.rs b/crates/vm/src/system/phantom/tests.rs index 58a27d00ca..71a14e46d2 100644 --- a/crates/vm/src/system/phantom/tests.rs +++ b/crates/vm/src/system/phantom/tests.rs @@ -1,5 +1,5 @@ use openvm_instructions::{instruction::Instruction, SystemOpcode, VmOpcode}; -use openvm_stark_backend::p3_field::{FieldAlgebra, PrimeField32}; +use openvm_stark_backend::p3_field::{PrimeCharacteristicRing, PrimeField32}; use openvm_stark_sdk::p3_baby_bear::BabyBear; use super::PhantomExecutor; @@ -30,7 +30,7 @@ fn run_phantom_test( for _ in 0..num_nops { tester.execute_with_pc(executor, arena, &nop, state.pc.as_canonical_u32()); let new_state = tester.execution_final_state(); - assert_eq!(state.pc + F::from_canonical_usize(4), new_state.pc); + assert_eq!(state.pc + F::from_usize(4), new_state.pc); assert_eq!(state.timestamp + F::ONE, new_state.timestamp); state = new_state; } diff --git a/crates/vm/src/system/poseidon2/air.rs b/crates/vm/src/system/poseidon2/air.rs index 81b99148e5..704a46d467 100644 --- a/crates/vm/src/system/poseidon2/air.rs +++ b/crates/vm/src/system/poseidon2/air.rs @@ -53,7 +53,7 @@ impl Air self.subair.eval(&mut sub_builder); let main = builder.main(); - let local = main.row_slice(0); + let local = main.row_slice(0).expect("row 0 present"); let cols: &Poseidon2PeripheryCols = (*local).borrow(); let input: [AB::Var; POSEIDON2_WIDTH] = cols.inner.inputs; diff --git a/crates/vm/src/system/poseidon2/chip.rs b/crates/vm/src/system/poseidon2/chip.rs index f7053edcb5..182365047f 100644 --- a/crates/vm/src/system/poseidon2/chip.rs +++ b/crates/vm/src/system/poseidon2/chip.rs @@ -8,26 +8,26 @@ use std::{ use dashmap::DashMap; use openvm_poseidon2_air::{Poseidon2Config, Poseidon2SubChip}; -use openvm_stark_backend::{ - interaction::{BusIndex, LookupBus}, - p3_field::{Field, PrimeField32}, -}; +use openvm_stark_backend::interaction::{BusIndex, LookupBus}; use rustc_hash::FxBuildHasher; use super::{ air::Poseidon2PeripheryAir, PERIPHERY_POSEIDON2_CHUNK_SIZE, PERIPHERY_POSEIDON2_WIDTH, }; -use crate::arch::hasher::{Hasher, HasherChip}; +use crate::arch::{ + hasher::{Hasher, HasherChip}, + VmField, +}; #[derive(Debug)] -pub struct Poseidon2PeripheryBaseChip { +pub struct Poseidon2PeripheryBaseChip { pub air: Arc>, pub subchip: Poseidon2SubChip, pub records: DashMap<[F; PERIPHERY_POSEIDON2_WIDTH], AtomicU32, FxBuildHasher>, pub nonempty: AtomicBool, } -impl Poseidon2PeripheryBaseChip { +impl Poseidon2PeripheryBaseChip { pub fn new(poseidon2_config: Poseidon2Config, bus_idx: BusIndex) -> Self { let subchip = Poseidon2SubChip::new(poseidon2_config.constants); Self { @@ -42,7 +42,7 @@ impl Poseidon2PeripheryBaseChip Hasher +impl Hasher for Poseidon2PeripheryBaseChip { fn compress( @@ -59,7 +59,7 @@ impl Hasher HasherChip +impl HasherChip for Poseidon2PeripheryBaseChip { /// Key method for Hasher trait. diff --git a/crates/vm/src/system/poseidon2/mod.rs b/crates/vm/src/system/poseidon2/mod.rs index 608e5e5d02..43e524df09 100644 --- a/crates/vm/src/system/poseidon2/mod.rs +++ b/crates/vm/src/system/poseidon2/mod.rs @@ -15,7 +15,6 @@ use openvm_poseidon2_air::{Poseidon2Config, Poseidon2SubAir}; use openvm_stark_backend::{ config::{StarkGenericConfig, Val}, interaction::{BusIndex, LookupBus}, - p3_field::{Field, PrimeField32}, AirRef, ChipUsageGetter, }; @@ -27,7 +26,10 @@ mod chip; pub use chip::*; use crate::{ - arch::hasher::{Hasher, HasherChip}, + arch::{ + hasher::{Hasher, HasherChip}, + VmField, + }, system::poseidon2::air::Poseidon2PeripheryAir, }; pub mod columns; @@ -37,12 +39,12 @@ pub const PERIPHERY_POSEIDON2_WIDTH: usize = 16; pub const PERIPHERY_POSEIDON2_CHUNK_SIZE: usize = 8; #[derive(Chip)] -#[chip(where = "F: Field")] -pub enum Poseidon2PeripheryChip { +#[chip(where = "F: VmField")] +pub enum Poseidon2PeripheryChip { Register0(Poseidon2PeripheryBaseChip), Register1(Poseidon2PeripheryBaseChip), } -impl Poseidon2PeripheryChip { +impl Poseidon2PeripheryChip { pub fn new( poseidon2_config: Poseidon2Config, bus_idx: BusIndex, @@ -56,11 +58,15 @@ impl Poseidon2PeripheryChip { } } -pub fn new_poseidon2_periphery_air( +pub fn new_poseidon2_periphery_air( poseidon2_config: Poseidon2Config>, direct_bus: LookupBus, max_constraint_degree: usize, -) -> AirRef { +) -> AirRef +where + SC: StarkGenericConfig, + Val: VmField, +{ if max_constraint_degree >= 7 { Arc::new(Poseidon2PeripheryAir::, 0>::new( Arc::new(Poseidon2SubAir::new(poseidon2_config.constants.into())), @@ -74,7 +80,7 @@ pub fn new_poseidon2_periphery_air( } } -impl ChipUsageGetter for Poseidon2PeripheryChip { +impl ChipUsageGetter for Poseidon2PeripheryChip { fn air_name(&self) -> String { match self { Poseidon2PeripheryChip::Register0(chip) => chip.air_name(), @@ -97,7 +103,7 @@ impl ChipUsageGetter for Poseidon2PeripheryChip { } } -impl Hasher for Poseidon2PeripheryChip { +impl Hasher for Poseidon2PeripheryChip { fn compress( &self, lhs: &[F; PERIPHERY_POSEIDON2_CHUNK_SIZE], @@ -110,7 +116,7 @@ impl Hasher for Poseidon2Per } } -impl HasherChip for Poseidon2PeripheryChip { +impl HasherChip for Poseidon2PeripheryChip { fn compress_and_record( &self, lhs: &[F; PERIPHERY_POSEIDON2_CHUNK_SIZE], diff --git a/crates/vm/src/system/poseidon2/tests.rs b/crates/vm/src/system/poseidon2/tests.rs index 31cbe9ff47..caafceacac 100644 --- a/crates/vm/src/system/poseidon2/tests.rs +++ b/crates/vm/src/system/poseidon2/tests.rs @@ -1,7 +1,7 @@ use openvm_poseidon2_air::Poseidon2Config; use openvm_stark_backend::{ interaction::LookupBus, - p3_field::{FieldAlgebra, PrimeField32}, + p3_field::{PrimeCharacteristicRing, PrimeField32}, AirRef, }; use openvm_stark_sdk::{ @@ -46,8 +46,8 @@ fn poseidon2_periphery_direct_test() { [BabyBear; PERIPHERY_POSEIDON2_CHUNK_SIZE], ); NUM_OPS] = std::array::from_fn(|_| { ( - std::array::from_fn(|_| BabyBear::from_canonical_u32(rng.next_u32() % (1 << 30))), - std::array::from_fn(|_| BabyBear::from_canonical_u32(rng.next_u32() % (1 << 30))), + std::array::from_fn(|_| BabyBear::from_u32(rng.next_u32() % (1 << 30))), + std::array::from_fn(|_| BabyBear::from_u32(rng.next_u32() % (1 << 30))), ) }); let (air, chip) = create_test_chip(); @@ -94,8 +94,8 @@ fn poseidon2_periphery_duplicate_hashes_test() { [BabyBear; PERIPHERY_POSEIDON2_CHUNK_SIZE], ); NUM_OPS] = std::array::from_fn(|_| { ( - std::array::from_fn(|_| BabyBear::from_canonical_u32(rng.next_u32() % (1 << 30))), - std::array::from_fn(|_| BabyBear::from_canonical_u32(rng.next_u32() % (1 << 30))), + std::array::from_fn(|_| BabyBear::from_u32(rng.next_u32() % (1 << 30))), + std::array::from_fn(|_| BabyBear::from_u32(rng.next_u32() % (1 << 30))), ) }); let counts: [u32; NUM_OPS] = std::array::from_fn(|_| rng.next_u32() % 20); @@ -104,7 +104,7 @@ fn poseidon2_periphery_duplicate_hashes_test() { let outs: [[BabyBear; PERIPHERY_POSEIDON2_CHUNK_SIZE]; NUM_OPS] = std::array::from_fn(|i| { for _ in 0..counts[i] { - chip.compress_and_record(&hashes[i].0, &hashes[i].1); + let _ = chip.compress_and_record(&hashes[i].0, &hashes[i].1); } chip.compress(&hashes[i].0, &hashes[i].1) }); diff --git a/crates/vm/src/system/poseidon2/trace.rs b/crates/vm/src/system/poseidon2/trace.rs index 7a1d8711df..bef5c92edc 100644 --- a/crates/vm/src/system/poseidon2/trace.rs +++ b/crates/vm/src/system/poseidon2/trace.rs @@ -4,7 +4,7 @@ use openvm_circuit_primitives::utils::next_power_of_two_or_zero; use openvm_stark_backend::{ config::{StarkGenericConfig, Val}, p3_air::BaseAir, - p3_field::{FieldAlgebra, PrimeField32}, + p3_field::PrimeCharacteristicRing, p3_matrix::dense::RowMajorMatrix, p3_maybe_rayon::prelude::*, prover::{cpu::CpuBackend, types::AirProvingContext}, @@ -12,11 +12,12 @@ use openvm_stark_backend::{ }; use super::{columns::*, Poseidon2PeripheryBaseChip, PERIPHERY_POSEIDON2_WIDTH}; +use crate::arch::VmField; impl Chip> for Poseidon2PeripheryBaseChip, SBOX_REGISTERS> where - Val: PrimeField32, + Val: VmField, { /// Generates trace and clears internal records state. fn generate_proving_ctx(&self, _: RA) -> AirProvingContext> { @@ -53,7 +54,7 @@ where // WARNING: Poseidon2SubCols must be the first field in Poseidon2PeripheryCols row[..inner_width].copy_from_slice(inner_row); let cols: &mut Poseidon2PeripheryCols, SBOX_REGISTERS> = row.borrow_mut(); - cols.mult = Val::::from_canonical_u32(mult); + cols.mult = Val::::from_u32(mult); }); self.records.clear(); @@ -61,7 +62,7 @@ where } } -impl ChipUsageGetter +impl ChipUsageGetter for Poseidon2PeripheryBaseChip { fn air_name(&self) -> String { diff --git a/crates/vm/src/system/program/air.rs b/crates/vm/src/system/program/air.rs index 7d085877f8..aa5af687a9 100644 --- a/crates/vm/src/system/program/air.rs +++ b/crates/vm/src/system/program/air.rs @@ -57,8 +57,8 @@ impl Air for ProgramAir { let common_trace = builder.common_main(); let cached_trace = &builder.cached_mains()[0]; - let exec_freq = common_trace.row_slice(0)[0]; - let exec_cols = cached_trace.row_slice(0).to_vec(); + let exec_freq = common_trace.row_slice(0).expect("row 0 present")[0]; + let exec_cols = cached_trace.row_slice(0).expect("row 0 present").to_vec(); self.bus .inner diff --git a/crates/vm/src/system/program/bus.rs b/crates/vm/src/system/program/bus.rs index 0fddb04a7f..bf355b9646 100644 --- a/crates/vm/src/system/program/bus.rs +++ b/crates/vm/src/system/program/bus.rs @@ -2,7 +2,7 @@ use std::iter; use openvm_stark_backend::{ interaction::{BusIndex, InteractionBuilder, LookupBus}, - p3_field::FieldAlgebra, + p3_field::PrimeCharacteristicRing, }; #[derive(Debug, Clone, Copy)] diff --git a/crates/vm/src/system/program/tests/mod.rs b/crates/vm/src/system/program/tests/mod.rs index 118c4b4dbd..a87b239518 100644 --- a/crates/vm/src/system/program/tests/mod.rs +++ b/crates/vm/src/system/program/tests/mod.rs @@ -13,7 +13,7 @@ use openvm_rv32im_transpiler::BranchEqualOpcode::*; use openvm_stark_backend::{ config::StarkGenericConfig, engine::StarkEngine, - p3_field::FieldAlgebra, + p3_field::PrimeCharacteristicRing, p3_matrix::{dense::RowMajorMatrix, Matrix}, prover::types::AirProvingContext, Chip, @@ -75,8 +75,8 @@ fn interaction_test(program: Program, execution: Vec) { let option = program.get_instruction_and_debug_info(index); if let Some((instruction, _)) = option { program_cells.extend([ - BabyBear::from_canonical_u32(frequency), - BabyBear::from_canonical_usize(index * (DEFAULT_PC_STEP as usize)), + BabyBear::from_u32(frequency), + BabyBear::from_usize(index * (DEFAULT_PC_STEP as usize)), instruction.opcode.to_field(), instruction.a, instruction.b, @@ -216,8 +216,8 @@ fn test_program_negative() { let mut program_rows = vec![]; for (pc_idx, instruction) in instructions.iter().enumerate() { program_rows.extend(vec![ - BabyBear::from_canonical_u32(execution_frequencies[pc_idx]), - BabyBear::from_canonical_usize(pc_idx * DEFAULT_PC_STEP as usize), + BabyBear::from_u32(execution_frequencies[pc_idx]), + BabyBear::from_usize(pc_idx * DEFAULT_PC_STEP as usize), instruction.opcode.to_field(), instruction.a, instruction.b, diff --git a/crates/vm/src/system/program/trace.rs b/crates/vm/src/system/program/trace.rs index d22a5ba136..070d6cae23 100644 --- a/crates/vm/src/system/program/trace.rs +++ b/crates/vm/src/system/program/trace.rs @@ -11,7 +11,7 @@ use openvm_instructions::{ use openvm_stark_backend::{ config::{Com, PcsProverData, StarkGenericConfig, Val}, p3_commit::Pcs, - p3_field::{Field, FieldAlgebra, PrimeField32}, + p3_field::{Field, PrimeCharacteristicRing, PrimeField32}, p3_matrix::{dense::RowMajorMatrix, Matrix}, p3_maybe_rayon::prelude::*, p3_util::log2_strict_usize, @@ -114,7 +114,7 @@ impl VmCommittedExe { &hasher, app_program_commit, &init_memory_commit, - Val::::from_canonical_u32(exe.pc_start), + Val::::from_u32(exe.pc_start), )) } } @@ -132,7 +132,7 @@ impl Chip> for ProgramChip { freqs .par_iter_mut() .zip(self.filtered_exec_frequencies.par_iter()) - .for_each(|(f, x)| *f = Val::::from_canonical_u32(*x)); + .for_each(|(f, x)| *f = Val::::from_u32(*x)); let common_trace = RowMajorMatrix::new_col(freqs); AirProvingContext { cached_mains: vec![cached], @@ -185,7 +185,7 @@ pub(crate) fn generate_cached_trace(program: &Program) -> RowMajorM .for_each(|(row, (pc, instruction))| { let row: &mut ProgramExecutionCols = row.borrow_mut(); *row = ProgramExecutionCols { - pc: F::from_canonical_u32(pc), + pc: F::from_u32(pc), opcode: instruction.opcode.to_field(), a: instruction.a, b: instruction.b, diff --git a/crates/vm/src/system/public_values/core.rs b/crates/vm/src/system/public_values/core.rs index 96add76bbb..1c8068ae05 100644 --- a/crates/vm/src/system/public_values/core.rs +++ b/crates/vm/src/system/public_values/core.rs @@ -11,7 +11,7 @@ use openvm_instructions::{ use openvm_stark_backend::{ interaction::InteractionBuilder, p3_air::{AirBuilder, AirBuilderWithPublicValues, BaseAir}, - p3_field::{Field, FieldAlgebra, PrimeField32}, + p3_field::{Field, PrimeCharacteristicRing, PrimeField32}, rap::BaseAirWithPublicValues, }; @@ -81,7 +81,7 @@ impl VmCoreAir(&vars)); @@ -96,7 +96,7 @@ impl VmCoreAir PartitionedBaseAir for PublicValuesCoreAir {} impl Air for PublicValuesCoreAir { fn eval(&self, builder: &mut AB) { let main = builder.main(); - let local_core = main.row_slice(0); + let local_core = main.row_slice(0).expect("window should have two elements"); // It's never used, so pick any value. let dummy_pc = local_core[0]; VmCoreAir::>::eval(self, builder, &local_core, dummy_pc); @@ -142,34 +142,25 @@ fn set_and_execute( E: PreflightExecutor, RA: Arena, { - let (b, e) = if rng.gen_bool(0.5) { - let val = F::from_canonical_u32(rng.gen_range(0..F::ORDER_U32)); + let (b, e) = if rng.random_bool(0.5) { + let val = F::from_u32(rng.random_range(0..F::ORDER_U32)); public_values.push(val); - (val, F::from_canonical_u32(RV32_IMM_AS)) + (val, F::from_u32(RV32_IMM_AS)) } else { let ptr = gen_pointer(rng, 4); - let val = F::from_canonical_u32(rng.gen_range(0..F::ORDER_U32)); + let val = F::from_u32(rng.random_range(0..F::ORDER_U32)); public_values.push(val); tester.write(NATIVE_AS as usize, ptr, [val]); - ( - F::from_canonical_u32(ptr as u32), - F::from_canonical_u32(NATIVE_AS), - ) + (F::from_u32(ptr as u32), F::from_u32(NATIVE_AS)) }; - let (c, f) = if rng.gen_bool(0.5) { - ( - F::from_canonical_u32(idx), - F::from_canonical_u32(RV32_IMM_AS), - ) + let (c, f) = if rng.random_bool(0.5) { + (F::from_u32(idx), F::from_u32(RV32_IMM_AS)) } else { let ptr = gen_pointer(rng, 4); - let val = F::from_canonical_u32(idx); + let val = F::from_u32(idx); tester.write(NATIVE_AS as usize, ptr, [val]); - ( - F::from_canonical_u32(ptr as u32), - F::from_canonical_u32(NATIVE_AS), - ) + (F::from_u32(ptr as u32), F::from_u32(NATIVE_AS)) }; let instruction = Instruction { @@ -221,8 +212,8 @@ fn public_values_rand_test() { fn public_values_happy_path_1() { let cols = PublicValuesCoreColsView:: { is_valid: F::ONE, - value: F::from_canonical_u32(12), - index: F::from_canonical_u32(2), + value: F::from_u32(12), + index: F::from_u32(2), custom_pv_vars: to_field_vec(vec![1, 0]), _marker: Default::default(), }; @@ -241,8 +232,8 @@ fn public_values_happy_path_1() { fn public_values_neg_pv_not_match() { let cols = PublicValuesCoreColsView:: { is_valid: F::ONE, - value: F::from_canonical_u32(12), - index: F::from_canonical_u32(2), + value: F::from_u32(12), + index: F::from_u32(2), custom_pv_vars: to_field_vec(vec![1, 0]), _marker: Default::default(), }; @@ -265,8 +256,8 @@ fn public_values_neg_pv_not_match() { fn public_values_neg_index_out_of_bound() { let cols = PublicValuesCoreColsView:: { is_valid: F::ONE, - value: F::from_canonical_u32(12), - index: F::from_canonical_u32(8), + value: F::from_u32(12), + index: F::from_u32(8), custom_pv_vars: to_field_vec(vec![0, 0]), _marker: Default::default(), }; @@ -296,15 +287,15 @@ fn public_values_neg_double_publish_impl(actual_pv: u32) { let rows = [ PublicValuesCoreColsView:: { is_valid: F::ONE, - value: F::from_canonical_u32(12), - index: F::from_canonical_u32(0), + value: F::from_u32(12), + index: F::from_u32(0), custom_pv_vars: to_field_vec(vec![0, 1]), _marker: Default::default(), }, PublicValuesCoreColsView:: { is_valid: F::ONE, - value: F::from_canonical_u32(13), - index: F::from_canonical_u32(0), + value: F::from_u32(13), + index: F::from_u32(0), custom_pv_vars: to_field_vec(vec![0, 1]), _marker: Default::default(), }, diff --git a/crates/vm/src/utils/test_utils.rs b/crates/vm/src/utils/test_utils.rs index c933d8b63e..fd24b72ac6 100644 --- a/crates/vm/src/utils/test_utils.rs +++ b/crates/vm/src/utils/test_utils.rs @@ -12,16 +12,16 @@ use crate::system::memory::{merkle::public_values::PUBLIC_VALUES_AS, online::PAG pub fn i32_to_f(val: i32) -> F { if val.signum() == -1 { - -F::from_canonical_u32(val.unsigned_abs()) + -F::from_u32(val.unsigned_abs()) } else { - F::from_canonical_u32(val as u32) + F::from_u32(val as u32) } } pub fn generate_long_number( rng: &mut StdRng, ) -> [u32; NUM_LIMBS] { - array::from_fn(|_| rng.gen_range(0..(1 << LIMB_BITS))) + array::from_fn(|_| rng.random_range(0..(1 << LIMB_BITS))) } // in little endian diff --git a/extensions/algebra/circuit/src/extension/mod.rs b/extensions/algebra/circuit/src/extension/mod.rs index 35e0aebfc4..d9b03d3d59 100644 --- a/extensions/algebra/circuit/src/extension/mod.rs +++ b/extensions/algebra/circuit/src/extension/mod.rs @@ -4,7 +4,7 @@ use num_bigint::BigUint; use openvm_circuit::{ arch::{ AirInventory, ChipInventoryError, InitFileGenerator, MatrixRecordArena, SystemConfig, - VmBuilder, VmChipComplex, VmProverExtension, + VmBuilder, VmChipComplex, VmField, VmProverExtension, }, system::{SystemChipInventory, SystemCpuBuilder, SystemExecutor}, }; @@ -14,7 +14,6 @@ use openvm_rv32im_circuit::{ }; use openvm_stark_backend::{ config::{StarkGenericConfig, Val}, - p3_field::PrimeField32, prover::cpu::{CpuBackend, CpuDevice}, }; use openvm_stark_sdk::engine::StarkEngine; @@ -120,7 +119,7 @@ impl VmBuilder for Rv32ModularCpuBuilder where SC: StarkGenericConfig, E: StarkEngine, PD = CpuDevice>, - Val: PrimeField32, + Val: VmField, { type VmConfig = Rv32ModularConfig; type SystemChipInventory = SystemChipInventory; @@ -156,7 +155,7 @@ impl VmBuilder for Rv32ModularWithFp2CpuBuilder where SC: StarkGenericConfig, E: StarkEngine, PD = CpuDevice>, - Val: PrimeField32, + Val: VmField, { type VmConfig = Rv32ModularWithFp2Config; type SystemChipInventory = SystemChipInventory; diff --git a/extensions/algebra/circuit/src/extension/modular.rs b/extensions/algebra/circuit/src/extension/modular.rs index aad0457ddd..d2071ec065 100644 --- a/extensions/algebra/circuit/src/extension/modular.rs +++ b/extensions/algebra/circuit/src/extension/modular.rs @@ -1,6 +1,6 @@ use std::{array, sync::Arc}; -use num_bigint::{BigUint, RandBigInt}; +use num_bigint::BigUint; use num_traits::{FromPrimitive, One}; use openvm_algebra_transpiler::{ModularPhantom, Rv32ModularArithmeticOpcode}; use openvm_circuit::{ @@ -32,7 +32,7 @@ use openvm_stark_backend::{ prover::cpu::{CpuBackend, CpuDevice}, }; use openvm_stark_sdk::engine::StarkEngine; -use rand::Rng; +use rand::RngCore; use serde::{Deserialize, Serialize}; use serde_with::{serde_as, DisplayFromStr}; use strum::EnumCount; @@ -573,7 +573,7 @@ pub(crate) mod phantom { .chain( sqrt.to_bytes_le() .into_iter() - .map(F::from_canonical_u8) + .map(F::from_u8) .chain(repeat(F::ZERO)) .take(num_limbs), ) @@ -638,7 +638,7 @@ pub(crate) mod phantom { let hint_bytes = self.non_qrs[mod_idx] .to_bytes_le() .into_iter() - .map(F::from_canonical_u8) + .map(F::from_u8) .chain(repeat(F::ZERO)) .take(num_limbs) .collect(); @@ -704,7 +704,7 @@ pub fn mod_sqrt(x: &BigUint, modulus: &BigUint, non_qr: &BigUint) -> Option BigUint { +pub fn find_non_qr(modulus: &BigUint, rng: &mut impl RngCore) -> BigUint { if modulus % 4u32 == BigUint::from(3u8) { // p = 3 mod 4 then -1 is a quadratic residue modulus - BigUint::one() @@ -713,20 +713,23 @@ pub fn find_non_qr(modulus: &BigUint, rng: &mut impl Rng) -> BigUint { // since 2^((p-1)/2) = (-1)^((p^2-1)/8) BigUint::from_u8(2u8).unwrap() } else { - let mut non_qr = rng.gen_biguint_range( - &BigUint::from_u8(2).unwrap(), - &(modulus - BigUint::from_u8(1).unwrap()), - ); - // To check if non_qr is a quadratic nonresidue, we compute non_qr^((p-1)/2) - // If the result is p-1, then non_qr is a quadratic nonresidue - // Otherwise, non_qr is a quadratic residue + // Sample uniformly from [2, modulus - 1) using rejection sampling + let range = modulus - 3u32; // number of values in [2, modulus-1) + let mut buf = vec![0u8; modulus.to_bytes_be().len()]; let exponent = (modulus - BigUint::one()) >> 1; - while non_qr.modpow(&exponent, modulus) != modulus - BigUint::one() { - non_qr = rng.gen_biguint_range( - &BigUint::from_u8(2).unwrap(), - &(modulus - BigUint::from_u8(1).unwrap()), - ); + loop { + // Rejection sample for uniform distribution + rng.fill_bytes(&mut buf); + let val = BigUint::from_bytes_be(&buf); + if val >= range { + continue; + } + let non_qr = val + 2u32; + // To check if non_qr is a quadratic nonresidue, we compute non_qr^((p-1)/2) + // If the result is p-1, then non_qr is a quadratic nonresidue + if non_qr.modpow(&exponent, modulus) == modulus - BigUint::one() { + return non_qr; + } } - non_qr } } diff --git a/extensions/algebra/circuit/src/fp2.rs b/extensions/algebra/circuit/src/fp2.rs index 48fcd535d5..7a62e37733 100644 --- a/extensions/algebra/circuit/src/fp2.rs +++ b/extensions/algebra/circuit/src/fp2.rs @@ -185,7 +185,7 @@ mod tests { use openvm_mod_circuit_builder::{test_utils::*, FieldExpr, FieldExprCols}; use openvm_pairing_guest::bn254::BN254_MODULUS; use openvm_stark_backend::{ - p3_air::BaseAir, p3_field::FieldAlgebra, p3_matrix::dense::RowMajorMatrix, + p3_air::BaseAir, p3_field::PrimeCharacteristicRing, p3_matrix::dense::RowMajorMatrix, }; use openvm_stark_sdk::{ any_rap_arc_vec, config::baby_bear_blake3::BabyBearBlake3Engine, engine::StarkFriEngine, diff --git a/extensions/algebra/circuit/src/fp2_chip/tests.rs b/extensions/algebra/circuit/src/fp2_chip/tests.rs index 46088d914e..1b5376d103 100644 --- a/extensions/algebra/circuit/src/fp2_chip/tests.rs +++ b/extensions/algebra/circuit/src/fp2_chip/tests.rs @@ -26,7 +26,7 @@ use openvm_mod_circuit_builder::{ test_utils::generate_random_biguint, utils::biguint_to_limbs_vec, ExprBuilderConfig, }; use openvm_pairing_guest::{bls12_381::BLS12_381_MODULUS, bn254::BN254_MODULUS}; -use openvm_stark_backend::p3_field::FieldAlgebra; +use openvm_stark_backend::p3_field::PrimeCharacteristicRing; use openvm_stark_sdk::{p3_baby_bear::BabyBear, utils::create_seeded_rng}; use rand::{rngs::StdRng, Rng}; use test_case::test_case; @@ -165,7 +165,7 @@ fn set_and_execute_fp2 Fp2Opcode::ADD as usize, @@ -196,34 +196,34 @@ fn set_and_execute_fp2( ptr_as, rs1_ptr, - a_base_addr.to_le_bytes().map(F::from_canonical_u8), + a_base_addr.to_le_bytes().map(F::from_u8), ); tester.write::( ptr_as, rs2_ptr, - b_base_addr.to_le_bytes().map(F::from_canonical_u8), + b_base_addr.to_le_bytes().map(F::from_u8), ); tester.write::( ptr_as, rd_ptr, - result_base_addr.to_le_bytes().map(F::from_canonical_u8), + result_base_addr.to_le_bytes().map(F::from_u8), ); let a_c0_limbs: Vec = biguint_to_limbs_vec(&a_c0, NUM_LIMBS) .into_iter() - .map(F::from_canonical_u8) + .map(F::from_u8) .collect(); let a_c1_limbs: Vec = biguint_to_limbs_vec(&a_c1, NUM_LIMBS) .into_iter() - .map(F::from_canonical_u8) + .map(F::from_u8) .collect(); let b_c0_limbs: Vec = biguint_to_limbs_vec(&b_c0, NUM_LIMBS) .into_iter() - .map(F::from_canonical_u8) + .map(F::from_u8) .collect(); let b_c1_limbs: Vec = biguint_to_limbs_vec(&b_c1, NUM_LIMBS) .into_iter() - .map(F::from_canonical_u8) + .map(F::from_u8) .collect(); for i in (0..NUM_LIMBS).step_by(BLOCK_SIZE) { diff --git a/extensions/algebra/circuit/src/modular_chip/is_eq.rs b/extensions/algebra/circuit/src/modular_chip/is_eq.rs index 7d1b13a6dd..e47a8a2906 100644 --- a/extensions/algebra/circuit/src/modular_chip/is_eq.rs +++ b/extensions/algebra/circuit/src/modular_chip/is_eq.rs @@ -29,7 +29,7 @@ use openvm_rv32_adapters::Rv32IsEqualModAdapterExecutor; use openvm_stark_backend::{ interaction::InteractionBuilder, p3_air::{AirBuilder, BaseAir}, - p3_field::{Field, FieldAlgebra, PrimeField32}, + p3_field::{Field, PrimeCharacteristicRing, PrimeField32}, rap::BaseAirWithPublicValues, }; @@ -171,21 +171,20 @@ where // If c_lt_mark is 1, then lt_marker_sum is 1 builder .when(cols.is_valid - cols.is_setup) - .when_ne(cols.c_lt_mark, AB::F::from_canonical_u8(2)) + .when_ne(cols.c_lt_mark, AB::F::from_u8(2)) .assert_one(lt_marker_sum.clone()); // If c_lt_mark is 2, then lt_marker_sum is 3 builder .when(cols.is_valid - cols.is_setup) .when_ne(cols.c_lt_mark, AB::F::ONE) - .assert_eq(lt_marker_sum.clone(), AB::F::from_canonical_u8(3)); + .assert_eq(lt_marker_sum.clone(), AB::F::from_u8(3)); // This constraint, along with the constraint (below) that lt_marker[i] is 0, 1, or 2, // ensures that lt_marker has exactly one 2. - builder.when_ne(cols.c_lt_mark, AB::F::ONE).assert_eq( - lt_marker_one_check_sum, - cols.is_valid * AB::F::from_canonical_u8(2), - ); + builder + .when_ne(cols.c_lt_mark, AB::F::ONE) + .assert_eq(lt_marker_one_check_sum, cols.is_valid * AB::F::from_u8(2)); // Handle the setup row constraints. // When is_setup = 1, constrain c_lt_mark = 2 and lt_marker_sum = 2 @@ -194,13 +193,13 @@ where // instead of just for i > b_diff_idx. builder .when(cols.is_setup) - .assert_eq(cols.c_lt_mark, AB::F::from_canonical_u8(2)); + .assert_eq(cols.c_lt_mark, AB::F::from_u8(2)); builder .when(cols.is_setup) - .assert_eq(lt_marker_sum.clone(), AB::F::from_canonical_u8(2)); + .assert_eq(lt_marker_sum.clone(), AB::F::from_u8(2)); // Constrain that b, c < N (i.e. modulus). - let modulus = self.modulus_limbs.map(AB::F::from_canonical_u32); + let modulus = self.modulus_limbs.map(AB::F::from_u32); let mut prefix_sum = AB::Expr::ZERO; for i in (0..READ_LIMBS).rev() { @@ -229,7 +228,7 @@ where // N[i] (i.e. i == b_diff_idx). builder .when_ne(cols.lt_marker[i], AB::F::ZERO) - .when_ne(cols.lt_marker[i], AB::F::from_canonical_u8(2)) + .when_ne(cols.lt_marker[i], AB::F::from_u8(2)) .assert_eq(AB::Expr::from(modulus[i]) - cols.b[i], cols.b_lt_diff); // Constrain c < N. @@ -246,10 +245,7 @@ where // we have {0, 1, 2} \ {0, 3 - c_lt_mark} = {c_lt_mark}. builder .when_ne(cols.lt_marker[i], AB::F::ZERO) - .when_ne( - cols.lt_marker[i], - AB::Expr::from_canonical_u8(3) - cols.c_lt_mark, - ) + .when_ne(cols.lt_marker[i], AB::Expr::from_u8(3) - cols.c_lt_mark) .assert_eq(AB::Expr::from(modulus[i]) - cols.c[i], cols.c_lt_diff); } @@ -261,11 +257,11 @@ where ) .eval(builder, cols.is_valid - cols.is_setup); - let expected_opcode = AB::Expr::from_canonical_usize(self.offset) + let expected_opcode = AB::Expr::from_usize(self.offset) + cols.is_setup - * AB::Expr::from_canonical_usize(Rv32ModularArithmeticOpcode::SETUP_ISEQ as usize) + * AB::Expr::from_usize(Rv32ModularArithmeticOpcode::SETUP_ISEQ as usize) + (AB::Expr::ONE - cols.is_setup) - * AB::Expr::from_canonical_usize(Rv32ModularArithmeticOpcode::IS_EQ as usize); + * AB::Expr::from_usize(Rv32ModularArithmeticOpcode::IS_EQ as usize); let mut a: [AB::Expr; WRITE_LIMBS] = array::from_fn(|_| AB::Expr::ZERO); a[0] = cols.cmp_result.into(); @@ -420,11 +416,9 @@ where F::TWO }; - cols.c_lt_diff = - F::from_canonical_u8(self.modulus_limbs[c_diff_idx] - record.c[c_diff_idx]); + cols.c_lt_diff = F::from_u8(self.modulus_limbs[c_diff_idx] - record.c[c_diff_idx]); if !record.is_setup { - cols.b_lt_diff = - F::from_canonical_u8(self.modulus_limbs[b_diff_idx] - record.b[b_diff_idx]); + cols.b_lt_diff = F::from_u8(self.modulus_limbs[b_diff_idx] - record.b[b_diff_idx]); self.bitwise_lookup_chip.request_range( (self.modulus_limbs[b_diff_idx] - record.b[b_diff_idx] - 1) as u32, (self.modulus_limbs[c_diff_idx] - record.c[c_diff_idx] - 1) as u32, @@ -443,8 +437,8 @@ where } }); - cols.c = record.c.map(F::from_canonical_u8); - cols.b = record.b.map(F::from_canonical_u8); + cols.c = record.c.map(F::from_u8); + cols.b = record.b.map(F::from_u8); let sub_air = IsEqArraySubAir::; sub_air.generate_subrow( (&cols.b, &cols.c), diff --git a/extensions/algebra/circuit/src/modular_chip/tests.rs b/extensions/algebra/circuit/src/modular_chip/tests.rs index 101288e12e..fdb7be42ff 100644 --- a/extensions/algebra/circuit/src/modular_chip/tests.rs +++ b/extensions/algebra/circuit/src/modular_chip/tests.rs @@ -30,7 +30,7 @@ use openvm_mod_circuit_builder::{ use openvm_pairing_guest::{bls12_381::BLS12_381_MODULUS, bn254::BN254_MODULUS}; use openvm_rv32_adapters::{rv32_write_heap_default, write_ptr_reg}; use openvm_rv32im_circuit::adapters::RV32_REGISTER_NUM_LIMBS; -use openvm_stark_backend::p3_field::FieldAlgebra; +use openvm_stark_backend::p3_field::PrimeCharacteristicRing; use openvm_stark_sdk::{p3_baby_bear::BabyBear, utils::create_seeded_rng}; use rand::{rngs::StdRng, Rng}; #[cfg(feature = "cuda")] @@ -187,7 +187,7 @@ mod addsub_tests { let a = generate_random_biguint(modulus); let b = generate_random_biguint(modulus); - let op = rng.gen_range(0..2) + ADD_LOCAL; // 0 for add, 1 for sub + let op = rng.random_range(0..2) + ADD_LOCAL; // 0 for add, 1 for sub (a, b, op) }; @@ -219,11 +219,11 @@ mod addsub_tests { let a_limbs: Vec = biguint_to_limbs_vec(&a, NUM_LIMBS) .into_iter() - .map(F::from_canonical_u8) + .map(F::from_u8) .collect(); let b_limbs: Vec = biguint_to_limbs_vec(&b, NUM_LIMBS) .into_iter() - .map(F::from_canonical_u8) + .map(F::from_u8) .collect(); for i in (0..NUM_LIMBS).step_by(BLOCK_SIZE) { @@ -251,7 +251,7 @@ mod addsub_tests { let expected_limbs: Vec = biguint_to_limbs_vec(&expected_answer, NUM_LIMBS) .into_iter() - .map(F::from_canonical_u8) + .map(F::from_u8) .collect(); for i in (0..NUM_LIMBS).step_by(BLOCK_SIZE) { @@ -533,7 +533,7 @@ mod muldiv_tests { let a = generate_random_biguint(modulus); let b = generate_random_biguint(modulus); - let op = rng.gen_range(0..2) + MUL_LOCAL; // 0 for add, 1 for sub + let op = rng.random_range(0..2) + MUL_LOCAL; // 0 for add, 1 for sub (a, b, op) }; @@ -566,11 +566,11 @@ mod muldiv_tests { let a_limbs: Vec = biguint_to_limbs_vec(&a, NUM_LIMBS) .into_iter() - .map(F::from_canonical_u8) + .map(F::from_u8) .collect(); let b_limbs: Vec = biguint_to_limbs_vec(&b, NUM_LIMBS) .into_iter() - .map(F::from_canonical_u8) + .map(F::from_u8) .collect(); for i in (0..NUM_LIMBS).step_by(BLOCK_SIZE) { @@ -598,7 +598,7 @@ mod muldiv_tests { let expected_limbs: Vec = biguint_to_limbs_vec(&expected_answer, NUM_LIMBS) .into_iter() - .map(F::from_canonical_u8) + .map(F::from_u8) .collect(); for i in (0..NUM_LIMBS).step_by(BLOCK_SIZE) { @@ -905,14 +905,12 @@ mod is_equal_tests { ) } else { let b = b.unwrap_or( - generate_field_element::(modulus, rng) - .map(F::from_canonical_u32), + generate_field_element::(modulus, rng).map(F::from_u32), ); - let c = c.unwrap_or(if rng.gen_bool(0.5) { + let c = c.unwrap_or(if rng.random_bool(0.5) { b } else { - generate_field_element::(modulus, rng) - .map(F::from_canonical_u32) + generate_field_element::(modulus, rng).map(F::from_u32) }); (b, c, offset + Rv32ModularArithmeticOpcode::IS_EQ as usize) @@ -948,7 +946,7 @@ mod is_equal_tests { opcode_offset, ); - let modulus_limbs = modulus_limbs.map(F::from_canonical_u8); + let modulus_limbs = modulus_limbs.map(F::from_u8); for i in 0..num_tests { set_and_execute_is_equal( @@ -1028,7 +1026,7 @@ mod is_equal_tests { opcode_offset, ); - let modulus_limbs = modulus_limbs.map(F::from_canonical_u8); + let modulus_limbs = modulus_limbs.map(F::from_u8); for i in 0..num_ops { set_and_execute_is_equal( @@ -1107,7 +1105,7 @@ mod is_equal_tests { opcode_offset, ); - let modulus_limbs = modulus_limbs.map(F::from_canonical_u8); + let modulus_limbs = modulus_limbs.map(F::from_u8); set_and_execute_is_equal( &mut tester, @@ -1124,12 +1122,15 @@ mod is_equal_tests { let adapter_width = BaseAir::::width(&harness.air.adapter); let modify_trace = |trace: &mut DenseMatrix| { - let mut trace_row = trace.row_slice(0).to_vec(); + let mut trace_row = trace + .row_slice(0) + .expect("trace row should be present") + .to_vec(); let cols: &mut ModularIsEqualCoreCols<_, READ_LIMBS> = trace_row.split_at_mut(adapter_width).1.borrow_mut(); if test_case == 1 { // test the constraint that c_lt_mark = 2 when is_setup = 1 - cols.b[0] = F::from_canonical_u32(1); + cols.b[0] = F::from_u32(1); cols.c_lt_mark = F::ONE; cols.lt_marker = [F::ZERO; READ_LIMBS]; cols.lt_marker[READ_LIMBS - 1] = F::ONE; @@ -1138,17 +1139,17 @@ mod is_equal_tests { } else if test_case == 2 { // test the constraint that b[i] = N[i] for all i when prefix_sum is not 1 or // lt_marker_sum - is_setup - cols.b[0] = F::from_canonical_u32(2); - cols.c_lt_mark = F::from_canonical_u8(2); + cols.b[0] = F::from_u32(2); + cols.c_lt_mark = F::from_u8(2); cols.lt_marker = [F::ZERO; READ_LIMBS]; - cols.lt_marker[READ_LIMBS - 1] = F::from_canonical_u8(2); + cols.lt_marker[READ_LIMBS - 1] = F::from_u8(2); cols.c_lt_diff = modulus_limbs[READ_LIMBS - 1] - cols.c[READ_LIMBS - 1]; } else if test_case == 3 { // test the constraint that sum_i lt_marker[i] = 2 when is_setup = 1 - cols.b[0] = F::from_canonical_u32(3); - cols.c_lt_mark = F::from_canonical_u8(2); + cols.b[0] = F::from_u32(3); + cols.c_lt_mark = F::from_u8(2); cols.lt_marker = [F::ZERO; READ_LIMBS]; - cols.lt_marker[READ_LIMBS - 1] = F::from_canonical_u8(2); + cols.lt_marker[READ_LIMBS - 1] = F::from_u8(2); cols.lt_marker[0] = F::ONE; cols.b_lt_diff = modulus_limbs[0] - cols.b[0]; cols.c_lt_diff = modulus_limbs[READ_LIMBS - 1] - cols.c[READ_LIMBS - 1]; diff --git a/extensions/algebra/transpiler/src/lib.rs b/extensions/algebra/transpiler/src/lib.rs index 74d3f9182a..7632996d4f 100644 --- a/extensions/algebra/transpiler/src/lib.rs +++ b/extensions/algebra/transpiler/src/lib.rs @@ -99,8 +99,8 @@ impl TranspilerExtension for ModularTranspilerExtension { VmOpcode::from_usize( local_opcode.global_opcode().as_usize() + mod_idx_shift, ), - F::from_canonical_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rd), - F::from_canonical_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rs1), + F::from_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rd), + F::from_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rs1), F::ZERO, // rs2 = 0 F::ONE, // d_as = 1 F::TWO, // e_as = 2 @@ -123,7 +123,7 @@ impl TranspilerExtension for ModularTranspilerExtension { assert_eq!(dec_insn.rs2, 0); Some(Instruction::phantom( PhantomDiscriminant(ModularPhantom::HintSqrt as u16), - F::from_canonical_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rs1), + F::from_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rs1), F::ZERO, mod_idx as u16, )) @@ -201,8 +201,8 @@ impl TranspilerExtension for Fp2TranspilerExtension { VmOpcode::from_usize( local_opcode.global_opcode().as_usize() + complex_idx_shift, ), - F::from_canonical_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rd), - F::from_canonical_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rs1), + F::from_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rd), + F::from_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rs1), F::ZERO, // rs2 = 0 F::ONE, // d_as = 1 F::TWO, // e_as = 2 diff --git a/extensions/bigint/circuit/Cargo.toml b/extensions/bigint/circuit/Cargo.toml index 2a02ea8c74..cc2228101f 100644 --- a/extensions/bigint/circuit/Cargo.toml +++ b/extensions/bigint/circuit/Cargo.toml @@ -48,7 +48,6 @@ aot = ["openvm-circuit/aot", "openvm-rv32im-circuit/aot"] mimalloc = ["openvm-circuit/mimalloc"] jemalloc = ["openvm-circuit/jemalloc"] jemalloc-prof = ["openvm-circuit/jemalloc-prof"] -nightly-features = ["openvm-circuit/nightly-features"] cuda = [ "dep:openvm-cuda-builder", diff --git a/extensions/bigint/circuit/src/common.rs b/extensions/bigint/circuit/src/common.rs index 329cf1d479..7d5ccb5836 100644 --- a/extensions/bigint/circuit/src/common.rs +++ b/extensions/bigint/circuit/src/common.rs @@ -107,8 +107,8 @@ mod tests { fn test_u256_lt() { let mut rng = StdRng::from_seed([42; 32]); for _ in 0..10000 { - let limbs_a: [u64; 4] = rng.gen(); - let limbs_b: [u64; 4] = rng.gen(); + let limbs_a: [u64; 4] = rng.random(); + let limbs_b: [u64; 4] = rng.random(); let a = U256::from_limbs(limbs_a); let b = U256::from_limbs(limbs_b); let a_u8: [u8; INT256_NUM_LIMBS] = u64_array_to_bytes(limbs_a); @@ -120,8 +120,8 @@ mod tests { fn test_i256_lt() { let mut rng = StdRng::from_seed([42; 32]); for _ in 0..10000 { - let limbs_a: [u64; 4] = rng.gen(); - let limbs_b: [u64; 4] = rng.gen(); + let limbs_a: [u64; 4] = rng.random(); + let limbs_b: [u64; 4] = rng.random(); let a = I256::from_limbs(limbs_a); let b = I256::from_limbs(limbs_b); let a_u8: [u8; INT256_NUM_LIMBS] = u64_array_to_bytes(limbs_a); diff --git a/extensions/bigint/circuit/src/extension/mod.rs b/extensions/bigint/circuit/src/extension/mod.rs index 0adb7fc595..eea95962c4 100644 --- a/extensions/bigint/circuit/src/extension/mod.rs +++ b/extensions/bigint/circuit/src/extension/mod.rs @@ -9,7 +9,8 @@ use openvm_circuit::{ arch::{ AirInventory, AirInventoryError, ChipInventory, ChipInventoryError, ExecutionBridge, ExecutorInventoryBuilder, ExecutorInventoryError, MatrixRecordArena, RowMajorMatrixArena, - VmBuilder, VmChipComplex, VmCircuitExtension, VmExecutionExtension, VmProverExtension, + VmBuilder, VmChipComplex, VmCircuitExtension, VmExecutionExtension, VmField, + VmProverExtension, }, system::{memory::SharedMemoryHelper, SystemChipInventory, SystemCpuBuilder, SystemPort}, }; @@ -355,7 +356,7 @@ impl VmBuilder for Int256Rv32CpuBuilder where SC: StarkGenericConfig, E: StarkEngine, PD = CpuDevice>, - Val: PrimeField32, + Val: VmField, { type VmConfig = Int256Rv32Config; type SystemChipInventory = SystemChipInventory; diff --git a/extensions/bigint/circuit/src/mult.rs b/extensions/bigint/circuit/src/mult.rs index 2eff4b9096..02eeafa383 100644 --- a/extensions/bigint/circuit/src/mult.rs +++ b/extensions/bigint/circuit/src/mult.rs @@ -223,8 +223,8 @@ mod tests { fn test_u256_mul() { let mut rng = StdRng::from_seed([42; 32]); for _ in 0..10000 { - let limbs_a: [u64; 4] = rng.gen(); - let limbs_b: [u64; 4] = rng.gen(); + let limbs_a: [u64; 4] = rng.random(); + let limbs_b: [u64; 4] = rng.random(); let a = U256::from_limbs(limbs_a); let b = U256::from_limbs(limbs_b); let a_u8: [u8; INT256_NUM_LIMBS] = u64_array_to_bytes(limbs_a); diff --git a/extensions/bigint/circuit/src/shift.rs b/extensions/bigint/circuit/src/shift.rs index c08afc26e0..f0fee73e3a 100644 --- a/extensions/bigint/circuit/src/shift.rs +++ b/extensions/bigint/circuit/src/shift.rs @@ -292,9 +292,9 @@ mod tests { fn test_shift_op() { let mut rng = StdRng::from_seed([42; 32]); for _ in 0..10000 { - let limbs_a: [u8; INT256_NUM_LIMBS] = rng.gen(); + let limbs_a: [u8; INT256_NUM_LIMBS] = rng.random(); let mut limbs_b: [u8; INT256_NUM_LIMBS] = [0; INT256_NUM_LIMBS]; - let shift: u8 = rng.gen(); + let shift: u8 = rng.random(); limbs_b[0] = shift; let a = U256::from_le_bytes(limbs_a); { diff --git a/extensions/bigint/circuit/src/tests.rs b/extensions/bigint/circuit/src/tests.rs index 00892e28a0..436d228e8b 100644 --- a/extensions/bigint/circuit/src/tests.rs +++ b/extensions/bigint/circuit/src/tests.rs @@ -39,7 +39,7 @@ use openvm_rv32im_circuit::{ use openvm_rv32im_transpiler::{ BaseAluOpcode, BranchEqualOpcode, BranchLessThanOpcode, LessThanOpcode, MulOpcode, ShiftOpcode, }; -use openvm_stark_backend::p3_field::{FieldAlgebra, PrimeField32}; +use openvm_stark_backend::p3_field::{PrimeCharacteristicRing, PrimeField32}; use openvm_stark_sdk::{p3_baby_bear::BabyBear, utils::create_seeded_rng}; use rand::{rngs::StdRng, Rng}; use test_case::test_case; @@ -336,11 +336,11 @@ fn set_and_execute_rand>( let b = generate_long_number::(rng); let c = generate_long_number::(rng); if branch { - let imm = rng.gen_range((-ABS_MAX_BRANCH)..ABS_MAX_BRANCH); + let imm = rng.random_range((-ABS_MAX_BRANCH)..ABS_MAX_BRANCH); let instruction = rv32_heap_branch_default( tester, - vec![b.map(F::from_canonical_u32)], - vec![c.map(F::from_canonical_u32)], + vec![b.map(F::from_u32)], + vec![c.map(F::from_u32)], imm as isize, opcode, ); @@ -349,7 +349,7 @@ fn set_and_execute_rand>( executor, arena, &instruction, - rng.gen_range((ABS_MAX_BRANCH as u32)..(1 << (PC_BITS - 1))), + rng.random_range((ABS_MAX_BRANCH as u32)..(1 << (PC_BITS - 1))), ); let cmp_result = branch_fn.unwrap()(opcode, &b, &c); @@ -359,8 +359,8 @@ fn set_and_execute_rand>( } else { let instruction = rv32_write_heap_default( tester, - vec![b.map(F::from_canonical_u32)], - vec![c.map(F::from_canonical_u32)], + vec![b.map(F::from_u32)], + vec![c.map(F::from_u32)], opcode, ); tester.execute(executor, arena, &instruction); diff --git a/extensions/bigint/transpiler/src/lib.rs b/extensions/bigint/transpiler/src/lib.rs index 8a522a8861..dc50ac1cb2 100644 --- a/extensions/bigint/transpiler/src/lib.rs +++ b/extensions/bigint/transpiler/src/lib.rs @@ -143,8 +143,8 @@ impl TranspilerExtension for Int256TranspilerExtension { BranchEqualOpcode::BEQ.local_usize() + Rv32BranchEqual256Opcode::CLASS_OFFSET, ), - F::from_canonical_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rs1), - F::from_canonical_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rs2), + F::from_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rs1), + F::from_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rs2), isize_to_field(dec_insn.imm as isize), F::ONE, F::TWO, diff --git a/extensions/ecc/circuit/src/extension/mod.rs b/extensions/ecc/circuit/src/extension/mod.rs index 03fa1a4c76..8f7c4627d7 100644 --- a/extensions/ecc/circuit/src/extension/mod.rs +++ b/extensions/ecc/circuit/src/extension/mod.rs @@ -4,7 +4,7 @@ use openvm_algebra_circuit::{Rv32ModularConfig, Rv32ModularConfigExecutor, Rv32M use openvm_circuit::{ arch::{ AirInventory, ChipInventoryError, InitFileGenerator, MatrixRecordArena, SystemConfig, - VmBuilder, VmChipComplex, VmProverExtension, + VmBuilder, VmChipComplex, VmField, VmProverExtension, }, system::SystemChipInventory, }; @@ -12,7 +12,6 @@ use openvm_circuit_derive::VmConfig; use openvm_stark_backend::{ config::{StarkGenericConfig, Val}, engine::StarkEngine, - p3_field::PrimeField32, prover::cpu::{CpuBackend, CpuDevice}, }; use serde::{Deserialize, Serialize}; @@ -77,7 +76,7 @@ impl VmBuilder for Rv32WeierstrassCpuBuilder where SC: StarkGenericConfig, E: StarkEngine, PD = CpuDevice>, - Val: PrimeField32, + Val: VmField, { type VmConfig = Rv32WeierstrassConfig; type SystemChipInventory = SystemChipInventory; diff --git a/extensions/ecc/circuit/src/weierstrass_chip/tests.rs b/extensions/ecc/circuit/src/weierstrass_chip/tests.rs index 5bb9d455d5..f98c97fd3a 100644 --- a/extensions/ecc/circuit/src/weierstrass_chip/tests.rs +++ b/extensions/ecc/circuit/src/weierstrass_chip/tests.rs @@ -26,7 +26,7 @@ use openvm_mod_circuit_builder::{ test_utils::generate_random_biguint, utils::biguint_to_limbs_vec, ExprBuilderConfig, }; use openvm_pairing_guest::bls12_381::BLS12_381_MODULUS; -use openvm_stark_backend::p3_field::FieldAlgebra; +use openvm_stark_backend::p3_field::PrimeCharacteristicRing; use openvm_stark_sdk::{p3_baby_bear::BabyBear, utils::create_seeded_rng}; use rand::{rngs::StdRng, Rng}; #[cfg(feature = "cuda")] @@ -245,7 +245,7 @@ mod ec_addne_tests { let y1 = y1 % modulus; let x2 = x2 % modulus; let y2 = y2 % modulus; - if rng.gen_bool(0.5) { + if rng.random_bool(0.5) { (x1, y1, x2, y2, Rv32WeierstrassOpcode::EC_ADD_NE as usize) } else { (x2, y2, x1, y1, Rv32WeierstrassOpcode::EC_ADD_NE as usize) @@ -268,34 +268,34 @@ mod ec_addne_tests { tester.write::( ptr_as, rs1_ptr, - p1_base_addr.to_le_bytes().map(F::from_canonical_u8), + p1_base_addr.to_le_bytes().map(F::from_u8), ); tester.write::( ptr_as, rs2_ptr, - p2_base_addr.to_le_bytes().map(F::from_canonical_u8), + p2_base_addr.to_le_bytes().map(F::from_u8), ); tester.write::( ptr_as, rd_ptr, - result_base_addr.to_le_bytes().map(F::from_canonical_u8), + result_base_addr.to_le_bytes().map(F::from_u8), ); let x1_limbs: Vec = biguint_to_limbs_vec(&x1, NUM_LIMBS) .into_iter() - .map(F::from_canonical_u8) + .map(F::from_u8) .collect(); let x2_limbs: Vec = biguint_to_limbs_vec(&x2, NUM_LIMBS) .into_iter() - .map(F::from_canonical_u8) + .map(F::from_u8) .collect(); let y1_limbs: Vec = biguint_to_limbs_vec(&y1, NUM_LIMBS) .into_iter() - .map(F::from_canonical_u8) + .map(F::from_u8) .collect(); let y2_limbs: Vec = biguint_to_limbs_vec(&y2, NUM_LIMBS) .into_iter() - .map(F::from_canonical_u8) + .map(F::from_u8) .collect(); for i in (0..NUM_LIMBS).step_by(BLOCK_SIZE) { @@ -718,21 +718,21 @@ mod ec_double_tests { tester.write::( ptr_as, rs1_ptr, - p1_base_addr.to_le_bytes().map(F::from_canonical_u8), + p1_base_addr.to_le_bytes().map(F::from_u8), ); tester.write::( ptr_as, rd_ptr, - result_base_addr.to_le_bytes().map(F::from_canonical_u8), + result_base_addr.to_le_bytes().map(F::from_u8), ); let x1_limbs: Vec = biguint_to_limbs_vec(&x1, NUM_LIMBS) .into_iter() - .map(F::from_canonical_u8) + .map(F::from_u8) .collect(); let y1_limbs: Vec = biguint_to_limbs_vec(&y1, NUM_LIMBS) .into_iter() - .map(F::from_canonical_u8) + .map(F::from_u8) .collect(); for i in (0..NUM_LIMBS).step_by(BLOCK_SIZE) { diff --git a/extensions/ecc/tests/src/lib.rs b/extensions/ecc/tests/src/lib.rs index 14d38e6230..84eefe13b2 100644 --- a/extensions/ecc/tests/src/lib.rs +++ b/extensions/ecc/tests/src/lib.rs @@ -24,7 +24,7 @@ mod tests { config::{AppConfig, SdkVmBuilder, SdkVmConfig, TranspilerConfig}, StdIn, }; - use openvm_stark_backend::p3_field::FieldAlgebra; + use openvm_stark_backend::p3_field::PrimeCharacteristicRing; use openvm_stark_sdk::{openvm_stark_backend, p3_baby_bear::BabyBear}; use openvm_toolchain_tests::{ build_example_program_at_path_with_features, get_programs_dir, NoInitFile, @@ -171,7 +171,7 @@ mod tests { let coords = [p.x.to_bytes(), p.y.to_bytes(), q_x, q_y, r_x, r_y] .concat() .into_iter() - .map(FieldAlgebra::from_canonical_u8) + .map(PrimeCharacteristicRing::from_u8) .collect(); air_test_with_min_segments(Rv32WeierstrassBuilder, config, openvm_exe, vec![coords], 1); Ok(()) diff --git a/extensions/ecc/transpiler/src/lib.rs b/extensions/ecc/transpiler/src/lib.rs index 462e95dbdd..f8a8ca6ad4 100644 --- a/extensions/ecc/transpiler/src/lib.rs +++ b/extensions/ecc/transpiler/src/lib.rs @@ -57,9 +57,9 @@ impl TranspilerExtension for EccTranspilerExtension { }; Some(Instruction::new( VmOpcode::from_usize(local_opcode.global_opcode().as_usize() + curve_idx_shift), - F::from_canonical_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rd), - F::from_canonical_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rs1), - F::from_canonical_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rs2), + F::from_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rd), + F::from_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rs1), + F::from_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rs2), F::ONE, // d_as = 1 F::TWO, // e_as = 2 F::ZERO, diff --git a/extensions/keccak256/circuit/Cargo.toml b/extensions/keccak256/circuit/Cargo.toml index 08e86855cf..cf7ecde467 100644 --- a/extensions/keccak256/circuit/Cargo.toml +++ b/extensions/keccak256/circuit/Cargo.toml @@ -50,7 +50,6 @@ aot = ["openvm-circuit/aot", "openvm-rv32im-circuit/aot"] mimalloc = ["openvm-circuit/mimalloc"] jemalloc = ["openvm-circuit/jemalloc"] jemalloc-prof = ["openvm-circuit/jemalloc-prof"] -nightly-features = ["openvm-circuit/nightly-features"] cuda = [ "dep:openvm-cuda-backend", "dep:openvm-cuda-common", diff --git a/extensions/keccak256/circuit/cuda/src/keccak256.cu b/extensions/keccak256/circuit/cuda/src/keccak256.cu index ef99a47a5f..c2118ec9a1 100644 --- a/extensions/keccak256/circuit/cuda/src/keccak256.cu +++ b/extensions/keccak256/circuit/cuda/src/keccak256.cu @@ -25,15 +25,12 @@ __global__ void p3_inner_tracegen( __align__(16) uint64_t initial_state[5][5] = {0}; if (block_idx < total_num_blocks) { - // We need to transpose state matrices due to a plonky3 issue: https://github.com/Plonky3/Plonky3/issues/672 - // Note: the fix for this issue will be a commit after the major Field crate refactor PR https://github.com/Plonky3/Plonky3/pull/640 - // which will require a significant refactor to switch to. #pragma unroll 5 for (auto x = 0; x < 5; x++) { #pragma unroll 5 for (auto y = 0; y < 5; y++) { - current_state[x][y] = states[block_idx * KECCAK_STATE_SIZE + y + 5 * x]; - initial_state[x][y] = current_state[x][y]; + current_state[y][x] = states[block_idx * KECCAK_STATE_SIZE + x + 5 * y]; + initial_state[y][x] = current_state[y][x]; } } } diff --git a/extensions/keccak256/circuit/src/air.rs b/extensions/keccak256/circuit/src/air.rs index 9453a86a8a..40d7722b6e 100644 --- a/extensions/keccak256/circuit/src/air.rs +++ b/extensions/keccak256/circuit/src/air.rs @@ -19,7 +19,7 @@ use openvm_stark_backend::{ air_builders::sub::SubAirBuilder, interaction::InteractionBuilder, p3_air::{Air, AirBuilder, BaseAir}, - p3_field::FieldAlgebra, + p3_field::PrimeCharacteristicRing, p3_matrix::Matrix, rap::{BaseAirWithPublicValues, PartitionedBaseAir}, }; @@ -54,7 +54,10 @@ impl BaseAir for KeccakVmAir { impl Air for KeccakVmAir { fn eval(&self, builder: &mut AB) { let main = builder.main(); - let (local, next) = (main.row_slice(0), main.row_slice(1)); + let (local, next) = ( + main.row_slice(0).expect("window should have two elements"), + main.row_slice(1).expect("window should have two elements"), + ); let local: &KeccakVmCols = (*local).borrow(); let next: &KeccakVmCols = (*next).borrow(); @@ -106,7 +109,7 @@ impl KeccakVmAir { } /// Many columns are expected to be the same between rounds and only change per-block. - pub fn constrain_consistency_across_rounds( + pub fn constrain_consistency_across_rounds>( &self, builder: &mut AB, local: &KeccakVmCols, @@ -120,7 +123,7 @@ impl KeccakVmAir { .assert_eq(&mut round_builder, next.instruction); } - pub fn constrain_block_transition( + pub fn constrain_block_transition>( &self, builder: &mut AB, local: &KeccakVmCols, @@ -151,14 +154,14 @@ impl KeccakVmAir { // This should always be RATE_BYTES since it's a non-final block. block_transition.assert_eq( next.instruction.src, - local.instruction.src + AB::F::from_canonical_usize(KECCAK_RATE_BYTES), + local.instruction.src + AB::F::from_usize(KECCAK_RATE_BYTES), ); // Advance timestamp by the number of memory accesses from reading // `dst, src, len` and block input bytes. block_transition.assert_eq(next.instruction.start_timestamp, start_write_timestamp); block_transition.assert_eq( next.instruction.remaining_len, - local.instruction.remaining_len - AB::F::from_canonical_usize(KECCAK_RATE_BYTES), + local.instruction.remaining_len - AB::F::from_usize(KECCAK_RATE_BYTES), ); // Padding transition is constrained in `constrain_padding`. } @@ -174,7 +177,9 @@ impl KeccakVmAir { builder: &mut AB, local: &KeccakVmCols, next: &KeccakVmCols, - ) { + ) where + AB::Var: Copy, + { let is_padding_byte = local.sponge.is_padding_byte; let block_bytes = &local.sponge.block_bytes; let remaining_len = local.remaining_len(); @@ -213,7 +218,7 @@ impl KeccakVmAir { // is_padding_byte must be consistent with remaining_len builder.when(is_final_block).assert_eq( remaining_len, - AB::Expr::from_canonical_usize(KECCAK_RATE_BYTES) - num_padding_bytes, + AB::Expr::from_usize(KECCAK_RATE_BYTES) - num_padding_bytes, ); // If this block is not final, when transitioning to next block, remaining len // must decrease by `KECCAK_RATE_BYTES`. @@ -221,7 +226,7 @@ impl KeccakVmAir { .when(is_last_round) .when(not(is_final_block)) .assert_eq( - remaining_len - AB::F::from_canonical_usize(KECCAK_RATE_BYTES), + remaining_len - AB::F::from_usize(KECCAK_RATE_BYTES), next.remaining_len(), ); // To enforce that is_padding_byte must be set appropriately for an input, we require @@ -249,7 +254,7 @@ impl KeccakVmAir { // value 0b10000001 builder.when(has_single_padding_byte.clone()).assert_eq( block_bytes[KECCAK_RATE_BYTES - 1], - AB::F::from_canonical_u8(0b10000001), + AB::F::from_u8(0b10000001), ); let has_multiple_padding_bytes: AB::Expr = not(has_single_padding_byte.clone()); @@ -266,7 +271,7 @@ impl KeccakVmAir { builder .when(has_multiple_padding_bytes.clone()) .when(is_first_padding_byte.clone()) - .assert_eq(block_bytes[i], AB::F::from_canonical_u8(0x01)); + .assert_eq(block_bytes[i], AB::F::from_u8(0x01)); // If the row has multiple padding bytes, the other padding bytes // except the last one must be 0 builder @@ -280,10 +285,7 @@ impl KeccakVmAir { builder .when(is_final_block) .when(has_multiple_padding_bytes) - .assert_eq( - block_bytes[KECCAK_RATE_BYTES - 1], - AB::F::from_canonical_u8(0x80), - ); + .assert_eq(block_bytes[KECCAK_RATE_BYTES - 1], AB::F::from_u8(0x80)); } /// Constrain state transition between keccak-f permutations is valid absorb of input bytes. @@ -317,7 +319,7 @@ impl KeccakVmAir { (0..U64_LIMBS).flat_map(move |limb| { let state_limb = local.postimage(y, x, limb); let hi = local.sponge.state_hi[i * U64_LIMBS + limb]; - let lo = state_limb - hi * AB::F::from_canonical_u64(1 << 8); + let lo = state_limb - hi * AB::F::from_u64(1 << 8); // Conversion from bytes to u64 is little-endian [lo, hi.into()] }) @@ -329,7 +331,7 @@ impl KeccakVmAir { (0..U64_LIMBS).flat_map(move |limb| { let state_limb = next.inner.preimage[y][x][limb]; let hi = next.sponge.state_hi[i * U64_LIMBS + limb]; - let lo = state_limb - hi * AB::F::from_canonical_u64(1 << 8); + let lo = state_limb - hi * AB::F::from_u64(1 << 8); [lo, hi.into()] }) }); @@ -369,7 +371,7 @@ impl KeccakVmAir { (0..U64_LIMBS).flat_map(move |limb| { let state_limb = local.inner.preimage[y][x][limb]; let hi = local.sponge.state_hi[i * U64_LIMBS + limb]; - let lo = state_limb - hi * AB::F::from_canonical_u64(1 << 8); + let lo = state_limb - hi * AB::F::from_u64(1 << 8); [lo, hi.into()] }) }); @@ -428,13 +430,13 @@ impl KeccakVmAir { let timestamp_change: AB::Expr = Self::timestamp_change(instruction.remaining_len); self.execution_bridge .execute_and_increment_pc( - AB::Expr::from_canonical_usize(Rv32KeccakOpcode::KECCAK256 as usize + self.offset), + AB::Expr::from_usize(Rv32KeccakOpcode::KECCAK256 as usize + self.offset), [ dst_ptr.into(), src_ptr.into(), len_ptr.into(), reg_addr_sp.into(), - AB::Expr::from_canonical_u32(RV32_MEMORY_AS), + AB::Expr::from_u32(RV32_MEMORY_AS), ], ExecutionState::new(instruction.pc, instruction.start_timestamp), timestamp_change, @@ -451,8 +453,7 @@ impl KeccakVmAir { .into_iter() .enumerate() .fold(val.into(), |acc, (j, limb)| { - acc - limb - * AB::Expr::from_canonical_usize(1 << ((j + 1) * RV32_CELL_BITS)) + acc - limb * AB::Expr::from_usize(1 << ((j + 1) * RV32_CELL_BITS)) }) } else { limbs[i - 1].into() @@ -490,9 +491,8 @@ impl KeccakVmAir { *instruction.len_limbs.last().unwrap(), *instruction.len_limbs.last().unwrap(), ]; - let limb_shift = AB::F::from_canonical_usize( - 1 << (RV32_CELL_BITS * RV32_REGISTER_NUM_LIMBS - self.ptr_max_bits), - ); + let limb_shift = + AB::F::from_usize(1 << (RV32_CELL_BITS * RV32_REGISTER_NUM_LIMBS - self.ptr_max_bits)); for pair in need_range_check.chunks_exact(2) { self.bitwise_lookup_bus .send_range(pair[0] * limb_shift, pair[1] * limb_shift) @@ -531,7 +531,7 @@ impl KeccakVmAir { ) .enumerate() { - let ptr = local.instruction.src + AB::F::from_canonical_usize(i * KECCAK_WORD_SIZE); + let ptr = local.instruction.src + AB::F::from_usize(i * KECCAK_WORD_SIZE); // Only read block i if it is not entirely padding bytes // count is degree 2 let count = is_input * not(is_padding[0]); @@ -562,7 +562,7 @@ impl KeccakVmAir { self.memory_bridge .read( - MemoryAddress::new(AB::Expr::from_canonical_u32(RV32_MEMORY_AS), ptr), + MemoryAddress::new(AB::Expr::from_u32(RV32_MEMORY_AS), ptr), word, // degree 2 timestamp.clone(), mem_aux, @@ -598,7 +598,7 @@ impl KeccakVmAir { (0..U64_LIMBS).flat_map(move |limb| { let state_limb = local.postimage(y, x, limb); let hi = local.sponge.state_hi[i * U64_LIMBS + limb]; - let lo = state_limb - hi * AB::F::from_canonical_u64(1 << 8); + let lo = state_limb - hi * AB::F::from_u64(1 << 8); // Conversion from bytes to u64 is little-endian [lo, hi.into()] }) @@ -611,12 +611,12 @@ impl KeccakVmAir { .enumerate() { let digest_bytes = digest_bytes.collect_vec(); - let timestamp = start_write_timestamp.clone() + AB::Expr::from_canonical_usize(i); + let timestamp = start_write_timestamp.clone() + AB::Expr::from_usize(i); self.memory_bridge .write( MemoryAddress::new( - AB::Expr::from_canonical_u32(RV32_MEMORY_AS), - dst.clone() + AB::F::from_canonical_usize(i * KECCAK_WORD_SIZE), + AB::Expr::from_u32(RV32_MEMORY_AS), + dst.clone() + AB::F::from_usize(i * KECCAK_WORD_SIZE), ), digest_bytes.try_into().unwrap(), timestamp, @@ -628,13 +628,11 @@ impl KeccakVmAir { /// Amount to advance timestamp by after execution of one opcode instruction. /// This is an upper bound dependent on the length `len` operand, which is unbounded. - pub fn timestamp_change(len: impl Into) -> T { + pub fn timestamp_change(len: impl Into) -> T { // actual number is ceil(len / 136) * (3 + 17) + KECCAK_DIGEST_WRITES // digest writes only done on last row of multi-block // add another KECCAK_ABSORB_READS to round up so we don't deal with padding len.into() - + T::from_canonical_usize( - KECCAK_REGISTER_READS + KECCAK_ABSORB_READS + KECCAK_DIGEST_WRITES, - ) + + T::from_usize(KECCAK_REGISTER_READS + KECCAK_ABSORB_READS + KECCAK_DIGEST_WRITES) } } diff --git a/extensions/keccak256/circuit/src/extension/mod.rs b/extensions/keccak256/circuit/src/extension/mod.rs index ef8fa62174..3a64956e77 100644 --- a/extensions/keccak256/circuit/src/extension/mod.rs +++ b/extensions/keccak256/circuit/src/extension/mod.rs @@ -6,7 +6,7 @@ use openvm_circuit::{ AirInventory, AirInventoryError, ChipInventory, ChipInventoryError, ExecutionBridge, ExecutorInventoryBuilder, ExecutorInventoryError, InitFileGenerator, MatrixRecordArena, RowMajorMatrixArena, SystemConfig, VmBuilder, VmChipComplex, VmCircuitExtension, - VmExecutionExtension, VmProverExtension, + VmExecutionExtension, VmField, VmProverExtension, }, system::{ memory::SharedMemoryHelper, SystemChipInventory, SystemCpuBuilder, SystemExecutor, @@ -86,7 +86,7 @@ impl VmBuilder for Keccak256Rv32CpuBuilder where SC: StarkGenericConfig, E: StarkEngine, PD = CpuDevice>, - Val: PrimeField32, + Val: VmField, { type VmConfig = Keccak256Rv32Config; type SystemChipInventory = SystemChipInventory; diff --git a/extensions/keccak256/circuit/src/tests.rs b/extensions/keccak256/circuit/src/tests.rs index 91243363a4..ba657479a7 100644 --- a/extensions/keccak256/circuit/src/tests.rs +++ b/extensions/keccak256/circuit/src/tests.rs @@ -23,7 +23,7 @@ use openvm_instructions::{ }; use openvm_keccak256_transpiler::Rv32KeccakOpcode::{self, *}; use openvm_stark_backend::{ - p3_field::FieldAlgebra, + p3_field::PrimeCharacteristicRing, p3_matrix::{ dense::{DenseMatrix, RowMajorMatrix}, Matrix, @@ -109,7 +109,7 @@ fn set_and_execute>( len: Option, expected_output: Option<[u8; 32]>, ) { - let len = len.unwrap_or(rng.gen_range(1..3000)); + let len = len.unwrap_or(rng.random_range(1..3000)); let tmp = get_random_message(rng, len); let message: &[u8] = message.unwrap_or(&tmp); let len = message.len(); @@ -120,17 +120,17 @@ fn set_and_execute>( let dst_ptr = gen_pointer(rng, 4); let src_ptr = gen_pointer(rng, 4); - tester.write(1, rd, dst_ptr.to_le_bytes().map(F::from_canonical_u8)); - tester.write(1, rs1, src_ptr.to_le_bytes().map(F::from_canonical_u8)); - tester.write(1, rs2, len.to_le_bytes().map(F::from_canonical_u8)); + tester.write(1, rd, dst_ptr.to_le_bytes().map(F::from_u8)); + tester.write(1, rs1, src_ptr.to_le_bytes().map(F::from_u8)); + tester.write(1, rs2, len.to_le_bytes().map(F::from_u8)); message.chunks(4).enumerate().for_each(|(i, chunk)| { - let rng = rng.gen(); + let rng = rng.random(); let chunk: [&u8; 4] = array::from_fn(|i| chunk.get(i).unwrap_or(&rng)); tester.write( RV32_MEMORY_AS as usize, src_ptr + i * 4, - chunk.map(|&x| F::from_canonical_u8(x)), + chunk.map(|&x| F::from_u8(x)), ); }); @@ -144,7 +144,7 @@ fn set_and_execute>( println!("expected_output: {expected_output:?}"); println!("keccak256(message): {:?}", keccak256(message)); assert_eq!( - expected_output.map(F::from_canonical_u8), + expected_output.map(F::from_u8), tester.read(RV32_MEMORY_AS as usize, dst_ptr) ); } @@ -281,12 +281,14 @@ fn run_negative_keccak256_test( ); let modify_trace = |trace: &mut DenseMatrix| { - let mut trace_row = trace.row_slice(16).to_vec(); + let mut trace_row = trace + .row_slice(16) + .expect("trace row should be present") + .to_vec(); let digest_row: &mut KeccakVmCols<_> = trace_row.as_mut_slice().borrow_mut(); for i in 0..16 { - let out_limb = F::from_canonical_u16( - prank_output[2 * i] as u16 + ((prank_output[2 * i + 1] as u16) << 8), - ); + let out_limb = + F::from_u16(prank_output[2 * i] as u16 + ((prank_output[2 * i + 1] as u16) << 8)); let x = i / 4; let y = 0; let limb = i % 4; @@ -316,7 +318,7 @@ fn test_keccak256_negative() { hasher.update(&input); let mut out = [0u8; 32]; hasher.finalize(&mut out); - out[0] = rng.gen(); + out[0] = rng.random(); run_negative_keccak256_test(&input, out, VerificationError::OodEvaluationMismatch); } diff --git a/extensions/keccak256/circuit/src/trace.rs b/extensions/keccak256/circuit/src/trace.rs index 489b72751e..04b7cea4e6 100644 --- a/extensions/keccak256/circuit/src/trace.rs +++ b/extensions/keccak256/circuit/src/trace.rs @@ -329,8 +329,7 @@ impl TraceFiller for KeccakVmFiller { // The first row of a `dummy` block should have `is_new_start = F::ONE` cols.sponge.is_new_start = F::from_bool(idx == 0); cols.sponge.block_bytes[0] = F::ONE; - cols.sponge.block_bytes[KECCAK_RATE_BYTES - 1] = - F::from_canonical_u32(0x80); + cols.sponge.block_bytes[KECCAK_RATE_BYTES - 1] = F::from_u32(0x80); cols.sponge.is_padding_byte = [F::ONE; KECCAK_RATE_BYTES]; }); return; @@ -364,7 +363,7 @@ impl TraceFiller for KeccakVmFiller { } else { [0u8; KECCAK_WORD_SIZE - 1] } - .map(F::from_canonical_u8); + .map(F::from_u8); let mut input = Vec::with_capacity(*num_blocks * KECCAK_RATE_BYTES); input.extend_from_slice(&record.input[..*len]); // Pad the input according to the Keccak spec @@ -400,14 +399,7 @@ impl TraceFiller for KeccakVmFiller { .par_chunks_exact_mut(NUM_ROUNDS * NUM_KECCAK_VM_COLS) .enumerate() .for_each(|(block_idx, block_slice)| { - // We need to transpose state matrices due to a plonky3 issue: https://github.com/Plonky3/Plonky3/issues/672 - // Note: the fix for this issue will be a commit after the major Field crate refactor PR https://github.com/Plonky3/Plonky3/pull/640 - // which will require a significant refactor to switch to. - let state = from_fn(|i| { - let x = i / 5; - let y = i % 5; - states[block_idx][x + 5 * y] - }); + let state = states[block_idx]; // Note: we can call `generate_trace_rows` for each block separately because // its trace only depends on the current `state` @@ -439,12 +431,11 @@ impl TraceFiller for KeccakVmFiller { } else { cols.sponge.is_padding_byte = [F::ZERO; KECCAK_RATE_BYTES]; } - cols.sponge.block_bytes = array::from_fn(|i| { - F::from_canonical_u8(input[input_offset + i]) - }); + cols.sponge.block_bytes = + array::from_fn(|i| F::from_u8(input[input_offset + i])); if row_idx == 0 { cols.sponge.state_hi = from_fn(|i| { - F::from_canonical_u8( + F::from_u8( (states[block_idx][i / U64_LIMBS] >> ((i % U64_LIMBS) * 16 + 8)) as u8, @@ -453,7 +444,7 @@ impl TraceFiller for KeccakVmFiller { } else if row_idx == NUM_ROUNDS - 1 { let state = keccak_f(states[block_idx]); cols.sponge.state_hi = from_fn(|i| { - F::from_canonical_u8( + F::from_u8( (state[i / U64_LIMBS] >> ((i % U64_LIMBS) * 16 + 8)) as u8, ) @@ -472,28 +463,25 @@ impl TraceFiller for KeccakVmFiller { } // Fill the instruction columns - cols.instruction.pc = F::from_canonical_u32(vm_record.from_pc); + cols.instruction.pc = F::from_u32(vm_record.from_pc); cols.instruction.is_enabled = F::ONE; cols.instruction.is_enabled_first_round = F::from_bool(row_idx == 0); - cols.instruction.start_timestamp = - F::from_canonical_u32(start_timestamp); - cols.instruction.dst_ptr = F::from_canonical_u32(vm_record.rd_ptr); - cols.instruction.src_ptr = F::from_canonical_u32(vm_record.rs1_ptr); - cols.instruction.len_ptr = F::from_canonical_u32(vm_record.rs2_ptr); - cols.instruction.dst = - vm_record.dst.to_le_bytes().map(F::from_canonical_u8); + cols.instruction.start_timestamp = F::from_u32(start_timestamp); + cols.instruction.dst_ptr = F::from_u32(vm_record.rd_ptr); + cols.instruction.src_ptr = F::from_u32(vm_record.rs1_ptr); + cols.instruction.len_ptr = F::from_u32(vm_record.rs2_ptr); + cols.instruction.dst = vm_record.dst.to_le_bytes().map(F::from_u8); let src = vm_record.src + (block_idx * KECCAK_RATE_BYTES) as u32; - cols.instruction.src = F::from_canonical_u32(src); - cols.instruction.src_limbs.copy_from_slice( - &src.to_le_bytes().map(F::from_canonical_u8)[1..], - ); + cols.instruction.src = F::from_u32(src); + cols.instruction + .src_limbs + .copy_from_slice(&src.to_le_bytes().map(F::from_u8)[1..]); cols.instruction.len_limbs.copy_from_slice( - &(rem_len as u32).to_le_bytes().map(F::from_canonical_u8)[1..], + &(rem_len as u32).to_le_bytes().map(F::from_u8)[1..], ); - cols.instruction.remaining_len = - F::from_canonical_u32(rem_len as u32); + cols.instruction.remaining_len = F::from_u32(rem_len as u32); // Fill the register reads if row_idx == 0 && block_idx == 0 { @@ -563,9 +551,7 @@ impl TraceFiller for KeccakVmFiller { .enumerate() .zip(vm_record.write_aux.par_iter()) .for_each(|((i, cols), vm_record)| { - cols.set_prev_data( - vm_record.prev_data.map(F::from_canonical_u8), - ); + cols.set_prev_data(vm_record.prev_data.map(F::from_u8)); mem_helper.fill( vm_record.prev_timestamp, timestamp + i as u32, diff --git a/extensions/native/circuit/src/adapters/alu_native_adapter.rs b/extensions/native/circuit/src/adapters/alu_native_adapter.rs index ab2de86345..eb23595571 100644 --- a/extensions/native/circuit/src/adapters/alu_native_adapter.rs +++ b/extensions/native/circuit/src/adapters/alu_native_adapter.rs @@ -27,7 +27,7 @@ use openvm_native_compiler::conversion::AS; use openvm_stark_backend::{ interaction::InteractionBuilder, p3_air::BaseAir, - p3_field::{Field, FieldAlgebra, PrimeField32}, + p3_field::{Field, PrimeCharacteristicRing, PrimeField32}, }; #[repr(C)] @@ -69,10 +69,10 @@ impl VmAdapterAir for AluNativeAdapterAir { let mut timestamp_delta = 0usize; let mut timestamp_pp = || { timestamp_delta += 1; - timestamp + AB::F::from_canonical_usize(timestamp_delta - 1) + timestamp + AB::F::from_usize(timestamp_delta - 1) }; - let native_as = AB::Expr::from_canonical_u32(AS::Native as u32); + let native_as = AB::Expr::from_u32(AS::Native as u32); // TODO: we assume address space is either 0 or 4, should we add a // constraint for that? @@ -115,7 +115,7 @@ impl VmAdapterAir for AluNativeAdapterAir { cols.f_as.into(), ], cols.from_state, - AB::F::from_canonical_usize(timestamp_delta), + AB::F::from_usize(timestamp_delta), (DEFAULT_PC_STEP, ctx.to_pc), ) .eval(builder, ctx.instruction.is_valid); @@ -219,7 +219,7 @@ impl AdapterTraceFiller for AluNativeAdapterFiller { adapter_row.write_aux.as_mut(), ); - let native_as = F::from_canonical_u32(AS::Native as u32); + let native_as = F::from_u32(AS::Native as u32); for ((i, read_record), read_cols) in record .reads_aux .iter() @@ -254,7 +254,7 @@ impl AdapterTraceFiller for AluNativeAdapterFiller { adapter_row.b_pointer = record.b; adapter_row.a_pointer = record.a_ptr; - adapter_row.from_state.timestamp = F::from_canonical_u32(record.from_timestamp); - adapter_row.from_state.pc = F::from_canonical_u32(record.from_pc); + adapter_row.from_state.timestamp = F::from_u32(record.from_timestamp); + adapter_row.from_state.pc = F::from_u32(record.from_pc); } } diff --git a/extensions/native/circuit/src/adapters/branch_native_adapter.rs b/extensions/native/circuit/src/adapters/branch_native_adapter.rs index 28f1fc9979..ad02cb36eb 100644 --- a/extensions/native/circuit/src/adapters/branch_native_adapter.rs +++ b/extensions/native/circuit/src/adapters/branch_native_adapter.rs @@ -24,7 +24,7 @@ use openvm_native_compiler::conversion::AS; use openvm_stark_backend::{ interaction::InteractionBuilder, p3_air::BaseAir, - p3_field::{Field, FieldAlgebra, PrimeField32}, + p3_field::{Field, PrimeCharacteristicRing, PrimeField32}, }; #[repr(C)] @@ -67,20 +67,14 @@ impl VmAdapterAir for BranchNativeAdapterAir { let mut timestamp_delta = 0usize; let mut timestamp_pp = || { timestamp_delta += 1; - timestamp + AB::F::from_canonical_usize(timestamp_delta - 1) + timestamp + AB::F::from_usize(timestamp_delta - 1) }; // check that d and e are in {0, 4} let d = cols.reads_aux[0].address.address_space; let e = cols.reads_aux[1].address.address_space; - builder.assert_eq( - d * (d - AB::F::from_canonical_u32(AS::Native as u32)), - AB::F::ZERO, - ); - builder.assert_eq( - e * (e - AB::F::from_canonical_u32(AS::Native as u32)), - AB::F::ZERO, - ); + builder.assert_eq(d * (d - AB::F::from_u32(AS::Native as u32)), AB::F::ZERO); + builder.assert_eq(e * (e - AB::F::from_u32(AS::Native as u32)), AB::F::ZERO); self.memory_bridge .read_or_immediate( @@ -111,7 +105,7 @@ impl VmAdapterAir for BranchNativeAdapterAir { cols.reads_aux[1].address.address_space.into(), ], cols.from_state, - AB::F::from_canonical_usize(timestamp_delta), + AB::F::from_usize(timestamp_delta), (DEFAULT_PC_STEP, ctx.to_pc), ) .eval(builder, ctx.instruction.is_valid); @@ -197,7 +191,7 @@ impl AdapterTraceFiller for BranchNativeAdapterFiller { // Writing in reverse order to avoid overwriting the `record` - let native_as = F::from_canonical_u32(AS::Native as u32); + let native_as = F::from_u32(AS::Native as u32); for ((i, read_record), read_cols) in record .reads_aux .iter() @@ -229,7 +223,7 @@ impl AdapterTraceFiller for BranchNativeAdapterFiller { } } - adapter_row.from_state.timestamp = F::from_canonical_u32(record.from_timestamp); - adapter_row.from_state.pc = F::from_canonical_u32(record.from_pc); + adapter_row.from_state.timestamp = F::from_u32(record.from_timestamp); + adapter_row.from_state.pc = F::from_u32(record.from_pc); } } diff --git a/extensions/native/circuit/src/adapters/convert_adapter.rs b/extensions/native/circuit/src/adapters/convert_adapter.rs index 271a714751..d7b784a793 100644 --- a/extensions/native/circuit/src/adapters/convert_adapter.rs +++ b/extensions/native/circuit/src/adapters/convert_adapter.rs @@ -30,7 +30,7 @@ use openvm_rv32im_circuit::adapters::tracing_write; use openvm_stark_backend::{ interaction::InteractionBuilder, p3_air::BaseAir, - p3_field::{Field, FieldAlgebra, PrimeField32}, + p3_field::{Field, PrimeCharacteristicRing, PrimeField32}, }; #[repr(C)] @@ -74,11 +74,11 @@ impl Vm let mut timestamp_delta = 0usize; let mut timestamp_pp = || { timestamp_delta += 1; - timestamp + AB::F::from_canonical_usize(timestamp_delta - 1) + timestamp + AB::F::from_usize(timestamp_delta - 1) }; let d = AB::Expr::TWO; - let e = AB::Expr::from_canonical_u32(AS::Native as u32); + let e = AB::Expr::from_u32(AS::Native as u32); self.memory_bridge .read( @@ -109,7 +109,7 @@ impl Vm e, ], cols.from_state, - AB::F::from_canonical_usize(timestamp_delta), + AB::F::from_usize(timestamp_delta), (DEFAULT_PC_STEP, ctx.to_pc), ) .eval(builder, ctx.instruction.is_valid); @@ -218,8 +218,7 @@ impl AdapterTr adapter_row.reads_aux[0].as_mut(), ); - adapter_row.writes_aux[0] - .set_prev_data(record.write_aux.prev_data.map(F::from_canonical_u8)); + adapter_row.writes_aux[0].set_prev_data(record.write_aux.prev_data.map(F::from_u8)); mem_helper.fill( record.write_aux.prev_timestamp, record.from_timestamp + 1, @@ -229,7 +228,7 @@ impl AdapterTr adapter_row.b_pointer = record.b_ptr; adapter_row.a_pointer = record.a_ptr; - adapter_row.from_state.timestamp = F::from_canonical_u32(record.from_timestamp); - adapter_row.from_state.pc = F::from_canonical_u32(record.from_pc); + adapter_row.from_state.timestamp = F::from_u32(record.from_timestamp); + adapter_row.from_state.pc = F::from_u32(record.from_pc); } } diff --git a/extensions/native/circuit/src/adapters/loadstore_native_adapter.rs b/extensions/native/circuit/src/adapters/loadstore_native_adapter.rs index 1a74d5e414..224a5b3819 100644 --- a/extensions/native/circuit/src/adapters/loadstore_native_adapter.rs +++ b/extensions/native/circuit/src/adapters/loadstore_native_adapter.rs @@ -30,7 +30,7 @@ use openvm_native_compiler::{ use openvm_stark_backend::{ interaction::InteractionBuilder, p3_air::BaseAir, - p3_field::{Field, FieldAlgebra, PrimeField32}, + p3_field::{Field, PrimeCharacteristicRing, PrimeField32}, }; pub struct NativeLoadStoreInstruction { @@ -92,14 +92,14 @@ impl VmAdapterAir ) { let cols: &NativeLoadStoreAdapterCols<_, NUM_CELLS> = local.borrow(); let timestamp = cols.from_state.timestamp; - let mut timestamp_delta = AB::Expr::from_canonical_usize(0); + let mut timestamp_delta = AB::Expr::from_usize(0); let is_valid = ctx.instruction.is_valid; let is_loadw = ctx.instruction.is_loadw; let is_storew = ctx.instruction.is_storew; let is_hint_storew = ctx.instruction.is_hint_storew; - let native_as = AB::Expr::from_canonical_u32(AS::Native as u32); + let native_as = AB::Expr::from_u32(AS::Native as u32); let ptr = ctx.reads.0; // Here we ignore ctx.reads.1 and we use `ctx.writes` as the data for both the write and the @@ -334,7 +334,7 @@ impl AdapterTraceFiller adapter_row.b = record.b; adapter_row.a = record.a; - adapter_row.from_state.pc = F::from_canonical_u32(record.from_pc); - adapter_row.from_state.timestamp = F::from_canonical_u32(record.from_timestamp); + adapter_row.from_state.pc = F::from_u32(record.from_pc); + adapter_row.from_state.timestamp = F::from_u32(record.from_timestamp); } } diff --git a/extensions/native/circuit/src/adapters/native_vectorized_adapter.rs b/extensions/native/circuit/src/adapters/native_vectorized_adapter.rs index 6d45bdecd0..dcc2e1ead8 100644 --- a/extensions/native/circuit/src/adapters/native_vectorized_adapter.rs +++ b/extensions/native/circuit/src/adapters/native_vectorized_adapter.rs @@ -27,7 +27,7 @@ use openvm_native_compiler::conversion::AS; use openvm_stark_backend::{ interaction::InteractionBuilder, p3_air::BaseAir, - p3_field::{Field, FieldAlgebra, PrimeField32}, + p3_field::{Field, PrimeCharacteristicRing, PrimeField32}, }; #[repr(C)] @@ -67,10 +67,10 @@ impl VmAdapterAir for NativeVectoriz let mut timestamp_delta = 0usize; let mut timestamp_pp = || { timestamp_delta += 1; - timestamp + AB::F::from_canonical_usize(timestamp_delta - 1) + timestamp + AB::F::from_usize(timestamp_delta - 1) }; - let native_as = AB::Expr::from_canonical_u32(AS::Native as u32); + let native_as = AB::Expr::from_u32(AS::Native as u32); self.memory_bridge .read( @@ -110,7 +110,7 @@ impl VmAdapterAir for NativeVectoriz native_as.clone(), ], cols.from_state, - AB::F::from_canonical_usize(timestamp_delta), + AB::F::from_usize(timestamp_delta), (DEFAULT_PC_STEP, ctx.to_pc), ) .eval(builder, ctx.instruction.is_valid); @@ -242,7 +242,7 @@ impl AdapterTraceFiller for NativeVectorized adapter_row.b_pointer = record.b_ptr; adapter_row.a_pointer = record.a_ptr; - adapter_row.from_state.timestamp = F::from_canonical_u32(record.from_timestamp); - adapter_row.from_state.pc = F::from_canonical_u32(record.from_pc); + adapter_row.from_state.timestamp = F::from_u32(record.from_timestamp); + adapter_row.from_state.pc = F::from_u32(record.from_pc); } } diff --git a/extensions/native/circuit/src/branch_eq/core.rs b/extensions/native/circuit/src/branch_eq/core.rs index e0669d0133..5fe1110eef 100644 --- a/extensions/native/circuit/src/branch_eq/core.rs +++ b/extensions/native/circuit/src/branch_eq/core.rs @@ -71,7 +71,7 @@ where opcode.local_opcode_idx(self.offset) == BranchEqualOpcode::BEQ as usize; if cmp_result == core_record.is_beq { - *state.pc = (F::from_canonical_u32(*state.pc) + imm).as_canonical_u32(); + *state.pc = (F::from_u32(*state.pc) + imm).as_canonical_u32(); } else { *state.pc = state.pc.wrapping_add(self.pc_step); } diff --git a/extensions/native/circuit/src/branch_eq/tests.rs b/extensions/native/circuit/src/branch_eq/tests.rs index 80c1473b36..fe69235cef 100644 --- a/extensions/native/circuit/src/branch_eq/tests.rs +++ b/extensions/native/circuit/src/branch_eq/tests.rs @@ -22,7 +22,7 @@ use openvm_rv32im_circuit::{ use openvm_rv32im_transpiler::BranchEqualOpcode; use openvm_stark_backend::{ p3_air::BaseAir, - p3_field::{FieldAlgebra, PrimeField32}, + p3_field::{PrimeCharacteristicRing, PrimeField32}, p3_matrix::{ dense::{DenseMatrix, RowMajorMatrix}, Matrix, @@ -114,12 +114,17 @@ fn set_and_execute( E: PreflightExecutor, RA: Arena, { - let a_val = a.unwrap_or(rng.gen()); - let b_val = b.unwrap_or(if rng.gen_bool(0.5) { a_val } else { rng.gen() }); - let imm = imm.unwrap_or(rng.gen_range((-ABS_MAX_IMM)..ABS_MAX_IMM)); + let a_val = a.unwrap_or(rng.random()); + let b_val = b.unwrap_or(if rng.random_bool(0.5) { + a_val + } else { + rng.random() + }); + let imm = imm.unwrap_or(rng.random_range((-ABS_MAX_IMM)..ABS_MAX_IMM)); let (a, a_as) = write_native_or_imm(tester, rng, a_val, None); let (b, b_as) = write_native_or_imm(tester, rng, b_val, None); - let initial_pc = rng.gen_range(imm.unsigned_abs()..(1 << (PC_BITS - 1)) - imm.unsigned_abs()); + let initial_pc = + rng.random_range(imm.unsigned_abs()..(1 << (PC_BITS - 1)) - imm.unsigned_abs()); tester.execute_with_pc( executor, @@ -129,8 +134,8 @@ fn set_and_execute( a, b, isize_to_field::(imm as isize), - F::from_canonical_usize(a_as), - F::from_canonical_usize(b_as), + F::from_usize(a_as), + F::from_usize(b_as), F::ZERO, F::ZERO, ), @@ -257,7 +262,7 @@ fn run_negative_branch_eq_test( let adapter_width = BaseAir::::width(&harness.air.adapter); let modify_trace = |trace: &mut DenseMatrix| { - let mut values = trace.row_slice(0).to_vec(); + let mut values = trace.row_slice(0).expect("row exists").to_vec(); let cols: &mut BranchEqualCoreCols = values.split_at_mut(adapter_width).1.borrow_mut(); if let Some(cmp_result) = prank_cmp_result { @@ -281,8 +286,8 @@ fn run_negative_branch_eq_test( fn rv32_beq_wrong_cmp_negative_test() { run_negative_branch_eq_test( BranchEqualOpcode::BEQ, - F::from_canonical_u32(7 << 16), - F::from_canonical_u32(7 << 24), + F::from_u32(7 << 16), + F::from_u32(7 << 24), Some(true), None, VerificationError::OodEvaluationMismatch, @@ -290,8 +295,8 @@ fn rv32_beq_wrong_cmp_negative_test() { run_negative_branch_eq_test( BranchEqualOpcode::BEQ, - F::from_canonical_u32(7 << 16), - F::from_canonical_u32(7 << 16), + F::from_u32(7 << 16), + F::from_u32(7 << 16), Some(false), None, VerificationError::OodEvaluationMismatch, @@ -302,8 +307,8 @@ fn rv32_beq_wrong_cmp_negative_test() { fn rv32_beq_zero_inv_marker_negative_test() { run_negative_branch_eq_test( BranchEqualOpcode::BEQ, - F::from_canonical_u32(7 << 16), - F::from_canonical_u32(7 << 24), + F::from_u32(7 << 16), + F::from_u32(7 << 24), Some(true), Some(F::ZERO), VerificationError::OodEvaluationMismatch, @@ -314,10 +319,10 @@ fn rv32_beq_zero_inv_marker_negative_test() { fn rv32_beq_invalid_inv_marker_negative_test() { run_negative_branch_eq_test( BranchEqualOpcode::BEQ, - F::from_canonical_u32(7 << 16), - F::from_canonical_u32(7 << 24), + F::from_u32(7 << 16), + F::from_u32(7 << 24), Some(false), - Some(F::from_canonical_u32(1 << 16)), + Some(F::from_u32(1 << 16)), VerificationError::OodEvaluationMismatch, ); } @@ -326,8 +331,8 @@ fn rv32_beq_invalid_inv_marker_negative_test() { fn rv32_bne_wrong_cmp_negative_test() { run_negative_branch_eq_test( BranchEqualOpcode::BNE, - F::from_canonical_u32(7 << 16), - F::from_canonical_u32(7 << 24), + F::from_u32(7 << 16), + F::from_u32(7 << 24), Some(false), None, VerificationError::OodEvaluationMismatch, @@ -335,8 +340,8 @@ fn rv32_bne_wrong_cmp_negative_test() { run_negative_branch_eq_test( BranchEqualOpcode::BNE, - F::from_canonical_u32(7 << 16), - F::from_canonical_u32(7 << 16), + F::from_u32(7 << 16), + F::from_u32(7 << 16), Some(true), None, VerificationError::OodEvaluationMismatch, @@ -347,8 +352,8 @@ fn rv32_bne_wrong_cmp_negative_test() { fn rv32_bne_zero_inv_marker_negative_test() { run_negative_branch_eq_test( BranchEqualOpcode::BNE, - F::from_canonical_u32(7 << 16), - F::from_canonical_u32(7 << 24), + F::from_u32(7 << 16), + F::from_u32(7 << 24), Some(false), Some(F::ZERO), VerificationError::OodEvaluationMismatch, @@ -359,10 +364,10 @@ fn rv32_bne_zero_inv_marker_negative_test() { fn rv32_bne_invalid_inv_marker_negative_test() { run_negative_branch_eq_test( BranchEqualOpcode::BNE, - F::from_canonical_u32(7 << 16), - F::from_canonical_u32(7 << 24), + F::from_u32(7 << 16), + F::from_u32(7 << 24), Some(true), - Some(F::from_canonical_u32(1 << 16)), + Some(F::from_u32(1 << 16)), VerificationError::OodEvaluationMismatch, ); } @@ -379,8 +384,8 @@ fn execute_roundtrip_sanity_test() { let mut tester = VmChipTestBuilder::default_native(); let mut harness = create_test_chip(&mut tester); - let x = F::from_canonical_u32(u32::from_le_bytes([19, 4, 179, 60])); - let y = F::from_canonical_u32(u32::from_le_bytes([19, 32, 180, 60])); + let x = F::from_u32(u32::from_le_bytes([19, 4, 179, 60])); + let y = F::from_u32(u32::from_le_bytes([19, 32, 180, 60])); set_and_execute( &mut tester, &mut harness.executor, @@ -406,7 +411,7 @@ fn execute_roundtrip_sanity_test() { #[test] fn run_eq_sanity_test() { - let x = F::from_canonical_u32(u32::from_le_bytes([19, 4, 17, 60])); + let x = F::from_u32(u32::from_le_bytes([19, 4, 17, 60])); let (cmp_result, diff_val) = run_eq(true, x, x); assert!(cmp_result); assert_eq!(diff_val, F::ZERO); @@ -418,8 +423,8 @@ fn run_eq_sanity_test() { #[test] fn run_ne_sanity_test() { - let x = F::from_canonical_u32(u32::from_le_bytes([19, 4, 17, 60])); - let y = F::from_canonical_u32(u32::from_le_bytes([19, 32, 18, 60])); + let x = F::from_u32(u32::from_le_bytes([19, 4, 17, 60])); + let y = F::from_u32(u32::from_le_bytes([19, 32, 18, 60])); let (cmp_result, diff_val) = run_eq(true, x, y); assert!(!cmp_result); assert_eq!(diff_val * (x - y), F::ONE); diff --git a/extensions/native/circuit/src/castf/core.rs b/extensions/native/circuit/src/castf/core.rs index 776e3086b5..7e9aafa8fc 100644 --- a/extensions/native/circuit/src/castf/core.rs +++ b/extensions/native/circuit/src/castf/core.rs @@ -15,7 +15,7 @@ use openvm_rv32im_circuit::adapters::RV32_REGISTER_NUM_LIMBS; use openvm_stark_backend::{ interaction::InteractionBuilder, p3_air::BaseAir, - p3_field::{Field, FieldAlgebra, PrimeField32}, + p3_field::{Field, PrimeCharacteristicRing, PrimeField32}, rap::BaseAirWithPublicValues, }; @@ -71,7 +71,7 @@ where .iter() .enumerate() .fold(AB::Expr::ZERO, |acc, (i, &limb)| { - acc + limb * AB::Expr::from_canonical_u32(1 << (i * LIMB_BITS)) + acc + limb * AB::Expr::from_u32(1 << (i * LIMB_BITS)) }); for i in 0..4 { @@ -93,9 +93,7 @@ where writes: [cols.out_val.map(Into::into)].into(), instruction: MinimalInstruction { is_valid: cols.is_valid.into(), - opcode: AB::Expr::from_canonical_usize( - CastfOpcode::CASTF.global_opcode().as_usize(), - ), + opcode: AB::Expr::from_usize(CastfOpcode::CASTF.global_opcode().as_usize()), } .into(), } @@ -190,8 +188,8 @@ where self.range_checker_chip.add_count(limb as u32, limb_bits); } core_row.is_valid = F::ONE; - core_row.out_val = out.map(F::from_canonical_u8); - core_row.in_val = F::from_canonical_u32(record.val); + core_row.out_val = out.map(F::from_u8); + core_row.in_val = F::from_u32(record.val); } } diff --git a/extensions/native/circuit/src/castf/tests.rs b/extensions/native/circuit/src/castf/tests.rs index 6d17984cad..211461e03d 100644 --- a/extensions/native/circuit/src/castf/tests.rs +++ b/extensions/native/circuit/src/castf/tests.rs @@ -19,7 +19,7 @@ use openvm_instructions::{ use openvm_native_compiler::{conversion::AS, CastfOpcode}; use openvm_stark_backend::{ p3_air::BaseAir, - p3_field::{FieldAlgebra, PrimeField32}, + p3_field::{PrimeCharacteristicRing, PrimeField32}, p3_matrix::{ dense::{DenseMatrix, RowMajorMatrix}, Matrix, @@ -95,7 +95,7 @@ fn set_and_execute( E: PreflightExecutor, RA: Arena, { - let b_val = b.unwrap_or(F::from_canonical_u32(rng.gen_range(0..1 << CASTF_MAX_BITS))); + let b_val = b.unwrap_or(F::from_u32(rng.random_range(0..1 << CASTF_MAX_BITS))); let b_ptr = write_native_array(tester, rng, Some([b_val])).1; let a = gen_pointer(rng, RV32_REGISTER_NUM_LIMBS); @@ -217,7 +217,7 @@ fn run_negative_castf_test(prank_vals: CastFPrankValues, b: Option, error: Ve let adapter_width = BaseAir::::width(&harness.air.adapter); let modify_trace = |trace: &mut DenseMatrix| { - let mut values = trace.row_slice(0).to_vec(); + let mut values = trace.row_slice(0).expect("row exists").to_vec(); let (adapter_row, core_row) = values.split_at_mut(adapter_width); let core_cols: &mut CastFCoreCols = core_row.borrow_mut(); let adapter_cols: &mut ConvertAdapterCols = @@ -225,16 +225,16 @@ fn run_negative_castf_test(prank_vals: CastFPrankValues, b: Option, error: Ve if let Some(in_val) = prank_vals.in_val { // TODO: in_val is actually never used in the AIR, should remove it - core_cols.in_val = F::from_canonical_u32(in_val); + core_cols.in_val = F::from_u32(in_val); } if let Some(out_val) = prank_vals.out_val { - core_cols.out_val = out_val.map(F::from_canonical_u32); + core_cols.out_val = out_val.map(F::from_u32); } if let Some(a_pointer) = prank_vals.a_pointer { - adapter_cols.a_pointer = F::from_canonical_u32(a_pointer); + adapter_cols.a_pointer = F::from_u32(a_pointer); } if let Some(b_pointer) = prank_vals.b_pointer { - adapter_cols.b_pointer = F::from_canonical_u32(b_pointer); + adapter_cols.b_pointer = F::from_u32(b_pointer); } *trace = RowMajorMatrix::new(values, trace.width()); }; @@ -254,7 +254,7 @@ fn casf_invalid_out_val_test() { out_val: Some([2 << LIMB_BITS, 0, 0, 0]), ..Default::default() }, - Some(F::from_canonical_u32(2 << LIMB_BITS)), + Some(F::from_u32(2 << LIMB_BITS)), VerificationError::ChallengePhaseError, ); diff --git a/extensions/native/circuit/src/extension/mod.rs b/extensions/native/circuit/src/extension/mod.rs index 251339c0d6..abe3a0c952 100644 --- a/extensions/native/circuit/src/extension/mod.rs +++ b/extensions/native/circuit/src/extension/mod.rs @@ -8,7 +8,7 @@ use openvm_circuit::{ arch::{ AirInventory, AirInventoryError, ChipInventory, ChipInventoryError, ExecutionBridge, ExecutorInventoryBuilder, ExecutorInventoryError, RowMajorMatrixArena, VmCircuitExtension, - VmExecutionExtension, VmProverExtension, + VmExecutionExtension, VmField, VmProverExtension, }, system::{memory::SharedMemoryHelper, SystemPort}, }; @@ -23,7 +23,7 @@ use openvm_poseidon2_air::Poseidon2Config; use openvm_rv32im_circuit::BranchEqualCoreAir; use openvm_stark_backend::{ config::{StarkGenericConfig, Val}, - p3_field::{Field, PrimeField32}, + p3_field::PrimeField32, prover::cpu::{CpuBackend, CpuDevice}, }; use openvm_stark_sdk::engine::StarkEngine; @@ -92,7 +92,7 @@ pub struct Native; openvm_circuit_derive::AotMeteredExecutor ) )] -pub enum NativeExecutor { +pub enum NativeExecutor { LoadStore(NativeLoadStoreExecutor<1>), BlockLoadStore(NativeLoadStoreExecutor), BranchEqual(NativeBranchEqExecutor), @@ -103,7 +103,7 @@ pub enum NativeExecutor { VerifyBatch(NativePoseidon2Executor), } -impl VmExecutionExtension for Native { +impl VmExecutionExtension for Native { type Executor = NativeExecutor; fn extend_execution( @@ -206,7 +206,7 @@ impl VmExecutionExtension for Native { impl VmCircuitExtension for Native where - Val: PrimeField32, + Val: VmField, { fn extend_circuit(&self, inventory: &mut AirInventory) -> Result<(), AirInventoryError> { let SystemPort { @@ -280,7 +280,7 @@ where SC: StarkGenericConfig, E: StarkEngine, PD = CpuDevice>, RA: RowMajorMatrixArena>, - Val: PrimeField32, + Val: VmField, { fn extend_prover( &self, @@ -386,9 +386,7 @@ pub(crate) mod phantom { } }; assert!(streams.hint_stream.is_empty()); - streams - .hint_stream - .push_back(F::from_canonical_usize(hint.len())); + streams.hint_stream.push_back(F::from_usize(hint.len())); streams.hint_stream.extend(hint); Ok(()) } @@ -467,9 +465,7 @@ pub(crate) mod phantom { assert!(streams.hint_stream.is_empty()); for _ in 0..len { - streams - .hint_stream - .push_back(F::from_canonical_u32(val & 1)); + streams.hint_stream.push_back(F::from_u32(val & 1)); val >>= 1; } Ok(()) @@ -497,7 +493,7 @@ pub(crate) mod phantom { streams.hint_space.push(payload); // Hint stream should have already been consumed. assert!(streams.hint_stream.is_empty()); - streams.hint_stream.push_back(F::from_canonical_usize(id)); + streams.hint_stream.push_back(F::from_usize(id)); Ok(()) } } diff --git a/extensions/native/circuit/src/field_arithmetic/core.rs b/extensions/native/circuit/src/field_arithmetic/core.rs index 112797701d..32a3580dc2 100644 --- a/extensions/native/circuit/src/field_arithmetic/core.rs +++ b/extensions/native/circuit/src/field_arithmetic/core.rs @@ -12,7 +12,7 @@ use openvm_native_compiler::FieldArithmeticOpcode::{self, *}; use openvm_stark_backend::{ interaction::InteractionBuilder, p3_air::BaseAir, - p3_field::{Field, FieldAlgebra, PrimeField32}, + p3_field::{Field, PrimeCharacteristicRing, PrimeField32}, rap::BaseAirWithPublicValues, }; @@ -81,7 +81,7 @@ where builder.assert_bool(flag); is_valid += flag.into(); - expected_opcode += flag * AB::Expr::from_canonical_u32(opcode as u32); + expected_opcode += flag * AB::Expr::from_u32(opcode as u32); expected_result += flag * result; } builder.assert_eq(a, expected_result); diff --git a/extensions/native/circuit/src/field_arithmetic/tests.rs b/extensions/native/circuit/src/field_arithmetic/tests.rs index 91508fe246..03c3d23add 100644 --- a/extensions/native/circuit/src/field_arithmetic/tests.rs +++ b/extensions/native/circuit/src/field_arithmetic/tests.rs @@ -13,7 +13,7 @@ use openvm_instructions::{instruction::Instruction, LocalOpcode}; use openvm_native_compiler::{conversion::AS, FieldArithmeticOpcode}; use openvm_stark_backend::{ p3_air::BaseAir, - p3_field::{Field, FieldAlgebra, PrimeField32}, + p3_field::{Field, PrimeCharacteristicRing, PrimeField32}, p3_matrix::{ dense::{DenseMatrix, RowMajorMatrix}, Matrix, @@ -95,12 +95,12 @@ fn set_and_execute( E: PreflightExecutor, RA: Arena, { - let b_val = b.unwrap_or(rng.gen()); + let b_val = b.unwrap_or(rng.random()); let c_val = c.unwrap_or(if opcode == FieldArithmeticOpcode::DIV { // If division, make sure c is not zero - F::from_canonical_u32(rng.gen_range(0..F::NEG_ONE.as_canonical_u32()) + 1) + F::from_u32(rng.random_range(0..F::NEG_ONE.as_canonical_u32()) + 1) } else { - rng.gen() + rng.random() }); assert!(!c_val.is_zero(), "Division by zero"); let (b, b_as) = write_native_or_imm(tester, rng, b_val, None); @@ -112,12 +112,12 @@ fn set_and_execute( arena, &Instruction::new( opcode.global_opcode(), - F::from_canonical_usize(a), + F::from_usize(a), b, c, - F::from_canonical_usize(AS::Native as usize), - F::from_canonical_usize(b_as), - F::from_canonical_usize(c_as), + F::from_usize(AS::Native as usize), + F::from_usize(b_as), + F::from_usize(c_as), F::ZERO, ), ); @@ -252,7 +252,7 @@ fn run_negative_field_arithmetic_test( let adapter_width = BaseAir::::width(&harness.air.adapter); let modify_trace = |trace: &mut DenseMatrix| { - let mut values = trace.row_slice(0).to_vec(); + let mut values = trace.row_slice(0).expect("row exists").to_vec(); let cols: &mut FieldArithmeticCoreCols = values.split_at_mut(adapter_width).1.borrow_mut(); if let Some(a) = prank_vals.a { @@ -285,8 +285,8 @@ fn run_negative_field_arithmetic_test( fn field_arithmetic_negative_zero_div_test() { run_negative_field_arithmetic_test( FieldArithmeticOpcode::DIV, - F::from_canonical_u32(111), - F::from_canonical_u32(222), + F::from_u32(111), + F::from_u32(222), FieldExpressionPrankVals { b: Some(F::ZERO), ..Default::default() @@ -323,14 +323,14 @@ fn field_arithmetic_negative_rand() { let mut rng = create_seeded_rng(); run_negative_field_arithmetic_test( FieldArithmeticOpcode::DIV, - F::from_canonical_u32(111), - F::from_canonical_u32(222), + F::from_u32(111), + F::from_u32(222), FieldExpressionPrankVals { - a: Some(rng.gen()), - b: Some(rng.gen()), - c: Some(rng.gen()), - opcode_flags: Some([rng.gen(), rng.gen(), rng.gen(), rng.gen()]), - divisor_inv: Some(rng.gen()), + a: Some(rng.random()), + b: Some(rng.random()), + c: Some(rng.random()), + opcode_flags: Some([rng.random(), rng.random(), rng.random(), rng.random()]), + divisor_inv: Some(rng.random()), }, VerificationError::OodEvaluationMismatch, ); diff --git a/extensions/native/circuit/src/field_extension/core.rs b/extensions/native/circuit/src/field_extension/core.rs index 5afaf74af5..ffe71699e7 100644 --- a/extensions/native/circuit/src/field_extension/core.rs +++ b/extensions/native/circuit/src/field_extension/core.rs @@ -16,7 +16,7 @@ use openvm_native_compiler::FieldExtensionOpcode::{self, *}; use openvm_stark_backend::{ interaction::InteractionBuilder, p3_air::BaseAir, - p3_field::{Field, FieldAlgebra, PrimeField32}, + p3_field::{Field, PrimeCharacteristicRing, PrimeField32}, rap::BaseAirWithPublicValues, }; @@ -93,7 +93,7 @@ where builder.assert_bool(flag); is_valid += flag.into(); - expected_opcode += flag * AB::F::from_canonical_usize(opcode.local_usize()); + expected_opcode += flag * AB::F::from_usize(opcode.local_usize()); for (j, result_part) in result.into_iter().enumerate() { expected_result[j] += flag * result_part; @@ -270,7 +270,7 @@ impl FieldExtension { pub(crate) fn multiply(x: [V; EXT_DEG], y: [V; EXT_DEG]) -> [E; EXT_DEG] where - E: FieldAlgebra, + E: PrimeCharacteristicRing, V: Copy, V: Mul, E: Mul, @@ -280,9 +280,9 @@ impl FieldExtension { let [x0, x1, x2, x3] = x; let [y0, y1, y2, y3] = y; [ - x0 * y0 + (x1 * y3 + x2 * y2 + x3 * y1) * E::from_canonical_usize(BETA), - x0 * y1 + x1 * y0 + (x2 * y3 + x3 * y2) * E::from_canonical_usize(BETA), - x0 * y2 + x1 * y1 + x2 * y0 + (x3 * y3) * E::from_canonical_usize(BETA), + x0 * y0 + (x1 * y3 + x2 * y2 + x3 * y1) * E::from_usize(BETA), + x0 * y1 + x1 * y0 + (x2 * y3 + x3 * y2) * E::from_usize(BETA), + x0 * y2 + x1 * y1 + x2 * y0 + (x3 * y3) * E::from_usize(BETA), x0 * y3 + x1 * y2 + x2 * y1 + x3 * y0, ] } @@ -301,7 +301,7 @@ impl FieldExtension { let [a0, a1, a2, a3] = a; - let beta = F::from_canonical_usize(BETA); + let beta = F::from_usize(BETA); let mut b0 = a0 * a0 - beta * (F::TWO * a1 * a3 - a2 * a2); let mut b2 = F::TWO * a0 * a2 - a1 * a1 - beta * a3 * a3; diff --git a/extensions/native/circuit/src/field_extension/tests.rs b/extensions/native/circuit/src/field_extension/tests.rs index d262aa7169..cc0a2c9a5e 100644 --- a/extensions/native/circuit/src/field_extension/tests.rs +++ b/extensions/native/circuit/src/field_extension/tests.rs @@ -17,7 +17,7 @@ use openvm_instructions::{instruction::Instruction, LocalOpcode}; use openvm_native_compiler::{conversion::AS, FieldExtensionOpcode}; use openvm_stark_backend::{ p3_air::BaseAir, - p3_field::{extension::BinomialExtensionField, FieldAlgebra, FieldExtensionAlgebra}, + p3_field::{extension::BinomialExtensionField, BasedVectorSpace, PrimeCharacteristicRing}, p3_matrix::{ dense::{DenseMatrix, RowMajorMatrix}, Matrix, @@ -245,7 +245,7 @@ fn run_negative_field_extension_test( let adapter_width = BaseAir::::width(&harness.air.adapter); let modify_trace = |trace: &mut DenseMatrix| { - let mut values = trace.row_slice(0).to_vec(); + let mut values = trace.row_slice(0).expect("row exists").to_vec(); let core_cols: &mut FieldExtensionCoreCols = values.split_at_mut(adapter_width).1.borrow_mut(); @@ -289,11 +289,11 @@ fn rand_negative_field_extension_test() { None, None, FieldExtensionPrankValues { - x: Some(array::from_fn(|_| rng.gen::())), - y: Some(array::from_fn(|_| rng.gen::())), - z: Some(array::from_fn(|_| rng.gen::())), - opcode_flags: Some(array::from_fn(|_| rng.gen_bool(0.5))), - divisor_inv: Some(array::from_fn(|_| rng.gen::())), + x: Some(array::from_fn(|_| rng.random::())), + y: Some(array::from_fn(|_| rng.random::())), + z: Some(array::from_fn(|_| rng.random::())), + opcode_flags: Some(array::from_fn(|_| rng.random_bool(0.5))), + divisor_inv: Some(array::from_fn(|_| rng.random::())), }, VerificationError::OodEvaluationMismatch, ); @@ -346,15 +346,15 @@ fn new_field_extension_consistency_test() { let operands: Vec<([F; 4], [F; 4])> = (0..len_tests) .map(|_| { ( - array::from_fn(|_| rng.gen::()), - array::from_fn(|_| rng.gen::()), + array::from_fn(|_| rng.random::()), + array::from_fn(|_| rng.random::()), ) }) .collect(); for (a, b) in operands { - let a_ext = EF::from_base_slice(&a); - let b_ext = EF::from_base_slice(&b); + let a_ext = EF::from_basis_coefficients_slice(&a).unwrap(); + let b_ext = EF::from_basis_coefficients_slice(&b).unwrap(); let plonky_add = a_ext.add(b_ext); let plonky_sub = a_ext.sub(b_ext); @@ -366,9 +366,9 @@ fn new_field_extension_consistency_test() { let my_mul = FieldExtension::multiply(a, b); let my_div = FieldExtension::divide(a, b); - assert_eq!(my_add, plonky_add.as_base_slice()); - assert_eq!(my_sub, plonky_sub.as_base_slice()); - assert_eq!(my_mul, plonky_mul.as_base_slice()); - assert_eq!(my_div, plonky_div.as_base_slice()); + assert_eq!(my_add, plonky_add.as_basis_coefficients_slice()); + assert_eq!(my_sub, plonky_sub.as_basis_coefficients_slice()); + assert_eq!(my_mul, plonky_mul.as_basis_coefficients_slice()); + assert_eq!(my_div, plonky_div.as_basis_coefficients_slice()); } } diff --git a/extensions/native/circuit/src/fri/execution.rs b/extensions/native/circuit/src/fri/execution.rs index 675caa1143..cf7e9162ec 100644 --- a/extensions/native/circuit/src/fri/execution.rs +++ b/extensions/native/circuit/src/fri/execution.rs @@ -217,14 +217,14 @@ unsafe fn execute_e12_impl( let mut as_and_bs = Vec::with_capacity(length); #[allow(clippy::needless_range_loop)] for i in 0..length { - let a_ptr_i = (a_ptr + F::from_canonical_usize(i)).as_canonical_u32(); + let a_ptr_i = (a_ptr + F::from_usize(i)).as_canonical_u32(); let [a]: [F; 1] = if is_init == 0 { exec_state.vm_write(AS::Native as u32, a_ptr_i, &[data[i]]); [data[i]] } else { exec_state.vm_read(AS::Native as u32, a_ptr_i) }; - let b_ptr_i = (b_ptr + F::from_canonical_usize(EXT_DEG * i)).as_canonical_u32(); + let b_ptr_i = (b_ptr + F::from_usize(EXT_DEG * i)).as_canonical_u32(); let b = exec_state.vm_read(AS::Native as u32, b_ptr_i); as_and_bs.push((a, b)); diff --git a/extensions/native/circuit/src/fri/mod.rs b/extensions/native/circuit/src/fri/mod.rs index 1e1ec65cb8..7985b0f3e2 100644 --- a/extensions/native/circuit/src/fri/mod.rs +++ b/extensions/native/circuit/src/fri/mod.rs @@ -26,7 +26,7 @@ use openvm_native_compiler::{conversion::AS, FriOpcode::FRI_REDUCED_OPENING}; use openvm_stark_backend::{ interaction::InteractionBuilder, p3_air::{Air, AirBuilder, BaseAir}, - p3_field::{Field, FieldAlgebra, PrimeField32}, + p3_field::{Field, PrimeCharacteristicRing, PrimeField32}, p3_matrix::{dense::RowMajorMatrix, Matrix}, p3_maybe_rayon::prelude::*, rap::{BaseAirWithPublicValues, PartitionedBaseAir}, @@ -240,8 +240,8 @@ impl PartitionedBaseAir for FriReducedOpeningAir {} impl Air for FriReducedOpeningAir { fn eval(&self, builder: &mut AB) { let main = builder.main(); - let local = main.row_slice(0); - let next = main.row_slice(1); + let local = main.row_slice(0).expect("window should have two elements"); + let next = main.row_slice(1).expect("window should have two elements"); let local_slice = local.deref(); let next_slice = next.deref(); self.eval_general(builder, local_slice, next_slice); @@ -287,8 +287,8 @@ impl FriReducedOpeningAir { let start_timestamp = next.general.timestamp; let multiplicity = local.prefix.general.is_workload_row; // a_ptr/b_ptr/length/result - let ptr_reads = AB::F::from_canonical_usize(INSTRUCTION_READS); - let native_as = AB::Expr::from_canonical_u32(AS::Native as u32); + let ptr_reads = AB::F::from_usize(INSTRUCTION_READS); + let native_as = AB::Expr::from_u32(AS::Native as u32); // write_a itself could be anything on non-workload row, but on workload row, it must be // boolean. write_a on last workflow row will be constrained to equal write_a on // instruction1 row, implying the latter is boolean. @@ -340,7 +340,7 @@ impl FriReducedOpeningAir { // local.b_ptr = next.b_ptr + EXT_DEG builder.assert_eq( local_data.b_ptr, - next.data.b_ptr + AB::F::from_canonical_usize(EXT_DEG), + next.data.b_ptr + AB::F::from_usize(EXT_DEG), ); // local.timestamp = next.timestamp + 2 builder.assert_eq( @@ -417,14 +417,13 @@ impl FriReducedOpeningAir { let length = local.prefix.data.idx; let multiplicity = local.prefix.general.is_ins_row * local.prefix.a_or_is_first; let start_timestamp = local.prefix.general.timestamp; - let write_timestamp = start_timestamp - + AB::Expr::TWO * length - + AB::Expr::from_canonical_usize(INSTRUCTION_READS); + let write_timestamp = + start_timestamp + AB::Expr::TWO * length + AB::Expr::from_usize(INSTRUCTION_READS); let end_timestamp = write_timestamp.clone() + AB::Expr::ONE; - let native_as = AB::Expr::from_canonical_u32(AS::Native as u32); + let native_as = AB::Expr::from_u32(AS::Native as u32); self.execution_bridge .execute( - AB::F::from_canonical_usize(FRI_REDUCED_OPENING.global_opcode().as_usize()), + AB::F::from_usize(FRI_REDUCED_OPENING.global_opcode().as_usize()), [ local.a_ptr_ptr.into(), local.b_ptr_ptr.into(), @@ -436,7 +435,7 @@ impl FriReducedOpeningAir { ], ExecutionState::new(local.pc, local.prefix.general.timestamp), ExecutionState::::new( - AB::Expr::from_canonical_u32(DEFAULT_PC_STEP) + local.pc, + AB::Expr::from_u32(DEFAULT_PC_STEP) + local.pc, end_timestamp.clone(), ), ) @@ -473,7 +472,7 @@ impl FriReducedOpeningAir { .read( MemoryAddress::new(native_as.clone(), local.b_ptr_ptr), [local_data.b_ptr], - start_timestamp + AB::Expr::from_canonical_u32(3), + start_timestamp + AB::Expr::from_u32(3), &local.b_ptr_aux, ) .eval(builder, multiplicity.clone()); @@ -482,7 +481,7 @@ impl FriReducedOpeningAir { .read( MemoryAddress::new(native_as.clone(), next.is_init_ptr), [AB::Expr::ONE - local_data.write_a], - start_timestamp + AB::Expr::from_canonical_u32(4), + start_timestamp + AB::Expr::from_u32(4), &next.is_init_aux, ) .eval(builder, multiplicity.clone()); @@ -987,7 +986,7 @@ impl TraceFiller for FriReducedOpeningFiller { cols.is_first = F::ZERO; - cols.general.timestamp = F::from_canonical_u32(timestamp); + cols.general.timestamp = F::from_u32(timestamp); cols.general.is_ins_row = F::ONE; cols.general.is_workload_row = F::ZERO; @@ -1014,18 +1013,18 @@ impl TraceFiller for FriReducedOpeningFiller { ); cols.a_ptr_ptr = record.common.a_ptr_ptr; - cols.pc = F::from_canonical_u32(record.common.from_pc); + cols.pc = F::from_u32(record.common.from_pc); cols.prefix.data.alpha = alpha; cols.prefix.data.result = record.workload.last().unwrap().result; - cols.prefix.data.idx = F::from_canonical_usize(length); - cols.prefix.data.b_ptr = F::from_canonical_u32(b_ptr); + cols.prefix.data.idx = F::from_usize(length); + cols.prefix.data.b_ptr = F::from_u32(b_ptr); cols.prefix.data.write_a = write_a; - cols.prefix.data.a_ptr = F::from_canonical_u32(a_ptr); + cols.prefix.data.a_ptr = F::from_u32(a_ptr); cols.prefix.a_or_is_first = F::ONE; - cols.prefix.general.timestamp = F::from_canonical_u32(timestamp); + cols.prefix.general.timestamp = F::from_u32(timestamp); cols.prefix.general.is_ins_row = F::ONE; cols.prefix.general.is_workload_row = F::ZERO; ins1_chunk[INS_1_WIDTH..OVERALL_WIDTH].fill(F::ZERO); @@ -1093,11 +1092,10 @@ impl TraceFiller for FriReducedOpeningFiller { } // DataCols - cols.prefix.data.a_ptr = F::from_canonical_u32(a_ptr + (length - i) as u32); + cols.prefix.data.a_ptr = F::from_u32(a_ptr + (length - i) as u32); cols.prefix.data.write_a = write_a; - cols.prefix.data.b_ptr = - F::from_canonical_u32(b_ptr + ((length - i) * EXT_DEG) as u32); - cols.prefix.data.idx = F::from_canonical_usize(i); + cols.prefix.data.b_ptr = F::from_u32(b_ptr + ((length - i) * EXT_DEG) as u32); + cols.prefix.data.idx = F::from_usize(i); if i == 0 { cols.prefix.data.result = [F::ZERO; EXT_DEG]; } @@ -1108,7 +1106,7 @@ impl TraceFiller for FriReducedOpeningFiller { cols.prefix.general.is_ins_row = F::ZERO; // WorkloadCols - cols.prefix.general.timestamp = F::from_canonical_u32(timestamp); + cols.prefix.general.timestamp = F::from_u32(timestamp); cols.b = FieldExtension::subtract( FieldExtension::add(cols.b, elem_to_ext(cols.prefix.a_or_is_first)), diff --git a/extensions/native/circuit/src/fri/tests.rs b/extensions/native/circuit/src/fri/tests.rs index 08933d6234..d1ba7aaf0d 100644 --- a/extensions/native/circuit/src/fri/tests.rs +++ b/extensions/native/circuit/src/fri/tests.rs @@ -10,7 +10,7 @@ use openvm_circuit::arch::{ use openvm_instructions::{instruction::Instruction, LocalOpcode}; use openvm_native_compiler::{conversion::AS, FriOpcode::FRI_REDUCED_OPENING}; use openvm_stark_backend::{ - p3_field::{Field, FieldAlgebra}, + p3_field::{Field, PrimeCharacteristicRing}, p3_matrix::{ dense::{DenseMatrix, RowMajorMatrix}, Matrix, @@ -94,15 +94,13 @@ fn set_and_execute( E: PreflightExecutor, RA: Arena, { - let len = rng.gen_range(1..=28); + let len = rng.random_range(1..=28); let a_ptr = gen_pointer(rng, len); let b_ptr = gen_pointer(rng, len); - let a_ptr_ptr = - write_native_array::(tester, rng, Some([F::from_canonical_usize(a_ptr)])).1; - let b_ptr_ptr = - write_native_array::(tester, rng, Some([F::from_canonical_usize(b_ptr)])).1; + let a_ptr_ptr = write_native_array::(tester, rng, Some([F::from_usize(a_ptr)])).1; + let b_ptr_ptr = write_native_array::(tester, rng, Some([F::from_usize(b_ptr)])).1; - let len_ptr = write_native_array::(tester, rng, Some([F::from_canonical_usize(len)])).1; + let len_ptr = write_native_array::(tester, rng, Some([F::from_usize(len)])).1; let (alpha, alpha_ptr) = write_native_array::(tester, rng, None); let out_ptr = gen_pointer(rng, EXT_DEG); let is_init = true; @@ -111,8 +109,8 @@ fn set_and_execute( let mut vec_a = Vec::with_capacity(len); let mut vec_b = Vec::with_capacity(len); for i in 0..len { - let a = rng.gen(); - let b: [F; EXT_DEG] = std::array::from_fn(|_| rng.gen()); + let a = rng.random(); + let b: [F; EXT_DEG] = std::array::from_fn(|_| rng.random()); vec_a.push(a); vec_b.push(b); if !is_init { @@ -226,10 +224,10 @@ fn run_negative_fri_mat_opening_test() { ); let modify_trace = |trace: &mut DenseMatrix| { - let mut values = trace.row_slice(0).to_vec(); + let mut values = trace.row_slice(0).expect("row exists").to_vec(); let cols: &mut WorkloadCols = values[..WL_WIDTH].borrow_mut(); - cols.prefix.a_or_is_first = F::from_canonical_u32(42); + cols.prefix.a_or_is_first = F::from_u32(42); *trace = RowMajorMatrix::new(values, OVERALL_WIDTH); }; diff --git a/extensions/native/circuit/src/jal_rangecheck/execution.rs b/extensions/native/circuit/src/jal_rangecheck/execution.rs index f392a22006..a9209529f5 100644 --- a/extensions/native/circuit/src/jal_rangecheck/execution.rs +++ b/extensions/native/circuit/src/jal_rangecheck/execution.rs @@ -42,7 +42,7 @@ impl JalRangeCheckExecutor { } let a = a.as_canonical_u32(); - let return_pc = F::from_canonical_u32(pc.wrapping_add(DEFAULT_PC_STEP)); + let return_pc = F::from_u32(pc.wrapping_add(DEFAULT_PC_STEP)); *jal_data = JalPreCompute { a, b, return_pc }; Ok(()) @@ -220,7 +220,7 @@ unsafe fn execute_jal_e12_impl( // TODO(ayush): better way to do this let mut pc = exec_state.pc(); - pc = (F::from_canonical_u32(pc) + pre_compute.b).as_canonical_u32(); + pc = (F::from_u32(pc) + pre_compute.b).as_canonical_u32(); exec_state.set_pc(pc); } diff --git a/extensions/native/circuit/src/jal_rangecheck/mod.rs b/extensions/native/circuit/src/jal_rangecheck/mod.rs index ad8b27489e..88105e88d5 100644 --- a/extensions/native/circuit/src/jal_rangecheck/mod.rs +++ b/extensions/native/circuit/src/jal_rangecheck/mod.rs @@ -24,7 +24,7 @@ use openvm_native_compiler::{conversion::AS, NativeJalOpcode, NativeRangeCheckOp use openvm_stark_backend::{ interaction::InteractionBuilder, p3_air::{Air, AirBuilder, BaseAir}, - p3_field::{Field, FieldAlgebra, PrimeField32}, + p3_field::{Field, PrimeCharacteristicRing, PrimeField32}, p3_matrix::Matrix, rap::{BaseAirWithPublicValues, PartitionedBaseAir}, }; @@ -81,7 +81,7 @@ where { fn eval(&self, builder: &mut AB) { let main = builder.main(); - let local = main.row_slice(0); + let local = main.row_slice(0).expect("window should have two elements"); let local_slice = local.deref(); let local: &JalRangeCheckCols = local_slice.borrow(); builder.assert_bool(local.is_jal); @@ -89,11 +89,10 @@ where let is_valid = local.is_jal + local.is_range_check; builder.assert_bool(is_valid.clone()); - let d = AB::Expr::from_canonical_u32(Native as u32); + let d = AB::Expr::from_u32(Native as u32); let a_val = local.writes_aux.prev_data()[0]; // if is_jal, write pc + DEFAULT_PC_STEP, else if is_range_check, read a_val. - let write_val = local.is_jal - * (local.state.pc + AB::Expr::from_canonical_u32(DEFAULT_PC_STEP)) + let write_val = local.is_jal * (local.state.pc + AB::Expr::from_u32(DEFAULT_PC_STEP)) + local.is_range_check * a_val; self.memory_bridge .write( @@ -105,16 +104,16 @@ where .eval(builder, is_valid.clone()); let opcode = local.is_jal - * AB::F::from_canonical_usize(NativeJalOpcode::JAL.global_opcode().as_usize()) + * AB::F::from_usize(NativeJalOpcode::JAL.global_opcode().as_usize()) + local.is_range_check - * AB::F::from_canonical_usize( + * AB::F::from_usize( NativeRangeCheckOpcode::RANGE_CHECK .global_opcode() .as_usize(), ); // Increment pc by b if is_jal, else by DEFAULT_PC_STEP if is_range_check. - let pc_inc = local.is_jal * local.b - + local.is_range_check * AB::F::from_canonical_u32(DEFAULT_PC_STEP); + let pc_inc = + local.is_jal * local.b + local.is_range_check * AB::F::from_u32(DEFAULT_PC_STEP); builder.when(local.is_jal).assert_zero(local.c); self.execution_bridge .execute_and_increment_or_set_pc( @@ -128,7 +127,7 @@ where // Range check specific: // a_val = x + y * (1 << 16) - let x = a_val - local.y * AB::Expr::from_canonical_u32(1 << 16); + let x = a_val - local.y * AB::Expr::from_u32(1 << 16); self.range_bus .send(x.clone(), local.b) .eval(builder, local.is_range_check); @@ -210,13 +209,11 @@ where tracing_write_native( state.memory, a.as_canonical_u32(), - [F::from_canonical_u32( - state.pc.wrapping_add(DEFAULT_PC_STEP), - )], + [F::from_u32(state.pc.wrapping_add(DEFAULT_PC_STEP))], &mut record.write.prev_timestamp, &mut record.write.prev_data, ); - *state.pc = (F::from_canonical_u32(*state.pc) + b).as_canonical_u32(); + *state.pc = (F::from_u32(*state.pc) + b).as_canonical_u32(); } else if opcode == NativeRangeCheckOpcode::RANGE_CHECK.global_opcode() { record.is_jal = false; record.c = c; @@ -256,8 +253,8 @@ impl TraceFiller for JalRangeCheckFiller { record.from_timestamp, cols.writes_aux.as_mut(), ); - cols.state.timestamp = F::from_canonical_u32(record.from_timestamp); - cols.state.pc = F::from_canonical_u32(record.from_pc); + cols.state.timestamp = F::from_u32(record.from_timestamp); + cols.state.pc = F::from_u32(record.from_pc); cols.a_pointer = record.a; cols.is_range_check = F::ZERO; cols.is_jal = F::ONE; @@ -278,7 +275,7 @@ impl TraceFiller for JalRangeCheckFiller { self.range_checker_chip.add_count(x, b as usize); self.range_checker_chip.add_count(y, c as usize); - cols.y = F::from_canonical_u32(y); + cols.y = F::from_u32(y); cols.c = record.c; cols.b = record.b; cols.writes_aux.set_prev_data(record.write.prev_data); @@ -287,8 +284,8 @@ impl TraceFiller for JalRangeCheckFiller { record.from_timestamp, cols.writes_aux.as_mut(), ); - cols.state.timestamp = F::from_canonical_u32(record.from_timestamp); - cols.state.pc = F::from_canonical_u32(record.from_pc); + cols.state.timestamp = F::from_u32(record.from_timestamp); + cols.state.pc = F::from_u32(record.from_pc); cols.a_pointer = record.a; cols.is_range_check = F::ONE; cols.is_jal = F::ZERO; diff --git a/extensions/native/circuit/src/jal_rangecheck/tests.rs b/extensions/native/circuit/src/jal_rangecheck/tests.rs index 1b9eb905e0..7ddf23d141 100644 --- a/extensions/native/circuit/src/jal_rangecheck/tests.rs +++ b/extensions/native/circuit/src/jal_rangecheck/tests.rs @@ -22,7 +22,7 @@ use openvm_native_compiler::{ #[cfg(feature = "cuda")] use openvm_native_compiler::{NativeJalOpcode, NativeRangeCheckOpcode}; use openvm_stark_backend::{ - p3_field::{FieldAlgebra, PrimeField32}, + p3_field::{PrimeCharacteristicRing, PrimeField32}, p3_matrix::{ dense::{DenseMatrix, RowMajorMatrix}, Matrix, @@ -99,10 +99,10 @@ fn set_and_execute( RA: Arena, { if opcode == JAL.global_opcode() { - let initial_pc = rng.gen_range(0..(1 << PC_BITS)); + let initial_pc = rng.random_range(0..(1 << PC_BITS)); let a = gen_pointer(rng, 1); - let final_pc = F::from_canonical_u32(rng.gen_range(0..(1 << PC_BITS))); - let b = b.unwrap_or((final_pc - F::from_canonical_u32(initial_pc)).as_canonical_u32()); + let final_pc = F::from_u32(rng.random_range(0..(1 << PC_BITS))); + let b = b.unwrap_or((final_pc - F::from_u32(initial_pc)).as_canonical_u32()); tester.execute_with_pc( executor, arena, @@ -111,21 +111,21 @@ fn set_and_execute( ); let final_pc = tester.execution_final_state().pc; - let expected_final_pc = F::from_canonical_u32(initial_pc) + F::from_canonical_u32(b); + let expected_final_pc = F::from_u32(initial_pc) + F::from_u32(b); assert_eq!(final_pc, expected_final_pc); let result_a_val = tester.read::<1>(AS::Native as usize, a)[0].as_canonical_u32(); let expected_a_val = initial_pc + DEFAULT_PC_STEP; assert_eq!(result_a_val, expected_a_val); } else { - let a_val = a_val.unwrap_or(rng.gen_range(0..(1 << 30))); - let a = write_native_array(tester, rng, Some([F::from_canonical_u32(a_val)])).1; + let a_val = a_val.unwrap_or(rng.random_range(0..(1 << 30))); + let a = write_native_array(tester, rng, Some([F::from_u32(a_val)])).1; let x = a_val & 0xffff; let y = a_val >> 16; let min_b = 32 - x.leading_zeros(); let min_c = 32 - y.leading_zeros(); - let b = b.unwrap_or(rng.gen_range(min_b..=16)); - let c = c.unwrap_or(rng.gen_range(min_c..=14)); + let b = b.unwrap_or(rng.random_range(min_b..=16)); + let c = c.unwrap_or(rng.random_range(min_c..=14)); tester.execute( executor, arena, @@ -231,7 +231,7 @@ fn range_check_edge_cases_test() { ); // x = 0 - let a = rng.gen_range(0..(1 << 14)) << 16; + let a = rng.random_range(0..(1 << 14)) << 16; set_and_execute( &mut tester, &mut harness.executor, @@ -244,7 +244,7 @@ fn range_check_edge_cases_test() { ); // y = 0 - let a = rng.gen_range(0..(1 << 16)); + let a = rng.random_range(0..(1 << 16)); set_and_execute( &mut tester, &mut harness.executor, @@ -299,7 +299,7 @@ fn run_negative_jal_range_check_test( ); let modify_trace = |trace: &mut DenseMatrix| { - let mut values = trace.row_slice(0).to_vec(); + let mut values = trace.row_slice(0).expect("row exists").to_vec(); let cols: &mut JalRangeCheckCols = values[..].borrow_mut(); if let Some(flags) = prank_vals.flags { @@ -307,18 +307,17 @@ fn run_negative_jal_range_check_test( cols.is_range_check = F::from_bool(flags[1]); } if let Some(a_val) = prank_vals.a_val { - cols.writes_aux - .set_prev_data([F::from_canonical_u32(a_val)]); + cols.writes_aux.set_prev_data([F::from_u32(a_val)]); } if let Some(b) = prank_vals.b { - cols.b = F::from_canonical_u32(b); + cols.b = F::from_u32(b); } if let Some(c) = prank_vals.c { - cols.c = F::from_canonical_u32(c); + cols.c = F::from_u32(c); } if let Some(y) = prank_vals.y { - cols.y = F::from_canonical_u32(y); + cols.y = F::from_u32(y); } *trace = RowMajorMatrix::new(values, trace.width()); diff --git a/extensions/native/circuit/src/lib.rs b/extensions/native/circuit/src/lib.rs index eb206dac52..5132411bb6 100644 --- a/extensions/native/circuit/src/lib.rs +++ b/extensions/native/circuit/src/lib.rs @@ -6,7 +6,7 @@ use openvm_circuit::{ arch::{ AirInventory, ChipInventoryError, InitFileGenerator, MatrixRecordArena, MemoryConfig, - SystemConfig, VmBuilder, VmChipComplex, VmProverExtension, + SystemConfig, VmBuilder, VmChipComplex, VmField, VmProverExtension, }, system::{SystemChipInventory, SystemCpuBuilder, SystemExecutor}, }; @@ -16,7 +16,6 @@ use openvm_rv32im_circuit::{ }; use openvm_stark_backend::{ config::{StarkGenericConfig, Val}, - p3_field::PrimeField32, prover::cpu::{CpuBackend, CpuDevice}, }; use openvm_stark_sdk::engine::StarkEngine; @@ -85,7 +84,7 @@ impl VmBuilder for NativeCpuBuilder where SC: StarkGenericConfig, E: StarkEngine, PD = CpuDevice>, - Val: PrimeField32, + Val: VmField, { type VmConfig = NativeConfig; type SystemChipInventory = SystemChipInventory; @@ -188,7 +187,7 @@ impl VmBuilder for Rv32WithKernelsCpuBuilder where SC: StarkGenericConfig, E: StarkEngine, PD = CpuDevice>, - Val: PrimeField32, + Val: VmField, { type VmConfig = Rv32WithKernelsConfig; type SystemChipInventory = SystemChipInventory; diff --git a/extensions/native/circuit/src/loadstore/core.rs b/extensions/native/circuit/src/loadstore/core.rs index 2b8c35a067..37478ff34d 100644 --- a/extensions/native/circuit/src/loadstore/core.rs +++ b/extensions/native/circuit/src/loadstore/core.rs @@ -14,7 +14,7 @@ use openvm_native_compiler::NativeLoadStoreOpcode; use openvm_stark_backend::{ interaction::InteractionBuilder, p3_air::BaseAir, - p3_field::{Field, FieldAlgebra, PrimeField32}, + p3_field::{Field, PrimeCharacteristicRing, PrimeField32}, rap::BaseAirWithPublicValues, }; use strum::IntoEnumIterator; @@ -75,8 +75,7 @@ where flags.iter().zip(NativeLoadStoreOpcode::iter()).fold( AB::Expr::ZERO, |acc, (flag, local_opcode)| { - acc + (*flag).into() - * AB::Expr::from_canonical_usize(local_opcode.local_usize()) + acc + (*flag).into() * AB::Expr::from_usize(local_opcode.local_usize()) }, ), ); diff --git a/extensions/native/circuit/src/loadstore/tests.rs b/extensions/native/circuit/src/loadstore/tests.rs index ed198ab0d9..15fb27b06a 100644 --- a/extensions/native/circuit/src/loadstore/tests.rs +++ b/extensions/native/circuit/src/loadstore/tests.rs @@ -18,7 +18,7 @@ use openvm_native_compiler::{ }; use openvm_stark_backend::{ p3_air::BaseAir, - p3_field::{FieldAlgebra, PrimeField32}, + p3_field::{PrimeCharacteristicRing, PrimeField32}, p3_matrix::{ dense::{DenseMatrix, RowMajorMatrix}, Matrix, @@ -117,8 +117,8 @@ fn set_and_execute( let ([c_val], c) = write_native_array(tester, rng, None); let mem_ptr = gen_pointer(rng, NUM_CELLS); - let b = F::from_canonical_usize(mem_ptr) - c_val; - let data: [F; NUM_CELLS] = array::from_fn(|_| rng.gen()); + let b = F::from_usize(mem_ptr) - c_val; + let data: [F; NUM_CELLS] = array::from_fn(|_| rng.random()); match opcode { LOADW => { @@ -322,7 +322,7 @@ fn run_negative_native_loadstore_test( let adapter_width = BaseAir::::width(&harness.air.adapter); let modify_trace = |trace: &mut DenseMatrix| { - let mut values = trace.row_slice(0).to_vec(); + let mut values = trace.row_slice(0).expect("row exists").to_vec(); let (adapter_row, core_row) = values.split_at_mut(adapter_width); let adapter_cols: &mut NativeLoadStoreAdapterCols = adapter_row.borrow_mut(); let core_cols: &mut NativeLoadStoreCoreCols = core_row.borrow_mut(); diff --git a/extensions/native/circuit/src/poseidon2/air.rs b/extensions/native/circuit/src/poseidon2/air.rs index adf2c09a62..5b7566164c 100644 --- a/extensions/native/circuit/src/poseidon2/air.rs +++ b/extensions/native/circuit/src/poseidon2/air.rs @@ -18,7 +18,7 @@ use openvm_stark_backend::{ air_builders::sub::SubAirBuilder, interaction::{BusIndex, InteractionBuilder, PermutationCheckBus}, p3_air::{Air, AirBuilder, BaseAir}, - p3_field::{Field, FieldAlgebra}, + p3_field::{Field, PrimeCharacteristicRing}, p3_matrix::Matrix, rap::{BaseAirWithPublicValues, PartitionedBaseAir}, }; @@ -53,7 +53,7 @@ impl NativePoseidon2Air Air { fn eval(&self, builder: &mut AB) { let main = builder.main(); - let local = main.row_slice(0); + let local = main.row_slice(0).expect("window should have two elements"); let local: &NativePoseidon2Cols = (*local).borrow(); - let next = main.row_slice(1); + let next = main.row_slice(1).expect("window should have two elements"); let next: &NativePoseidon2Cols = (*next).borrow(); let &NativePoseidon2Cols { @@ -167,7 +167,7 @@ impl Air false, end_inside_row, very_first_timestamp, - start_timestamp + AB::F::from_canonical_usize(2 * CHUNK), + start_timestamp + AB::F::from_usize(2 * CHUNK), opened_base_pointer, opened_element_size_inv, initial_opened_index, @@ -179,7 +179,7 @@ impl Air builder.when(inside_row - end_inside_row).assert_eq( next.start_timestamp, - start_timestamp + AB::F::from_canonical_usize(2 * CHUNK), + start_timestamp + AB::F::from_usize(2 * CHUNK), ); builder .when(inside_row - end_inside_row) @@ -263,7 +263,7 @@ impl Air .read( MemoryAddress::new(self.address_space, cell.row_pointer), [left_input[i]], - start_timestamp + AB::F::from_canonical_usize((2 * i) + 1), + start_timestamp + AB::F::from_usize((2 * i) + 1), &cell.read, ) .eval(builder, inside_row * (AB::Expr::ONE - is_exhausted.clone())); @@ -297,7 +297,7 @@ impl Air cell.row_pointer.into(), opened_element_size_inv * (cell.row_end - cell.row_pointer), ], - start_timestamp + AB::F::from_canonical_usize(2 * i), + start_timestamp + AB::F::from_usize(2 * i), &cell.read_row_pointer_and_length, ) .eval(builder, inside_row * cell.is_first_in_row); @@ -367,8 +367,7 @@ impl Air .when(next.incorporate_row + next.incorporate_sibling) .assert_eq(next_top_level_specific.proof_index, AB::F::ZERO); - let timestamp_after_initial_reads = - start_timestamp + AB::F::from_canonical_usize(NUM_INITIAL_READS); + let timestamp_after_initial_reads = start_timestamp + AB::F::from_usize(NUM_INITIAL_READS); builder .when(end.clone()) @@ -376,7 +375,7 @@ impl Air .assert_eq(next.initial_opened_index, AB::F::ZERO); self.execution_bridge .execute_and_increment_pc( - AB::Expr::from_canonical_usize(VERIFY_BATCH.global_opcode().as_usize()), + AB::Expr::from_usize(VERIFY_BATCH.global_opcode().as_usize()), [ dim_register, opened_register, @@ -419,7 +418,7 @@ impl Air .read( MemoryAddress::new(self.address_space, index_register), [index_base_pointer], - very_first_timestamp + AB::F::from_canonical_usize(3), + very_first_timestamp + AB::F::from_usize(3), &index_base_pointer_read, ) .eval(builder, end_top_level); @@ -427,7 +426,7 @@ impl Air .read( MemoryAddress::new(self.address_space, commit_register), [commit_pointer], - very_first_timestamp + AB::F::from_canonical_usize(4), + very_first_timestamp + AB::F::from_usize(4), &commit_pointer_read, ) .eval(builder, end_top_level); @@ -436,13 +435,13 @@ impl Air .read( MemoryAddress::new(self.address_space, commit_pointer), left_output, - very_first_timestamp + AB::F::from_canonical_usize(5), + very_first_timestamp + AB::F::from_usize(5), &commit_read, ) .eval(builder, end_top_level); builder.when(start_top_level).assert_eq( - very_first_timestamp + AB::F::from_canonical_usize(NUM_INITIAL_READS), + very_first_timestamp + AB::F::from_usize(NUM_INITIAL_READS), start_timestamp, ); @@ -613,10 +612,8 @@ impl Air self.execution_bridge .execute_and_increment_pc( - is_permute.clone() - * AB::F::from_canonical_usize(PERM_POS2.global_opcode().as_usize()) - + is_compress - * AB::F::from_canonical_usize(COMP_POS2.global_opcode().as_usize()), + is_permute.clone() * AB::F::from_usize(PERM_POS2.global_opcode().as_usize()) + + is_compress * AB::F::from_usize(COMP_POS2.global_opcode().as_usize()), [ output_register.into(), input_register_1.into(), @@ -625,7 +622,7 @@ impl Air self.address_space.into(), ], ExecutionState::new(pc, start_timestamp), - AB::Expr::from_canonical_u32(NUM_SIMPLE_ACCESSES), + AB::Expr::from_u32(NUM_SIMPLE_ACCESSES), ) .eval(builder, simple); @@ -655,16 +652,16 @@ impl Air &read_input_pointer_2, ) .eval(builder, simple * is_compress); - builder.when(simple).when(is_permute.clone()).assert_eq( - input_pointer_2, - input_pointer_1 + AB::F::from_canonical_usize(CHUNK), - ); + builder + .when(simple) + .when(is_permute.clone()) + .assert_eq(input_pointer_2, input_pointer_1 + AB::F::from_usize(CHUNK)); self.memory_bridge .read( MemoryAddress::new(self.address_space, input_pointer_1), left_input, - start_timestamp + AB::F::from_canonical_usize(3), + start_timestamp + AB::F::from_usize(3), &read_data_1, ) .eval(builder, simple); @@ -673,7 +670,7 @@ impl Air .read( MemoryAddress::new(self.address_space, input_pointer_2), right_input, - start_timestamp + AB::F::from_canonical_usize(4), + start_timestamp + AB::F::from_usize(4), &read_data_2, ) .eval(builder, simple); @@ -682,7 +679,7 @@ impl Air .write( MemoryAddress::new(self.address_space, output_pointer), left_output, - start_timestamp + AB::F::from_canonical_usize(5), + start_timestamp + AB::F::from_usize(5), &write_data_1, ) .eval(builder, simple); @@ -691,10 +688,10 @@ impl Air .write( MemoryAddress::new( self.address_space, - output_pointer + AB::F::from_canonical_usize(CHUNK), + output_pointer + AB::F::from_usize(CHUNK), ), right_output, - start_timestamp + AB::F::from_canonical_usize(6), + start_timestamp + AB::F::from_usize(6), &write_data_2, ) .eval(builder, simple * is_permute); diff --git a/extensions/native/circuit/src/poseidon2/chip.rs b/extensions/native/circuit/src/poseidon2/chip.rs index ec636fbf33..6fa59ef963 100644 --- a/extensions/native/circuit/src/poseidon2/chip.rs +++ b/extensions/native/circuit/src/poseidon2/chip.rs @@ -18,7 +18,6 @@ use openvm_native_compiler::{ use openvm_poseidon2_air::{Poseidon2Config, Poseidon2SubChip, Poseidon2SubCols}; use openvm_stark_backend::{ p3_air::BaseAir, - p3_field::{Field, PrimeField32}, p3_matrix::{dense::RowMajorMatrix, Matrix}, p3_maybe_rayon::prelude::{IntoParallelIterator, ParallelSliceMut, *}, }; @@ -32,20 +31,20 @@ use crate::poseidon2::{ }; #[derive(Clone)] -pub struct NativePoseidon2Executor { +pub struct NativePoseidon2Executor { pub(super) subchip: Poseidon2SubChip, /// If true, `verify_batch` assumes the verification is always passed and skips poseidon2 /// computation during execution for performance. optimistic: bool, } -pub struct NativePoseidon2Filler { +pub struct NativePoseidon2Filler { // pre-computed Poseidon2 sub cols for dummy rows. empty_poseidon2_sub_cols: Vec, pub(super) subchip: Poseidon2SubChip, } -impl NativePoseidon2Executor { +impl NativePoseidon2Executor { pub fn new(poseidon2_config: Poseidon2Config) -> Self { let subchip = Poseidon2SubChip::new(poseidon2_config.constants); Self { @@ -58,7 +57,7 @@ impl NativePoseidon2Executor( +pub(crate) fn compress( subchip: &Poseidon2SubChip, left: [F; CHUNK], right: [F; CHUNK], @@ -68,7 +67,7 @@ pub(crate) fn compress( (concatenated, std::array::from_fn(|i| permuted[i])) } -impl NativePoseidon2Filler { +impl NativePoseidon2Filler { pub fn new(poseidon2_config: Poseidon2Config) -> Self { let subchip = Poseidon2SubChip::new(poseidon2_config.constants); let empty_poseidon2_sub_cols = subchip.generate_trace(vec![[F::ZERO; CHUNK * 2]]).values; @@ -100,7 +99,7 @@ pub struct NativePoseidon2RecordMut<'a, F, const SBOX_REGISTERS: usize>( &'a mut [NativePoseidon2Cols], ); -impl<'a, F: PrimeField32, const SBOX_REGISTERS: usize> +impl<'a, F: VmField, const SBOX_REGISTERS: usize> CustomBorrow<'a, NativePoseidon2RecordMut<'a, F, SBOX_REGISTERS>, NativePoseidon2RecordLayout> for [u8] { @@ -131,7 +130,7 @@ impl<'a, F: PrimeField32, const SBOX_REGISTERS: usize> } } -impl SizedRecord +impl SizedRecord for NativePoseidon2RecordMut<'_, F, SBOX_REGISTERS> { fn size(layout: &NativePoseidon2RecordLayout) -> usize { @@ -143,7 +142,7 @@ impl SizedRecord PreflightExecutor +impl PreflightExecutor for NativePoseidon2Executor where for<'buf> RA: RecordArena< @@ -175,11 +174,8 @@ where e: data_address_space, .. } = instruction; - debug_assert_eq!( - register_address_space, - F::from_canonical_u32(AS::Native as u32) - ); - debug_assert_eq!(data_address_space, F::from_canonical_u32(AS::Native as u32)); + debug_assert_eq!(register_address_space, F::from_u32(AS::Native as u32)); + debug_assert_eq!(data_address_space, F::from_u32(AS::Native as u32)); let [output_pointer]: [F; 1] = tracing_read_native_helper( state.memory, output_register.as_canonical_u32(), @@ -194,7 +190,7 @@ where let input_pointer_1_u32 = input_pointer_1.as_canonical_u32(); let [input_pointer_2]: [F; 1] = if instruction.opcode == PERM_POS2.global_opcode() { state.memory.increment_timestamp(); - [input_pointer_1 + F::from_canonical_usize(CHUNK)] + [input_pointer_1 + F::from_usize(CHUNK)] } else { tracing_read_native_helper( state.memory, @@ -249,10 +245,10 @@ where cols.end_inside_row = F::ZERO; cols.end_top_level = F::ZERO; cols.is_exhausted = [F::ZERO; CHUNK - 1]; - cols.start_timestamp = F::from_canonical_u32(init_timestamp_u32); + cols.start_timestamp = F::from_u32(init_timestamp_u32); cols.inner.inputs = p2_input; - simple_cols.pc = F::from_canonical_u32(*state.pc); + simple_cols.pc = F::from_u32(*state.pc); simple_cols.is_compress = F::from_bool(instruction.opcode == COMP_POS2.global_opcode()); simple_cols.output_register = output_register; simple_cols.input_register_1 = input_register_1; @@ -261,7 +257,7 @@ where simple_cols.input_pointer_1 = input_pointer_1; simple_cols.input_pointer_2 = input_pointer_2; } else if instruction.opcode == VERIFY_BATCH.global_opcode() { - let init_timestamp = F::from_canonical_u32(init_timestamp_u32); + let init_timestamp = F::from_u32(init_timestamp_u32); let mut col_buffer = vec![F::ZERO; NativePoseidon2Cols::::width()]; let last_top_level_cols: &mut NativePoseidon2Cols = col_buffer.as_mut_slice().borrow_mut(); @@ -381,7 +377,7 @@ where num_rows: total_num_row, })) .0; - allocated_rows[0].inner.export = F::from_canonical_u32(num_non_inside_rows as u32); + allocated_rows[0].inner.export = F::from_u32(num_non_inside_rows as u32); let mut inside_row_idx = num_non_inside_rows; let mut non_inside_row_idx = 0; @@ -390,7 +386,7 @@ where && memory_read_native::( state.memory.data(), dim_base_pointer_u32 + opened_index as u32, - )[0] == F::from_canonical_u32(log_height as u32) + )[0] == F::from_u32(log_height as u32) { state .memory @@ -425,7 +421,7 @@ where || memory_read_native::( state.memory.data(), dim_base_pointer_u32 + opened_index as u32, - )[0] != F::from_canonical_u32(log_height as u32) + )[0] != F::from_u32(log_height as u32) { break; } @@ -448,9 +444,9 @@ where cell_cols.read.as_mut(), ); - cell_cols.opened_index = F::from_canonical_usize(opened_index); - cell_cols.row_pointer = F::from_canonical_usize(row_pointer); - cell_cols.row_end = F::from_canonical_usize(row_end); + cell_cols.opened_index = F::from_usize(opened_index); + cell_cols.row_pointer = F::from_usize(row_pointer); + cell_cols.row_end = F::from_usize(row_end); *chunk_elem = value; row_pointer += 1; @@ -479,15 +475,13 @@ where inside_cols.end_inside_row = F::ZERO; inside_cols.end_top_level = F::ZERO; inside_cols.opened_element_size_inv = opened_element_size_inv; - inside_cols.very_first_timestamp = - F::from_canonical_u32(incorporate_start_timestamp); - inside_cols.start_timestamp = F::from_canonical_u32(start_timestamp_u32); + inside_cols.very_first_timestamp = F::from_u32(incorporate_start_timestamp); + inside_cols.start_timestamp = F::from_u32(start_timestamp_u32); - inside_cols.initial_opened_index = - F::from_canonical_usize(initial_opened_index); + inside_cols.initial_opened_index = F::from_usize(initial_opened_index); inside_cols.opened_base_pointer = opened_base_pointer; if cells_idx < CHUNK { - let exhausted_opened_idx = F::from_canonical_usize(opened_index - 1); + let exhausted_opened_idx = F::from_usize(opened_index - 1); for exhausted_idx in cells_idx..CHUNK { inside_cols.is_exhausted[exhausted_idx - 1] = F::ONE; inside_specific_cols.cells[exhausted_idx].opened_index = @@ -514,14 +508,14 @@ where .read_initial_height_or_sibling_is_on_right .as_mut(), ); - assert_eq!(height_check, F::from_canonical_u32(log_height as u32)); + assert_eq!(height_check, F::from_u32(log_height as u32)); let final_height_read_timestamp = state.memory.timestamp; let [height_check]: [F; 1] = tracing_read_native_helper( state.memory, dim_base_pointer_u32 + final_opened_index as u32, top_level_specific_cols.read_final_height.as_mut(), ); - assert_eq!(height_check, F::from_canonical_u32(log_height as u32)); + assert_eq!(height_check, F::from_u32(log_height as u32)); if !self.optimistic { let hash: [F; CHUNK] = std::array::from_fn(|i| rolling_hash[i]); @@ -542,22 +536,19 @@ where incorporate_cols.start_top_level = F::from_bool(proof_index == 0); incorporate_cols.opened_element_size_inv = opened_element_size_inv; incorporate_cols.very_first_timestamp = init_timestamp; - incorporate_cols.start_timestamp = F::from_canonical_u32( - incorporate_start_timestamp - NUM_INITIAL_READS as u32, - ); + incorporate_cols.start_timestamp = + F::from_u32(incorporate_start_timestamp - NUM_INITIAL_READS as u32); top_level_specific_cols.end_timestamp = - F::from_canonical_u32(final_height_read_timestamp + 1); - - incorporate_cols.initial_opened_index = - F::from_canonical_usize(initial_opened_index); - top_level_specific_cols.final_opened_index = - F::from_canonical_usize(final_opened_index); - top_level_specific_cols.log_height = F::from_canonical_u32(log_height as u32); - top_level_specific_cols.opened_length = F::from_canonical_usize(opened_length); + F::from_u32(final_height_read_timestamp + 1); + + incorporate_cols.initial_opened_index = F::from_usize(initial_opened_index); + top_level_specific_cols.final_opened_index = F::from_usize(final_opened_index); + top_level_specific_cols.log_height = F::from_u32(log_height as u32); + top_level_specific_cols.opened_length = F::from_usize(opened_length); top_level_specific_cols.dim_base_pointer = dim_base_pointer; incorporate_cols.opened_base_pointer = opened_base_pointer; top_level_specific_cols.index_base_pointer = index_base_pointer; - top_level_specific_cols.proof_index = F::from_canonical_usize(proof_index); + top_level_specific_cols.proof_index = F::from_usize(proof_index); } if log_height != 0 { @@ -600,20 +591,19 @@ where sibling_cols.start_top_level = F::ZERO; sibling_cols.opened_element_size_inv = opened_element_size_inv; sibling_cols.very_first_timestamp = init_timestamp; - sibling_cols.start_timestamp = F::from_canonical_u32(row_start_timestamp); + sibling_cols.start_timestamp = F::from_u32(row_start_timestamp); top_level_specific_cols.end_timestamp = - F::from_canonical_u32(read_sibling_is_on_right_timestamp + 1); - sibling_cols.initial_opened_index = F::from_canonical_usize(opened_index); - top_level_specific_cols.final_opened_index = - F::from_canonical_usize(opened_index - 1); - top_level_specific_cols.log_height = F::from_canonical_u32(log_height as u32); - top_level_specific_cols.opened_length = F::from_canonical_usize(opened_length); + F::from_u32(read_sibling_is_on_right_timestamp + 1); + sibling_cols.initial_opened_index = F::from_usize(opened_index); + top_level_specific_cols.final_opened_index = F::from_usize(opened_index - 1); + top_level_specific_cols.log_height = F::from_u32(log_height as u32); + top_level_specific_cols.opened_length = F::from_usize(opened_length); top_level_specific_cols.dim_base_pointer = dim_base_pointer; sibling_cols.opened_base_pointer = opened_base_pointer; top_level_specific_cols.index_base_pointer = index_base_pointer; - top_level_specific_cols.proof_index = F::from_canonical_usize(proof_index); + top_level_specific_cols.proof_index = F::from_usize(proof_index); top_level_specific_cols.sibling_is_on_right = sibling_is_on_right; }; @@ -623,9 +613,9 @@ where let ltl_trace_cols = &mut allocated_rows[non_inside_row_idx - 1]; let ltl_trace_specific_cols: &mut TopLevelSpecificCols = ltl_trace_cols.specific[..TopLevelSpecificCols::::width()].borrow_mut(); - ltl_trace_cols.inner.export = F::from_canonical_u32(total_num_row as u32); + ltl_trace_cols.inner.export = F::from_u32(total_num_row as u32); ltl_trace_cols.end_top_level = F::ONE; - ltl_trace_specific_cols.pc = F::from_canonical_u32(*state.pc); + ltl_trace_specific_cols.pc = F::from_u32(*state.pc); ltl_trace_specific_cols.dim_register = dim_register; ltl_trace_specific_cols.opened_register = opened_register; ltl_trace_specific_cols.opened_length_register = opened_length_register; @@ -665,7 +655,7 @@ where } } -impl TraceFiller +impl TraceFiller for NativePoseidon2Filler { fn fill_trace( @@ -714,7 +704,7 @@ impl TraceFiller } } -impl NativePoseidon2Filler { +impl NativePoseidon2Filler { fn fill_simple_chunk(&self, mem_helper: &MemoryAuxColsFactory, chunk_slice: &mut [F]) { { let inner_width = self.subchip.air.width(); @@ -965,19 +955,19 @@ impl NativePoseidon2Filler( +fn tracing_read_native_helper( memory: &mut TracingMemory, ptr: u32, base_aux: &mut MemoryBaseAuxCols, ) -> [F; BLOCK_SIZE] { let mut prev_ts = 0; let ret = tracing_read_native(memory, ptr, &mut prev_ts); - base_aux.set_prev(F::from_canonical_u32(prev_ts)); + base_aux.set_prev(F::from_u32(prev_ts)); ret } /// Fill `MemoryBaseAuxCols`, assuming that the `prev_timestamp` is already set in `base_aux`. -fn mem_fill_helper( +fn mem_fill_helper( mem_helper: &MemoryAuxColsFactory, timestamp: u32, base_aux: &mut MemoryBaseAuxCols, diff --git a/extensions/native/circuit/src/poseidon2/execution.rs b/extensions/native/circuit/src/poseidon2/execution.rs index d30e0d010c..f6af411633 100644 --- a/extensions/native/circuit/src/poseidon2/execution.rs +++ b/extensions/native/circuit/src/poseidon2/execution.rs @@ -12,17 +12,14 @@ use openvm_native_compiler::{ VerifyBatchOpcode::VERIFY_BATCH, }; use openvm_poseidon2_air::Poseidon2SubChip; -use openvm_stark_backend::{ - p3_field::{Field, PrimeField32}, - p3_maybe_rayon::prelude::{ParallelIterator, ParallelSlice}, -}; +use openvm_stark_backend::p3_maybe_rayon::prelude::{ParallelIterator, ParallelSlice}; use super::chip::{compress, NativePoseidon2Executor}; use crate::poseidon2::CHUNK; #[derive(AlignedBytesBorrow, Clone)] #[repr(C)] -struct Pos2PreCompute<'a, F: Field, const SBOX_REGISTERS: usize> { +struct Pos2PreCompute<'a, F: VmField, const SBOX_REGISTERS: usize> { subchip: &'a Poseidon2SubChip, output_register: u32, input_register_1: u32, @@ -31,7 +28,7 @@ struct Pos2PreCompute<'a, F: Field, const SBOX_REGISTERS: usize> { #[derive(AlignedBytesBorrow, Clone)] #[repr(C)] -struct VerifyBatchPreCompute<'a, F: Field, const SBOX_REGISTERS: usize> { +struct VerifyBatchPreCompute<'a, F: VmField, const SBOX_REGISTERS: usize> { subchip: &'a Poseidon2SubChip, dim_register: u32, opened_register: u32, @@ -42,7 +39,7 @@ struct VerifyBatchPreCompute<'a, F: Field, const SBOX_REGISTERS: usize> { opened_element_size: F, } -impl<'a, F: PrimeField32, const SBOX_REGISTERS: usize> NativePoseidon2Executor { +impl<'a, F: VmField, const SBOX_REGISTERS: usize> NativePoseidon2Executor { #[inline(always)] fn pre_compute_pos2_impl( &'a self, @@ -166,7 +163,7 @@ macro_rules! dispatch1 { }; } -impl InterpreterExecutor +impl InterpreterExecutor for NativePoseidon2Executor { #[inline(always)] @@ -216,7 +213,7 @@ impl InterpreterExecutor } #[cfg(feature = "aot")] -impl AotExecutor +impl AotExecutor for NativePoseidon2Executor { } @@ -254,7 +251,7 @@ macro_rules! dispatch2 { }; } -impl InterpreterMeteredExecutor +impl InterpreterMeteredExecutor for NativePoseidon2Executor { #[inline(always)] @@ -307,14 +304,14 @@ impl InterpreterMeteredExecutor } } #[cfg(feature = "aot")] -impl AotMeteredExecutor +impl AotMeteredExecutor for NativePoseidon2Executor { } #[create_handler] #[inline(always)] unsafe fn execute_pos2_e1_impl< - F: PrimeField32, + F: VmField, CTX: ExecutionCtxTrait, const SBOX_REGISTERS: usize, const IS_PERM: bool, @@ -331,7 +328,7 @@ unsafe fn execute_pos2_e1_impl< #[create_handler] #[inline(always)] unsafe fn execute_pos2_e2_impl< - F: PrimeField32, + F: VmField, CTX: MeteredExecutionCtxTrait, const SBOX_REGISTERS: usize, const IS_PERM: bool, @@ -354,7 +351,7 @@ unsafe fn execute_pos2_e2_impl< #[create_handler] #[inline(always)] unsafe fn execute_verify_batch_e1_impl< - F: PrimeField32, + F: VmField, CTX: ExecutionCtxTrait, const SBOX_REGISTERS: usize, >( @@ -373,7 +370,7 @@ unsafe fn execute_verify_batch_e1_impl< #[create_handler] #[inline(always)] unsafe fn execute_verify_batch_e2_impl< - F: PrimeField32, + F: VmField, CTX: MeteredExecutionCtxTrait, const SBOX_REGISTERS: usize, >( @@ -396,7 +393,7 @@ unsafe fn execute_verify_batch_e2_impl< #[inline(always)] unsafe fn execute_pos2_e12_impl< - F: PrimeField32, + F: VmField, CTX: ExecutionCtxTrait, const SBOX_REGISTERS: usize, const IS_PERM: bool, @@ -411,7 +408,7 @@ unsafe fn execute_pos2_e12_impl< let [input_pointer_1]: [F; 1] = exec_state.vm_read(AS::Native as u32, pre_compute.input_register_1); let [input_pointer_2] = if IS_PERM { - [input_pointer_1 + F::from_canonical_usize(CHUNK)] + [input_pointer_1 + F::from_usize(CHUNK)] } else { exec_state.vm_read(AS::Native as u32, pre_compute.input_register_2) }; @@ -452,7 +449,7 @@ unsafe fn execute_pos2_e12_impl< #[inline(always)] unsafe fn execute_verify_batch_e12_impl< - F: PrimeField32, + F: VmField, CTX: ExecutionCtxTrait, const SBOX_REGISTERS: usize, const OPTIMISTIC: bool, @@ -506,7 +503,7 @@ unsafe fn execute_verify_batch_e12_impl< && exec_state.host_read::( AS::Native as u32, dim_base_pointer_u32 + opened_index as u32, - )[0] == F::from_canonical_u32(log_height as u32) + )[0] == F::from_u32(log_height as u32) { let initial_opened_index = opened_index; @@ -529,7 +526,7 @@ unsafe fn execute_verify_batch_e12_impl< || exec_state.host_read::( AS::Native as u32, dim_base_pointer_u32 + opened_index as u32, - )[0] != F::from_canonical_u32(log_height as u32) + )[0] != F::from_u32(log_height as u32) { break; } @@ -564,12 +561,12 @@ unsafe fn execute_verify_batch_e12_impl< AS::Native as u32, dim_base_pointer_u32 + initial_opened_index as u32, ); - assert_eq!(height_check, F::from_canonical_u32(log_height as u32)); + assert_eq!(height_check, F::from_u32(log_height as u32)); let [height_check]: [F; 1] = exec_state.host_read( AS::Native as u32, dim_base_pointer_u32 + final_opened_index as u32, ); - assert_eq!(height_check, F::from_canonical_u32(log_height as u32)); + assert_eq!(height_check, F::from_u32(log_height as u32)); if !OPTIMISTIC { let hash: [F; CHUNK] = std::array::from_fn(|i| rolling_hash[i]); diff --git a/extensions/native/circuit/src/poseidon2/tests.rs b/extensions/native/circuit/src/poseidon2/tests.rs index 197def47b8..cacb0c8d25 100644 --- a/extensions/native/circuit/src/poseidon2/tests.rs +++ b/extensions/native/circuit/src/poseidon2/tests.rs @@ -1,7 +1,8 @@ use std::cmp::min; -use openvm_circuit::arch::testing::{ - memory::gen_pointer, TestBuilder, TestChipHarness, VmChipTestBuilder, VmChipTester, +use openvm_circuit::arch::{ + testing::{memory::gen_pointer, TestBuilder, TestChipHarness, VmChipTestBuilder, VmChipTester}, + VmField, }; use openvm_instructions::{instruction::Instruction, LocalOpcode}; use openvm_native_compiler::{ @@ -10,7 +11,7 @@ use openvm_native_compiler::{ use openvm_poseidon2_air::{Poseidon2Config, Poseidon2SubChip}; use openvm_stark_backend::{ p3_air::BaseAir, - p3_field::{Field, FieldAlgebra, PrimeField32, PrimeField64}, + p3_field::{Field, PrimeCharacteristicRing, PrimeField32, PrimeField64}, p3_matrix::{ dense::{DenseMatrix, RowMajorMatrix}, Matrix, @@ -56,7 +57,7 @@ type Harness = TestChipHarness< NativePoseidon2Chip, >; -fn create_test_chip( +fn create_test_chip( tester: &VmChipTestBuilder, ) -> Harness { let air = NativePoseidon2Air::new( @@ -146,13 +147,13 @@ fn random_instance( dims.push(log_height); let mut opened_row = vec![]; for _ in 0..opened_element_size * row_length { - opened_row.push(rng.gen()); + opened_row.push(rng.random()); } opened.push(opened_row); } if log_height > 0 { - proof.push(std::array::from_fn(|_| rng.gen())); - sibling_is_on_right.push(rng.gen()); + proof.push(std::array::from_fn(|_| rng.random())); + sibling_is_on_right.push(rng.random()); } } @@ -251,7 +252,7 @@ fn set_and_execute( } tester.write(address_space, commit_pointer, commit); - let opened_element_size_inv = F::from_canonical_usize(case.opened_element_size) + let opened_element_size_inv = F::from_usize(case.opened_element_size) .inverse() .as_canonical_u32() as usize; tester.execute( @@ -301,7 +302,7 @@ fn test(cases: [Case; N]) { let inner_width = p2_chip.air.width(); let modify_trace = |trace: &mut DenseMatrix| { - let mut trace_row = trace.row_slice(0).to_vec(); + let mut trace_row = trace.row_slice(0).expect("row exists").to_vec(); trace_row[..inner_width].copy_from_slice(&inner_trace.values); *trace = RowMajorMatrix::new(trace_row, trace.width()); }; @@ -398,10 +399,9 @@ fn random_instructions(num_ops: usize) -> Vec> { let mut rng = create_seeded_rng(); (0..num_ops) .map(|_| { - let [a, b, c] = - std::array::from_fn(|_| BabyBear::from_canonical_usize(gen_pointer(&mut rng, 1))); + let [a, b, c] = std::array::from_fn(|_| BabyBear::from_usize(gen_pointer(&mut rng, 1))); Instruction { - opcode: if rng.gen_bool(0.5) { + opcode: if rng.random_bool(0.5) { PERM_POS2 } else { COMP_POS2 @@ -410,8 +410,8 @@ fn random_instructions(num_ops: usize) -> Vec> { a, b, c, - d: BabyBear::from_canonical_usize(4), - e: BabyBear::from_canonical_usize(4), + d: BabyBear::from_usize(4), + e: BabyBear::from_usize(4), f: BabyBear::ZERO, g: BabyBear::ZERO, } @@ -447,14 +447,14 @@ fn tester_with_random_poseidon2_ops(num_ops: usize) -> VmChipTester(d, a, [CudaF::from_canonical_usize(dst)]); - tester.write::<1>(d, b, [CudaF::from_canonical_usize(lhs)]); + tester.write::<1>(d, a, [CudaF::from_usize(dst)]); + tester.write::<1>(d, b, [CudaF::from_usize(lhs)]); if opcode == Poseidon2Opcode::COMP_POS2 { - tester.write::<1>(d, c, [CudaF::from_canonical_usize(rhs)]); + tester.write::<1>(d, c, [CudaF::from_usize(rhs)]); } - let data_left: [_; CHUNK] = - from_fn(|_| CudaF::from_canonical_usize(rng.gen_range(1..=100))); - let data_right: [_; CHUNK] = - from_fn(|_| CudaF::from_canonical_usize(rng.gen_range(1..=100))); + let data_left: [_; CHUNK] = from_fn(|_| CudaF::from_usize(rng.random_range(1..=100))); + let data_right: [_; CHUNK] = from_fn(|_| CudaF::from_usize(rng.random_range(1..=100))); match opcode { Poseidon2Opcode::COMP_POS2 => { tester.write::(e, lhs, data_left); @@ -817,7 +815,7 @@ mod cuda_tests { } tester.write(ADDRESS_SPACE, commit_pointer, commit); - let opened_element_size_inv = CudaF::from_canonical_usize(opened_element_size) + let opened_element_size_inv = CudaF::from_usize(opened_element_size) .inverse() .as_canonical_u32() as usize; tester.execute( diff --git a/extensions/native/circuit/src/utils.rs b/extensions/native/circuit/src/utils.rs index d09d7f91bd..7e89cc412a 100644 --- a/extensions/native/circuit/src/utils.rs +++ b/extensions/native/circuit/src/utils.rs @@ -32,7 +32,7 @@ pub mod test_utils { engine::StarkFriEngine, p3_baby_bear::BabyBear, }; - use rand::{distributions::Standard, prelude::Distribution, rngs::StdRng, Rng}; + use rand::{rngs::StdRng, Rng}; use crate::{NativeConfig, NativeCpuBuilder, Rv32WithKernelsConfig}; @@ -44,13 +44,13 @@ pub mod test_utils { value: F, is_imm: Option, ) -> (F, usize) { - let is_imm = is_imm.unwrap_or(rng.gen_bool(0.5)); + let is_imm = is_imm.unwrap_or(rng.random_bool(0.5)); if is_imm { (value, AS::Immediate as usize) } else { let ptr = gen_pointer(rng, 1); tester.write::<1>(AS::Native as usize, ptr, [value]); - (F::from_canonical_usize(ptr), AS::Native as usize) + (F::from_usize(ptr), AS::Native as usize) } } @@ -60,11 +60,8 @@ pub mod test_utils { tester: &mut impl TestBuilder, rng: &mut StdRng, value: Option<[F; N]>, - ) -> ([F; N], usize) - where - Standard: Distribution, // Needed for `rng.gen` - { - let value = value.unwrap_or(array::from_fn(|_| rng.gen())); + ) -> ([F; N], usize) { + let value = value.unwrap_or(array::from_fn(|_| F::from_u32(rng.random()))); let ptr = gen_pointer(rng, N); tester.write::(AS::Native as usize, ptr, value); (value, ptr) diff --git a/extensions/native/circuit/tests/arithmetic.rs b/extensions/native/circuit/tests/arithmetic.rs index e75f46b755..03440ffcb2 100644 --- a/extensions/native/circuit/tests/arithmetic.rs +++ b/extensions/native/circuit/tests/arithmetic.rs @@ -7,17 +7,18 @@ use openvm_native_compiler::{ ir::{Builder, Ext, ExtConst, Felt, SymbolicExt, Var}, }; use openvm_stark_backend::p3_field::{ - extension::BinomialExtensionField, Field, FieldAlgebra, FieldExtensionAlgebra, + extension::BinomialExtensionField, Field, PrimeCharacteristicRing, }; -use openvm_stark_sdk::p3_baby_bear::BabyBear; -use rand::{thread_rng, Rng}; +use openvm_stark_sdk::{p3_baby_bear::BabyBear, utils::create_seeded_rng}; +use p3_field::BasedVectorSpace; +use rand::Rng; const WORD_SIZE: usize = 1; #[test] fn test_compiler_arithmetic() { let num_tests = 3; - let mut rng = thread_rng(); + let mut rng = create_seeded_rng(); type F = BabyBear; type EF = BinomialExtensionField; let mut builder = AsmBuilder::::default(); @@ -48,8 +49,8 @@ fn test_compiler_arithmetic() { builder.assert_ext_eq(two_ext / one_ext, (EF::TWO / EF::ONE).cons()); for _ in 0..num_tests { - let a_var_val = rng.gen::(); - let b_var_val = rng.gen::(); + let a_var_val = rng.random::(); + let b_var_val = rng.random::(); let a_var: Var<_> = builder.eval(a_var_val); let b_var: Var<_> = builder.eval(b_var_val); builder.assert_var_eq(a_var + b_var, a_var_val + b_var_val); @@ -57,8 +58,8 @@ fn test_compiler_arithmetic() { builder.assert_var_eq(a_var - b_var, a_var_val - b_var_val); builder.assert_var_eq(-a_var, -a_var_val); - let a_felt_val = rng.gen::(); - let b_felt_val = rng.gen::(); + let a_felt_val = rng.random::(); + let b_felt_val = rng.random::(); let a: Felt<_> = builder.eval(a_felt_val); let b: Felt<_> = builder.eval(b_felt_val); builder.assert_felt_eq(a + b, a_felt_val + b_felt_val); @@ -68,8 +69,8 @@ fn test_compiler_arithmetic() { builder.assert_felt_eq(a / b, a_felt_val / b_felt_val); builder.assert_felt_eq(-a, -a_felt_val); - let a_ext_val = rng.gen::(); - let b_ext_val = rng.gen::(); + let a_ext_val = rng.random::(); + let b_ext_val = rng.random::(); let a_ext: Ext<_, _> = builder.eval(a_ext_val.cons()); let b_ext: Ext<_, _> = builder.eval(b_ext_val.cons()); @@ -103,12 +104,13 @@ fn test_compiler_arithmetic_2() { type EF = BinomialExtensionField; let mut builder = AsmBuilder::::default(); - let ef = EF::from_base_slice(&[ - F::from_canonical_u32(1163664312), - F::from_canonical_u32(1251518712), - F::from_canonical_u32(1133200680), - F::from_canonical_u32(1689596134), - ]); + let ef = EF::from_basis_coefficients_slice(&[ + F::from_u32(1163664312), + F::from_u32(1251518712), + F::from_u32(1133200680), + F::from_u32(1689596134), + ]) + .unwrap(); let x: Ext<_, _> = builder.constant(ef); let xinv: Ext<_, _> = builder.constant(ef.inverse()); @@ -127,12 +129,13 @@ fn test_in_place_arithmetic() { let mut builder = AsmBuilder::::default(); - let ef = EF::from_base_slice(&[ - F::from_canonical_u32(1163664312), - F::from_canonical_u32(1251518712), - F::from_canonical_u32(1133200680), - F::from_canonical_u32(1689596134), - ]); + let ef = EF::from_basis_coefficients_slice(&[ + F::from_u32(1163664312), + F::from_u32(1251518712), + F::from_u32(1133200680), + F::from_u32(1689596134), + ]) + .unwrap(); let x: Ext<_, _> = builder.constant(ef); builder.assign(&x, x + x); @@ -163,10 +166,10 @@ fn test_field_immediate() { let mut builder = AsmBuilder::::default(); - let mut rng = thread_rng(); + let mut rng = create_seeded_rng(); - let a = rng.gen(); - let b = rng.gen(); + let a = rng.random(); + let b = rng.random(); let v: Felt<_> = builder.constant(a); @@ -188,14 +191,15 @@ fn test_ext_immediate() { let mut builder = AsmBuilder::::default(); - let f = F::from_canonical_u32(314159265); + let f = F::from_u32(314159265); - let ef = EF::from_base_slice(&[ - F::from_canonical_u32(1163664312), - F::from_canonical_u32(1251518712), - F::from_canonical_u32(1133200680), - F::from_canonical_u32(1689596134), - ]); + let ef = EF::from_basis_coefficients_slice(&[ + F::from_u32(1163664312), + F::from_u32(1251518712), + F::from_u32(1133200680), + F::from_u32(1689596134), + ]) + .unwrap(); let ext: Ext<_, _> = builder.constant(ef); @@ -263,14 +267,15 @@ fn test_ext_felt_arithmetic() { let mut builder = AsmBuilder::::default(); - let f = F::from_canonical_u32(314159265); + let f = F::from_u32(314159265); - let ef = EF::from_base_slice(&[ - F::from_canonical_u32(1163664312), - F::from_canonical_u32(1251518712), - F::from_canonical_u32(1133200680), - F::from_canonical_u32(1689596134), - ]); + let ef = EF::from_basis_coefficients_slice(&[ + F::from_u32(1163664312), + F::from_u32(1251518712), + F::from_u32(1133200680), + F::from_u32(1689596134), + ]) + .unwrap(); let felt: Felt<_> = builder.constant(f); let ext: Ext<_, _> = builder.constant(ef); @@ -295,10 +300,10 @@ fn test_ext_felt_arithmetic() { builder.assert_ext_eq(x, (ef * f).cons()); builder.assign(&x, ext / felt); - builder.assert_ext_eq(x, (ef / EF::from_base(f)).cons()); + builder.assert_ext_eq(x, (ef / EF::from(f)).cons()); builder.assign(&x, ext / f); - builder.assert_ext_eq(x, (ef / EF::from_base(f)).cons()); + builder.assert_ext_eq(x, (ef / EF::from(f)).cons()); builder.halt(); @@ -314,8 +319,8 @@ fn test_felt_equality() { type F = BabyBear; type EF = BinomialExtensionField; - let mut rng = thread_rng(); - let f = rng.gen::(); + let mut rng = create_seeded_rng(); + let f = rng.random::(); let mut builder = AsmBuilder::::default(); @@ -341,8 +346,8 @@ fn test_felt_equality_negative() { type F = BabyBear; type EF = BinomialExtensionField; - let mut rng = thread_rng(); - let f = rng.gen::(); + let mut rng = create_seeded_rng(); + let f = rng.random::(); let mut builder = AsmBuilder::::default(); let a: Felt<_> = builder.constant(f); @@ -357,8 +362,8 @@ fn test_ext_equality() { type F = BabyBear; type EF = BinomialExtensionField; - let mut rng = thread_rng(); - let a_ext = rng.gen::(); + let mut rng = create_seeded_rng(); + let a_ext = rng.random::(); let mut builder = AsmBuilder::::default(); @@ -378,8 +383,8 @@ fn test_ext_equality_negative() { type F = BabyBear; type EF = BinomialExtensionField; - let mut rng = thread_rng(); - let a_ext = rng.gen::(); + let mut rng = create_seeded_rng(); + let a_ext = rng.random::(); let mut builder = AsmBuilder::::default(); let a: Ext<_, _> = builder.constant(a_ext); diff --git a/extensions/native/circuit/tests/array.rs b/extensions/native/circuit/tests/array.rs index 9ef5eca8ea..b0080702d8 100644 --- a/extensions/native/circuit/tests/array.rs +++ b/extensions/native/circuit/tests/array.rs @@ -5,7 +5,7 @@ use openvm_native_compiler::{ prelude::{Builder, MemIndex, MemVariable, Ptr, Variable}, }; use openvm_native_compiler_derive::DslVariable; -use openvm_stark_backend::p3_field::{extension::BinomialExtensionField, FieldAlgebra}; +use openvm_stark_backend::p3_field::{extension::BinomialExtensionField, PrimeCharacteristicRing}; use openvm_stark_sdk::p3_baby_bear::BabyBear; #[derive(DslVariable, Clone, Debug)] @@ -139,13 +139,13 @@ fn test_slice_variable_impl_happy_path() { let mut builder = AsmBuilder::::default(); let slice1: [Felt; N] = builder.uninit(); for (i, f) in slice1.iter().enumerate() { - builder.assign(f, F::from_canonical_u32(i as u32)); + builder.assign(f, F::from_u32(i as u32)); } let slice2: [Felt; N] = builder.uninit(); slice2.assign(slice1, &mut builder); builder.assert_eq::<[_; N]>(slice1, slice2); for (i, f) in slice2.iter().enumerate() { - builder.assign(f, F::from_canonical_u32(i as u32)); + builder.assign(f, F::from_u32(i as u32)); } let ptr = builder.alloc(1, <[Felt; N] as MemVariable>::size_of()); let mem_index = MemIndex { @@ -174,7 +174,7 @@ fn test_slice_assert_eq_neg() { let mut builder = AsmBuilder::::default(); let slice1: [Felt; N] = builder.uninit(); for (i, f) in slice1.iter().enumerate() { - builder.assign(f, F::from_canonical_u32(i as u32)); + builder.assign(f, F::from_u32(i as u32)); } let slice2: [Felt; N] = [builder.eval(F::ZERO); N]; // Should panic because slice1 != slice2 diff --git a/extensions/native/circuit/tests/conditionals.rs b/extensions/native/circuit/tests/conditionals.rs index 29fa85386a..c05e37e937 100644 --- a/extensions/native/circuit/tests/conditionals.rs +++ b/extensions/native/circuit/tests/conditionals.rs @@ -1,6 +1,6 @@ use openvm_native_circuit::execute_program; use openvm_native_compiler::{asm::AsmBuilder, ir::Var}; -use openvm_stark_backend::p3_field::{extension::BinomialExtensionField, FieldAlgebra}; +use openvm_stark_backend::p3_field::{extension::BinomialExtensionField, PrimeCharacteristicRing}; use openvm_stark_sdk::p3_baby_bear::BabyBear; type F = BabyBear; @@ -13,8 +13,8 @@ fn test_compiler_conditionals() { let zero: Var<_> = builder.eval(F::ZERO); let one: Var<_> = builder.eval(F::ONE); let two: Var<_> = builder.eval(F::TWO); - let three: Var<_> = builder.eval(F::from_canonical_u32(3)); - let four: Var<_> = builder.eval(F::from_canonical_u32(4)); + let three: Var<_> = builder.eval(F::from_u32(3)); + let four: Var<_> = builder.eval(F::from_u32(4)); let c: Var<_> = builder.eval(F::ZERO); builder.if_eq(zero, zero).then(|builder| { @@ -60,8 +60,8 @@ fn test_compiler_conditionals_v2() { let zero: Var<_> = builder.eval(F::ZERO); let one: Var<_> = builder.eval(F::ONE); let two: Var<_> = builder.eval(F::TWO); - let three: Var<_> = builder.eval(F::from_canonical_u32(3)); - let four: Var<_> = builder.eval(F::from_canonical_u32(4)); + let three: Var<_> = builder.eval(F::from_u32(3)); + let four: Var<_> = builder.eval(F::from_u32(4)); let c: Var<_> = builder.eval(F::ZERO); builder.if_eq(zero, zero).then(|builder| { @@ -88,9 +88,9 @@ fn test_compiler_conditionals_const() { let zero = builder.eval_expr(F::ZERO); let one = builder.eval_expr(F::ONE); - let two = builder.eval_expr(F::from_canonical_u32(2)); - let three = builder.eval_expr(F::from_canonical_u32(3)); - let four = builder.eval_expr(F::from_canonical_u32(4)); + let two = builder.eval_expr(F::from_u32(2)); + let three = builder.eval_expr(F::from_u32(3)); + let four = builder.eval_expr(F::from_u32(4)); // 1 instruction to evaluate the variable. let c: Var<_> = builder.eval(F::ZERO); diff --git a/extensions/native/circuit/tests/cycle_tracker.rs b/extensions/native/circuit/tests/cycle_tracker.rs index 06a8622e45..12097decf6 100644 --- a/extensions/native/circuit/tests/cycle_tracker.rs +++ b/extensions/native/circuit/tests/cycle_tracker.rs @@ -2,7 +2,7 @@ use std::ops::Deref; use openvm_native_circuit::execute_program; use openvm_native_compiler::{asm::AsmBuilder, conversion::CompilerOptions, ir::Var}; -use openvm_stark_backend::p3_field::{extension::BinomialExtensionField, FieldAlgebra}; +use openvm_stark_backend::p3_field::{extension::BinomialExtensionField, PrimeCharacteristicRing}; use openvm_stark_sdk::p3_baby_bear::BabyBear; type F = BabyBear; @@ -16,8 +16,8 @@ fn test_cycle_tracker() { builder.cycle_tracker_start("test_outer"); - let n_val = F::from_canonical_u32(10); - let m_val = F::from_canonical_u32(20); + let n_val = F::from_u32(10); + let m_val = F::from_u32(20); let n: Var<_> = builder.eval(n_val); let m: Var<_> = builder.eval(m_val); diff --git a/extensions/native/circuit/tests/ext.rs b/extensions/native/circuit/tests/ext.rs index 5592d53ab9..7532d9e9be 100644 --- a/extensions/native/circuit/tests/ext.rs +++ b/extensions/native/circuit/tests/ext.rs @@ -4,10 +4,10 @@ use openvm_native_compiler::{ ir::{Ext, Felt}, }; use openvm_stark_backend::p3_field::{ - extension::BinomialExtensionField, FieldAlgebra, FieldExtensionAlgebra, + extension::BinomialExtensionField, BasedVectorSpace, PrimeCharacteristicRing, }; -use openvm_stark_sdk::p3_baby_bear::BabyBear; -use rand::{thread_rng, Rng}; +use openvm_stark_sdk::{p3_baby_bear::BabyBear, utils::create_seeded_rng}; +use rand::Rng; #[test] fn test_ext2felt() { const D: usize = 4; @@ -16,13 +16,13 @@ fn test_ext2felt() { let mut builder = AsmBuilder::::default(); - let mut rng = thread_rng(); - let val = rng.gen::(); + let mut rng = create_seeded_rng(); + let val = rng.random::(); let ext: Ext = builder.constant(val); let felts = builder.ext2felt(ext); - for (i, &fe) in val.as_base_slice().iter().enumerate() { + for (i, &fe) in val.as_basis_coefficients_slice().iter().enumerate() { let lhs = builder.get(&felts, i); let rhs: Felt = builder.constant(fe); builder.assert_felt_eq(lhs, rhs); @@ -35,7 +35,7 @@ fn test_ext2felt() { } #[test] -fn test_ext_from_base_slice() { +fn test_ext_from_slice() { const D: usize = 4; type F = BabyBear; type EF = BinomialExtensionField; @@ -43,13 +43,13 @@ fn test_ext_from_base_slice() { let mut builder = AsmBuilder::::default(); let base_slice = &[ - F::from_canonical_usize(123), - F::from_canonical_usize(234), - F::from_canonical_usize(345), - F::from_canonical_usize(456), + F::from_usize(123), + F::from_usize(234), + F::from_usize(345), + F::from_usize(456), ]; - let val = EF::from_base_slice(base_slice); + let val = EF::from_basis_coefficients_slice(base_slice).unwrap(); let expected: Ext<_, _> = builder.constant(val); let felts = base_slice.map(|e| builder.constant::>(e)); diff --git a/extensions/native/circuit/tests/fibonacci.rs b/extensions/native/circuit/tests/fibonacci.rs index 8dfb29a835..ef88400c6b 100644 --- a/extensions/native/circuit/tests/fibonacci.rs +++ b/extensions/native/circuit/tests/fibonacci.rs @@ -3,7 +3,7 @@ use openvm_native_compiler::{ asm::AsmBuilder, ir::{Felt, Var}, }; -use openvm_stark_backend::p3_field::{extension::BinomialExtensionField, FieldAlgebra}; +use openvm_stark_backend::p3_field::{extension::BinomialExtensionField, PrimeCharacteristicRing}; use openvm_stark_sdk::p3_baby_bear::BabyBear; fn fibonacci(n: u32) -> u32 { @@ -29,7 +29,7 @@ fn main() { let mut builder = AsmBuilder::::default(); let a: Felt<_> = builder.eval(F::ZERO); let b: Felt<_> = builder.eval(F::ONE); - let n: Var<_> = builder.eval(F::from_canonical_u32(n_val)); + let n: Var<_> = builder.eval(F::from_u32(n_val)); let start: Var<_> = builder.eval(F::ZERO); let end = n; @@ -41,7 +41,7 @@ fn main() { builder.assign(&a, temp); }); - let expected_value = F::from_canonical_u32(fibonacci(n_val)); + let expected_value = F::from_u32(fibonacci(n_val)); builder.assert_felt_eq(a, expected_value); builder.halt(); diff --git a/extensions/native/circuit/tests/for_loops.rs b/extensions/native/circuit/tests/for_loops.rs index 123a416cdb..58790b689e 100644 --- a/extensions/native/circuit/tests/for_loops.rs +++ b/extensions/native/circuit/tests/for_loops.rs @@ -5,7 +5,7 @@ use openvm_native_compiler::{ prelude::ArrayLike, }; use openvm_native_compiler_derive::iter_zip; -use openvm_stark_backend::p3_field::{extension::BinomialExtensionField, FieldAlgebra}; +use openvm_stark_backend::p3_field::{extension::BinomialExtensionField, PrimeCharacteristicRing}; use openvm_stark_sdk::p3_baby_bear::BabyBear; type F = BabyBear; @@ -15,8 +15,8 @@ type EF = BinomialExtensionField; fn test_compiler_for_loops() { let mut builder = AsmBuilder::::default(); - let n_val = BabyBear::from_canonical_u32(10); - let m_val = BabyBear::from_canonical_u32(5); + let n_val = BabyBear::from_u32(10); + let m_val = BabyBear::from_u32(5); let zero: Var<_> = builder.eval(F::ZERO); let n: Var<_> = builder.eval(n_val); @@ -75,11 +75,11 @@ fn test_compiler_zip_fixed() { builder.assign(&ptr1_cache, ptr_vec[0]); builder.assign(&ptr2_cache, ptr_vec[1]); }); - builder.assert_var_eq(count, F::from_canonical_usize(2)); - builder.assert_var_eq(x1, F::from_canonical_usize(1)); - builder.assert_var_eq(x2, F::from_canonical_usize(7)); - builder.assert_var_eq(ptr1_cache, F::from_canonical_usize(1)); - builder.assert_var_eq(ptr2_cache, F::from_canonical_usize(1)); + builder.assert_var_eq(count, F::from_usize(2)); + builder.assert_var_eq(x1, F::from_usize(1)); + builder.assert_var_eq(x2, F::from_usize(7)); + builder.assert_var_eq(ptr1_cache, F::from_usize(1)); + builder.assert_var_eq(ptr2_cache, F::from_usize(1)); builder.halt(); let program = builder.compile_isa(); @@ -117,11 +117,11 @@ fn test_compiler_zip_dyn() { builder.assign(&ptr1_cache, ptr_vec[0]); builder.assign(&ptr2_cache, ptr_vec[1]); }); - builder.assert_var_eq(count, F::from_canonical_usize(2)); - builder.assert_var_eq(x1, F::from_canonical_usize(1)); - builder.assert_var_eq(x2, F::from_canonical_usize(7)); - builder.assert_var_eq(ptr1_cache, arr1.ptr().address + F::from_canonical_usize(1)); - builder.assert_var_eq(ptr2_cache, arr2.ptr().address + F::from_canonical_usize(1)); + builder.assert_var_eq(count, F::from_usize(2)); + builder.assert_var_eq(x1, F::from_usize(1)); + builder.assert_var_eq(x2, F::from_usize(7)); + builder.assert_var_eq(ptr1_cache, arr1.ptr().address + F::from_usize(1)); + builder.assert_var_eq(ptr2_cache, arr2.ptr().address + F::from_usize(1)); builder.halt(); let program = builder.compile_isa(); @@ -169,7 +169,7 @@ fn test_compiler_nested_array_loop() { fn test_compiler_bneinc() { let mut builder = AsmBuilder::::default(); - let n_val = BabyBear::from_canonical_u32(20); + let n_val = BabyBear::from_u32(20); let zero: Var<_> = builder.eval(F::ZERO); let n: Var<_> = builder.eval(n_val); diff --git a/extensions/native/circuit/tests/fri_ro_eval.rs b/extensions/native/circuit/tests/fri_ro_eval.rs index 6f332d22b6..b2b514039f 100644 --- a/extensions/native/circuit/tests/fri_ro_eval.rs +++ b/extensions/native/circuit/tests/fri_ro_eval.rs @@ -4,9 +4,9 @@ use openvm_native_compiler::{ conversion::{convert_program, CompilerOptions}, ir::{Array, Ext, Felt}, }; -use openvm_stark_backend::p3_field::{extension::BinomialExtensionField, FieldAlgebra}; -use openvm_stark_sdk::p3_baby_bear::BabyBear; -use rand::{thread_rng, Rng}; +use openvm_stark_backend::p3_field::{extension::BinomialExtensionField, PrimeCharacteristicRing}; +use openvm_stark_sdk::{p3_baby_bear::BabyBear, utils::create_seeded_rng}; +use rand::Rng; type F = BabyBear; type EF = BinomialExtensionField; @@ -15,21 +15,21 @@ type EF = BinomialExtensionField; fn test_single_reduced_opening_eval() { let mut builder = AsmBuilder::::default(); - let mut rng = thread_rng(); + let mut rng = create_seeded_rng(); let n = 3; - let alpha_value = rng.gen::(); - let initial_alpha_pow_value = rng.gen::(); - let x_value = rng.gen::(); - let z_value = rng.gen::(); + let alpha_value = rng.random::(); + let initial_alpha_pow_value = rng.random::(); + let x_value = rng.random::(); + let z_value = rng.random::(); let ps_at_z: Array<_, Ext<_, _>> = builder.dyn_array(n); let mut mat_opening = Vec::with_capacity(n); let expected_mat_opening: Array<_, Felt<_>> = builder.dyn_array(n); for i in 0..n { - let a_value = rng.gen::(); - let b_value = rng.gen::(); + let a_value = rng.random::(); + let b_value = rng.random::(); mat_opening.push(a_value); diff --git a/extensions/native/circuit/tests/hint.rs b/extensions/native/circuit/tests/hint.rs index 1a0131a62e..43c724dbb8 100644 --- a/extensions/native/circuit/tests/hint.rs +++ b/extensions/native/circuit/tests/hint.rs @@ -1,6 +1,8 @@ use openvm_native_circuit::execute_program; use openvm_native_compiler::{asm::AsmBuilder, ir::Felt}; -use openvm_stark_backend::p3_field::{extension::BinomialExtensionField, Field, FieldAlgebra}; +use openvm_stark_backend::p3_field::{ + extension::BinomialExtensionField, Field, PrimeCharacteristicRing, +}; use openvm_stark_sdk::p3_baby_bear::BabyBear; type F = BabyBear; @@ -10,7 +12,7 @@ type EF = BinomialExtensionField; fn test_hint_bits_felt() { let mut builder = AsmBuilder::::default(); - let felt: Felt<_> = builder.constant(F::from_canonical_u32(5)); + let felt: Felt<_> = builder.constant(F::from_u32(5)); let bits = builder.num2bits_f(felt, F::bits() as u32); let x = builder.get(&bits, 0); diff --git a/extensions/native/circuit/tests/integration_test.rs b/extensions/native/circuit/tests/integration_test.rs index d0d56f6d4c..314d424514 100644 --- a/extensions/native/circuit/tests/integration_test.rs +++ b/extensions/native/circuit/tests/integration_test.rs @@ -47,7 +47,7 @@ use openvm_native_compiler::{ }; use openvm_rv32im_transpiler::BranchEqualOpcode::*; use openvm_stark_backend::{ - config::StarkGenericConfig, engine::StarkEngine, p3_field::FieldAlgebra, + config::StarkGenericConfig, engine::StarkEngine, p3_field::PrimeCharacteristicRing, }; use openvm_stark_sdk::{ config::{ @@ -66,7 +66,7 @@ where R: Rng + ?Sized, { const MAX_MEMORY: usize = 1 << 29; - rng.gen_range(0..MAX_MEMORY - len) / len * len + rng.random_range(0..MAX_MEMORY - len) / len * len } #[test] @@ -236,11 +236,7 @@ fn test_vm_public_values() -> eyre::Result<()> { assert_eq!( proof.per_air[PUBLIC_VALUES_AIR_ID].public_values, [ - vec![ - BabyBear::ZERO, - BabyBear::ZERO, - BabyBear::from_canonical_u32(12) - ], + vec![BabyBear::ZERO, BabyBear::ZERO, BabyBear::from_u32(12)], vec![BabyBear::ZERO; num_public_values - 3] ] .concat(), @@ -272,7 +268,7 @@ fn test_vm_initial_memory() { Instruction::::from_isize(TERMINATE.global_opcode(), 0, 0, 0, 0, 0), ]); - let raw = unsafe { transmute::(BabyBear::from_canonical_u32(101)) }; + let raw = unsafe { transmute::(BabyBear::from_u32(101)) }; let init_memory = BTreeMap::from_iter((0..4).map(|i| ((4u32, 7u32 * 4 + i), raw[i as usize]))); let config = test_native_continuations_config(); @@ -905,21 +901,21 @@ fn test_vm_execute_native_chips() { // Poseidon2 operations (Poseidon2Chip) Instruction::new( Poseidon2Opcode::PERM_POS2.global_opcode(), - F::from_canonical_usize(44), - F::from_canonical_usize(48), + F::from_usize(44), + F::from_usize(48), F::ZERO, - F::from_canonical_usize(4), - F::from_canonical_usize(4), + F::from_usize(4), + F::from_usize(4), F::ZERO, F::ZERO, ), Instruction::new( Poseidon2Opcode::COMP_POS2.global_opcode(), - F::from_canonical_usize(52), - F::from_canonical_usize(44), - F::from_canonical_usize(48), - F::from_canonical_usize(4), - F::from_canonical_usize(4), + F::from_usize(52), + F::from_usize(44), + F::from_usize(48), + F::from_usize(4), + F::from_usize(4), F::ZERO, F::ZERO, ), diff --git a/extensions/native/circuit/tests/io.rs b/extensions/native/circuit/tests/io.rs index d740728d5c..119d83ee34 100644 --- a/extensions/native/circuit/tests/io.rs +++ b/extensions/native/circuit/tests/io.rs @@ -3,7 +3,7 @@ use openvm_native_compiler::{ asm::{AsmBuilder, AsmCompiler}, conversion::{convert_program, CompilerOptions}, }; -use openvm_stark_backend::p3_field::{extension::BinomialExtensionField, FieldAlgebra}; +use openvm_stark_backend::p3_field::{extension::BinomialExtensionField, PrimeCharacteristicRing}; use openvm_stark_sdk::p3_baby_bear::BabyBear; type F = BabyBear; @@ -38,7 +38,7 @@ fn test_io() { let witness_stream: Vec> = vec![ vec![F::ZERO, F::ZERO, F::ONE], vec![F::ZERO, F::ZERO, F::TWO], - vec![F::from_canonical_usize(3)], + vec![F::from_usize(3)], vec![ F::ZERO, F::ZERO, diff --git a/extensions/native/circuit/tests/poseidon2.rs b/extensions/native/circuit/tests/poseidon2.rs index d1758f6849..1098b99a62 100644 --- a/extensions/native/circuit/tests/poseidon2.rs +++ b/extensions/native/circuit/tests/poseidon2.rs @@ -4,28 +4,30 @@ use openvm_native_compiler::{ ir::{Array, Var, PERMUTATION_WIDTH}, prelude::RVar, }; -use openvm_stark_backend::p3_field::{extension::BinomialExtensionField, FieldAlgebra}; -use openvm_stark_sdk::{config::baby_bear_poseidon2::default_perm, p3_baby_bear::BabyBear}; +use openvm_stark_backend::p3_field::{extension::BinomialExtensionField, PrimeCharacteristicRing}; +use openvm_stark_sdk::{ + config::baby_bear_poseidon2::default_perm, p3_baby_bear::BabyBear, utils::create_seeded_rng, +}; use p3_symmetric::Permutation; -use rand::{thread_rng, Rng}; +use rand::Rng; type F = BabyBear; type EF = BinomialExtensionField; #[test] fn test_compiler_poseidon2_permute() { - let mut rng = thread_rng(); + let mut rng = create_seeded_rng(); let mut builder = AsmBuilder::::default(); - let random_state_vals: [F; PERMUTATION_WIDTH] = rng.gen(); + let random_state_vals: [F; PERMUTATION_WIDTH] = rng.random(); // Execute the reference permutation let perm = default_perm(); let expected_result = perm.permute(random_state_vals); // Execute the permutation in the VM // Initialize an array and populate it with the entries. - let var_width: Var = builder.eval(F::from_canonical_usize(PERMUTATION_WIDTH)); + let var_width: Var = builder.eval(F::from_usize(PERMUTATION_WIDTH)); let random_state = builder.array(var_width); for (i, val) in random_state_vals.iter().enumerate() { builder.set(&random_state, i, *val); @@ -54,11 +56,11 @@ fn test_compiler_poseidon2_permute() { #[test] fn test_compiler_poseidon2_hash_1() { - let mut rng = thread_rng(); + let mut rng = create_seeded_rng(); let mut builder = AsmBuilder::::default(); - let random_state_vals: [F; 42] = rng.gen(); + let random_state_vals: [F; 42] = rng.random(); println!("{random_state_vals:?}"); let rlen = random_state_vals.len(); let random_state_v2 = builder.dyn_array(rlen); diff --git a/extensions/native/circuit/tests/ptr_struct.rs b/extensions/native/circuit/tests/ptr_struct.rs index 58d2d0c0b8..b8aed5b0d9 100644 --- a/extensions/native/circuit/tests/ptr_struct.rs +++ b/extensions/native/circuit/tests/ptr_struct.rs @@ -5,9 +5,9 @@ use openvm_native_compiler::{ prelude::{Builder, MemIndex, MemVariable, Ptr, Variable}, }; use openvm_native_compiler_derive::DslVariable; -use openvm_stark_backend::p3_field::{extension::BinomialExtensionField, FieldAlgebra}; -use openvm_stark_sdk::p3_baby_bear::BabyBear; -use rand::{thread_rng, Rng}; +use openvm_stark_backend::p3_field::{extension::BinomialExtensionField, PrimeCharacteristicRing}; +use openvm_stark_sdk::{p3_baby_bear::BabyBear, utils::create_seeded_rng}; +use rand::Rng; #[derive(DslVariable, Clone, Debug)] pub struct Point { @@ -26,7 +26,7 @@ fn test_compiler_array() { // Sum all the values of an array. let len: usize = 3; - let mut rng = thread_rng(); + let mut rng = create_seeded_rng(); let static_array = builder.array::>(len); @@ -40,14 +40,14 @@ fn test_compiler_array() { builder.assert_var_eq(value, F::ONE); } - let dyn_len: Var<_> = builder.eval(F::from_canonical_usize(len)); + let dyn_len: Var<_> = builder.eval(F::from_usize(len)); let var_array = builder.array::>(dyn_len); let felt_array = builder.array::>(dyn_len); let ext_array = builder.array::>(dyn_len); // Put values statically - let var_vals = (0..len).map(|_| rng.gen::()).collect::>(); - let felt_vals = (0..len).map(|_| rng.gen::()).collect::>(); - let ext_vals = (0..len).map(|_| rng.gen::()).collect::>(); + let var_vals = (0..len).map(|_| rng.random::()).collect::>(); + let felt_vals = (0..len).map(|_| rng.random::()).collect::>(); + let ext_vals = (0..len).map(|_| rng.random::()).collect::>(); for i in 0..len { builder.set(&var_array, i, var_vals[i]); builder.set(&felt_array, i, felt_vals[i]); @@ -66,24 +66,20 @@ fn test_compiler_array() { // Put values dynamically builder.range(0, dyn_len).for_each(|i_vec, builder| { let i = i_vec[0]; - builder.set( - &var_array, - i, - i * RVar::from_field(F::from_canonical_u32(2)), - ); - builder.set(&felt_array, i, F::from_canonical_u32(3)); - builder.set(&ext_array, i, EF::from_canonical_u32(4).cons()); + builder.set(&var_array, i, i * RVar::from_field(F::from_u32(2))); + builder.set(&felt_array, i, F::from_u32(3)); + builder.set(&ext_array, i, EF::from_u32(4).cons()); }); // Assert values set. builder.range(0, dyn_len).for_each(|i_vec, builder| { let i = i_vec[0]; let var_value = builder.get(&var_array, i); - builder.assert_var_eq(var_value, i * RVar::from_field(F::from_canonical_u32(2))); + builder.assert_var_eq(var_value, i * RVar::from_field(F::from_u32(2))); let felt_value = builder.get(&felt_array, i); - builder.assert_felt_eq(felt_value, F::from_canonical_u32(3)); + builder.assert_felt_eq(felt_value, F::from_u32(3)); let ext_value = builder.get(&ext_array, i); - builder.assert_ext_eq(ext_value, EF::from_canonical_u32(4).cons()); + builder.assert_ext_eq(ext_value, EF::from_u32(4).cons()); }); // Test the derived macro and mixed size allocations. diff --git a/extensions/native/circuit/tests/public_values.rs b/extensions/native/circuit/tests/public_values.rs index f3ad166d77..a8f21ae364 100644 --- a/extensions/native/circuit/tests/public_values.rs +++ b/extensions/native/circuit/tests/public_values.rs @@ -1,7 +1,7 @@ use openvm_circuit::{arch::PUBLIC_VALUES_AIR_ID, utils::air_test_impl}; use openvm_native_circuit::{execute_program_with_config, test_native_config, NativeCpuBuilder}; use openvm_native_compiler::{asm::AsmBuilder, prelude::*}; -use openvm_stark_backend::p3_field::{extension::BinomialExtensionField, FieldAlgebra}; +use openvm_stark_backend::p3_field::{extension::BinomialExtensionField, PrimeCharacteristicRing}; use openvm_stark_sdk::{ config::{baby_bear_poseidon2::BabyBearPoseidon2Engine, FriParameters}, p3_baby_bear::BabyBear, @@ -12,15 +12,15 @@ type EF = BinomialExtensionField; #[test] fn test_compiler_public_values() { - let public_value_0 = F::from_canonical_u32(10); - let public_value_1 = F::from_canonical_u32(20); + let public_value_0 = F::from_u32(10); + let public_value_1 = F::from_u32(20); let mut builder = AsmBuilder::::default(); { let a: Felt<_> = builder.constant(public_value_0); let b: Felt<_> = builder.constant(public_value_1); - let dyn_len: Var<_> = builder.eval(F::from_canonical_usize(2)); + let dyn_len: Var<_> = builder.eval(F::from_usize(2)); let var_array = builder.dyn_array::>(dyn_len); builder.set(&var_array, RVar::zero(), a); builder.set(&var_array, RVar::one(), b); @@ -58,13 +58,13 @@ fn test_compiler_public_values() { fn test_compiler_public_values_no_initial() { let mut builder = AsmBuilder::::default(); - let public_value_0 = F::from_canonical_u32(10); - let public_value_1 = F::from_canonical_u32(20); + let public_value_0 = F::from_u32(10); + let public_value_1 = F::from_u32(20); let a: Felt<_> = builder.constant(public_value_0); let b: Felt<_> = builder.constant(public_value_1); - let dyn_len: Var<_> = builder.eval(F::from_canonical_usize(2)); + let dyn_len: Var<_> = builder.eval(F::from_usize(2)); let var_array = builder.dyn_array::>(dyn_len); builder.set(&var_array, RVar::zero(), a); builder.set(&var_array, RVar::one(), b); diff --git a/extensions/native/circuit/tests/range_check.rs b/extensions/native/circuit/tests/range_check.rs index 959f2bae9f..d3954b5beb 100644 --- a/extensions/native/circuit/tests/range_check.rs +++ b/extensions/native/circuit/tests/range_check.rs @@ -1,6 +1,6 @@ use openvm_native_circuit::execute_program; use openvm_native_compiler::{asm::AsmBuilder, prelude::*}; -use openvm_stark_backend::p3_field::{extension::BinomialExtensionField, FieldAlgebra}; +use openvm_stark_backend::p3_field::{extension::BinomialExtensionField, PrimeCharacteristicRing}; use openvm_stark_sdk::p3_baby_bear::BabyBear; const D: usize = 4; @@ -14,11 +14,11 @@ fn test_range_check_v() { builder.range_check_var(v, 1); } { - let v: Var<_> = builder.eval(F::from_canonical_u32(1 << 16)); + let v: Var<_> = builder.eval(F::from_u32(1 << 16)); builder.range_check_var(v, 17); } { - let v: Var<_> = builder.eval(F::from_canonical_u32((1 << 29) - 1)); + let v: Var<_> = builder.eval(F::from_u32((1 << 29) - 1)); builder.range_check_var(v, 29); } builder.halt(); @@ -32,7 +32,7 @@ fn test_range_check_v() { fn test_range_check_v_neg() { let mut builder = AsmBuilder::::default(); { - let v: Var<_> = builder.eval(F::from_canonical_u32(1 << 16)); + let v: Var<_> = builder.eval(F::from_u32(1 << 16)); builder.range_check_var(v, 15); } builder.halt(); diff --git a/extensions/native/compiler/src/asm/code.rs b/extensions/native/compiler/src/asm/code.rs index c46dae55b0..c78d41b231 100644 --- a/extensions/native/compiler/src/asm/code.rs +++ b/extensions/native/compiler/src/asm/code.rs @@ -54,7 +54,7 @@ impl> Display for AssemblyCode { f, "{}:", self.labels - .get(&F::from_canonical_u32(i as u32)) + .get(&F::from_u32(i as u32)) .unwrap_or(&format!(".L{i}")) )?; for instruction in &block.0 { diff --git a/extensions/native/compiler/src/asm/compiler.rs b/extensions/native/compiler/src/asm/compiler.rs index 2f3a7c5559..3262fa7960 100644 --- a/extensions/native/compiler/src/asm/compiler.rs +++ b/extensions/native/compiler/src/asm/compiler.rs @@ -89,7 +89,7 @@ impl + TwoAdicField> AsmCo pub fn build(&mut self, operations: TracedVec>>) { if self.block_label().is_zero() { // Initialize the heap pointer value. - let heap_start = F::from_canonical_u32(HEAP_START_ADDRESS as u32); + let heap_start = F::from_u32(HEAP_START_ADDRESS as u32); self.push(AsmInstruction::ImmF(HEAP_PTR, heap_start), None); // Jump over the TRAP instruction we are about to add. self.push(AsmInstruction::j(self.trap_label + F::ONE), None); @@ -146,7 +146,7 @@ impl + TwoAdicField> AsmCo self.add_felt_exti(dst, lhs, rhs, debug_info); } DslIr::AddEFI(dst, lhs, rhs) => { - self.add_ext_exti(dst, lhs, EF::from_base(rhs), debug_info); + self.add_ext_exti(dst, lhs, EF::from(rhs), debug_info); } DslIr::SubV(dst, lhs, rhs) => { self.push( @@ -226,7 +226,7 @@ impl + TwoAdicField> AsmCo self.sub_ext_felt(dst, lhs, rhs, debug_info); } DslIr::SubEFI(dst, lhs, rhs) => { - self.add_ext_exti(dst, lhs, EF::from_base(rhs.neg()), debug_info); + self.add_ext_exti(dst, lhs, EF::from(rhs.neg()), debug_info); } DslIr::SubEIN(dst, lhs, rhs) => { self.sub_exti_ext(dst, lhs, rhs, debug_info.clone()); @@ -641,7 +641,7 @@ impl + TwoAdicField> AsmCo ); let inc = align((len.as_canonical_u32() as usize) * size); assert!((inc as u32) < HEAP_SIZE, "Allocation size too large"); - let inc_f = F::from_canonical_usize(inc); + let inc_f = F::from_usize(inc); self.push( AsmInstruction::AddFI(HEAP_PTR, HEAP_PTR, inc_f), debug_info.clone(), @@ -668,7 +668,7 @@ impl + TwoAdicField> AsmCo debug_info.clone(), ); } - let size_f = F::from_canonical_usize(size); + let size_f = F::from_usize(size); self.push( AsmInstruction::MulFI(A0, len.fp(), size_f), debug_info.clone(), @@ -718,7 +718,7 @@ impl + TwoAdicField> AsmCo } fn block_label(&mut self) -> F { - F::from_canonical_usize(self.basic_blocks.len() - 1) + F::from_usize(self.basic_blocks.len() - 1) } fn push_to_block( @@ -951,8 +951,8 @@ impl + TwoAdicField> // Ext compiler logic. impl + TwoAdicField> AsmCompiler { fn assign_exti(&mut self, dst: i32, imm: EF, debug_info: Option) { - let imm = imm.as_base_slice(); - for i in 0..EF::D { + let imm = imm.as_basis_coefficients_slice(); + for i in 0..EF::DIMENSION { self.push( AsmInstruction::ImmF(dst + i as i32, imm[i]), debug_info.clone(), @@ -981,8 +981,8 @@ impl + TwoAdicField> AsmCo rhs: EF, debug_info: Option, ) { - let rhs = rhs.as_base_slice(); - for i in 0..EF::D { + let rhs = rhs.as_basis_coefficients_slice(); + for i in 0..EF::DIMENSION { let j = i as i32; self.push( AsmInstruction::AddFI(dst.fp() + j, lhs.fp() + j, rhs[i]), @@ -998,8 +998,8 @@ impl + TwoAdicField> AsmCo rhs: Ext, debug_info: Option, ) { - let lhs = lhs.as_base_slice(); - for i in 0..EF::D { + let lhs = lhs.as_basis_coefficients_slice(); + for i in 0..EF::DIMENSION { let j = i as i32; self.push( AsmInstruction::SubFIN(dst.fp() + j, lhs[i], rhs.fp() + j), @@ -1019,7 +1019,7 @@ impl + TwoAdicField> AsmCo AsmInstruction::AddF(dst.fp(), lhs.fp(), rhs.fp()), debug_info.clone(), ); - for i in 1..EF::D { + for i in 1..EF::DIMENSION { let j = i as i32; self.push( AsmInstruction::CopyF(dst.fp() + j, lhs.fp() + j), @@ -1039,7 +1039,7 @@ impl + TwoAdicField> AsmCo AsmInstruction::SubF(dst.fp(), lhs.fp(), rhs.fp()), debug_info.clone(), ); - for i in 1..EF::D { + for i in 1..EF::DIMENSION { let j = i as i32; self.push( AsmInstruction::CopyF(dst.fp() + j, lhs.fp() + j), @@ -1055,14 +1055,14 @@ impl + TwoAdicField> AsmCo rhs: EF, debug_info: Option, ) { - let rhs = rhs.as_base_slice(); + let rhs = rhs.as_basis_coefficients_slice(); self.push( AsmInstruction::CopyF(dst.fp(), lhs.fp()), debug_info.clone(), ); - for i in 1..EF::D { + for i in 1..EF::DIMENSION { let j = i as i32; self.push( AsmInstruction::ImmF(dst.fp() + j, rhs[i]), @@ -1078,7 +1078,7 @@ impl + TwoAdicField> AsmCo rhs: Felt, debug_info: Option, ) { - for i in 0..EF::D { + for i in 0..EF::DIMENSION { let j = i as i32; self.push( AsmInstruction::MulF(dst.fp() + j, lhs.fp() + j, rhs.fp()), @@ -1094,7 +1094,7 @@ impl + TwoAdicField> AsmCo rhs: F, debug_info: Option, ) { - for i in 0..EF::D { + for i in 0..EF::DIMENSION { let j = i as i32; self.push( AsmInstruction::MulFI(dst.fp() + j, lhs.fp() + j, rhs), @@ -1110,7 +1110,7 @@ impl + TwoAdicField> AsmCo rhs: Felt, debug_info: Option, ) { - for i in 0..EF::D { + for i in 0..EF::DIMENSION { let j = i as i32; self.push( AsmInstruction::DivF(dst.fp() + j, lhs.fp() + j, rhs.fp()), diff --git a/extensions/native/compiler/src/asm/utils.rs b/extensions/native/compiler/src/asm/utils.rs index 104196791a..cf9c997c8c 100644 --- a/extensions/native/compiler/src/asm/utils.rs +++ b/extensions/native/compiler/src/asm/utils.rs @@ -11,15 +11,13 @@ pub enum IndexTriple { impl MemIndex { pub fn fp(&self) -> IndexTriple { match &self.index { - RVar::Const(index) => IndexTriple::Const( - *index, - F::from_canonical_usize(self.offset), - F::from_canonical_usize(self.size), - ), + RVar::Const(index) => { + IndexTriple::Const(*index, F::from_usize(self.offset), F::from_usize(self.size)) + } RVar::Val(index) => IndexTriple::Var( index.fp(), - F::from_canonical_usize(self.offset), - F::from_canonical_usize(self.size), + F::from_usize(self.offset), + F::from_usize(self.size), ), } } diff --git a/extensions/native/compiler/src/constraints/halo2/baby_bear.rs b/extensions/native/compiler/src/constraints/halo2/baby_bear.rs index 750aed5569..f5f186b494 100644 --- a/extensions/native/compiler/src/constraints/halo2/baby_bear.rs +++ b/extensions/native/compiler/src/constraints/halo2/baby_bear.rs @@ -5,7 +5,7 @@ use num_bigint::{BigInt, BigUint}; use num_integer::Integer; use openvm_stark_backend::p3_field::{ extension::{BinomialExtensionField, BinomiallyExtendable}, - Field, FieldAlgebra, FieldExtensionAlgebra, PrimeField32, PrimeField64, + BasedVectorSpace, Field, PrimeCharacteristicRing, PrimeField32, PrimeField64, }; use openvm_stark_sdk::p3_baby_bear::BabyBear; use snark_verifier_sdk::snark_verifier::{ @@ -26,13 +26,13 @@ const RESERVED_HIGH_BITS: usize = 2; #[derive(Copy, Clone, Debug)] pub struct AssignedBabyBear { - /// Logically `value` is a signed integer represented as `Bn254Fr`. + /// Logically `value` is a signed integer represented as `Bn254`. /// Invariants: - /// - `|value|` never overflows `Bn254Fr` + /// - `|value|` never overflows `Bn254` /// - `|value| < 2^max_bits` and `max_bits <= Fr::CAPACITY - RESERVED_HIGH_BITS` /// /// Basically `value` could do arithmetic operations without extra constraints as long as the - /// result doesn't overflow `Bn254Fr`. And it's easy to track `max_bits` of the result. + /// result doesn't overflow `Bn254`. And it's easy to track `max_bits` of the result. pub value: AssignedValue, /// The value is guaranteed to be less than 2^max_bits. pub max_bits: usize, @@ -44,7 +44,7 @@ impl AssignedBabyBear { if b_int < BigInt::from(0) { b_int += BabyBear::ORDER_U32; } - BabyBear::from_canonical_u32(b_int.try_into().unwrap()) + BabyBear::from_u32(b_int.try_into().unwrap()) } } @@ -448,7 +448,7 @@ pub type BabyBearExt4 = BinomialExtensionField; impl AssignedBabyBearExt4 { pub fn to_extension_field(&self) -> BabyBearExt4 { let b_val = (0..4).map(|i| self.0[i].to_baby_bear()).collect_vec(); - BabyBearExt4::from_base_slice(&b_val) + BabyBearExt4::from_basis_coefficients_slice(&b_val).unwrap() } } @@ -459,7 +459,7 @@ impl BabyBearExt4Chip { pub fn load_witness(&self, ctx: &mut Context, value: BabyBearExt4) -> AssignedBabyBearExt4 { AssignedBabyBearExt4( value - .as_base_slice() + .as_basis_coefficients_slice() .iter() .map(|x| self.base.load_witness(ctx, *x)) .collect_vec() @@ -474,7 +474,7 @@ impl BabyBearExt4Chip { ) -> AssignedBabyBearExt4 { AssignedBabyBearExt4( value - .as_base_slice() + .as_basis_coefficients_slice() .iter() .map(|x| self.base.load_constant(ctx, *x)) .collect_vec() diff --git a/extensions/native/compiler/src/constraints/halo2/compiler.rs b/extensions/native/compiler/src/constraints/halo2/compiler.rs index 766393eadd..74e20c2f27 100644 --- a/extensions/native/compiler/src/constraints/halo2/compiler.rs +++ b/extensions/native/compiler/src/constraints/halo2/compiler.rs @@ -9,8 +9,8 @@ use std::{ use itertools::Itertools; #[cfg(feature = "metrics")] use openvm_circuit::metrics::cycle_tracker::CycleTracker; -use openvm_stark_backend::p3_field::{ExtensionField, Field, FieldAlgebra, PrimeField}; -use openvm_stark_sdk::{p3_baby_bear::BabyBear, p3_bn254_fr::Bn254Fr}; +use openvm_stark_backend::p3_field::{ExtensionField, Field, PrimeCharacteristicRing, PrimeField}; +use openvm_stark_sdk::{p3_baby_bear::BabyBear, p3_bn254::Bn254}; use snark_verifier_sdk::snark_verifier::{ halo2_base::{ gates::{ @@ -133,7 +133,7 @@ impl Halo2ConstraintCompiler { // Assume: C::N = C::F = C::EF is type Fr pub fn constrain_halo2(&self, halo2_state: &mut Halo2State, operations: TracedVec>) where - C: Config, + C: Config, { #[cfg(feature = "metrics")] let mut cell_tracker = CycleTracker::new(); @@ -532,7 +532,7 @@ pub fn convert_fr(a: &F) -> Fr { #[allow(dead_code)] pub fn convert_efr>(a: &EF) -> Vec { - let slc = a.as_base_slice(); + let slc = a.as_basis_coefficients_slice(); slc.iter() .map(|x| biguint_to_fe(&x.as_canonical_biguint())) .collect() @@ -655,7 +655,7 @@ fn var_to_u64_limbs( gate.assert_bit(ctx, li_out_bd); // Update on_bound except the last limb if i > 0 { - debug_assert_ne!(fr_bound_limbs[i], 0, "This should never happen for Bn254Fr"); + debug_assert_ne!(fr_bound_limbs[i], 0, "This should never happen for Bn254"); // on_bound && limbs[i] - fr_bound_limbs[i] == 0 let diff = gate.sub_mul( ctx, diff --git a/extensions/native/compiler/src/constraints/halo2/poseidon2_perm.rs b/extensions/native/compiler/src/constraints/halo2/poseidon2_perm.rs index f39c9b98a7..05a8ddddf3 100644 --- a/extensions/native/compiler/src/constraints/halo2/poseidon2_perm.rs +++ b/extensions/native/compiler/src/constraints/halo2/poseidon2_perm.rs @@ -1,4 +1,4 @@ -//! Halo2 implementation of poseidon2 perm for Bn254Fr +//! Halo2 implementation of poseidon2 perm for Bn254 //! sbox degree 5 use snark_verifier_sdk::snark_verifier::halo2_base::{ diff --git a/extensions/native/compiler/src/constraints/mod.rs b/extensions/native/compiler/src/constraints/mod.rs index 8b5053a27b..46471ef29e 100644 --- a/extensions/native/compiler/src/constraints/mod.rs +++ b/extensions/native/compiler/src/constraints/mod.rs @@ -1,7 +1,7 @@ use core::fmt::Debug; use std::marker::PhantomData; -use openvm_stark_backend::p3_field::{Field, FieldExtensionAlgebra, PrimeField}; +use openvm_stark_backend::p3_field::{BasedVectorSpace, Field, PrimeField}; use serde::{Deserialize, Serialize}; use self::opcodes::ConstraintOpcode; @@ -71,7 +71,7 @@ impl ConstraintCompiler { args: vec![ vec![tmp_id.clone()], value - .as_base_slice() + .as_basis_coefficients_slice() .iter() .map(|x| x.as_canonical_biguint().to_string()) .collect(), @@ -97,7 +97,7 @@ impl ConstraintCompiler { opcode: ConstraintOpcode::ImmE, args: vec![ vec![a.id()], - b.as_base_slice() + b.as_basis_coefficients_slice() .iter() .map(|x| x.as_canonical_biguint().to_string()) .collect(), diff --git a/extensions/native/compiler/src/conversion/mod.rs b/extensions/native/compiler/src/conversion/mod.rs index af4e5080fb..be9d15844e 100644 --- a/extensions/native/compiler/src/conversion/mod.rs +++ b/extensions/native/compiler/src/conversion/mod.rs @@ -88,7 +88,7 @@ impl AS { fn to_field(self) -> F { match self { AS::Immediate => F::ZERO, - AS::Native => F::from_canonical_u8(AS::Native as u8), + AS::Native => F::from_u8(AS::Native as u8), } } } @@ -97,9 +97,9 @@ fn i32_f(x: i32) -> F { let modulus = F::ORDER_U32; assert!(x < modulus as i32 && x >= -(modulus as i32)); if x < 0 { - -F::from_canonical_u32((-x) as u32) + -F::from_u32((-x) as u32) } else { - F::from_canonical_u32(x as u32) + F::from_u32(x as u32) } } @@ -214,31 +214,31 @@ fn convert_instruction>( AS::Immediate, ), ], - AsmInstruction::BneE(label, lhs, rhs) => (0..EF::D) + AsmInstruction::BneE(label, lhs, rhs) => (0..EF::DIMENSION) .map(|i| // if mem[lhs + i] != mem[rhs +i] for i = 0..4, pc <- labels[label] inst( options.opcode_with_offset(NativeBranchEqualOpcode(BranchEqualOpcode::BNE)), i32_f(lhs + (i as i32)), i32_f(rhs + (i as i32)), - labels(label) - (pc + F::from_canonical_usize(i * DEFAULT_PC_STEP as usize)), + labels(label) - (pc + F::from_usize(i * DEFAULT_PC_STEP as usize)), AS::Native, AS::Native, )) .collect(), - AsmInstruction::BneEI(label, lhs, rhs) => (0..EF::D) + AsmInstruction::BneEI(label, lhs, rhs) => (0..EF::DIMENSION) .map(|i| // if mem[lhs + i] != rhs[i] for i = 0..4, pc <- labels[label] inst( options.opcode_with_offset(NativeBranchEqualOpcode(BranchEqualOpcode::BNE)), i32_f(lhs + (i as i32)), - rhs.as_base_slice()[i], - labels(label) - (pc + F::from_canonical_usize(i * DEFAULT_PC_STEP as usize)), + rhs.as_basis_coefficients_slice()[i], + labels(label) - (pc + F::from_usize(i * DEFAULT_PC_STEP as usize)), AS::Native, AS::Immediate, )) .collect(), - AsmInstruction::BeqE(label, lhs, rhs) => (0..EF::D) + AsmInstruction::BeqE(label, lhs, rhs) => (0..EF::DIMENSION) .rev() .map(|i| // if mem[lhs + i] == mem[rhs + i] for i = 0..4, pc <- labels[label] @@ -247,26 +247,26 @@ fn convert_instruction>( i32_f(lhs + (i as i32)), i32_f(rhs + (i as i32)), if i == 0 { - labels(label) - (pc + F::from_canonical_usize((EF::D - 1) * DEFAULT_PC_STEP as usize)) + labels(label) - (pc + F::from_usize((EF::DIMENSION - 1) * DEFAULT_PC_STEP as usize)) } else { - F::from_canonical_usize((i + 1) * DEFAULT_PC_STEP as usize) + F::from_usize((i + 1) * DEFAULT_PC_STEP as usize) }, AS::Native, AS::Native, )) .collect(), - AsmInstruction::BeqEI(label, lhs, rhs) => (0..EF::D) + AsmInstruction::BeqEI(label, lhs, rhs) => (0..EF::DIMENSION) .rev() .map(|i| // if mem[lhs + i] == rhs[i] for i = 0..4, pc <- labels[label] inst( if i == 0 { options.opcode_with_offset(NativeBranchEqualOpcode(BranchEqualOpcode::BEQ)) } else { options.opcode_with_offset(NativeBranchEqualOpcode(BranchEqualOpcode::BNE)) }, i32_f(lhs + (i as i32)), - rhs.as_base_slice()[i], + rhs.as_basis_coefficients_slice()[i], if i == 0 { - labels(label) - (pc + F::from_canonical_usize((EF::D - 1) * DEFAULT_PC_STEP as usize)) + labels(label) - (pc + F::from_usize((EF::DIMENSION - 1) * DEFAULT_PC_STEP as usize)) } else { - F::from_canonical_usize((i + 1) * DEFAULT_PC_STEP as usize) + F::from_usize((i + 1) * DEFAULT_PC_STEP as usize) }, AS::Native, AS::Immediate, @@ -302,7 +302,7 @@ fn convert_instruction>( Instruction::phantom(PhantomDiscriminant(NativePhantom::HintFelt as u16), F::ZERO, F::ZERO, 0) ], AsmInstruction::HintBits(src, len) => vec![ - Instruction::phantom(PhantomDiscriminant(NativePhantom::HintBits as u16), i32_f(src), F::from_canonical_u32(len), AS::Native as u16) + Instruction::phantom(PhantomDiscriminant(NativePhantom::HintBits as u16), i32_f(src), F::from_u32(len), AS::Native as u16) ], AsmInstruction::HintLoad() => vec![ Instruction::phantom(PhantomDiscriminant(NativePhantom::HintLoad as u16), F::ZERO, F::ZERO, 0) @@ -335,7 +335,7 @@ fn convert_instruction>( F::ZERO, AS::Native as u16, )], - AsmInstruction::PrintE(src) => (0..EF::D as i32) + AsmInstruction::PrintE(src) => (0..EF::DIMENSION as i32) .map(|i| { Instruction::phantom( PhantomDiscriminant(NativePhantom::Print as u16), @@ -508,7 +508,7 @@ fn convert_instruction>( d: i32_f(sibling), e: i32_f(index), f: i32_f(commit), - g: F::from_canonical_usize(4).inverse(), + g: F::from_usize(4).inverse(), }], AsmInstruction::RangeCheck(v, x_bit, y_bit) => { assert!((0..=16).contains(&x_bit)); @@ -557,7 +557,7 @@ pub fn convert_program>( let instructions = convert_instruction::( instruction.clone(), debug_info.clone(), - F::from_canonical_u32(pc_idx * DEFAULT_PC_STEP), + F::from_u32(pc_idx * DEFAULT_PC_STEP), |label| label, &options, ); @@ -572,12 +572,11 @@ pub fn convert_program>( let cur_size = result.len() as u32; let cur_pc = cur_size * DEFAULT_PC_STEP; - let labels = - |label: F| F::from_canonical_u32(block_start[label.as_canonical_u64() as usize]); + let labels = |label: F| F::from_u32(block_start[label.as_canonical_u64() as usize]); let local_result = convert_instruction( instruction.clone(), debug_info.clone(), - F::from_canonical_u32(cur_pc), + F::from_u32(cur_pc), labels, &options, ); diff --git a/extensions/native/compiler/src/ir/bits.rs b/extensions/native/compiler/src/ir/bits.rs index 2fd7d5a97b..932313ef7b 100644 --- a/extensions/native/compiler/src/ir/bits.rs +++ b/extensions/native/compiler/src/ir/bits.rs @@ -1,6 +1,6 @@ use std::{any::TypeId, array}; -use openvm_stark_backend::p3_field::FieldAlgebra; +use openvm_stark_backend::p3_field::PrimeCharacteristicRing; use openvm_stark_sdk::p3_baby_bear::BabyBear; use super::{Array, Builder, Config, DslIr, Felt, MemIndex, Var}; @@ -31,7 +31,7 @@ impl Builder { let bit = self.get(&output, i); self.assert_felt_eq(bit * (bit - C::F::ONE), C::F::ZERO); - self.assign(&sum, sum + bit * C::F::from_canonical_u32(1 << i)); + self.assign(&sum, sum + bit * C::F::from_u32(1 << i)); if i == 26 { self.assign(&prefix_sum, sum); } @@ -53,7 +53,7 @@ impl Builder { // * if `num_bits >= 27`, then we must check: if `suffix_bit_sum = b[27] + ... + b[30] = // 4`, then `prefix_sum = b[0] + ... + b[26] * 2^26 = 0` let suffix_bit_sum_var = self.cast_felt_to_var(suffix_bit_sum); - self.if_eq(suffix_bit_sum_var, C::N::from_canonical_u32(4)) + self.if_eq(suffix_bit_sum_var, C::N::from_u32(4)) .then(|builder| { builder.assert_felt_eq(prefix_sum, C::F::ZERO); }); @@ -78,7 +78,7 @@ impl Builder { pub fn bits2num_v_circuit(&mut self, bits: &[Var]) -> Var { let result: Var<_> = self.eval(C::N::ZERO); for i in 0..bits.len() { - self.assign(&result, result + bits[i] * C::N::from_canonical_u32(1 << i)); + self.assign(&result, result + bits[i] * C::N::from_u32(1 << i)); } result } diff --git a/extensions/native/compiler/src/ir/builder.rs b/extensions/native/compiler/src/ir/builder.rs index 4af6f3c64b..af920c60ee 100644 --- a/extensions/native/compiler/src/ir/builder.rs +++ b/extensions/native/compiler/src/ir/builder.rs @@ -3,7 +3,7 @@ use std::{iter::Zip, vec::IntoIter}; use backtrace::Backtrace; use itertools::izip; use openvm_native_compiler_derive::iter_zip; -use openvm_stark_backend::p3_field::{Field, FieldAlgebra, FieldExtensionAlgebra}; +use openvm_stark_backend::p3_field::{BasedVectorSpace, Field, PrimeCharacteristicRing}; use serde::{Deserialize, Serialize}; use super::{ @@ -386,7 +386,7 @@ impl Builder { }, step_sizes: arrays .iter() - .map(|array| C::N::from_canonical_usize(array.element_size_of())) + .map(|array| C::N::from_usize(array.element_size_of())) .collect(), builder: self, } @@ -396,7 +396,7 @@ impl Builder { } pub fn print_debug(&mut self, val: usize) { - let constant = self.eval(C::N::from_canonical_usize(val)); + let constant = self.eval(C::N::from_usize(val)); self.print_v(constant); } @@ -446,7 +446,7 @@ impl Builder { } pub fn hint_ext(&mut self) -> Ext { - let flattened = self.hint_felts_fixed(C::EF::D); + let flattened = self.hint_felts_fixed(C::EF::DIMENSION); // Simply recast memory as Array. let array: Array> = match flattened { @@ -544,7 +544,7 @@ impl Builder { let flattened = self.hint_felts(); let size = as MemVariable>::size_of(); - self.assert_usize_eq(flattened.len(), len * C::N::from_canonical_usize(size)); + self.assert_usize_eq(flattened.len(), len * C::N::from_usize(size)); // Simply recast memory as Array. match flattened { diff --git a/extensions/native/compiler/src/ir/poseidon.rs b/extensions/native/compiler/src/ir/poseidon.rs index 12ec526c89..b0ca7e11c4 100644 --- a/extensions/native/compiler/src/ir/poseidon.rs +++ b/extensions/native/compiler/src/ir/poseidon.rs @@ -1,5 +1,5 @@ use openvm_native_compiler_derive::iter_zip; -use openvm_stark_backend::p3_field::FieldAlgebra; +use openvm_stark_backend::p3_field::PrimeCharacteristicRing; use super::{Array, ArrayLike, Builder, Config, DslIr, Ext, Felt, MemIndex, Ptr, Usize, Var}; @@ -88,7 +88,7 @@ impl Builder { let address = self.eval(state.ptr().address); let start: Var<_> = self.eval(address); - let end: Var<_> = self.eval(address + C::N::from_canonical_usize(HASH_RATE)); + let end: Var<_> = self.eval(address + C::N::from_usize(HASH_RATE)); iter_zip!(self, array).for_each(|idx_vec, builder| { let subarray = builder.iter_ptr_get(array, idx_vec[0]); iter_zip!(builder, subarray).for_each(|ptr_vec, builder| { @@ -145,7 +145,7 @@ impl Builder { builder.set_value(&state, idx, felt); builder.assign(&idx, idx + C::N::ONE); builder - .if_eq(idx, C::N::from_canonical_usize(HASH_RATE)) + .if_eq(idx, C::N::from_usize(HASH_RATE)) .then(|builder| { builder.poseidon2_permute_mut(&state); builder.assign(&idx, C::N::ZERO); diff --git a/extensions/native/compiler/src/ir/symbolic.rs b/extensions/native/compiler/src/ir/symbolic.rs index d5dfa9abdd..f38fc18c5d 100644 --- a/extensions/native/compiler/src/ir/symbolic.rs +++ b/extensions/native/compiler/src/ir/symbolic.rs @@ -11,7 +11,9 @@ use std::{ ops::{AddAssign, DivAssign, MulAssign, SubAssign}, }; -use openvm_stark_backend::p3_field::{ExtensionField, Field, FieldAlgebra, FieldArray, PrimeField}; +use openvm_stark_backend::p3_field::{ + ExtensionField, Field, FieldArray, PrimeCharacteristicRing, PrimeField, +}; use serde::{Deserialize, Serialize}; use super::{utils::prime_field_to_usize, Ext, Felt, Usize, Var}; @@ -36,20 +38,20 @@ pub fn ext_elements>() -> Digest { fn digest_id(id: u32) -> Digest { let elements = elements(); - Digest::from(elements.0.map(|e: F| { - (e + F::from_canonical_u32(id)) - .try_inverse() - .unwrap_or(F::ONE) - })) + Digest::from( + elements + .0 + .map(|e: F| (e + F::from_u32(id)).try_inverse().unwrap_or(F::ONE)), + ) } fn digest_id_ext>(id: u32) -> Digest { let elements = ext_elements(); - Digest::from(elements.0.map(|e: EF| { - (e + EF::from_canonical_u32(id)) - .try_inverse() - .unwrap_or(EF::ONE) - })) + Digest::from( + elements + .0 + .map(|e: EF| (e + EF::from_u32(id)).try_inverse().unwrap_or(EF::ONE)), + ) } fn div_digests(a: Digest, b: Digest) -> Digest { @@ -273,11 +275,11 @@ pub enum ExtOperand> { impl> ExtOperand { pub fn digest(&self) -> Digest { match self { - ExtOperand::Base(f) => SymbolicFelt::from(*f).digest().0.map(EF::from_base).into(), + ExtOperand::Base(f) => SymbolicFelt::from(*f).digest().0.map(EF::from).into(), ExtOperand::Const(ef) => (*ef).into(), - ExtOperand::Felt(f) => SymbolicFelt::from(*f).digest().0.map(EF::from_base).into(), + ExtOperand::Felt(f) => SymbolicFelt::from(*f).digest().0.map(EF::from).into(), ExtOperand::Ext(e) => digest_id_ext::(e.0), - ExtOperand::SymFelt(f) => f.digest().0.map(EF::from_base).into(), + ExtOperand::SymFelt(f) => f.digest().0.map(EF::from).into(), ExtOperand::Sym(e) => e.digest(), } } @@ -309,41 +311,16 @@ pub trait ExtensionOperand> { fn to_operand(self) -> ExtOperand; } -impl FieldAlgebra for SymbolicVar { - type F = N; +impl PrimeCharacteristicRing for SymbolicVar { + type PrimeSubfield = N::PrimeSubfield; const ZERO: Self = SymbolicVar::Const(N::ZERO, FieldArray([N::ZERO; 4])); const ONE: Self = SymbolicVar::Const(N::ONE, FieldArray([N::ONE; 4])); const TWO: Self = SymbolicVar::Const(N::TWO, FieldArray([N::TWO; 4])); const NEG_ONE: Self = SymbolicVar::Const(N::NEG_ONE, FieldArray([N::NEG_ONE; 4])); - fn from_f(f: Self::F) -> Self { - SymbolicVar::from(f) - } - fn from_bool(b: bool) -> Self { - SymbolicVar::from(N::from_bool(b)) - } - fn from_canonical_u8(n: u8) -> Self { - SymbolicVar::from(N::from_canonical_u8(n)) - } - fn from_canonical_u16(n: u16) -> Self { - SymbolicVar::from(N::from_canonical_u16(n)) - } - fn from_canonical_u32(n: u32) -> Self { - SymbolicVar::from(N::from_canonical_u32(n)) - } - fn from_canonical_u64(n: u64) -> Self { - SymbolicVar::from(N::from_canonical_u64(n)) - } - fn from_canonical_usize(n: usize) -> Self { - SymbolicVar::from(N::from_canonical_usize(n)) - } - - fn from_wrapped_u32(n: u32) -> Self { - SymbolicVar::from(N::from_wrapped_u32(n)) - } - fn from_wrapped_u64(n: u64) -> Self { - SymbolicVar::from(N::from_wrapped_u64(n)) + fn from_prime_subfield(f: Self::PrimeSubfield) -> Self { + SymbolicVar::from(N::from_prime_subfield(f)) } } @@ -354,46 +331,21 @@ impl NotSymbolicVar for Var {} impl NotSymbolicVar for Usize {} impl NotSymbolicVar for RVar {} -impl FieldAlgebra for SymbolicFelt { - type F = F; +impl PrimeCharacteristicRing for SymbolicFelt { + type PrimeSubfield = F::PrimeSubfield; const ZERO: Self = SymbolicFelt::Const(F::ZERO, FieldArray([F::ZERO; 4])); const ONE: Self = SymbolicFelt::Const(F::ONE, FieldArray([F::ONE; 4])); const TWO: Self = SymbolicFelt::Const(F::TWO, FieldArray([F::TWO; 4])); const NEG_ONE: Self = SymbolicFelt::Const(F::NEG_ONE, FieldArray([F::NEG_ONE; 4])); - fn from_f(f: Self::F) -> Self { - SymbolicFelt::from(f) - } - fn from_bool(b: bool) -> Self { - SymbolicFelt::from(F::from_bool(b)) - } - fn from_canonical_u8(n: u8) -> Self { - SymbolicFelt::from(F::from_canonical_u8(n)) - } - fn from_canonical_u16(n: u16) -> Self { - SymbolicFelt::from(F::from_canonical_u16(n)) - } - fn from_canonical_u32(n: u32) -> Self { - SymbolicFelt::from(F::from_canonical_u32(n)) - } - fn from_canonical_u64(n: u64) -> Self { - SymbolicFelt::from(F::from_canonical_u64(n)) - } - fn from_canonical_usize(n: usize) -> Self { - SymbolicFelt::from(F::from_canonical_usize(n)) - } - - fn from_wrapped_u32(n: u32) -> Self { - SymbolicFelt::from(F::from_wrapped_u32(n)) - } - fn from_wrapped_u64(n: u64) -> Self { - SymbolicFelt::from(F::from_wrapped_u64(n)) + fn from_prime_subfield(f: Self::PrimeSubfield) -> Self { + SymbolicFelt::from(F::from_prime_subfield(f)) } } -impl> FieldAlgebra for SymbolicExt { - type F = EF; +impl> PrimeCharacteristicRing for SymbolicExt { + type PrimeSubfield = F::PrimeSubfield; const ZERO: Self = SymbolicExt::Const(EF::ZERO, FieldArray([EF::ZERO; 4])); const ONE: Self = @@ -405,33 +357,9 @@ impl> FieldAlgebra for SymbolicExt { FieldArray([EF::ZERO, EF::ZERO, EF::ZERO, EF::NEG_ONE]), ); - fn from_f(f: Self::F) -> Self { - SymbolicExt::Const(f, f.into()) - } - fn from_bool(b: bool) -> Self { - SymbolicExt::from_f(EF::from_bool(b)) - } - fn from_canonical_u8(n: u8) -> Self { - SymbolicExt::from_f(EF::from_canonical_u8(n)) - } - fn from_canonical_u16(n: u16) -> Self { - SymbolicExt::from_f(EF::from_canonical_u16(n)) - } - fn from_canonical_u32(n: u32) -> Self { - SymbolicExt::from_f(EF::from_canonical_u32(n)) - } - fn from_canonical_u64(n: u64) -> Self { - SymbolicExt::from_f(EF::from_canonical_u64(n)) - } - fn from_canonical_usize(n: usize) -> Self { - SymbolicExt::from_f(EF::from_canonical_usize(n)) - } - - fn from_wrapped_u32(n: u32) -> Self { - SymbolicExt::from_f(EF::from_wrapped_u32(n)) - } - fn from_wrapped_u64(n: u64) -> Self { - SymbolicExt::from_f(EF::from_wrapped_u64(n)) + fn from_prime_subfield(f: Self::PrimeSubfield) -> Self { + let ef = EF::from(F::from_prime_subfield(f)); + SymbolicExt::Const(ef, ef.into()) } } @@ -1332,7 +1260,7 @@ impl From> for SymbolicVar { impl From for RVar { fn from(value: usize) -> Self { - Self::from_field(N::from_canonical_usize(value)) + RVar::Const(N::from_usize(value)) } } diff --git a/extensions/native/compiler/src/ir/types.rs b/extensions/native/compiler/src/ir/types.rs index adaf659ba2..cc31c53229 100644 --- a/extensions/native/compiler/src/ir/types.rs +++ b/extensions/native/compiler/src/ir/types.rs @@ -3,7 +3,7 @@ use core::marker::PhantomData; use std::{cell::RefCell, collections::HashMap, hash::Hash}; use openvm_stark_backend::p3_field::{ - ExtensionField, Field, FieldAlgebra, FieldExtensionAlgebra, PrimeField, + BasedVectorSpace, ExtensionField, Field, PrimeCharacteristicRing, PrimeField, }; use serde::{Deserialize, Serialize}; @@ -137,7 +137,7 @@ impl From> for Usize { impl From for Usize { fn from(c: usize) -> Self { - Usize::Const(Rc::new(RefCell::new(N::from_canonical_usize(c)))) + Usize::Const(Rc::new(RefCell::new(N::from_usize(c)))) } } @@ -200,7 +200,7 @@ impl Ext { pub fn inverse(&self) -> SymbolicExt where - F: Field, + F: PrimeField, EF: ExtensionField, { SymbolicExt::::ONE / *self @@ -848,9 +848,7 @@ impl> Ext { match src { SymbolicExt::Base(v, _) => match &*v { SymbolicFelt::Const(c, _) => { - builder - .operations - .push(DslIr::ImmE(*self, C::EF::from_base(*c))); + builder.operations.push(DslIr::ImmE(*self, (*c).into())); } SymbolicFelt::Val(v, _) => { builder @@ -879,7 +877,7 @@ impl> Ext { } (SymbolicExt::Const(lhs, _), SymbolicExt::Base(rhs, _)) => match rhs.as_ref() { SymbolicFelt::Const(rhs, _) => { - let sum = *lhs + C::EF::from_base(*rhs); + let sum = *lhs + EF::from(*rhs); builder.operations.push(DslIr::ImmE(*self, sum)); } SymbolicFelt::Val(rhs, _) => { @@ -1205,7 +1203,7 @@ impl Variable for Ext { impl MemVariable for Ext { fn size_of() -> usize { - C::EF::D + C::EF::DIMENSION } fn load(&self, ptr: Ptr, index: MemIndex, builder: &mut Builder) { diff --git a/extensions/native/compiler/src/ir/utils.rs b/extensions/native/compiler/src/ir/utils.rs index 2c5fc96bd6..6bed98c339 100644 --- a/extensions/native/compiler/src/ir/utils.rs +++ b/extensions/native/compiler/src/ir/utils.rs @@ -1,7 +1,7 @@ use std::ops::{Add, Mul}; use openvm_native_compiler_derive::iter_zip; -use openvm_stark_backend::p3_field::{FieldAlgebra, FieldExtensionAlgebra, PrimeField}; +use openvm_stark_backend::p3_field::{BasedVectorSpace, PrimeCharacteristicRing, PrimeField}; use super::{ Array, ArrayLike, Builder, CanSelect, Config, DslIr, Ext, Felt, MemIndex, RVar, SymbolicExt, @@ -27,7 +27,7 @@ impl Builder { /// /// Reference: [`openvm_stark_sdk::p3_baby_bear::BabyBear`] pub fn generator(&mut self) -> Felt { - self.eval(C::F::from_canonical_u32(31)) + self.eval(C::F::from_u32(31)) } /// Select a variable based on a condition. @@ -82,7 +82,7 @@ impl Builder { /// Example: if power_bits = [1, 0, 1, 0], then the result should be x^8 * x^2 = x^10. pub fn exp_bits_big_endian(&mut self, x: V, power_bits: &Array>) -> V where - V::Expression: FieldAlgebra, + V::Expression: PrimeCharacteristicRing, V: Copy + Mul + Variable + CanSelect, { let result: V = self.eval(V::Expression::ONE); @@ -129,10 +129,13 @@ impl Builder { /// Creates an ext from a slice of felts. pub fn ext_from_base_slice(&mut self, arr: &[Felt]) -> Ext { - assert!(arr.len() <= >::D); - let mut res = SymbolicExt::from_f(C::EF::ZERO); + assert!(arr.len() <= >::DIMENSION); + let mut res: SymbolicExt = SymbolicExt::ZERO; for i in 0..arr.len() { - res += arr[i] * SymbolicExt::from_f(C::EF::monomial(i)); + let basis_elem = + C::EF::ith_basis_element(i).expect("basis element index out of bounds"); + let basis = SymbolicExt::::Const(basis_elem, basis_elem.into()); + res += arr[i] * basis; } self.eval(res) } @@ -150,11 +153,11 @@ impl Builder { let felts = self.ext2felt_circuit(value); self.vec(felts.to_vec()) } else { - let result = self.array(C::EF::D); + let result = self.array(C::EF::DIMENSION); let index = MemIndex { index: RVar::zero(), offset: 0, - size: C::EF::D, + size: C::EF::DIMENSION, }; if let Array::Dyn(ptr, _) = &result { self.store(*ptr, index, value); diff --git a/extensions/native/recursion/Cargo.toml b/extensions/native/recursion/Cargo.toml index a9a5c04cca..2fdc597d84 100644 --- a/extensions/native/recursion/Cargo.toml +++ b/extensions/native/recursion/Cargo.toml @@ -14,6 +14,7 @@ openvm-native-compiler-derive = { workspace = true } openvm-stark-sdk = { workspace = true } openvm-circuit = { workspace = true } +rand08 = { package = "rand", version = "0.8.5", default-features = false, features = ["std_rng"] } p3-dft = { workspace = true } p3-fri = { workspace = true } p3-symmetric = { workspace = true } @@ -58,5 +59,4 @@ metrics = [ parallel = ["openvm-stark-backend/parallel"] mimalloc = ["openvm-stark-backend/mimalloc"] jemalloc = ["openvm-stark-backend/jemalloc"] -nightly-features = ["openvm-circuit/nightly-features"] cuda = ["openvm-circuit/cuda", "openvm-native-circuit/cuda"] diff --git a/extensions/native/recursion/src/challenger/duplex.rs b/extensions/native/recursion/src/challenger/duplex.rs index 6fc3cabee9..17580a1c77 100644 --- a/extensions/native/recursion/src/challenger/duplex.rs +++ b/extensions/native/recursion/src/challenger/duplex.rs @@ -3,7 +3,7 @@ use openvm_native_compiler::{ prelude::*, }; use openvm_native_compiler_derive::iter_zip; -use openvm_stark_backend::p3_field::{Field, FieldAlgebra}; +use openvm_stark_backend::p3_field::{Field, PrimeCharacteristicRing}; use crate::{ challenger::{ @@ -35,8 +35,7 @@ impl DuplexChallengerVariable { builder.set(&sponge_state, i_vec[0], C::F::ZERO); }); let io_empty_ptr = sponge_state.ptr(); - let io_full_ptr: Ptr<_> = - builder.eval(io_empty_ptr + C::N::from_canonical_usize(DIGEST_SIZE)); + let io_full_ptr: Ptr<_> = builder.eval(io_empty_ptr + C::N::from_usize(DIGEST_SIZE)); let input_ptr = builder.eval(io_empty_ptr); let output_ptr = builder.eval(io_empty_ptr); @@ -120,6 +119,9 @@ impl DuplexChallengerVariable { } pub fn check_witness(&self, builder: &mut Builder, nb_bits: usize, witness: Felt) { + if nb_bits == 0 { + return; + } self.observe(builder, witness); let element_bits = self.sample_bits(builder, RVar::from(nb_bits)); let element_bits_truncated = element_bits.slice(builder, 0, nb_bits); @@ -197,21 +199,22 @@ mod tests { use openvm_stark_backend::{ config::{StarkGenericConfig, Val}, p3_challenger::{CanObserve, CanSample}, - p3_field::FieldAlgebra, + p3_field::PrimeCharacteristicRing, }; use openvm_stark_sdk::{ config::baby_bear_poseidon2::{default_engine, BabyBearPoseidon2Config}, engine::StarkEngine, p3_baby_bear::BabyBear, + utils::create_seeded_rng, }; use rand::Rng; use super::DuplexChallengerVariable; fn test_compiler_challenger_with_num_challenges(num_challenges: usize) { - let mut rng = rand::thread_rng(); + let mut rng = create_seeded_rng(); let observations = (0..num_challenges) - .map(|_| BabyBear::from_canonical_u32(rng.gen_range(0..(1 << 30)))) + .map(|_| BabyBear::from_u32(rng.random_range(0..(1 << 30)))) .collect::>(); type SC = BabyBearPoseidon2Config; diff --git a/extensions/native/recursion/src/challenger/multi_field32.rs b/extensions/native/recursion/src/challenger/multi_field32.rs index 685f98f15f..7208c5782a 100644 --- a/extensions/native/recursion/src/challenger/multi_field32.rs +++ b/extensions/native/recursion/src/challenger/multi_field32.rs @@ -1,5 +1,5 @@ use openvm_native_compiler::ir::{Array, Builder, Config, Ext, Felt, RVar, Var}; -use openvm_stark_backend::p3_field::{Field, FieldAlgebra}; +use openvm_stark_backend::p3_field::{Field, PrimeCharacteristicRing}; use crate::{ challenger::{ @@ -97,9 +97,12 @@ impl MultiField32ChallengerVariable { } pub fn check_witness(&mut self, builder: &mut Builder, bits: usize, witness: Felt) { + if bits == 0 { + return; + } self.observe(builder, witness); let element = self.sample_bits(builder, bits); - builder.assert_var_eq(element, C::N::from_canonical_usize(0)); + builder.assert_var_eq(element, C::N::from_usize(0)); } } diff --git a/extensions/native/recursion/src/commit.rs b/extensions/native/recursion/src/commit.rs index 860fed2af2..2b339580f0 100644 --- a/extensions/native/recursion/src/commit.rs +++ b/extensions/native/recursion/src/commit.rs @@ -17,7 +17,11 @@ pub trait PolynomialSpaceVariable: Sized + FromConstant { point: Ext, ) -> LagrangeSelectors>; - fn zp_at_point(&self, builder: &mut Builder, point: Ext) -> Ext; + fn vanishing_poly_at_point( + &self, + builder: &mut Builder, + point: Ext, + ) -> Ext; fn split_domains( &self, diff --git a/extensions/native/recursion/src/config/outer.rs b/extensions/native/recursion/src/config/outer.rs index ef43762bc2..3fec74f58c 100644 --- a/extensions/native/recursion/src/config/outer.rs +++ b/extensions/native/recursion/src/config/outer.rs @@ -3,16 +3,16 @@ use openvm_stark_backend::{ config::Com, keygen::types::{MultiStarkVerifyingKey, StarkVerifyingKey}, p3_challenger::MultiField32Challenger, - p3_commit::ExtensionMmcs, + p3_commit::{BatchOpening, ExtensionMmcs}, p3_field::extension::BinomialExtensionField, }; use openvm_stark_sdk::{ config::baby_bear_poseidon2_root::BabyBearPoseidon2RootConfig, p3_baby_bear::BabyBear, - p3_bn254_fr::{Bn254Fr, Poseidon2Bn254}, + p3_bn254::{Bn254, Poseidon2Bn254}, }; use p3_dft::Radix2DitParallel; -use p3_fri::{BatchOpening, CommitPhaseProofStep, FriProof, QueryProof, TwoAdicFriPcs}; +use p3_fri::{CommitPhaseProofStep, FriProof, QueryProof, TwoAdicFriPcs}; use p3_merkle_tree::MerkleTreeMmcs; use p3_symmetric::{MultiField32PaddingFreeSponge, TruncatedPermutation}; use serde::{Deserialize, Serialize}; @@ -33,7 +33,7 @@ const DIGEST_WIDTH: usize = 1; pub struct OuterConfig; impl Config for OuterConfig { - type N = Bn254Fr; + type N = Bn254; type F = BabyBear; type EF = BinomialExtensionField; } @@ -43,13 +43,13 @@ pub type OuterVal = BabyBear; pub type OuterChallenge = BinomialExtensionField; pub type OuterPerm = Poseidon2Bn254; pub type OuterHash = - MultiField32PaddingFreeSponge; -pub type OuterDigest = [Bn254Fr; 1]; + MultiField32PaddingFreeSponge; +pub type OuterDigest = [Bn254; 1]; pub type OuterCompress = TruncatedPermutation; -pub type OuterValMmcs = MerkleTreeMmcs; +pub type OuterValMmcs = MerkleTreeMmcs; pub type OuterChallengeMmcs = ExtensionMmcs; pub type OuterDft = Radix2DitParallel; -pub type OuterChallenger = MultiField32Challenger; +pub type OuterChallenger = MultiField32Challenger; pub type OuterPcs = TwoAdicFriPcs; pub type OuterInputProof = Vec; pub type OuterQueryProof = QueryProof; @@ -69,7 +69,7 @@ pub(crate) fn new_from_outer_vkv2( } = vk; StarkVerificationAdvice { preprocessed_data: preprocessed_data.map(|data| { - let commit: [Bn254Fr; DIGEST_WIDTH] = data.commit.into(); + let commit: [Bn254; DIGEST_WIDTH] = data.commit.into(); VerifierSinglePreprocessedDataInProgram { commit: DigestVal::N(commit.to_vec()), } @@ -88,7 +88,7 @@ pub fn new_from_outer_multi_vk( vk: &MultiStarkVerifyingKey, ) -> MultiStarkVerificationAdvice { let num_challenges_to_sample = vk.num_challenges_per_phase(); - let pre_hash: [Bn254Fr; DIGEST_WIDTH] = vk.pre_hash.into(); + let pre_hash: [Bn254; DIGEST_WIDTH] = vk.pre_hash.into(); MultiStarkVerificationAdvice { per_air: vk .inner diff --git a/extensions/native/recursion/src/fri/domain.rs b/extensions/native/recursion/src/fri/domain.rs index cdc8fc242c..8de709b0ca 100644 --- a/extensions/native/recursion/src/fri/domain.rs +++ b/extensions/native/recursion/src/fri/domain.rs @@ -1,7 +1,7 @@ use openvm_native_compiler::prelude::*; use openvm_stark_backend::{ - p3_commit::{LagrangeSelectors, TwoAdicMultiplicativeCoset}, - p3_field::{Field, FieldAlgebra, TwoAdicField}, + p3_commit::LagrangeSelectors, + p3_field::{coset::TwoAdicMultiplicativeCoset, Field, PrimeCharacteristicRing, TwoAdicField}, }; use super::types::FriConfigVariable; @@ -32,11 +32,11 @@ where type Constant = TwoAdicMultiplicativeCoset; fn constant(value: Self::Constant, builder: &mut Builder) -> Self { - let g_val = C::F::two_adic_generator(value.log_n); + let g_val = C::F::two_adic_generator(value.log_size()); TwoAdicMultiplicativeCosetVariable:: { // builder.eval is necessary to assign a variable in the dynamic mode. - log_n: builder.eval(RVar::from(value.log_n)), - shift: builder.eval(value.shift), + log_n: builder.eval(RVar::from(value.log_size())), + shift: builder.eval(value.shift()), g: builder.eval(g_val), } } @@ -70,11 +70,11 @@ where is_first_row: builder.eval(z_h / (unshifted_point - C::EF::ONE)), is_last_row: builder.eval(z_h / (unshifted_point - self.gen().inverse())), is_transition: builder.eval(unshifted_point - self.gen().inverse()), - inv_zeroifier: builder.eval(z_h.inverse()), + inv_vanishing: builder.eval(z_h.inverse()), } } - fn zp_at_point( + fn vanishing_poly_at_point( &self, builder: &mut Builder, point: Ext<::F, ::EF>, @@ -119,8 +119,7 @@ where fn split_domains_const(&self, builder: &mut Builder, log_num_chunks: usize) -> Vec { let num_chunks = 1 << log_num_chunks; - let log_n: Usize<_> = - builder.eval(self.log_n.clone() - C::N::from_canonical_usize(log_num_chunks)); + let log_n: Usize<_> = builder.eval(self.log_n.clone() - C::N::from_usize(log_num_chunks)); let g_dom = self.gen(); let g = builder.exp_power_of_2_v::>(g_dom, log_num_chunks); @@ -163,11 +162,14 @@ pub(crate) mod tests { p3_commit::{Pcs, PolynomialSpace}, p3_field::PrimeField, }; - use openvm_stark_sdk::config::{ - baby_bear_poseidon2::{config_from_perm, default_perm, BabyBearPoseidon2Config}, - fri_params::SecurityParameters, + use openvm_stark_sdk::{ + config::{ + baby_bear_poseidon2::{config_from_perm, default_perm, BabyBearPoseidon2Config}, + fri_params::SecurityParameters, + }, + utils::create_seeded_rng, }; - use rand::{thread_rng, Rng}; + use rand::Rng; use super::*; use crate::utils::const_fri_config; @@ -179,11 +181,8 @@ pub(crate) mod tests { zeta_val: C::EF, ) { // Assert the domain parameters are the same. - builder.assert_var_eq( - domain.log_n.clone(), - F::from_canonical_usize(domain_val.log_n), - ); - builder.assert_felt_eq(domain.shift, domain_val.shift); + builder.assert_var_eq(domain.log_n.clone(), F::from_usize(domain_val.log_size())); + builder.assert_felt_eq(domain.shift, domain_val.shift()); // Get a random point. let zeta: Ext<_, _> = builder.eval(zeta_val.cons()); @@ -195,8 +194,8 @@ pub(crate) mod tests { builder.assert_ext_eq(sels.is_last_row, sels_expected.is_last_row.cons()); builder.assert_ext_eq(sels.is_transition, sels_expected.is_transition.cons()); - let zp_val = domain_val.zp_at_point(zeta_val); - let zp = domain.zp_at_point(builder, zeta); + let zp_val = domain_val.vanishing_poly_at_point(zeta_val); + let zp = domain.vanishing_poly_at_point(builder, zeta); builder.assert_ext_eq(zp, zp_val.cons()); } @@ -207,7 +206,7 @@ pub(crate) mod tests { type Challenger = ::Challenger; type ScPcs = ::Pcs; - let mut rng = thread_rng(); + let mut rng = create_seeded_rng(); let security_params = SecurityParameters::standard_fast(); let config = config_from_perm(&default_perm(), security_params.clone()); let pcs = config.pcs(); @@ -230,7 +229,7 @@ pub(crate) mod tests { let domain = builder.constant(domain_val); // builder.assert_felt_eq(domain.shift, domain_val.shift); - let zeta_val = rng.gen::(); + let zeta_val = rng.random::(); domain_assertions(&mut builder, &domain, &domain_val, zeta_val); // Try a shifted domain. diff --git a/extensions/native/recursion/src/fri/hints.rs b/extensions/native/recursion/src/fri/hints.rs index 2cace2f77d..07e561d3ed 100644 --- a/extensions/native/recursion/src/fri/hints.rs +++ b/extensions/native/recursion/src/fri/hints.rs @@ -2,7 +2,7 @@ use openvm_native_compiler::{ asm::AsmConfig, ir::{Builder, Config, Usize, DIGEST_SIZE}, }; -use openvm_stark_backend::p3_field::FieldAlgebra; +use openvm_stark_backend::p3_field::PrimeCharacteristicRing; use super::types::BatchOpeningVariable; use crate::{ @@ -89,14 +89,16 @@ impl Hintable for InnerFriProof { fn read(builder: &mut Builder) -> Self::HintVariable { let commit_phase_commits = Vec::::read(builder); + let commit_pow_witnesses = Vec::::read(builder); let query_proofs = Vec::::read(builder); let final_poly = builder.hint_exts(); - let pow_witness = builder.hint_felt(); + let query_pow_witness = builder.hint_felt(); Self::HintVariable { commit_phase_commits, + commit_pow_witnesses, query_proofs, final_poly, - pow_witness, + query_pow_witness, } } @@ -110,9 +112,10 @@ impl Hintable for InnerFriProof { .map(|x| (*x).into()) .collect(), )); + stream.extend(Vec::::write(&self.commit_pow_witnesses)); stream.extend(Vec::::write(&self.query_proofs)); stream.extend(self.final_poly.write()); - stream.push(vec![self.pow_witness]); + stream.push(vec![self.query_pow_witness]); stream } @@ -138,7 +141,7 @@ impl Hintable for InnerBatchOpening { let mut stream = Vec::new(); let flat_opened_values: Vec<_> = self.opened_values.iter().flatten().copied().collect(); stream.extend(vec![ - vec![InnerVal::from_canonical_usize(flat_opened_values.len())], + vec![InnerVal::from_usize(flat_opened_values.len())], flat_opened_values, ]); stream.extend(write_opening_proof(&self.opening_proof)); @@ -157,7 +160,7 @@ fn read_hint_slice(builder: &mut Builder) -> HintSlice { fn write_opening_proof(opening_proof: &[InnerDigest]) -> Vec> { vec![ - vec![InnerVal::from_canonical_usize(opening_proof.len())], + vec![InnerVal::from_usize(opening_proof.len())], opening_proof.iter().flatten().copied().collect(), ] } diff --git a/extensions/native/recursion/src/fri/mod.rs b/extensions/native/recursion/src/fri/mod.rs index 2aa13e85fe..3540b15bb1 100644 --- a/extensions/native/recursion/src/fri/mod.rs +++ b/extensions/native/recursion/src/fri/mod.rs @@ -7,7 +7,7 @@ use openvm_native_compiler::{ prelude::MemVariable, }; use openvm_native_compiler_derive::iter_zip; -use openvm_stark_backend::p3_field::{FieldAlgebra, TwoAdicField}; +use openvm_stark_backend::p3_field::{PrimeCharacteristicRing, TwoAdicField}; pub use two_adic_pcs::*; use self::types::{DimensionsVariable, FriConfigVariable, FriQueryProofVariable}; diff --git a/extensions/native/recursion/src/fri/two_adic_pcs.rs b/extensions/native/recursion/src/fri/two_adic_pcs.rs index 3e66e05e61..8b3e7672c8 100644 --- a/extensions/native/recursion/src/fri/two_adic_pcs.rs +++ b/extensions/native/recursion/src/fri/two_adic_pcs.rs @@ -1,8 +1,7 @@ use openvm_native_compiler::prelude::*; use openvm_native_compiler_derive::iter_zip; -use openvm_stark_backend::{ - p3_commit::TwoAdicMultiplicativeCoset, - p3_field::{FieldAlgebra, FieldExtensionAlgebra, TwoAdicField}, +use openvm_stark_backend::p3_field::{ + coset::TwoAdicMultiplicativeCoset, BasedVectorSpace, PrimeCharacteristicRing, TwoAdicField, }; use p3_symmetric::Hash; @@ -73,7 +72,7 @@ pub fn verify_two_adic_pcs( challenger.observe_slice(builder, arr); } else { let ptr = ptr_vec[0]; - for i in 0..C::EF::D { + for i in 0..C::EF::DIMENSION { let f: Felt<_> = builder.uninit(); builder.load( f, @@ -102,6 +101,7 @@ pub fn verify_two_adic_pcs( // **ATTENTION**: always check shape of user inputs. builder.assert_usize_eq(proof.query_proofs.len(), RVar::from(config.num_queries)); builder.assert_usize_eq(proof.commit_phase_commits.len(), log_max_height); + builder.assert_usize_eq(proof.commit_pow_witnesses.len(), log_max_height); let betas: Array> = builder.array(log_max_height); let betas_squared: Array> = builder.array(log_max_height); // `i_plus_one_arr[i] = i + 1`. This is needed to add "enumerate" to `iter_zip!` @@ -111,15 +111,19 @@ pub fn verify_two_adic_pcs( iter_zip!( builder, proof.commit_phase_commits, + proof.commit_pow_witnesses, betas, betas_squared, i_plus_one_arr ) .for_each(|ptr_vec, builder| { - let [comm_ptr, beta_ptr, beta_sq_ptr, i_plus_one_ptr] = ptr_vec.try_into().unwrap(); + let [comm_ptr, commit_pow_ptr, beta_ptr, beta_sq_ptr, i_plus_one_ptr] = + ptr_vec.try_into().unwrap(); let comm = builder.iter_ptr_get(&proof.commit_phase_commits, comm_ptr); + let commit_pow = builder.iter_ptr_get(&proof.commit_pow_witnesses, commit_pow_ptr); challenger.observe_digest(builder, comm); + challenger.check_witness(builder, config.commit_proof_of_work_bits, commit_pow); let sample = challenger.sample_ext(builder); builder.iter_ptr_set(&betas, beta_ptr, sample); builder.iter_ptr_set(&betas_squared, beta_sq_ptr, sample * sample); @@ -135,7 +139,11 @@ pub fn verify_two_adic_pcs( challenger.observe_slice(builder, final_poly_elem_felts); }); - challenger.check_witness(builder, config.proof_of_work_bits, proof.pow_witness); + challenger.check_witness( + builder, + config.query_proof_of_work_bits, + proof.query_pow_witness, + ); let log_max_lde_height = builder.eval_expr(log_max_height + RVar::from(log_blowup)); // tag_exp is a shared buffer. @@ -629,14 +637,15 @@ pub mod tests { config::{StarkGenericConfig, Val}, engine::StarkEngine, p3_challenger::{CanObserve, FieldChallenger}, - p3_commit::{Pcs, TwoAdicMultiplicativeCoset}, + p3_commit::Pcs, + p3_field::coset::TwoAdicMultiplicativeCoset, p3_matrix::dense::RowMajorMatrix, }; use openvm_stark_sdk::{ config::baby_bear_poseidon2::{default_engine, BabyBearPoseidon2Config}, p3_baby_bear::BabyBear, }; - use rand::rngs::OsRng; + use rand::{rngs::StdRng, SeedableRng}; use crate::{ challenger::{duplex::DuplexChallengerVariable, CanObserveDigest, FeltChallenger}, @@ -660,7 +669,7 @@ pub mod tests { type Challenger = ::Challenger; type ScPcs = ::Pcs; - let mut rng = &mut OsRng; + let mut rng = StdRng::seed_from_u64(0); let log_degrees = &[nb_log2_rows]; let engine = default_engine(); let pcs = engine.config().pcs(); @@ -675,12 +684,12 @@ pub mod tests { RowMajorMatrix::::rand(&mut rng, 1 << d, nb_cols), ) }) - .sorted_by_key(|(dom, _)| Reverse(dom.log_n)) + .sorted_by_key(|(dom, _)| Reverse(dom.log_size())) .collect::>(); let (commit, data) = >::commit(pcs, domains_and_polys.clone()); let mut challenger = Challenger::new(perm.clone()); challenger.observe(commit); - let zeta = challenger.sample_ext_element::(); + let zeta = challenger.sample_algebra_element::(); let points = domains_and_polys .iter() .map(|_| vec![zeta]) @@ -690,7 +699,7 @@ pub mod tests { // Verify proof. let mut challenger = Challenger::new(perm.clone()); challenger.observe(commit); - challenger.sample_ext_element::(); + let _ = challenger.sample_algebra_element::(); let os: Vec<(TwoAdicMultiplicativeCoset, Vec<_>)> = domains_and_polys .iter() .zip(&opening[0]) diff --git a/extensions/native/recursion/src/fri/types.rs b/extensions/native/recursion/src/fri/types.rs index c54b4796e8..5a02783ecf 100644 --- a/extensions/native/recursion/src/fri/types.rs +++ b/extensions/native/recursion/src/fri/types.rs @@ -8,7 +8,8 @@ pub struct FriConfigVariable { pub blowup: usize, pub log_final_poly_len: usize, pub num_queries: usize, - pub proof_of_work_bits: usize, + pub commit_proof_of_work_bits: usize, + pub query_proof_of_work_bits: usize, pub generators: Array>, pub subgroups: Array>, } @@ -36,7 +37,8 @@ pub struct FriProofVariable { pub commit_phase_commits: Array>, pub query_proofs: Array>, pub final_poly: Array>, - pub pow_witness: Felt, + pub commit_pow_witnesses: Array>, + pub query_pow_witness: Felt, } #[derive(DslVariable, Clone)] diff --git a/extensions/native/recursion/src/fri/witness.rs b/extensions/native/recursion/src/fri/witness.rs index 302f9e93bd..8786a3b485 100644 --- a/extensions/native/recursion/src/fri/witness.rs +++ b/extensions/native/recursion/src/fri/witness.rs @@ -61,22 +61,25 @@ impl Witnessable for OuterFriProof { fn read(&self, builder: &mut Builder) -> Self::WitnessVariable { let commit_phase_commits = self.commit_phase_commits.read(builder); + let commit_pow_witnesses = self.commit_pow_witnesses.read(builder); let query_proofs = self.query_proofs.read(builder); let final_poly = self.final_poly.read(builder); - let pow_witness = self.pow_witness.read(builder); + let query_pow_witness = self.query_pow_witness.read(builder); Self::WitnessVariable { commit_phase_commits, + commit_pow_witnesses, query_proofs, final_poly, - pow_witness, + query_pow_witness, } } fn write(&self, witness: &mut Witness) { self.commit_phase_commits.write(witness); + self.commit_pow_witnesses.write(witness); as Witnessable>::write(&self.query_proofs, witness); self.final_poly.write(witness); - self.pow_witness.write(witness); + self.query_pow_witness.write(witness); } } diff --git a/extensions/native/recursion/src/halo2/mod.rs b/extensions/native/recursion/src/halo2/mod.rs index aa70fc8577..7747b9cf95 100644 --- a/extensions/native/recursion/src/halo2/mod.rs +++ b/extensions/native/recursion/src/halo2/mod.rs @@ -14,7 +14,7 @@ use openvm_native_compiler::{ ir::{Config, DslIr, TracedVec, Witness}, }; use openvm_stark_backend::p3_field::extension::BinomialExtensionField; -use openvm_stark_sdk::{p3_baby_bear::BabyBear, p3_bn254_fr::Bn254Fr}; +use openvm_stark_sdk::{p3_baby_bear::BabyBear, p3_bn254::Bn254}; use serde::{de, Deserialize, Deserializer, Serialize, Serializer}; use snark_verifier_sdk::{ halo2::{gen_dummy_snark_from_vk, gen_snark_shplonk}, @@ -102,7 +102,7 @@ impl Halo2Prover { } pub fn populate< - C: Config> + Debug, + C: Config> + Debug, >( builder: BaseCircuitBuilder, dsl_operations: DslOperations, @@ -131,7 +131,7 @@ impl Halo2Prover { /// /// Returns the public instances. pub fn mock< - C: Config> + Debug, + C: Config> + Debug, >( k: usize, dsl_operations: DslOperations, @@ -153,7 +153,7 @@ impl Halo2Prover { /// Populates builder, tunes circuit, keygen pub fn keygen< - C: Config> + Debug, + C: Config> + Debug, >( params: &Halo2Params, dsl_operations: DslOperations, @@ -189,7 +189,7 @@ impl Halo2Prover { } pub fn prove< - C: Config> + Debug, + C: Config> + Debug, >( params: &Halo2Params, config_params: BaseCircuitParams, diff --git a/extensions/native/recursion/src/halo2/tests/mod.rs b/extensions/native/recursion/src/halo2/tests/mod.rs index 81b7e062b3..5e463bd310 100644 --- a/extensions/native/recursion/src/halo2/tests/mod.rs +++ b/extensions/native/recursion/src/halo2/tests/mod.rs @@ -5,9 +5,9 @@ use openvm_native_compiler::{ ir::{Builder, Witness}, }; use openvm_stark_backend::p3_field::{ - reduce_32 as reduce_32_gt, split_32 as split_32_gt, FieldAlgebra, + reduce_32 as reduce_32_gt, split_32 as split_32_gt, PrimeCharacteristicRing, }; -use openvm_stark_sdk::{p3_baby_bear::BabyBear, p3_bn254_fr::Bn254Fr}; +use openvm_stark_sdk::{p3_baby_bear::BabyBear, p3_bn254::Bn254}; use snark_verifier_sdk::{ halo2::{gen_dummy_snark_from_vk, gen_snark_shplonk}, snark_verifier::{ @@ -78,7 +78,7 @@ fn test_publish() { let mut builder = Builder::::default(); builder.flags.static_only = true; let value_u32 = 1345237507; - let value_fr = Bn254Fr::from_canonical_u32(value_u32); + let value_fr = Bn254::from_u32(value_u32); let value = builder.eval(value_fr); builder.static_commit_public_value(0, value); @@ -95,9 +95,9 @@ fn test_publish() { #[test] fn test_reduce_32() { - let value_1 = BabyBear::from_canonical_u32(1345237507); - let value_2 = BabyBear::from_canonical_u32(1000001); - let gt: Bn254Fr = reduce_32_gt(&[value_1, value_2]); + let value_1 = BabyBear::from_u32(1345237507); + let value_2 = BabyBear::from_u32(1000001); + let gt: Bn254 = reduce_32_gt(&[value_1, value_2]); let mut builder = Builder::::default(); builder.flags.static_only = true; @@ -140,9 +140,9 @@ fn test_split_32() { Witness::default(), ); }; - let modulus = Bn254Fr::ZERO - Bn254Fr::ONE; - f(Bn254Fr::from_canonical_u32(1345237507)); - f(Bn254Fr::ZERO); + let modulus = Bn254::ZERO - Bn254::ONE; + f(Bn254::from_u32(1345237507)); + f(Bn254::ZERO); f(modulus); } diff --git a/extensions/native/recursion/src/halo2/tests/multi_field32.rs b/extensions/native/recursion/src/halo2/tests/multi_field32.rs index 95143e806d..d472b9a34c 100644 --- a/extensions/native/recursion/src/halo2/tests/multi_field32.rs +++ b/extensions/native/recursion/src/halo2/tests/multi_field32.rs @@ -1,10 +1,10 @@ -use openvm_native_compiler::ir::{Builder, SymbolicExt, Witness}; +use openvm_native_compiler::ir::{Builder, ExtConst, Witness}; use openvm_stark_backend::{ p3_challenger::{CanObserve, CanSample, FieldChallenger}, - p3_field::{extension::BinomialExtensionField, FieldAlgebra}, + p3_field::{extension::BinomialExtensionField, PrimeCharacteristicRing}, }; use openvm_stark_sdk::{ - config::baby_bear_poseidon2_root::root_perm, p3_baby_bear::BabyBear, p3_bn254_fr::Bn254Fr, + config::baby_bear_poseidon2_root::root_perm, p3_baby_bear::BabyBear, p3_bn254::Bn254, }; use p3_symmetric::Hash; @@ -19,9 +19,9 @@ use crate::{ fn test_challenger() { let perm = root_perm(); let mut challenger = OuterChallenger::new(perm).unwrap(); - let a = BabyBear::from_canonical_usize(1); - let b = BabyBear::from_canonical_usize(2); - let c = BabyBear::from_canonical_usize(3); + let a = BabyBear::from_usize(1); + let b = BabyBear::from_usize(2); + let c = BabyBear::from_usize(3); challenger.observe(a); challenger.observe(b); challenger.observe(c); @@ -65,19 +65,19 @@ fn test_challenger() { fn test_challenger_sample_ext() { let perm = root_perm(); let mut challenger = OuterChallenger::new(perm).unwrap(); - let a = BabyBear::from_canonical_usize(1); - let b = BabyBear::from_canonical_usize(2); - let c = BabyBear::from_canonical_usize(3); - let hash = Hash::from([Bn254Fr::TWO; OUTER_DIGEST_SIZE]); + let a = BabyBear::from_usize(1); + let b = BabyBear::from_usize(2); + let c = BabyBear::from_usize(3); + let hash = Hash::from([Bn254::TWO; OUTER_DIGEST_SIZE]); challenger.observe(hash); challenger.observe(a); challenger.observe(b); challenger.observe(c); - let gt1: BinomialExtensionField = challenger.sample_ext_element(); + let gt1: BinomialExtensionField = challenger.sample_algebra_element(); challenger.observe(a); challenger.observe(b); challenger.observe(c); - let gt2: BinomialExtensionField = challenger.sample_ext_element(); + let gt2: BinomialExtensionField = challenger.sample_algebra_element(); let mut builder = Builder::::default(); builder.flags.static_only = true; @@ -85,7 +85,7 @@ fn test_challenger_sample_ext() { let a = builder.eval(a); let b = builder.eval(b); let c = builder.eval(c); - let hash = builder.eval(Bn254Fr::TWO); + let hash = builder.eval(Bn254::TWO); challenger.observe_commitment(&mut builder, [hash]); challenger.observe(&mut builder, a); challenger.observe(&mut builder, b); @@ -96,8 +96,8 @@ fn test_challenger_sample_ext() { challenger.observe(&mut builder, c); let result2 = challenger.sample_ext(&mut builder); - builder.assert_ext_eq(SymbolicExt::from_f(gt1), result1); - builder.assert_ext_eq(SymbolicExt::from_f(gt2), result2); + builder.assert_ext_eq(gt1.cons(), result1); + builder.assert_ext_eq(gt2.cons(), result2); Halo2Prover::mock::( 10, diff --git a/extensions/native/recursion/src/halo2/tests/outer_poseidon2.rs b/extensions/native/recursion/src/halo2/tests/outer_poseidon2.rs index d6fb562f00..7803872274 100644 --- a/extensions/native/recursion/src/halo2/tests/outer_poseidon2.rs +++ b/extensions/native/recursion/src/halo2/tests/outer_poseidon2.rs @@ -1,7 +1,7 @@ use openvm_native_compiler::ir::{Builder, Felt, Var, Witness}; -use openvm_stark_backend::p3_field::FieldAlgebra; +use openvm_stark_backend::p3_field::PrimeCharacteristicRing; use openvm_stark_sdk::{ - config::baby_bear_poseidon2_root::root_perm, p3_baby_bear::BabyBear, p3_bn254_fr::Bn254Fr, + config::baby_bear_poseidon2_root::root_perm, p3_baby_bear::BabyBear, p3_bn254::Bn254, }; use p3_symmetric::{CryptographicHasher, Permutation, PseudoCompressionFunction}; @@ -15,11 +15,7 @@ use crate::{ #[test] fn test_p2_permute_mut() { let poseidon2 = root_perm(); - let input: [Bn254Fr; 3] = [ - Bn254Fr::from_canonical_u32(0), - Bn254Fr::from_canonical_u32(1), - Bn254Fr::from_canonical_u32(2), - ]; + let input: [Bn254; 3] = [Bn254::from_u32(0), Bn254::from_u32(1), Bn254::from_u32(2)]; let mut output = input; poseidon2.permute_mut(&mut output); @@ -49,13 +45,13 @@ fn test_p2_hash() { let hasher = OuterHash::new(perm.clone()).unwrap(); let input: [BabyBear; 7] = [ - BabyBear::from_canonical_u32(0), - BabyBear::from_canonical_u32(1), - BabyBear::from_canonical_u32(2), - BabyBear::from_canonical_u32(2), - BabyBear::from_canonical_u32(2), - BabyBear::from_canonical_u32(2), - BabyBear::from_canonical_u32(2), + BabyBear::from_u32(0), + BabyBear::from_u32(1), + BabyBear::from_u32(2), + BabyBear::from_u32(2), + BabyBear::from_u32(2), + BabyBear::from_u32(2), + BabyBear::from_u32(2), ]; let output = hasher.hash_iter(input); @@ -85,8 +81,8 @@ fn test_p2_compress() { let perm = root_perm(); let compressor = OuterCompress::new(perm.clone()); - let a: [Bn254Fr; 1] = [Bn254Fr::TWO]; - let b: [Bn254Fr; 1] = [Bn254Fr::TWO]; + let a: [Bn254; 1] = [Bn254::TWO]; + let b: [Bn254; 1] = [Bn254::TWO]; let gt = compressor.compress([a, b]); let mut builder = Builder::::default(); diff --git a/extensions/native/recursion/src/halo2/utils.rs b/extensions/native/recursion/src/halo2/utils.rs index f960994f7a..95408b32fa 100644 --- a/extensions/native/recursion/src/halo2/utils.rs +++ b/extensions/native/recursion/src/halo2/utils.rs @@ -8,7 +8,7 @@ use std::{ use lazy_static::lazy_static; use once_cell::sync::Lazy; -use rand::{prelude::StdRng, SeedableRng}; +use rand08::{prelude::StdRng, SeedableRng}; use snark_verifier_sdk::{ halo2::{PoseidonTranscript, POSEIDON_SPEC}, snark_verifier::{ diff --git a/extensions/native/recursion/src/hints.rs b/extensions/native/recursion/src/hints.rs index b65f6ba647..68c42b928d 100644 --- a/extensions/native/recursion/src/hints.rs +++ b/extensions/native/recursion/src/hints.rs @@ -9,8 +9,10 @@ use openvm_native_compiler_derive::iter_zip; use openvm_stark_backend::{ config::{Com, PcsProof}, keygen::types::TraceWidth, - p3_commit::ExtensionMmcs, - p3_field::{extension::BinomialExtensionField, Field, FieldAlgebra, FieldExtensionAlgebra}, + p3_commit::{BatchOpening, ExtensionMmcs}, + p3_field::{ + extension::BinomialExtensionField, BasedVectorSpace, Field, PrimeCharacteristicRing, + }, p3_util::log2_strict_usize, proof::{AdjacentOpenedValues, AirProofData, Commitments, OpenedValues, OpeningProof, Proof}, }; @@ -18,7 +20,7 @@ use openvm_stark_sdk::{ config::baby_bear_poseidon2::BabyBearPoseidon2Config, p3_baby_bear::{BabyBear, Poseidon2BabyBear}, }; -use p3_fri::{BatchOpening, CommitPhaseProofStep, FriProof, QueryProof}; +use p3_fri::{CommitPhaseProofStep, FriProof, QueryProof}; use p3_merkle_tree::MerkleTreeMmcs; use p3_symmetric::{PaddingFreeSponge, TruncatedPermutation}; @@ -71,7 +73,7 @@ impl Hintable for usize { } fn write(&self) -> Vec> { - vec![vec![FieldAlgebra::from_canonical_usize(*self)]] + vec![vec![PrimeCharacteristicRing::from_usize(*self)]] } } @@ -97,7 +99,7 @@ impl Hintable for InnerChallenge { } fn write(&self) -> Vec::N>> { - self.as_base_slice() + self.as_basis_coefficients_slice() .iter() .copied() .map(|x| vec![x]) @@ -141,7 +143,7 @@ impl> Hintable for Vec { fn write(&self) -> Vec::N>> { let mut stream = Vec::new(); - let len = C::N::from_canonical_usize(self.len()); + let len = C::N::from_usize(self.len()); stream.push(vec![len]); self.iter().for_each(|i| { @@ -161,10 +163,7 @@ impl Hintable for Vec { } fn write(&self) -> Vec> { - vec![self - .iter() - .map(|x| InnerVal::from_canonical_usize(*x)) - .collect()] + vec![self.iter().map(|x| InnerVal::from_usize(*x)).collect()] } } @@ -178,7 +177,7 @@ impl Hintable for Vec { fn write(&self) -> Vec> { vec![self .iter() - .map(|x| FieldAlgebra::from_canonical_u8(*x)) + .map(|x| PrimeCharacteristicRing::from_u8(*x)) .collect()] } } @@ -204,9 +203,9 @@ impl Hintable for Vec { fn write(&self) -> Vec::N>> { vec![ - vec![InnerVal::from_canonical_usize(self.len())], + vec![InnerVal::from_usize(self.len())], self.iter() - .flat_map(|x| (*x).as_base_slice().to_vec()) + .flat_map(|x| (*x).as_basis_coefficients_slice().to_vec()) .collect(), ] } @@ -228,7 +227,7 @@ impl Hintable for Vec> { fn write(&self) -> Vec::N>> { let mut stream = Vec::new(); - let len = InnerVal::from_canonical_usize(self.len()); + let len = InnerVal::from_usize(self.len()); stream.push(vec![len]); self.iter().for_each(|arr| { @@ -451,16 +450,16 @@ mod test { asm::AsmBuilder, ir::{Ext, Felt, Var}, }; - use openvm_stark_backend::p3_field::FieldAlgebra; + use openvm_stark_backend::p3_field::PrimeCharacteristicRing; use crate::hints::{Hintable, InnerChallenge, InnerVal}; #[test] fn test_var_array() { let x = vec![ - InnerVal::from_canonical_usize(1), - InnerVal::from_canonical_usize(2), - InnerVal::from_canonical_usize(3), + InnerVal::from_usize(1), + InnerVal::from_usize(2), + InnerVal::from_usize(3), ]; let stream = Vec::::write(&x); assert_eq!(stream, vec![x.clone()]); @@ -468,7 +467,7 @@ mod test { let mut builder = AsmBuilder::::default(); let arr = Vec::::read(&mut builder); - let expected: Var<_> = builder.constant(InnerVal::from_canonical_usize(3)); + let expected: Var<_> = builder.constant(InnerVal::from_usize(3)); builder.assert_var_eq(arr.len(), expected); for (i, &val) in x.iter().enumerate() { @@ -486,28 +485,28 @@ mod test { #[test] fn test_ext_array() { let x = vec![ - InnerChallenge::from_canonical_usize(1), - InnerChallenge::from_canonical_usize(2), - InnerChallenge::from_canonical_usize(3), + InnerChallenge::from_usize(1), + InnerChallenge::from_usize(2), + InnerChallenge::from_usize(3), ]; let stream = Vec::::write(&x); assert_eq!( stream, vec![ - vec![InnerVal::from_canonical_usize(x.len())], + vec![InnerVal::from_usize(x.len())], vec![ - InnerVal::from_canonical_usize(1), - InnerVal::from_canonical_usize(0), - InnerVal::from_canonical_usize(0), - InnerVal::from_canonical_usize(0), - InnerVal::from_canonical_usize(2), - InnerVal::from_canonical_usize(0), - InnerVal::from_canonical_usize(0), - InnerVal::from_canonical_usize(0), - InnerVal::from_canonical_usize(3), - InnerVal::from_canonical_usize(0), - InnerVal::from_canonical_usize(0), - InnerVal::from_canonical_usize(0), + InnerVal::from_usize(1), + InnerVal::from_usize(0), + InnerVal::from_usize(0), + InnerVal::from_usize(0), + InnerVal::from_usize(2), + InnerVal::from_usize(0), + InnerVal::from_usize(0), + InnerVal::from_usize(0), + InnerVal::from_usize(3), + InnerVal::from_usize(0), + InnerVal::from_usize(0), + InnerVal::from_usize(0), ], ] ); @@ -515,7 +514,7 @@ mod test { let mut builder = AsmBuilder::::default(); let arr = Vec::::read(&mut builder); - let expected: Var<_> = builder.constant(InnerVal::from_canonical_usize(3)); + let expected: Var<_> = builder.constant(InnerVal::from_usize(3)); builder.assert_var_eq(arr.len(), expected); for (i, &val) in x.iter().enumerate() { diff --git a/extensions/native/recursion/src/outer_poseidon2.rs b/extensions/native/recursion/src/outer_poseidon2.rs index 5d12e0a9bc..e80842c7c7 100644 --- a/extensions/native/recursion/src/outer_poseidon2.rs +++ b/extensions/native/recursion/src/outer_poseidon2.rs @@ -1,6 +1,6 @@ use itertools::Itertools; use openvm_native_compiler::ir::{Builder, Config, DslIr, Felt, Var}; -use openvm_stark_backend::p3_field::{Field, FieldAlgebra}; +use openvm_stark_backend::p3_field::{Field, PrimeCharacteristicRing}; use crate::{utils::reduce_32, vars::OuterDigestVariable, OUTER_DIGEST_SIZE}; @@ -25,7 +25,7 @@ impl Poseidon2CircuitBuilder for Builder { fn p2_hash(&mut self, input: &[Felt]) -> OuterDigestVariable { self.cycle_tracker_start(POSEIDON_CELL_TRACKER_NAME); - assert_eq!(C::N::bits(), openvm_stark_sdk::p3_bn254_fr::Bn254Fr::bits()); + assert_eq!(C::N::bits(), openvm_stark_sdk::p3_bn254::Bn254::bits()); assert_eq!( C::F::bits(), openvm_stark_sdk::p3_baby_bear::BabyBear::bits() diff --git a/extensions/native/recursion/src/stark/mod.rs b/extensions/native/recursion/src/stark/mod.rs index f3f4a8106f..354a25e374 100644 --- a/extensions/native/recursion/src/stark/mod.rs +++ b/extensions/native/recursion/src/stark/mod.rs @@ -11,7 +11,7 @@ use openvm_native_compiler_derive::iter_zip; use openvm_stark_backend::{ air_builders::symbolic::SymbolicExpressionDag, p3_commit::LagrangeSelectors, - p3_field::{FieldAlgebra, FieldExtensionAlgebra, TwoAdicField}, + p3_field::{BasedVectorSpace, PrimeCharacteristicRing, TwoAdicField}, p3_matrix::{dense::RowMajorMatrixView, stack::VerticalPair}, proof::{AdjacentOpenedValues, Proof}, verifier::GenericVerifierConstraintFolder, @@ -600,7 +600,7 @@ where let values = builder.array::>(2); builder.assert_usize_eq( after_challenge.local.len(), - after_challenge_width * RVar::from(C::EF::D), + after_challenge_width * RVar::from(C::EF::DIMENSION), ); builder.assert_usize_eq( after_challenge.next.len(), @@ -963,7 +963,7 @@ where let after_challenge_width = if constants.width.after_challenge.is_empty() { 0 } else { - C::EF::D * constants.width.after_challenge[0] + C::EF::DIMENSION * constants.width.after_challenge[0] }; builder.assert_usize_eq( after_challenge_values.local.len(), @@ -1003,10 +1003,10 @@ where for i in 0..num_quotient_chunks { let chunk = builder.get("ient_chunks, i); // Assert that the chunk length matches the expected length. - builder.assert_usize_eq(RVar::from(C::EF::D), RVar::from(chunk.len())); + builder.assert_usize_eq(RVar::from(C::EF::DIMENSION), RVar::from(chunk.len())); // Collect the quotient values into vectors. let mut quotient_vals = vec![]; - for j in 0..C::EF::D { + for j in 0..C::EF::DIMENSION { let value = builder.get(&chunk, j); quotient_vals.push(value); } @@ -1016,7 +1016,7 @@ where let quotient: Ext<_, _> = Self::recompute_quotient(builder, "ient, qc_domains, zeta); // Assert that the quotient times the zerofier is equal to the folded constraints. - builder.assert_ext_eq(folded_constraints * sels.inv_zeroifier, quotient); + builder.assert_ext_eq(folded_constraints * sels.inv_vanishing, quotient); } #[allow(clippy::too_many_arguments)] @@ -1033,13 +1033,17 @@ where exposed_values_after_challenge: &[Vec>], ) -> Ext { let mut unflatten = |v: &[Ext]| { - v.chunks_exact(C::EF::D) + v.chunks_exact(C::EF::DIMENSION) .map(|chunk| { builder.eval( chunk .iter() .enumerate() - .map(|(e_i, &x)| x * C::EF::monomial(e_i).cons()) + .map(|(e_i, &x)| { + x * C::EF::ith_basis_element(e_i) + .expect("basis element index out of bounds") + .cons() + }) .sum::>(), ) }) @@ -1100,8 +1104,10 @@ where .filter(|(j, _)| *j != i) .map(|(_, other_domain)| { let first_point: Ext<_, _> = builder.eval(domain.first_point()); - other_domain.zp_at_point(builder, zeta) - * other_domain.zp_at_point(builder, first_point).inverse() + other_domain.vanishing_poly_at_point(builder, zeta) + * other_domain + .vanishing_poly_at_point(builder, first_point) + .inverse() }) .product::>() }) @@ -1115,10 +1121,15 @@ where .iter() .enumerate() .map(|(ch_i, ch)| { - assert_eq!(ch.len(), C::EF::D); + assert_eq!(ch.len(), C::EF::DIMENSION); ch.iter() .enumerate() - .map(|(e_i, &c)| zps[ch_i] * C::EF::monomial(e_i) * c) + .map(|(e_i, &c)| { + zps[ch_i] + * C::EF::ith_basis_element(e_i) + .expect("basis element index out of bounds") + * c + }) .sum::>() }) .sum::>(), @@ -1166,7 +1177,7 @@ where C::F: TwoAdicField, { if builder.flags.static_only { - builder.eval(C::F::from_canonical_usize(val.value())) + builder.eval(C::F::from_usize(val.value())) } else { builder.unsafe_cast_var_to_felt(val.get_var()) } diff --git a/extensions/native/recursion/src/tests.rs b/extensions/native/recursion/src/tests.rs index 627304e866..4b15781950 100644 --- a/extensions/native/recursion/src/tests.rs +++ b/extensions/native/recursion/src/tests.rs @@ -120,7 +120,8 @@ fn test_fibonacci() { log_blowup: 3, log_final_poly_len: 0, num_queries: 2, - proof_of_work_bits: 0, + commit_proof_of_work_bits: 0, + query_proof_of_work_bits: 0, }, ) } diff --git a/extensions/native/recursion/src/utils.rs b/extensions/native/recursion/src/utils.rs index 3c018cc0c2..da64d2bebc 100644 --- a/extensions/native/recursion/src/utils.rs +++ b/extensions/native/recursion/src/utils.rs @@ -1,7 +1,6 @@ use openvm_native_compiler::ir::{Builder, CanSelect, Config, Felt, MemVariable, Var}; -use openvm_stark_backend::{ - p3_commit::TwoAdicMultiplicativeCoset, - p3_field::{FieldAlgebra, TwoAdicField}, +use openvm_stark_backend::p3_field::{ + coset::TwoAdicMultiplicativeCoset, PrimeCharacteristicRing, TwoAdicField, }; use openvm_stark_sdk::config::FriParameters; @@ -18,10 +17,7 @@ pub fn const_fri_config( let constant_generator = C::F::two_adic_generator(i); builder.set(&generators, i, constant_generator); - let constant_domain = TwoAdicMultiplicativeCoset { - log_n: i, - shift: C::F::ONE, - }; + let constant_domain = TwoAdicMultiplicativeCoset::new(C::F::ONE, i).unwrap(); let domain_value: TwoAdicMultiplicativeCosetVariable<_> = builder.constant(constant_domain); // ATTENTION: here must use `builder.set_value`. `builder.set` will convert `Usize::Const` // to `Usize::Var` because it calls `builder.eval`. @@ -32,7 +28,8 @@ pub fn const_fri_config( blowup: 1 << params.log_blowup, log_final_poly_len: params.log_final_poly_len, num_queries: params.num_queries, - proof_of_work_bits: params.proof_of_work_bits, + commit_proof_of_work_bits: params.commit_proof_of_work_bits, + query_proof_of_work_bits: params.query_proof_of_work_bits, subgroups, generators, } @@ -45,7 +42,7 @@ pub fn reduce_32(builder: &mut Builder, vals: &[Felt]) -> Va for val in vals.iter() { let val = builder.cast_felt_to_var(*val); builder.assign(&result, result + val * power); - power *= C::N::from_canonical_usize(1usize << 32); + power *= C::N::from_usize(1usize << 32); } result } diff --git a/extensions/native/recursion/src/view.rs b/extensions/native/recursion/src/view.rs index 4df191268c..b165401225 100644 --- a/extensions/native/recursion/src/view.rs +++ b/extensions/native/recursion/src/view.rs @@ -5,7 +5,7 @@ use openvm_native_compiler::{ }; use openvm_stark_backend::{ keygen::types::TraceWidth, - p3_field::{FieldAlgebra, PrimeField32}, + p3_field::{PrimeCharacteristicRing, PrimeField32}, p3_util::log2_strict_usize, }; @@ -57,11 +57,11 @@ pub fn get_advice_per_air( .map(|constraint| { let coefficients = builder.array(constraint.coefficients.len()); for (i, coeff) in constraint.coefficients.iter().enumerate() { - let coefficient: Var<_> = builder.constant(C::N::from_canonical_u32(*coeff)); + let coefficient: Var<_> = builder.constant(C::N::from_u32(*coeff)); builder.set(&coefficients, i, coefficient); } assert!(constraint.threshold <= C::F::ORDER_U32); - let threshold: Var<_> = builder.constant(C::N::from_wrapped_u32(constraint.threshold)); + let threshold: Var<_> = builder.constant(C::N::from_u32(constraint.threshold)); let is_threshold_at_p = constraint.threshold == C::F::ORDER_U32; LinearConstraintVariable { coefficients, @@ -90,9 +90,7 @@ pub fn get_advice_per_air( // Because `C::F::ORDER_U32` is prime and `max_coefficient > 1`, // `floor(C::F::ORDER_U32 / max_coefficient) * max_coefficient < C::F::ORDER_U32`, // `height * max_coefficient` cannot overflow `C::F`. - value: builder.constant(C::N::from_canonical_u32( - C::F::ORDER_U32 / max_coefficient + 1, - )), + value: builder.constant(C::N::from_u32(C::F::ORDER_U32 / max_coefficient + 1)), } }; builder.set(&height_maxes, i, height_max); diff --git a/extensions/native/recursion/src/witness.rs b/extensions/native/recursion/src/witness.rs index 1a13ffb1b4..06edd56e01 100644 --- a/extensions/native/recursion/src/witness.rs +++ b/extensions/native/recursion/src/witness.rs @@ -10,7 +10,7 @@ use openvm_stark_backend::{ }; use openvm_stark_sdk::{ config::baby_bear_poseidon2_root::BabyBearPoseidon2RootConfig, p3_baby_bear::BabyBear, - p3_bn254_fr::Bn254Fr, + p3_bn254::Bn254, }; use p3_symmetric::Hash; @@ -33,10 +33,10 @@ pub trait Witnessable { } type C = OuterConfig; -type OuterCom = Hash; +type OuterCom = Hash; -impl Witnessable for Bn254Fr { - type WitnessVariable = Var; +impl Witnessable for Bn254 { + type WitnessVariable = Var; fn read(&self, builder: &mut Builder) -> Self::WitnessVariable { builder.witness_var() @@ -75,13 +75,13 @@ impl Witnessable for OuterCom { type WitnessVariable = DigestVariable; fn read(&self, builder: &mut Builder) -> Self::WitnessVariable { - let bv: &[Bn254Fr; 1] = self.borrow(); + let bv: &[Bn254; 1] = self.borrow(); let v = vec![bv[0].read(builder)]; DigestVariable::Var(builder.vec(v)) } fn write(&self, witness: &mut Witness) { - let bv: &[Bn254Fr; 1] = self.borrow(); + let bv: &[Bn254; 1] = self.borrow(); witness.vars.push(bv[0]); } } @@ -100,7 +100,7 @@ impl Witnessable for usize { } pub trait VectorWitnessable: Witnessable {} -impl VectorWitnessable for Bn254Fr {} +impl VectorWitnessable for Bn254 {} impl VectorWitnessable for OuterVal {} impl VectorWitnessable for OuterChallenge {} impl VectorWitnessable for OuterCom {} diff --git a/extensions/native/recursion/tests/recursion.rs b/extensions/native/recursion/tests/recursion.rs index fa8c6e7f2c..76ff175457 100644 --- a/extensions/native/recursion/tests/recursion.rs +++ b/extensions/native/recursion/tests/recursion.rs @@ -14,7 +14,7 @@ use openvm_native_recursion::testing_utils::inner::run_recursive_test; use openvm_stark_backend::{ config::{Domain, StarkGenericConfig, Val}, p3_commit::PolynomialSpace, - p3_field::{extension::BinomialExtensionField, FieldAlgebra}, + p3_field::{extension::BinomialExtensionField, PrimeCharacteristicRing}, prover::{ cpu::{CpuBackend, CpuDevice}, hal::{DeviceDataTransporter, ProverBackend, TraceCommitter}, @@ -37,8 +37,8 @@ fn fibonacci_program(a: u32, b: u32, n: u32) -> Program { let mut builder = AsmBuilder::::default(); - let prev: Felt<_> = builder.constant(F::from_canonical_u32(a)); - let next: Felt<_> = builder.constant(F::from_canonical_u32(b)); + let prev: Felt<_> = builder.constant(F::from_u32(a)); + let next: Felt<_> = builder.constant(F::from_u32(b)); builder.commit_public_value(prev); builder.commit_public_value(next); diff --git a/extensions/native/transpiler/src/lib.rs b/extensions/native/transpiler/src/lib.rs index a6b582abb7..699ad29705 100644 --- a/extensions/native/transpiler/src/lib.rs +++ b/extensions/native/transpiler/src/lib.rs @@ -25,7 +25,7 @@ impl TranspilerExtension for LongFormTranspilerExtension { let mut operands = vec![]; let mut j = 3; for _ in 0..num_operands { - operands.push(F::from_canonical_u32(instruction_stream[j])); + operands.push(F::from_u32(instruction_stream[j])); j += 1; } while operands.len() < 7 { diff --git a/extensions/pairing/circuit/Cargo.toml b/extensions/pairing/circuit/Cargo.toml index 2f8828d1b4..aca425d6ad 100644 --- a/extensions/pairing/circuit/Cargo.toml +++ b/extensions/pairing/circuit/Cargo.toml @@ -55,6 +55,7 @@ openvm-pairing-guest = { workspace = true, features = [ "bls12_381", "bn254", ] } +rand08 = { package = "rand", version = "0.8.5", features = ["std_rng"] } [features] default = [] diff --git a/extensions/pairing/circuit/src/config.rs b/extensions/pairing/circuit/src/config.rs index 20ea07186a..843e30d263 100644 --- a/extensions/pairing/circuit/src/config.rs +++ b/extensions/pairing/circuit/src/config.rs @@ -7,7 +7,7 @@ use openvm_algebra_circuit::{ use openvm_circuit::{ arch::{ AirInventory, ChipInventoryError, InitFileGenerator, MatrixRecordArena, SystemConfig, - VmBuilder, VmChipComplex, VmProverExtension, + VmBuilder, VmChipComplex, VmField, VmProverExtension, }, system::SystemChipInventory, }; @@ -16,7 +16,6 @@ use openvm_ecc_circuit::{EccCpuProverExt, WeierstrassExtension, WeierstrassExten use openvm_stark_backend::{ config::{StarkGenericConfig, Val}, engine::StarkEngine, - p3_field::PrimeField32, prover::cpu::{CpuBackend, CpuDevice}, }; use serde::{Deserialize, Serialize}; @@ -77,7 +76,7 @@ impl VmBuilder for Rv32PairingCpuBuilder where SC: StarkGenericConfig, E: StarkEngine, PD = CpuDevice>, - Val: PrimeField32, + Val: VmField, { type VmConfig = Rv32PairingConfig; type SystemChipInventory = SystemChipInventory; diff --git a/extensions/pairing/circuit/src/fp12.rs b/extensions/pairing/circuit/src/fp12.rs index bdd0e7bc17..c12c749d86 100644 --- a/extensions/pairing/circuit/src/fp12.rs +++ b/extensions/pairing/circuit/src/fp12.rs @@ -208,17 +208,18 @@ mod tests { use openvm_mod_circuit_builder::{test_utils::*, *}; use openvm_pairing_guest::bn254::BN254_MODULUS; use openvm_stark_backend::{ - p3_air::BaseAir, p3_field::FieldAlgebra, p3_matrix::dense::RowMajorMatrix, + p3_air::BaseAir, p3_field::PrimeCharacteristicRing, p3_matrix::dense::RowMajorMatrix, }; use openvm_stark_sdk::{ any_rap_arc_vec, config::baby_bear_blake3::BabyBearBlake3Engine, engine::StarkFriEngine, - p3_baby_bear::BabyBear, utils::create_seeded_rng, + p3_baby_bear::BabyBear, }; + use rand08::{rngs::StdRng, SeedableRng}; use super::*; fn generate_random_fq12() -> Fq12 { - let mut rng = create_seeded_rng(); + let mut rng = StdRng::from_entropy(); Fq12::random(&mut rng) } diff --git a/extensions/pairing/circuit/src/pairing_extension.rs b/extensions/pairing/circuit/src/pairing_extension.rs index 5f5bcc74bf..ade6d52b72 100644 --- a/extensions/pairing/circuit/src/pairing_extension.rs +++ b/extensions/pairing/circuit/src/pairing_extension.rs @@ -218,7 +218,7 @@ pub(crate) mod phantom { .chain(u.to_coeffs()) .flat_map(|fp2| fp2.to_coeffs()) .flat_map(|fp| fp.to_bytes()) - .map(F::from_canonical_u8), + .map(F::from_u8), ); } Some(PairingCurve::Bls12_381) => { @@ -260,7 +260,7 @@ pub(crate) mod phantom { .chain(u.to_coeffs()) .flat_map(|fp2| fp2.to_coeffs()) .flat_map(|fp| fp.to_bytes()) - .map(F::from_canonical_u8), + .map(F::from_u8), ); } _ => { diff --git a/extensions/pairing/guest/Cargo.toml b/extensions/pairing/guest/Cargo.toml index 8ad3873261..3e98da0880 100644 --- a/extensions/pairing/guest/Cargo.toml +++ b/extensions/pairing/guest/Cargo.toml @@ -11,7 +11,6 @@ repository.workspace = true openvm = { workspace = true } serde = { workspace = true } itertools = { workspace = true, features = ["use_alloc"] } -rand.workspace = true strum_macros.workspace = true hex-literal = { workspace = true } openvm-algebra-guest = { workspace = true } @@ -23,6 +22,9 @@ openvm-custom-insn = { workspace = true } halo2curves-axiom = { workspace = true, optional = true } blstrs = { workspace = true, optional = true } +[dev-dependencies] +rand08 = { package = "rand", version = "0.8.5", features = ["std_rng"] } + [target.'cfg(not(target_os = "zkvm"))'.dependencies] num-bigint.workspace = true num-traits.workspace = true diff --git a/extensions/pairing/guest/src/halo2curves_shims/bls12_381/tests/mod.rs b/extensions/pairing/guest/src/halo2curves_shims/bls12_381/tests/mod.rs index 954ebf3056..8455b3b3ba 100644 --- a/extensions/pairing/guest/src/halo2curves_shims/bls12_381/tests/mod.rs +++ b/extensions/pairing/guest/src/halo2curves_shims/bls12_381/tests/mod.rs @@ -3,7 +3,7 @@ use alloc::vec::Vec; use halo2curves_axiom::bls12_381::{Fq, Fq2, G1Affine, G2Affine}; use itertools::izip; use openvm_ecc_guest::AffinePoint; -use rand::{rngs::StdRng, SeedableRng}; +use rand08::{rngs::StdRng, SeedableRng}; #[cfg(test)] mod test_final_exp; diff --git a/extensions/pairing/guest/src/halo2curves_shims/bls12_381/tests/test_line.rs b/extensions/pairing/guest/src/halo2curves_shims/bls12_381/tests/test_line.rs index e1e7e9a353..dc528d1671 100644 --- a/extensions/pairing/guest/src/halo2curves_shims/bls12_381/tests/test_line.rs +++ b/extensions/pairing/guest/src/halo2curves_shims/bls12_381/tests/test_line.rs @@ -3,7 +3,7 @@ use halo2curves_axiom::{ ff::Field, }; use openvm_ecc_guest::{algebra::field::FieldExtension, AffinePoint}; -use rand::{rngs::StdRng, SeedableRng}; +use rand08::{rngs::StdRng, SeedableRng}; use crate::{ halo2curves_shims::bls12_381::{tangent_line_023, Bls12_381}, diff --git a/extensions/pairing/guest/src/halo2curves_shims/bls12_381/tests/test_miller_loop.rs b/extensions/pairing/guest/src/halo2curves_shims/bls12_381/tests/test_miller_loop.rs index 47c06b0f64..8aa3d7ddc4 100644 --- a/extensions/pairing/guest/src/halo2curves_shims/bls12_381/tests/test_miller_loop.rs +++ b/extensions/pairing/guest/src/halo2curves_shims/bls12_381/tests/test_miller_loop.rs @@ -2,7 +2,7 @@ use alloc::vec::Vec; use halo2curves_axiom::bls12_381::{Fq12, G1Affine, G2Affine, G2Prepared}; use openvm_ecc_guest::{algebra::Field, AffinePoint}; -use rand::{rngs::StdRng, SeedableRng}; +use rand08::{rngs::StdRng, SeedableRng}; use subtle::ConditionallySelectable; use super::generate_test_points_bls12_381; diff --git a/extensions/pairing/guest/src/halo2curves_shims/bn254/tests/mod.rs b/extensions/pairing/guest/src/halo2curves_shims/bn254/tests/mod.rs index 723f78fbf7..234c139352 100644 --- a/extensions/pairing/guest/src/halo2curves_shims/bn254/tests/mod.rs +++ b/extensions/pairing/guest/src/halo2curves_shims/bn254/tests/mod.rs @@ -3,7 +3,7 @@ use alloc::vec::Vec; use halo2curves_axiom::bn256::{Fq, Fq2, G1Affine, G2Affine}; use itertools::izip; use openvm_ecc_guest::AffinePoint; -use rand::{rngs::StdRng, SeedableRng}; +use rand08::{rngs::StdRng, SeedableRng}; #[cfg(test)] mod test_final_exp; diff --git a/extensions/pairing/guest/src/halo2curves_shims/bn254/tests/test_line.rs b/extensions/pairing/guest/src/halo2curves_shims/bn254/tests/test_line.rs index 05b425fa43..263480d8e2 100644 --- a/extensions/pairing/guest/src/halo2curves_shims/bn254/tests/test_line.rs +++ b/extensions/pairing/guest/src/halo2curves_shims/bn254/tests/test_line.rs @@ -3,7 +3,7 @@ use halo2curves_axiom::{ ff::Field, }; use openvm_ecc_guest::{algebra::field::FieldExtension, AffinePoint}; -use rand::{rngs::StdRng, SeedableRng}; +use rand08::{rngs::StdRng, SeedableRng}; use crate::{ halo2curves_shims::bn254::{tangent_line_013, Bn254}, diff --git a/extensions/pairing/transpiler/src/lib.rs b/extensions/pairing/transpiler/src/lib.rs index e80deaf154..76e6d54b4e 100644 --- a/extensions/pairing/transpiler/src/lib.rs +++ b/extensions/pairing/transpiler/src/lib.rs @@ -44,8 +44,8 @@ impl TranspilerExtension for PairingTranspilerExtension { // Return exits the outermost function return Some(TranspilerOutput::one_to_one(Instruction::phantom( PhantomDiscriminant(PairingPhantom::HintFinalExp as u16), - F::from_canonical_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rs1), - F::from_canonical_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rs2), + F::from_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rs1), + F::from_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rs2), pairing_idx as u16, ))); } diff --git a/extensions/rv32-adapters/src/eq_mod.rs b/extensions/rv32-adapters/src/eq_mod.rs index 3da6c37b76..1518e1e00e 100644 --- a/extensions/rv32-adapters/src/eq_mod.rs +++ b/extensions/rv32-adapters/src/eq_mod.rs @@ -34,7 +34,7 @@ use openvm_rv32im_circuit::adapters::{ use openvm_stark_backend::{ interaction::InteractionBuilder, p3_air::BaseAir, - p3_field::{Field, FieldAlgebra, PrimeField32}, + p3_field::{Field, PrimeCharacteristicRing, PrimeField32}, }; /// This adapter reads from NUM_READS <= 2 pointers and writes to a register. @@ -120,12 +120,12 @@ impl< let mut timestamp_delta: usize = 0; let mut timestamp_pp = || { timestamp_delta += 1; - timestamp + AB::F::from_canonical_usize(timestamp_delta - 1) + timestamp + AB::F::from_usize(timestamp_delta - 1) }; // Address spaces - let d = AB::F::from_canonical_u32(RV32_REGISTER_AS); - let e = AB::F::from_canonical_u32(RV32_MEMORY_AS); + let d = AB::F::from_u32(RV32_REGISTER_AS); + let e = AB::F::from_u32(RV32_MEMORY_AS); // Read register values for rs for (ptr, val, aux) in izip!(cols.rs_ptr, cols.rs_val, &cols.rs_read_aux) { @@ -138,7 +138,7 @@ impl< // a range check on the highest limb. let rs_val_f = cols.rs_val.map(|decomp| { decomp.iter().rev().fold(AB::Expr::ZERO, |acc, &limb| { - acc * AB::Expr::from_canonical_usize(1 << RV32_CELL_BITS) + limb + acc * AB::Expr::from_usize(1 << RV32_CELL_BITS) + limb }) }); @@ -150,9 +150,8 @@ impl< } }); - let limb_shift = AB::F::from_canonical_usize( - 1 << (RV32_CELL_BITS * RV32_REGISTER_NUM_LIMBS - self.address_bits), - ); + let limb_shift = + AB::F::from_usize(1 << (RV32_CELL_BITS * RV32_REGISTER_NUM_LIMBS - self.address_bits)); self.bus .send_range( @@ -168,8 +167,7 @@ impl< let mut r_it = r.into_iter(); from_fn(|_| from_fn(|_| r_it.next().unwrap())) }); - let block_ptr_offset: [_; BLOCKS_PER_READ] = - from_fn(|i| AB::F::from_canonical_usize(i * BLOCK_SIZE)); + let block_ptr_offset: [_; BLOCKS_PER_READ] = from_fn(|i| AB::F::from_usize(i * BLOCK_SIZE)); for (ptr, block_data, block_aux) in izip!(rs_val_f, read_block_data, &cols.heap_read_aux) { for (offset, data, aux) in izip!(block_ptr_offset, block_data, block_aux) { @@ -211,7 +209,7 @@ impl< e.into(), ], cols.from_state, - AB::F::from_canonical_usize(timestamp_delta), + AB::F::from_usize(timestamp_delta), (DEFAULT_PC_STEP, ctx.to_pc), ) .eval(builder, ctx.instruction.is_valid.clone()); @@ -417,13 +415,13 @@ impl< ); // Writing in reverse order cols.writes_aux - .set_prev_data(record.writes_aux.prev_data.map(F::from_canonical_u8)); + .set_prev_data(record.writes_aux.prev_data.map(F::from_u8)); mem_helper.fill( record.writes_aux.prev_timestamp, timestamp_mm(), cols.writes_aux.as_mut(), ); - cols.rd_ptr = F::from_canonical_u32(record.rd_ptr); + cols.rd_ptr = F::from_u32(record.rd_ptr); // **NOTE**: Must iterate everything in reverse order to avoid overwriting the records cols.heap_read_aux @@ -448,12 +446,10 @@ impl< mem_helper.fill(record.prev_timestamp, timestamp_mm(), col.as_mut()); }); - cols.rs_val = record - .rs_val - .map(|val| val.to_le_bytes().map(F::from_canonical_u8)); - cols.rs_ptr = record.rs_ptr.map(|ptr| F::from_canonical_u32(ptr)); + cols.rs_val = record.rs_val.map(|val| val.to_le_bytes().map(F::from_u8)); + cols.rs_ptr = record.rs_ptr.map(|ptr| F::from_u32(ptr)); - cols.from_state.timestamp = F::from_canonical_u32(record.timestamp); - cols.from_state.pc = F::from_canonical_u32(record.from_pc); + cols.from_state.timestamp = F::from_u32(record.timestamp); + cols.from_state.pc = F::from_u32(record.from_pc); } } diff --git a/extensions/rv32-adapters/src/heap_branch.rs b/extensions/rv32-adapters/src/heap_branch.rs index e87b4fd973..0a2c364d44 100644 --- a/extensions/rv32-adapters/src/heap_branch.rs +++ b/extensions/rv32-adapters/src/heap_branch.rs @@ -29,7 +29,7 @@ use openvm_rv32im_circuit::adapters::{tracing_read, RV32_CELL_BITS, RV32_REGISTE use openvm_stark_backend::{ interaction::InteractionBuilder, p3_air::BaseAir, - p3_field::{Field, FieldAlgebra, PrimeField32}, + p3_field::{Field, PrimeCharacteristicRing, PrimeField32}, }; /// This adapter reads from NUM_READS <= 2 pointers. @@ -81,11 +81,11 @@ impl VmA let mut timestamp_delta: usize = 0; let mut timestamp_pp = || { timestamp_delta += 1; - timestamp + AB::F::from_canonical_usize(timestamp_delta - 1) + timestamp + AB::F::from_usize(timestamp_delta - 1) }; - let d = AB::F::from_canonical_u32(RV32_REGISTER_AS); - let e = AB::F::from_canonical_u32(RV32_MEMORY_AS); + let d = AB::F::from_u32(RV32_REGISTER_AS); + let e = AB::F::from_u32(RV32_MEMORY_AS); for (ptr, data, aux) in izip!(cols.rs_ptr, cols.rs_val, &cols.rs_read_aux) { self.memory_bridge @@ -106,9 +106,8 @@ impl VmA // range checks constrain to RV32_CELL_BITS bits, so we need to shift the limbs to constrain // the correct amount of bits - let limb_shift = AB::F::from_canonical_usize( - 1 << (RV32_CELL_BITS * RV32_REGISTER_NUM_LIMBS - self.address_bits), - ); + let limb_shift = + AB::F::from_usize(1 << (RV32_CELL_BITS * RV32_REGISTER_NUM_LIMBS - self.address_bits)); // Note: since limbs are read from memory we already know that limb[i] < 2^RV32_CELL_BITS // thus range checking limb[i] * shift < 2^RV32_CELL_BITS, gives us that @@ -124,7 +123,7 @@ impl VmA let heap_ptr = cols.rs_val.map(|r| { r.iter().rev().fold(AB::Expr::ZERO, |acc, limb| { - acc * AB::F::from_canonical_u32(1 << RV32_CELL_BITS) + (*limb) + acc * AB::F::from_u32(1 << RV32_CELL_BITS) + (*limb) }) }); for (ptr, data, aux) in izip!(heap_ptr, ctx.reads, &cols.heap_read_aux) { @@ -150,7 +149,7 @@ impl VmA e.into(), ], cols.from_state, - AB::F::from_canonical_usize(timestamp_delta), + AB::F::from_usize(timestamp_delta), (DEFAULT_PC_STEP, ctx.to_pc), ) .eval(builder, ctx.instruction.is_valid); @@ -309,7 +308,7 @@ impl AdapterTra .rev() .zip(record.rs_vals.iter().rev()) .for_each(|(col, record)| { - *col = record.to_le_bytes().map(F::from_canonical_u8); + *col = record.to_le_bytes().map(F::from_u8); }); cols.rs_ptr @@ -317,10 +316,10 @@ impl AdapterTra .rev() .zip(record.rs_ptr.iter().rev()) .for_each(|(col, record)| { - *col = F::from_canonical_u32(*record); + *col = F::from_u32(*record); }); - cols.from_state.timestamp = F::from_canonical_u32(record.from_timestamp); - cols.from_state.pc = F::from_canonical_u32(record.from_pc); + cols.from_state.timestamp = F::from_u32(record.from_timestamp); + cols.from_state.pc = F::from_u32(record.from_pc); } } diff --git a/extensions/rv32-adapters/src/test_utils.rs b/extensions/rv32-adapters/src/test_utils.rs index e2b1012e7a..369872b33b 100644 --- a/extensions/rv32-adapters/src/test_utils.rs +++ b/extensions/rv32-adapters/src/test_utils.rs @@ -1,7 +1,7 @@ use openvm_circuit::arch::testing::{memory::gen_pointer, TestBuilder}; use openvm_instructions::{instruction::Instruction, VmOpcode}; use openvm_rv32im_circuit::adapters::{RV32_REGISTER_NUM_LIMBS, RV_IS_TYPE_IMM_BITS}; -use openvm_stark_backend::p3_field::FieldAlgebra; +use openvm_stark_backend::p3_field::PrimeCharacteristicRing; use openvm_stark_sdk::p3_baby_bear::BabyBear; use rand::{rngs::StdRng, Rng}; @@ -11,11 +11,7 @@ pub fn write_ptr_reg( reg_addr: usize, value: u32, ) { - tester.write( - ptr_as, - reg_addr, - value.to_le_bytes().map(BabyBear::from_canonical_u8), - ); + tester.write(ptr_as, reg_addr, value.to_le_bytes().map(BabyBear::from_u8)); } pub fn rv32_write_heap_default( @@ -121,9 +117,9 @@ pub fn rv32_rand_write_register_or_imm( let rs2 = imm.unwrap_or_else(|| gen_pointer(rng, NUM_LIMBS)); let rd = gen_pointer(rng, NUM_LIMBS); - tester.write::(1, rs1, rs1_writes.map(BabyBear::from_canonical_u32)); + tester.write::(1, rs1, rs1_writes.map(BabyBear::from_u32)); if !rs2_is_imm { - tester.write::(1, rs2, rs2_writes.map(BabyBear::from_canonical_u32)); + tester.write::(1, rs2, rs2_writes.map(BabyBear::from_u32)); } ( @@ -138,7 +134,7 @@ pub fn rv32_rand_write_register_or_imm( pub fn generate_rv32_is_type_immediate( rng: &mut StdRng, ) -> (usize, [u32; RV32_REGISTER_NUM_LIMBS]) { - let mut imm: u32 = rng.gen_range(0..(1 << RV_IS_TYPE_IMM_BITS)); + let mut imm: u32 = rng.random_range(0..(1 << RV_IS_TYPE_IMM_BITS)); if (imm & 0x800) != 0 { imm |= !0xFFF } diff --git a/extensions/rv32-adapters/src/vec_heap.rs b/extensions/rv32-adapters/src/vec_heap.rs index a9b612f39b..ae27428dc1 100644 --- a/extensions/rv32-adapters/src/vec_heap.rs +++ b/extensions/rv32-adapters/src/vec_heap.rs @@ -35,7 +35,7 @@ use openvm_rv32im_circuit::adapters::{ use openvm_stark_backend::{ interaction::InteractionBuilder, p3_air::BaseAir, - p3_field::{Field, FieldAlgebra, PrimeField32}, + p3_field::{Field, PrimeCharacteristicRing, PrimeField32}, }; /// This adapter reads from R (R <= 2) pointers and writes to 1 pointer. @@ -145,7 +145,7 @@ impl< let mut timestamp_delta: usize = 0; let mut timestamp_pp = || { timestamp_delta += 1; - timestamp + AB::F::from_canonical_usize(timestamp_delta - 1) + timestamp + AB::F::from_usize(timestamp_delta - 1) }; // Read register values for rs, rd @@ -156,7 +156,7 @@ impl< ))) { self.memory_bridge .read( - MemoryAddress::new(AB::F::from_canonical_u32(RV32_REGISTER_AS), ptr), + MemoryAddress::new(AB::F::from_u32(RV32_REGISTER_AS), ptr), val, timestamp_pp(), aux, @@ -178,9 +178,8 @@ impl< // range checks constrain to RV32_CELL_BITS bits, so we need to shift the limbs to constrain // the correct amount of bits - let limb_shift = AB::F::from_canonical_usize( - 1 << (RV32_CELL_BITS * RV32_REGISTER_NUM_LIMBS - self.address_bits), - ); + let limb_shift = + AB::F::from_usize(1 << (RV32_CELL_BITS * RV32_REGISTER_NUM_LIMBS - self.address_bits)); // Note: since limbs are read from memory we already know that limb[i] < 2^RV32_CELL_BITS // thus range checking limb[i] * shift < 2^RV32_CELL_BITS, gives us that @@ -195,7 +194,7 @@ impl< let rd_val_f: AB::Expr = abstract_compose(cols.rd_val); let rs_val_f: [AB::Expr; NUM_READS] = cols.rs_val.map(abstract_compose); - let e = AB::F::from_canonical_u32(RV32_MEMORY_AS); + let e = AB::F::from_u32(RV32_MEMORY_AS); // Reads from heap for (address, reads, reads_aux) in izip!(rs_val_f, ctx.reads, &cols.reads_aux,) { for (i, (read, aux)) in zip(reads, reads_aux).enumerate() { @@ -203,7 +202,7 @@ impl< .read( MemoryAddress::new( e, - address.clone() + AB::Expr::from_canonical_usize(i * READ_SIZE), + address.clone() + AB::Expr::from_usize(i * READ_SIZE), ), read, timestamp_pp(), @@ -217,10 +216,7 @@ impl< for (i, (write, aux)) in zip(ctx.writes, &cols.writes_aux).enumerate() { self.memory_bridge .write( - MemoryAddress::new( - e, - rd_val_f.clone() + AB::Expr::from_canonical_usize(i * WRITE_SIZE), - ), + MemoryAddress::new(e, rd_val_f.clone() + AB::Expr::from_usize(i * WRITE_SIZE)), write, timestamp_pp(), aux, @@ -241,11 +237,11 @@ impl< .get(1) .map(|&x| x.into()) .unwrap_or(AB::Expr::ZERO), - AB::Expr::from_canonical_u32(RV32_REGISTER_AS), + AB::Expr::from_u32(RV32_REGISTER_AS), e.into(), ], cols.from_state, - AB::F::from_canonical_usize(timestamp_delta), + AB::F::from_usize(timestamp_delta), (DEFAULT_PC_STEP, ctx.to_pc), ) .eval(builder, ctx.instruction.is_valid.clone()); @@ -521,7 +517,7 @@ impl< .rev() .zip(cols.writes_aux.iter_mut().rev()) .for_each(|(write, cols_write)| { - cols_write.set_prev_data(write.prev_data.map(F::from_canonical_u8)); + cols_write.set_prev_data(write.prev_data.map(F::from_u8)); mem_helper.fill(write.prev_timestamp, timestamp_mm(), cols_write.as_mut()); }); @@ -555,23 +551,23 @@ impl< mem_helper.fill(aux.prev_timestamp, timestamp_mm(), cols_aux.as_mut()); }); - cols.rd_val = record.rd_val.to_le_bytes().map(F::from_canonical_u8); + cols.rd_val = record.rd_val.to_le_bytes().map(F::from_u8); cols.rs_val .iter_mut() .rev() .zip(record.rs_vals.iter().rev()) .for_each(|(cols_val, val)| { - *cols_val = val.to_le_bytes().map(F::from_canonical_u8); + *cols_val = val.to_le_bytes().map(F::from_u8); }); - cols.rd_ptr = F::from_canonical_u32(record.rd_ptr); + cols.rd_ptr = F::from_u32(record.rd_ptr); cols.rs_ptr .iter_mut() .rev() .zip(record.rs_ptrs.iter().rev()) .for_each(|(cols_ptr, ptr)| { - *cols_ptr = F::from_canonical_u32(*ptr); + *cols_ptr = F::from_u32(*ptr); }); - cols.from_state.timestamp = F::from_canonical_u32(record.from_timestamp); - cols.from_state.pc = F::from_canonical_u32(record.from_pc); + cols.from_state.timestamp = F::from_u32(record.from_timestamp); + cols.from_state.pc = F::from_u32(record.from_pc); } } diff --git a/extensions/rv32im/circuit/Cargo.toml b/extensions/rv32im/circuit/Cargo.toml index 8af24f30a4..57d27dc357 100644 --- a/extensions/rv32im/circuit/Cargo.toml +++ b/extensions/rv32im/circuit/Cargo.toml @@ -48,7 +48,6 @@ aot = ["openvm-circuit/aot", "openvm-circuit-derive/aot"] mimalloc = ["openvm-circuit/mimalloc"] jemalloc = ["openvm-circuit/jemalloc"] jemalloc-prof = ["openvm-circuit/jemalloc-prof"] -nightly-features = ["openvm-circuit/nightly-features"] cuda = [ "dep:openvm-stark-sdk", diff --git a/extensions/rv32im/circuit/src/adapters/alu.rs b/extensions/rv32im/circuit/src/adapters/alu.rs index 29f74c5bc0..50f87678ee 100644 --- a/extensions/rv32im/circuit/src/adapters/alu.rs +++ b/extensions/rv32im/circuit/src/adapters/alu.rs @@ -28,7 +28,7 @@ use openvm_instructions::{ use openvm_stark_backend::{ interaction::InteractionBuilder, p3_air::{AirBuilder, BaseAir}, - p3_field::{Field, FieldAlgebra, PrimeField32}, + p3_field::{Field, PrimeCharacteristicRing, PrimeField32}, }; use super::{ @@ -86,7 +86,7 @@ impl VmAdapterAir for Rv32BaseAluAdapterAir { let mut timestamp_delta: usize = 0; let mut timestamp_pp = || { timestamp_delta += 1; - timestamp + AB::F::from_canonical_usize(timestamp_delta - 1) + timestamp + AB::F::from_usize(timestamp_delta - 1) }; // If rs2 is an immediate value, constrain that: @@ -95,15 +95,14 @@ impl VmAdapterAir for Rv32BaseAluAdapterAir { let rs2_limbs = ctx.reads[1].clone(); let rs2_sign = rs2_limbs[2].clone(); let rs2_imm = rs2_limbs[0].clone() - + rs2_limbs[1].clone() * AB::Expr::from_canonical_usize(1 << RV32_CELL_BITS) - + rs2_sign.clone() * AB::Expr::from_canonical_usize(1 << (2 * RV32_CELL_BITS)); + + rs2_limbs[1].clone() * AB::Expr::from_usize(1 << RV32_CELL_BITS) + + rs2_sign.clone() * AB::Expr::from_usize(1 << (2 * RV32_CELL_BITS)); builder.assert_bool(local.rs2_as); let mut rs2_imm_when = builder.when(not(local.rs2_as)); rs2_imm_when.assert_eq(local.rs2, rs2_imm); rs2_imm_when.assert_eq(rs2_sign.clone(), rs2_limbs[3].clone()); rs2_imm_when.assert_zero( - rs2_sign.clone() - * (AB::Expr::from_canonical_usize((1 << RV32_CELL_BITS) - 1) - rs2_sign), + rs2_sign.clone() * (AB::Expr::from_usize((1 << RV32_CELL_BITS) - 1) - rs2_sign), ); self.bitwise_lookup_bus .send_range(rs2_limbs[0].clone(), rs2_limbs[1].clone()) @@ -111,7 +110,7 @@ impl VmAdapterAir for Rv32BaseAluAdapterAir { self.memory_bridge .read( - MemoryAddress::new(AB::F::from_canonical_u32(RV32_REGISTER_AS), local.rs1_ptr), + MemoryAddress::new(AB::F::from_u32(RV32_REGISTER_AS), local.rs1_ptr), ctx.reads[0].clone(), timestamp_pp(), &local.reads_aux[0], @@ -133,7 +132,7 @@ impl VmAdapterAir for Rv32BaseAluAdapterAir { self.memory_bridge .write( - MemoryAddress::new(AB::F::from_canonical_u32(RV32_REGISTER_AS), local.rd_ptr), + MemoryAddress::new(AB::F::from_u32(RV32_REGISTER_AS), local.rd_ptr), ctx.writes[0].clone(), timestamp_pp(), &local.writes_aux, @@ -147,11 +146,11 @@ impl VmAdapterAir for Rv32BaseAluAdapterAir { local.rd_ptr.into(), local.rs1_ptr.into(), local.rs2.into(), - AB::Expr::from_canonical_u32(RV32_REGISTER_AS), + AB::Expr::from_u32(RV32_REGISTER_AS), local.rs2_as.into(), ], local.from_state, - AB::F::from_canonical_usize(timestamp_delta), + AB::F::from_usize(timestamp_delta), (DEFAULT_PC_STEP, ctx.to_pc), ) .eval(builder, ctx.instruction.is_valid); @@ -294,7 +293,7 @@ impl AdapterTraceFiller adapter_row .writes_aux - .set_prev_data(record.writes_aux.prev_data.map(F::from_canonical_u8)); + .set_prev_data(record.writes_aux.prev_data.map(F::from_u8)); mem_helper.fill( record.writes_aux.prev_timestamp, timestamp, @@ -323,11 +322,11 @@ impl AdapterTraceFiller adapter_row.reads_aux[0].as_mut(), ); - adapter_row.rs2_as = F::from_canonical_u8(record.rs2_as); - adapter_row.rs2 = F::from_canonical_u32(record.rs2); - adapter_row.rs1_ptr = F::from_canonical_u32(record.rs1_ptr); - adapter_row.rd_ptr = F::from_canonical_u32(record.rd_ptr); - adapter_row.from_state.timestamp = F::from_canonical_u32(timestamp); - adapter_row.from_state.pc = F::from_canonical_u32(record.from_pc); + adapter_row.rs2_as = F::from_u8(record.rs2_as); + adapter_row.rs2 = F::from_u32(record.rs2); + adapter_row.rs1_ptr = F::from_u32(record.rs1_ptr); + adapter_row.rd_ptr = F::from_u32(record.rd_ptr); + adapter_row.from_state.timestamp = F::from_u32(timestamp); + adapter_row.from_state.pc = F::from_u32(record.from_pc); } } diff --git a/extensions/rv32im/circuit/src/adapters/branch.rs b/extensions/rv32im/circuit/src/adapters/branch.rs index 2d81b897fe..699e88b9a2 100644 --- a/extensions/rv32im/circuit/src/adapters/branch.rs +++ b/extensions/rv32im/circuit/src/adapters/branch.rs @@ -19,7 +19,7 @@ use openvm_instructions::{ use openvm_stark_backend::{ interaction::InteractionBuilder, p3_air::BaseAir, - p3_field::{Field, FieldAlgebra, PrimeField32}, + p3_field::{Field, PrimeCharacteristicRing, PrimeField32}, }; use super::RV32_REGISTER_NUM_LIMBS; @@ -61,12 +61,12 @@ impl VmAdapterAir for Rv32BranchAdapterAir { let mut timestamp_delta: usize = 0; let mut timestamp_pp = || { timestamp_delta += 1; - timestamp + AB::F::from_canonical_usize(timestamp_delta - 1) + timestamp + AB::F::from_usize(timestamp_delta - 1) }; self.memory_bridge .read( - MemoryAddress::new(AB::F::from_canonical_u32(RV32_REGISTER_AS), local.rs1_ptr), + MemoryAddress::new(AB::F::from_u32(RV32_REGISTER_AS), local.rs1_ptr), ctx.reads[0].clone(), timestamp_pp(), &local.reads_aux[0], @@ -75,7 +75,7 @@ impl VmAdapterAir for Rv32BranchAdapterAir { self.memory_bridge .read( - MemoryAddress::new(AB::F::from_canonical_u32(RV32_REGISTER_AS), local.rs2_ptr), + MemoryAddress::new(AB::F::from_u32(RV32_REGISTER_AS), local.rs2_ptr), ctx.reads[1].clone(), timestamp_pp(), &local.reads_aux[1], @@ -89,11 +89,11 @@ impl VmAdapterAir for Rv32BranchAdapterAir { local.rs1_ptr.into(), local.rs2_ptr.into(), ctx.instruction.immediate, - AB::Expr::from_canonical_u32(RV32_REGISTER_AS), - AB::Expr::from_canonical_u32(RV32_REGISTER_AS), + AB::Expr::from_u32(RV32_REGISTER_AS), + AB::Expr::from_u32(RV32_REGISTER_AS), ], local.from_state, - AB::F::from_canonical_usize(timestamp_delta), + AB::F::from_usize(timestamp_delta), (DEFAULT_PC_STEP, ctx.to_pc), ) .eval(builder, ctx.instruction.is_valid); @@ -208,9 +208,9 @@ impl AdapterTraceFiller for Rv32BranchAdapterFiller { adapter_row.reads_aux[0].as_mut(), ); - adapter_row.from_state.pc = F::from_canonical_u32(record.from_pc); - adapter_row.from_state.timestamp = F::from_canonical_u32(record.from_timestamp); - adapter_row.rs1_ptr = F::from_canonical_u32(record.rs1_ptr); - adapter_row.rs2_ptr = F::from_canonical_u32(record.rs2_ptr); + adapter_row.from_state.pc = F::from_u32(record.from_pc); + adapter_row.from_state.timestamp = F::from_u32(record.from_timestamp); + adapter_row.rs1_ptr = F::from_u32(record.rs1_ptr); + adapter_row.rs2_ptr = F::from_u32(record.rs2_ptr); } } diff --git a/extensions/rv32im/circuit/src/adapters/jalr.rs b/extensions/rv32im/circuit/src/adapters/jalr.rs index f9946ac328..9f4efec893 100644 --- a/extensions/rv32im/circuit/src/adapters/jalr.rs +++ b/extensions/rv32im/circuit/src/adapters/jalr.rs @@ -22,7 +22,7 @@ use openvm_instructions::{ use openvm_stark_backend::{ interaction::InteractionBuilder, p3_air::{AirBuilder, BaseAir}, - p3_field::{Field, FieldAlgebra, PrimeField32}, + p3_field::{Field, PrimeCharacteristicRing, PrimeField32}, }; use super::RV32_REGISTER_NUM_LIMBS; @@ -75,7 +75,7 @@ impl VmAdapterAir for Rv32JalrAdapterAir { let mut timestamp_delta: usize = 0; let mut timestamp_pp = || { timestamp_delta += 1; - timestamp + AB::Expr::from_canonical_usize(timestamp_delta - 1) + timestamp + AB::Expr::from_usize(timestamp_delta - 1) }; let write_count = local_cols.needs_write; @@ -87,10 +87,7 @@ impl VmAdapterAir for Rv32JalrAdapterAir { self.memory_bridge .read( - MemoryAddress::new( - AB::F::from_canonical_u32(RV32_REGISTER_AS), - local_cols.rs1_ptr, - ), + MemoryAddress::new(AB::F::from_u32(RV32_REGISTER_AS), local_cols.rs1_ptr), ctx.reads[0].clone(), timestamp_pp(), &local_cols.rs1_aux_cols, @@ -99,10 +96,7 @@ impl VmAdapterAir for Rv32JalrAdapterAir { self.memory_bridge .write( - MemoryAddress::new( - AB::F::from_canonical_u32(RV32_REGISTER_AS), - local_cols.rd_ptr, - ), + MemoryAddress::new(AB::F::from_u32(RV32_REGISTER_AS), local_cols.rd_ptr), ctx.writes[0].clone(), timestamp_pp(), &local_cols.rd_aux_cols, @@ -111,7 +105,7 @@ impl VmAdapterAir for Rv32JalrAdapterAir { let to_pc = ctx .to_pc - .unwrap_or(local_cols.from_state.pc + AB::F::from_canonical_u32(DEFAULT_PC_STEP)); + .unwrap_or(local_cols.from_state.pc + AB::F::from_u32(DEFAULT_PC_STEP)); // regardless of `needs_write`, must always execute instruction when `is_valid`. self.execution_bridge @@ -121,7 +115,7 @@ impl VmAdapterAir for Rv32JalrAdapterAir { local_cols.rd_ptr.into(), local_cols.rs1_ptr.into(), ctx.instruction.immediate, - AB::Expr::from_canonical_u32(RV32_REGISTER_AS), + AB::Expr::from_u32(RV32_REGISTER_AS), AB::Expr::ZERO, write_count.into(), ctx.instruction.imm_sign, @@ -129,7 +123,7 @@ impl VmAdapterAir for Rv32JalrAdapterAir { local_cols.from_state, ExecutionState { pc: to_pc, - timestamp: timestamp + AB::F::from_canonical_usize(timestamp_delta), + timestamp: timestamp + AB::F::from_usize(timestamp_delta), }, ) .eval(builder, ctx.instruction.is_valid); @@ -247,13 +241,13 @@ impl AdapterTraceFiller for Rv32JalrAdapterFiller { if record.rd_ptr != u32::MAX { adapter_row .rd_aux_cols - .set_prev_data(record.writes_aux.prev_data.map(F::from_canonical_u8)); + .set_prev_data(record.writes_aux.prev_data.map(F::from_u8)); mem_helper.fill( record.writes_aux.prev_timestamp, record.from_timestamp + 1, adapter_row.rd_aux_cols.as_mut(), ); - adapter_row.rd_ptr = F::from_canonical_u32(record.rd_ptr); + adapter_row.rd_ptr = F::from_u32(record.rd_ptr); } else { adapter_row.rd_ptr = F::ZERO; } @@ -263,8 +257,8 @@ impl AdapterTraceFiller for Rv32JalrAdapterFiller { record.from_timestamp, adapter_row.rs1_aux_cols.as_mut(), ); - adapter_row.rs1_ptr = F::from_canonical_u32(record.rs1_ptr); - adapter_row.from_state.timestamp = F::from_canonical_u32(record.from_timestamp); - adapter_row.from_state.pc = F::from_canonical_u32(record.from_pc); + adapter_row.rs1_ptr = F::from_u32(record.rs1_ptr); + adapter_row.from_state.timestamp = F::from_u32(record.from_timestamp); + adapter_row.from_state.pc = F::from_u32(record.from_pc); } } diff --git a/extensions/rv32im/circuit/src/adapters/loadstore.rs b/extensions/rv32im/circuit/src/adapters/loadstore.rs index 9fdf9bf4fc..4feb8cd13e 100644 --- a/extensions/rv32im/circuit/src/adapters/loadstore.rs +++ b/extensions/rv32im/circuit/src/adapters/loadstore.rs @@ -36,7 +36,7 @@ use openvm_rv32im_transpiler::Rv32LoadStoreOpcode::{self, *}; use openvm_stark_backend::{ interaction::InteractionBuilder, p3_air::{AirBuilder, BaseAir}, - p3_field::{Field, FieldAlgebra, PrimeField32}, + p3_field::{Field, PrimeCharacteristicRing, PrimeField32}, }; use super::RV32_REGISTER_NUM_LIMBS; @@ -133,7 +133,7 @@ impl VmAdapterAir for Rv32LoadStoreAdapterAir { let mut timestamp_delta: usize = 0; let mut timestamp_pp = || { timestamp_delta += 1; - timestamp + AB::Expr::from_canonical_usize(timestamp_delta - 1) + timestamp + AB::Expr::from_usize(timestamp_delta - 1) }; let is_load = ctx.instruction.is_load; @@ -160,10 +160,7 @@ impl VmAdapterAir for Rv32LoadStoreAdapterAir { // read rs1 self.memory_bridge .read( - MemoryAddress::new( - AB::F::from_canonical_u32(RV32_REGISTER_AS), - local_cols.rs1_ptr, - ), + MemoryAddress::new(AB::F::from_u32(RV32_REGISTER_AS), local_cols.rs1_ptr), local_cols.rs1_data, timestamp_pp(), &local_cols.rs1_aux_cols, @@ -171,12 +168,12 @@ impl VmAdapterAir for Rv32LoadStoreAdapterAir { .eval(builder, is_valid.clone()); // constrain mem_ptr = rs1 + imm as a u32 addition with 2 limbs - let limbs_01 = local_cols.rs1_data[0] - + local_cols.rs1_data[1] * AB::F::from_canonical_u32(1 << RV32_CELL_BITS); - let limbs_23 = local_cols.rs1_data[2] - + local_cols.rs1_data[3] * AB::F::from_canonical_u32(1 << RV32_CELL_BITS); + let limbs_01 = + local_cols.rs1_data[0] + local_cols.rs1_data[1] * AB::F::from_u32(1 << RV32_CELL_BITS); + let limbs_23 = + local_cols.rs1_data[2] + local_cols.rs1_data[3] * AB::F::from_u32(1 << RV32_CELL_BITS); - let inv = AB::F::from_canonical_u32(1 << (RV32_CELL_BITS * 2)).inverse(); + let inv = AB::F::from_u32(1 << (RV32_CELL_BITS * 2)).inverse(); let carry = (limbs_01 + local_cols.imm - local_cols.mem_ptr_limbs[0]) * inv; builder.when(is_valid.clone()).assert_bool(carry.clone()); @@ -185,7 +182,7 @@ impl VmAdapterAir for Rv32LoadStoreAdapterAir { .when(is_valid.clone()) .assert_bool(local_cols.imm_sign); let imm_extend_limb = - local_cols.imm_sign * AB::F::from_canonical_u32((1 << (RV32_CELL_BITS * 2)) - 1); + local_cols.imm_sign * AB::F::from_u32((1 << (RV32_CELL_BITS * 2)) - 1); let carry = (limbs_23 + imm_extend_limb + carry - local_cols.mem_ptr_limbs[1]) * inv; builder.when(is_valid.clone()).assert_bool(carry.clone()); @@ -193,8 +190,7 @@ impl VmAdapterAir for Rv32LoadStoreAdapterAir { self.range_bus .range_check( // (limb[0] - shift_amount) / 4 < 2^14 => limb[0] - shift_amount < 2^16 - (local_cols.mem_ptr_limbs[0] - shift_amount) - * AB::F::from_canonical_u32(4).inverse(), + (local_cols.mem_ptr_limbs[0] - shift_amount) * AB::F::from_u32(4).inverse(), RV32_CELL_BITS * 2 - 2, ) .eval(builder, is_valid.clone()); @@ -206,7 +202,7 @@ impl VmAdapterAir for Rv32LoadStoreAdapterAir { .eval(builder, is_valid.clone()); let mem_ptr = local_cols.mem_ptr_limbs[0] - + local_cols.mem_ptr_limbs[1] * AB::F::from_canonical_u32(1 << (RV32_CELL_BITS * 2)); + + local_cols.mem_ptr_limbs[1] * AB::F::from_u32(1 << (RV32_CELL_BITS * 2)); let is_store = is_valid.clone() - is_load.clone(); // constrain mem_as to be in {0, 1, 2} if the instruction is a load, @@ -220,7 +216,7 @@ impl VmAdapterAir for Rv32LoadStoreAdapterAir { let read_as = select::( is_load.clone(), local_cols.mem_as, - AB::F::from_canonical_u32(RV32_REGISTER_AS), + AB::F::from_u32(RV32_REGISTER_AS), ); // read_ptr is mem_ptr for loads and rd_rs2_ptr for stores @@ -245,7 +241,7 @@ impl VmAdapterAir for Rv32LoadStoreAdapterAir { // write_as is 1 for loads and [local_cols.mem_as] for stores let write_as = select::( is_load.clone(), - AB::F::from_canonical_u32(RV32_REGISTER_AS), + AB::F::from_u32(RV32_REGISTER_AS), local_cols.mem_as, ); @@ -264,7 +260,7 @@ impl VmAdapterAir for Rv32LoadStoreAdapterAir { let to_pc = ctx .to_pc - .unwrap_or(local_cols.from_state.pc + AB::F::from_canonical_u32(DEFAULT_PC_STEP)); + .unwrap_or(local_cols.from_state.pc + AB::F::from_u32(DEFAULT_PC_STEP)); self.execution_bridge .execute( ctx.instruction.opcode, @@ -272,7 +268,7 @@ impl VmAdapterAir for Rv32LoadStoreAdapterAir { local_cols.rd_rs2_ptr.into(), local_cols.rs1_ptr.into(), local_cols.imm.into(), - AB::Expr::from_canonical_u32(RV32_REGISTER_AS), + AB::Expr::from_u32(RV32_REGISTER_AS), local_cols.mem_as.into(), local_cols.needs_write.into(), local_cols.imm_sign.into(), @@ -280,7 +276,7 @@ impl VmAdapterAir for Rv32LoadStoreAdapterAir { local_cols.from_state, ExecutionState { pc: to_pc, - timestamp: timestamp + AB::F::from_canonical_usize(timestamp_delta), + timestamp: timestamp + AB::F::from_usize(timestamp_delta), }, ) .eval(builder, is_valid); @@ -398,7 +394,7 @@ where // those cells let (read_data, prev_data) = match local_opcode { LOADW | LOADB | LOADH | LOADBU | LOADHU => { - debug_assert_eq!(e, F::from_canonical_u32(RV32_MEMORY_AS)); + debug_assert_eq!(e, F::from_u32(RV32_MEMORY_AS)); record.mem_as = RV32_MEMORY_AS as u8; let read_data = tracing_read( memory, @@ -467,7 +463,7 @@ where let ptr = record.rs1_val.wrapping_add(imm_extended) & !3; if record.mem_as == 4 { - timed_write_native(memory, ptr, data.map(F::from_canonical_u32)).0 + timed_write_native(memory, ptr, data.map(F::from_u32)).0 } else { timed_write(memory, record.mem_as as u32, ptr, data.map(|x| x as u8)).0 } @@ -518,7 +514,7 @@ impl AdapterTraceFiller for Rv32LoadStoreAdapterFiller { mem_helper.fill_zero(&mut adapter_row.write_base_aux); } - adapter_row.mem_as = F::from_canonical_u8(record.mem_as); + adapter_row.mem_as = F::from_u8(record.mem_as); let ptr = record .rs1_val .wrapping_add(record.imm as u32 + record.imm_sign as u32 * 0xffff0000); @@ -528,10 +524,10 @@ impl AdapterTraceFiller for Rv32LoadStoreAdapterFiller { .add_count(ptr_limbs[0] >> 2, RV32_CELL_BITS * 2 - 2); self.range_checker_chip .add_count(ptr_limbs[1], self.pointer_max_bits - 16); - adapter_row.mem_ptr_limbs = ptr_limbs.map(F::from_canonical_u32); + adapter_row.mem_ptr_limbs = ptr_limbs.map(F::from_u32); adapter_row.imm_sign = F::from_bool(record.imm_sign); - adapter_row.imm = F::from_canonical_u16(record.imm); + adapter_row.imm = F::from_u16(record.imm); mem_helper.fill( record.read_data_aux.prev_timestamp, @@ -539,7 +535,7 @@ impl AdapterTraceFiller for Rv32LoadStoreAdapterFiller { adapter_row.read_data_aux.as_mut(), ); adapter_row.rd_rs2_ptr = if record.rd_rs2_ptr != u32::MAX { - F::from_canonical_u32(record.rd_rs2_ptr) + F::from_u32(record.rd_rs2_ptr) } else { F::ZERO }; @@ -550,10 +546,10 @@ impl AdapterTraceFiller for Rv32LoadStoreAdapterFiller { adapter_row.rs1_aux_cols.as_mut(), ); - adapter_row.rs1_data = record.rs1_val.to_le_bytes().map(F::from_canonical_u8); - adapter_row.rs1_ptr = F::from_canonical_u32(record.rs1_ptr); + adapter_row.rs1_data = record.rs1_val.to_le_bytes().map(F::from_u8); + adapter_row.rs1_ptr = F::from_u32(record.rs1_ptr); - adapter_row.from_state.timestamp = F::from_canonical_u32(record.from_timestamp); - adapter_row.from_state.pc = F::from_canonical_u32(record.from_pc); + adapter_row.from_state.timestamp = F::from_u32(record.from_timestamp); + adapter_row.from_state.pc = F::from_u32(record.from_pc); } } diff --git a/extensions/rv32im/circuit/src/adapters/mod.rs b/extensions/rv32im/circuit/src/adapters/mod.rs index 96536c8754..36f3996118 100644 --- a/extensions/rv32im/circuit/src/adapters/mod.rs +++ b/extensions/rv32im/circuit/src/adapters/mod.rs @@ -8,7 +8,7 @@ use openvm_circuit::{ }, }; use openvm_instructions::riscv::{RV32_MEMORY_AS, RV32_REGISTER_AS}; -use openvm_stark_backend::p3_field::{FieldAlgebra, PrimeField32}; +use openvm_stark_backend::p3_field::{PrimeCharacteristicRing, PrimeField32}; mod alu; mod branch; @@ -49,7 +49,7 @@ pub fn compose(ptr_data: [F; RV32_REGISTER_NUM_LIMBS]) -> u32 { /// inverse of `compose` pub fn decompose(value: u32) -> [F; RV32_REGISTER_NUM_LIMBS] { std::array::from_fn(|i| { - F::from_canonical_u32((value >> (RV32_CELL_BITS * i)) & ((1 << RV32_CELL_BITS) - 1)) + F::from_u32((value >> (RV32_CELL_BITS * i)) & ((1 << RV32_CELL_BITS) - 1)) }) } @@ -244,13 +244,13 @@ pub fn read_rv32_register(memory: &GuestMemory, ptr: u32) -> u32 { u32::from_le_bytes(memory_read(memory, RV32_REGISTER_AS, ptr)) } -pub fn abstract_compose>( +pub fn abstract_compose>( data: [V; RV32_REGISTER_NUM_LIMBS], ) -> T { data.into_iter() .enumerate() .fold(T::ZERO, |acc, (i, limb)| { - acc + limb * T::from_canonical_u32(1 << (i * RV32_CELL_BITS)) + acc + limb * T::from_u32(1 << (i * RV32_CELL_BITS)) }) } diff --git a/extensions/rv32im/circuit/src/adapters/mul.rs b/extensions/rv32im/circuit/src/adapters/mul.rs index 00f9b98fb5..62ccb21b4c 100644 --- a/extensions/rv32im/circuit/src/adapters/mul.rs +++ b/extensions/rv32im/circuit/src/adapters/mul.rs @@ -22,7 +22,7 @@ use openvm_instructions::{ use openvm_stark_backend::{ interaction::InteractionBuilder, p3_air::BaseAir, - p3_field::{Field, FieldAlgebra, PrimeField32}, + p3_field::{Field, PrimeCharacteristicRing, PrimeField32}, }; use super::{tracing_write, RV32_REGISTER_NUM_LIMBS}; @@ -74,12 +74,12 @@ impl VmAdapterAir for Rv32MultAdapterAir { let mut timestamp_delta: usize = 0; let mut timestamp_pp = || { timestamp_delta += 1; - timestamp + AB::F::from_canonical_usize(timestamp_delta - 1) + timestamp + AB::F::from_usize(timestamp_delta - 1) }; self.memory_bridge .read( - MemoryAddress::new(AB::F::from_canonical_u32(RV32_REGISTER_AS), local.rs1_ptr), + MemoryAddress::new(AB::F::from_u32(RV32_REGISTER_AS), local.rs1_ptr), ctx.reads[0].clone(), timestamp_pp(), &local.reads_aux[0], @@ -88,7 +88,7 @@ impl VmAdapterAir for Rv32MultAdapterAir { self.memory_bridge .read( - MemoryAddress::new(AB::F::from_canonical_u32(RV32_REGISTER_AS), local.rs2_ptr), + MemoryAddress::new(AB::F::from_u32(RV32_REGISTER_AS), local.rs2_ptr), ctx.reads[1].clone(), timestamp_pp(), &local.reads_aux[1], @@ -97,7 +97,7 @@ impl VmAdapterAir for Rv32MultAdapterAir { self.memory_bridge .write( - MemoryAddress::new(AB::F::from_canonical_u32(RV32_REGISTER_AS), local.rd_ptr), + MemoryAddress::new(AB::F::from_u32(RV32_REGISTER_AS), local.rd_ptr), ctx.writes[0].clone(), timestamp_pp(), &local.writes_aux, @@ -111,11 +111,11 @@ impl VmAdapterAir for Rv32MultAdapterAir { local.rd_ptr.into(), local.rs1_ptr.into(), local.rs2_ptr.into(), - AB::Expr::from_canonical_u32(RV32_REGISTER_AS), + AB::Expr::from_u32(RV32_REGISTER_AS), AB::Expr::ZERO, ], local.from_state, - AB::F::from_canonical_usize(timestamp_delta), + AB::F::from_usize(timestamp_delta), (DEFAULT_PC_STEP, ctx.to_pc), ) .eval(builder, ctx.instruction.is_valid); @@ -231,7 +231,7 @@ impl AdapterTraceFiller for Rv32MultAdapterFiller { adapter_row .writes_aux - .set_prev_data(record.writes_aux.prev_data.map(F::from_canonical_u8)); + .set_prev_data(record.writes_aux.prev_data.map(F::from_u8)); mem_helper.fill( record.writes_aux.prev_timestamp, timestamp + 2, @@ -250,11 +250,11 @@ impl AdapterTraceFiller for Rv32MultAdapterFiller { adapter_row.reads_aux[0].as_mut(), ); - adapter_row.rs2_ptr = F::from_canonical_u32(record.rs2_ptr); - adapter_row.rs1_ptr = F::from_canonical_u32(record.rs1_ptr); - adapter_row.rd_ptr = F::from_canonical_u32(record.rd_ptr); + adapter_row.rs2_ptr = F::from_u32(record.rs2_ptr); + adapter_row.rs1_ptr = F::from_u32(record.rs1_ptr); + adapter_row.rd_ptr = F::from_u32(record.rd_ptr); - adapter_row.from_state.timestamp = F::from_canonical_u32(record.from_timestamp); - adapter_row.from_state.pc = F::from_canonical_u32(record.from_pc); + adapter_row.from_state.timestamp = F::from_u32(record.from_timestamp); + adapter_row.from_state.pc = F::from_u32(record.from_pc); } } diff --git a/extensions/rv32im/circuit/src/adapters/rdwrite.rs b/extensions/rv32im/circuit/src/adapters/rdwrite.rs index 52c433ac9a..aeb625fbac 100644 --- a/extensions/rv32im/circuit/src/adapters/rdwrite.rs +++ b/extensions/rv32im/circuit/src/adapters/rdwrite.rs @@ -19,7 +19,7 @@ use openvm_instructions::{ use openvm_stark_backend::{ interaction::InteractionBuilder, p3_air::{AirBuilder, BaseAir}, - p3_field::{Field, FieldAlgebra, PrimeField32}, + p3_field::{Field, PrimeCharacteristicRing, PrimeField32}, }; use super::RV32_REGISTER_NUM_LIMBS; @@ -101,10 +101,7 @@ impl Rv32RdWriteAdapterAir { }; self.memory_bridge .write( - MemoryAddress::new( - AB::F::from_canonical_u32(RV32_REGISTER_AS), - local_cols.rd_ptr, - ), + MemoryAddress::new(AB::F::from_u32(RV32_REGISTER_AS), local_cols.rd_ptr), ctx.writes[0].clone(), timestamp, &local_cols.rd_aux_cols, @@ -113,7 +110,7 @@ impl Rv32RdWriteAdapterAir { let to_pc = ctx .to_pc - .unwrap_or(local_cols.from_state.pc + AB::F::from_canonical_u32(DEFAULT_PC_STEP)); + .unwrap_or(local_cols.from_state.pc + AB::F::from_u32(DEFAULT_PC_STEP)); // regardless of `needs_write`, must always execute instruction when `is_valid`. self.execution_bridge .execute( @@ -122,14 +119,14 @@ impl Rv32RdWriteAdapterAir { local_cols.rd_ptr.into(), AB::Expr::ZERO, ctx.instruction.immediate, - AB::Expr::from_canonical_u32(RV32_REGISTER_AS), + AB::Expr::from_u32(RV32_REGISTER_AS), AB::Expr::ZERO, f, ], local_cols.from_state, ExecutionState { pc: to_pc, - timestamp: timestamp + AB::F::from_canonical_usize(timestamp_delta), + timestamp: timestamp + AB::F::from_usize(timestamp_delta), }, ) .eval(builder, ctx.instruction.is_valid); @@ -269,15 +266,15 @@ impl AdapterTraceFiller for Rv32RdWriteAdapterFiller { adapter_row .rd_aux_cols - .set_prev_data(record.rd_aux_record.prev_data.map(F::from_canonical_u8)); + .set_prev_data(record.rd_aux_record.prev_data.map(F::from_u8)); mem_helper.fill( record.rd_aux_record.prev_timestamp, record.from_timestamp, adapter_row.rd_aux_cols.as_mut(), ); - adapter_row.rd_ptr = F::from_canonical_u32(record.rd_ptr); - adapter_row.from_state.timestamp = F::from_canonical_u32(record.from_timestamp); - adapter_row.from_state.pc = F::from_canonical_u32(record.from_pc); + adapter_row.rd_ptr = F::from_u32(record.rd_ptr); + adapter_row.from_state.timestamp = F::from_u32(record.from_timestamp); + adapter_row.from_state.pc = F::from_u32(record.from_pc); } } @@ -377,8 +374,8 @@ impl AdapterTraceFiller for Rv32CondRdWriteAdapterFiller { } else { adapter_cols.inner.rd_ptr = F::ZERO; mem_helper.fill_zero(adapter_cols.inner.rd_aux_cols.as_mut()); - adapter_cols.inner.from_state.timestamp = F::from_canonical_u32(record.from_timestamp); - adapter_cols.inner.from_state.pc = F::from_canonical_u32(record.from_pc); + adapter_cols.inner.from_state.timestamp = F::from_u32(record.from_timestamp); + adapter_cols.inner.from_state.pc = F::from_u32(record.from_pc); } } } diff --git a/extensions/rv32im/circuit/src/auipc/core.rs b/extensions/rv32im/circuit/src/auipc/core.rs index 84311e597b..764d9c8f2c 100644 --- a/extensions/rv32im/circuit/src/auipc/core.rs +++ b/extensions/rv32im/circuit/src/auipc/core.rs @@ -21,7 +21,7 @@ use openvm_rv32im_transpiler::Rv32AuipcOpcode::{self, *}; use openvm_stark_backend::{ interaction::InteractionBuilder, p3_air::{AirBuilder, BaseAir}, - p3_field::{Field, FieldAlgebra, PrimeField32}, + p3_field::{Field, PrimeCharacteristicRing, PrimeField32}, rap::BaseAirWithPublicValues, }; @@ -89,13 +89,12 @@ where .iter() .enumerate() .fold(AB::Expr::ZERO, |acc, (i, &val)| { - acc + val * AB::Expr::from_canonical_u32(1 << ((i + 1) * RV32_CELL_BITS)) + acc + val * AB::Expr::from_u32(1 << ((i + 1) * RV32_CELL_BITS)) }); // Compute the most significant limb of PC let pc_msl = (from_pc - intermed_val) - * AB::F::from_canonical_usize(1 << (RV32_CELL_BITS * (RV32_REGISTER_NUM_LIMBS - 1))) - .inverse(); + * AB::F::from_usize(1 << (RV32_CELL_BITS * (RV32_REGISTER_NUM_LIMBS - 1))).inverse(); // The vector pc_limbs contains the actual limbs of PC in little endian order let pc_limbs = [rd_data[0]] @@ -106,7 +105,7 @@ where .collect::>(); let mut carry: [AB::Expr; RV32_REGISTER_NUM_LIMBS] = array::from_fn(|_| AB::Expr::ZERO); - let carry_divide = AB::F::from_canonical_usize(1 << RV32_CELL_BITS).inverse(); + let carry_divide = AB::F::from_usize(1 << RV32_CELL_BITS).inverse(); // Don't need to constrain the least significant limb of the addition // since we already know that rd_data[0] = pc_limbs[0] and the least significant limb of imm @@ -145,9 +144,7 @@ where // 2^{PC_BITS-(RV32_REGISTER_NUM_LIMBS-1)*RV32_CELL_BITS}) need_range_check.push( (*limb).clone() - * AB::Expr::from_canonical_usize( - 1 << (pc_limbs.len() * RV32_CELL_BITS - PC_BITS), - ), + * AB::Expr::from_usize(1 << (pc_limbs.len() * RV32_CELL_BITS - PC_BITS)), ); } else { need_range_check.push((*limb).clone()); @@ -168,7 +165,7 @@ where .iter() .enumerate() .fold(AB::Expr::ZERO, |acc, (i, &val)| { - acc + val * AB::Expr::from_canonical_u32(1 << (i * RV32_CELL_BITS)) + acc + val * AB::Expr::from_u32(1 << (i * RV32_CELL_BITS)) }); let expected_opcode = VmCoreAir::::opcode_to_global_expr(self, AUIPC); AdapterAirContext { @@ -280,10 +277,10 @@ where .request_range(pair[0] as u32, pair[1] as u32); } // Writing in reverse order - core_row.rd_data = rd_data.map(F::from_canonical_u8); + core_row.rd_data = rd_data.map(F::from_u8); // only the middle 2 limbs: - core_row.pc_limbs = from_fn(|i| F::from_canonical_u8(pc_limbs[i + 1])); - core_row.imm_limbs = from_fn(|i| F::from_canonical_u8(imm_limbs[i])); + core_row.pc_limbs = from_fn(|i| F::from_u8(pc_limbs[i + 1])); + core_row.imm_limbs = from_fn(|i| F::from_u8(imm_limbs[i])); core_row.is_valid = F::ONE; } diff --git a/extensions/rv32im/circuit/src/auipc/tests.rs b/extensions/rv32im/circuit/src/auipc/tests.rs index 69a8e825c3..8c0f44626a 100644 --- a/extensions/rv32im/circuit/src/auipc/tests.rs +++ b/extensions/rv32im/circuit/src/auipc/tests.rs @@ -15,7 +15,7 @@ use openvm_instructions::{instruction::Instruction, program::PC_BITS, LocalOpcod use openvm_rv32im_transpiler::Rv32AuipcOpcode::{self, *}; use openvm_stark_backend::{ p3_air::BaseAir, - p3_field::{FieldAlgebra, PrimeField32}, + p3_field::{PrimeCharacteristicRing, PrimeField32}, p3_matrix::{ dense::{DenseMatrix, RowMajorMatrix}, Matrix, @@ -104,18 +104,18 @@ fn set_and_execute>( ) where Rv32AuipcExecutor: PreflightExecutor, { - let imm = imm.unwrap_or(rng.gen_range(0..(1 << IMM_BITS))) as usize; - let a = rng.gen_range(0..32) << 2; + let imm = imm.unwrap_or(rng.random_range(0..(1 << IMM_BITS))) as usize; + let a = rng.random_range(0..32) << 2; tester.execute_with_pc( executor, arena, &Instruction::from_usize(opcode.global_opcode(), [a, 0, imm, 1, 0]), - initial_pc.unwrap_or(rng.gen_range(0..(1 << PC_BITS))), + initial_pc.unwrap_or(rng.random_range(0..(1 << PC_BITS))), ); let initial_pc = tester.last_from_pc().as_canonical_u32(); let rd_data = run_auipc(initial_pc, imm as u32); - assert_eq!(rd_data.map(F::from_canonical_u8), tester.read::<4>(1, a)); + assert_eq!(rd_data.map(F::from_u8), tester.read::<4>(1, a)); } /////////////////////////////////////////////////////////////////////////////////////// @@ -188,18 +188,18 @@ fn run_negative_auipc_test( let adapter_width = BaseAir::::width(&harness.air.adapter); let modify_trace = |trace: &mut DenseMatrix| { - let mut trace_row = trace.row_slice(0).to_vec(); + let mut trace_row = trace.row_slice(0).expect("row exists").to_vec(); let (_, core_row) = trace_row.split_at_mut(adapter_width); let core_cols: &mut Rv32AuipcCoreCols = core_row.borrow_mut(); if let Some(data) = prank_vals.rd_data { - core_cols.rd_data = data.map(F::from_canonical_u32); + core_cols.rd_data = data.map(F::from_u32); } if let Some(data) = prank_vals.imm_limbs { - core_cols.imm_limbs = data.map(F::from_canonical_u32); + core_cols.imm_limbs = data.map(F::from_u32); } if let Some(data) = prank_vals.pc_limbs { - core_cols.pc_limbs = data.map(F::from_canonical_u32); + core_cols.pc_limbs = data.map(F::from_u32); } *trace = RowMajorMatrix::new(trace_row, trace.width()); @@ -373,9 +373,9 @@ fn test_cuda_rand_auipc_tracegen() { let num_ops = 100; for _ in 0..num_ops { - let imm = rng.gen_range(0..(1 << IMM_BITS)) as usize; + let imm = rng.random_range(0..(1 << IMM_BITS)) as usize; let a = gen_pointer(&mut rng, RV32_REGISTER_NUM_LIMBS); - let initial_pc = rng.gen_range(0..(1 << PC_BITS)); + let initial_pc = rng.random_range(0..(1 << PC_BITS)); tester.execute_with_pc( &mut harness.executor, diff --git a/extensions/rv32im/circuit/src/base_alu/core.rs b/extensions/rv32im/circuit/src/base_alu/core.rs index 1e57b4485c..05e352ee18 100644 --- a/extensions/rv32im/circuit/src/base_alu/core.rs +++ b/extensions/rv32im/circuit/src/base_alu/core.rs @@ -19,7 +19,7 @@ use openvm_rv32im_transpiler::BaseAluOpcode; use openvm_stark_backend::{ interaction::InteractionBuilder, p3_air::{AirBuilder, BaseAir}, - p3_field::{Field, FieldAlgebra, PrimeField32}, + p3_field::{Field, PrimeCharacteristicRing, PrimeField32}, rap::BaseAirWithPublicValues, }; use strum::IntoEnumIterator; @@ -96,7 +96,7 @@ where // carry[i] is (a[i] + c[i] - b[i] + carry[i - 1]) / 2^LIMB_BITS. let mut carry_add: [AB::Expr; NUM_LIMBS] = array::from_fn(|_| AB::Expr::ZERO); let mut carry_sub: [AB::Expr; NUM_LIMBS] = array::from_fn(|_| AB::Expr::ZERO); - let carry_divide = AB::F::from_canonical_usize(1 << LIMB_BITS).inverse(); + let carry_divide = AB::F::from_usize(1 << LIMB_BITS).inverse(); for i in 0..NUM_LIMBS { // We explicitly separate the constraints for ADD and SUB in order to keep degree @@ -131,8 +131,8 @@ where let x = not::(bitwise.clone()) * a[i] + bitwise.clone() * b[i]; let y = not::(bitwise.clone()) * a[i] + bitwise.clone() * c[i]; let x_xor_y = cols.opcode_xor_flag * a[i] - + cols.opcode_or_flag * ((AB::Expr::from_canonical_u32(2) * a[i]) - b[i] - c[i]) - + cols.opcode_and_flag * (b[i] + c[i] - (AB::Expr::from_canonical_u32(2) * a[i])); + + cols.opcode_or_flag * ((AB::Expr::from_u32(2) * a[i]) - b[i] - c[i]) + + cols.opcode_and_flag * (b[i] + c[i] - (AB::Expr::from_u32(2) * a[i])); self.bus .send_xor(x, y, x_xor_y) .eval(builder, is_valid.clone()); @@ -143,7 +143,7 @@ where flags.iter().zip(BaseAluOpcode::iter()).fold( AB::Expr::ZERO, |acc, (flag, local_opcode)| { - acc + (*flag).into() * AB::Expr::from_canonical_u8(local_opcode as u8) + acc + (*flag).into() * AB::Expr::from_u8(local_opcode as u8) }, ), ); @@ -282,9 +282,9 @@ where .request_xor(b_val as u32, c_val as u32); } } - core_row.c = record.c.map(F::from_canonical_u8); - core_row.b = record.b.map(F::from_canonical_u8); - core_row.a = a.map(F::from_canonical_u8); + core_row.c = record.c.map(F::from_u8); + core_row.b = record.b.map(F::from_u8); + core_row.a = a.map(F::from_u8); } } diff --git a/extensions/rv32im/circuit/src/base_alu/tests.rs b/extensions/rv32im/circuit/src/base_alu/tests.rs index 8f38dea1f5..94c72b5540 100644 --- a/extensions/rv32im/circuit/src/base_alu/tests.rs +++ b/extensions/rv32im/circuit/src/base_alu/tests.rs @@ -15,7 +15,7 @@ use openvm_instructions::LocalOpcode; use openvm_rv32im_transpiler::BaseAluOpcode::{self, *}; use openvm_stark_backend::{ p3_air::BaseAir, - p3_field::{FieldAlgebra, PrimeField32}, + p3_field::{PrimeCharacteristicRing, PrimeField32}, p3_matrix::{ dense::{DenseMatrix, RowMajorMatrix}, Matrix, @@ -112,8 +112,8 @@ fn set_and_execute>( is_imm: Option, c: Option<[u8; RV32_REGISTER_NUM_LIMBS]>, ) { - let b = b.unwrap_or(array::from_fn(|_| rng.gen_range(0..=u8::MAX))); - let (c_imm, c) = if is_imm.unwrap_or(rng.gen_bool(0.5)) { + let b = b.unwrap_or(array::from_fn(|_| rng.random_range(0..=u8::MAX))); + let (c_imm, c) = if is_imm.unwrap_or(rng.random_bool(0.5)) { let (imm, c) = if let Some(c) = c { ((u32::from_le_bytes(c) & 0xFFFFFF) as usize, c) } else { @@ -123,7 +123,7 @@ fn set_and_execute>( } else { ( None, - c.unwrap_or(array::from_fn(|_| rng.gen_range(0..=u8::MAX))), + c.unwrap_or(array::from_fn(|_| rng.random_range(0..=u8::MAX))), ) }; @@ -137,8 +137,7 @@ fn set_and_execute>( ); tester.execute(executor, arena, &instruction); - let a = run_alu::(opcode, &b, &c) - .map(F::from_canonical_u8); + let a = run_alu::(opcode, &b, &c).map(F::from_u8); assert_eq!(a, tester.read::(1, rd)) } @@ -260,12 +259,12 @@ fn run_negative_alu_test( let adapter_width = BaseAir::::width(&harness.air.adapter); let modify_trace = |trace: &mut DenseMatrix| { - let mut values = trace.row_slice(0).to_vec(); + let mut values = trace.row_slice(0).expect("row exists").to_vec(); let cols: &mut BaseAluCoreCols = values.split_at_mut(adapter_width).1.borrow_mut(); - cols.a = prank_a.map(F::from_canonical_u32); + cols.a = prank_a.map(F::from_u32); if let Some(prank_c) = prank_c { - cols.c = prank_c.map(F::from_canonical_u32); + cols.c = prank_c.map(F::from_u32); } if let Some(prank_opcode_flags) = prank_opcode_flags { cols.opcode_add_flag = F::from_bool(prank_opcode_flags[0]); diff --git a/extensions/rv32im/circuit/src/branch_eq/core.rs b/extensions/rv32im/circuit/src/branch_eq/core.rs index 6b08062f47..18647a82d0 100644 --- a/extensions/rv32im/circuit/src/branch_eq/core.rs +++ b/extensions/rv32im/circuit/src/branch_eq/core.rs @@ -11,7 +11,7 @@ use openvm_rv32im_transpiler::BranchEqualOpcode; use openvm_stark_backend::{ interaction::InteractionBuilder, p3_air::{AirBuilder, BaseAir}, - p3_field::{Field, FieldAlgebra, PrimeField32}, + p3_field::{Field, PrimeCharacteristicRing, PrimeField32}, rap::BaseAirWithPublicValues, }; use strum::IntoEnumIterator; @@ -103,13 +103,13 @@ where .iter() .zip(BranchEqualOpcode::iter()) .fold(AB::Expr::ZERO, |acc, (flag, opcode)| { - acc + (*flag).into() * AB::Expr::from_canonical_u8(opcode as u8) + acc + (*flag).into() * AB::Expr::from_u8(opcode as u8) }) - + AB::Expr::from_canonical_usize(self.offset); + + AB::Expr::from_usize(self.offset); let to_pc = from_pc + cols.cmp_result * cols.imm - + not(cols.cmp_result) * AB::Expr::from_canonical_u32(self.pc_step); + + not(cols.cmp_result) * AB::Expr::from_u32(self.pc_step); AdapterAirContext { to_pc: Some(to_pc), @@ -194,7 +194,7 @@ where core_record.local_opcode = branch_eq_opcode as u8; if fast_run_eq(branch_eq_opcode, &rs1, &rs2) { - *state.pc = (F::from_canonical_u32(*state.pc) + imm).as_canonical_u32(); + *state.pc = (F::from_u32(*state.pc) + imm).as_canonical_u32(); } else { *state.pc = state.pc.wrapping_add(self.pc_step); } @@ -232,11 +232,11 @@ where core_row.opcode_beq_flag = F::from_bool(record.local_opcode == BranchEqualOpcode::BEQ as u8); - core_row.imm = F::from_canonical_u32(record.imm); + core_row.imm = F::from_u32(record.imm); core_row.cmp_result = F::from_bool(cmp_result); - core_row.b = record.b.map(F::from_canonical_u8); - core_row.a = record.a.map(F::from_canonical_u8); + core_row.b = record.b.map(F::from_u8); + core_row.a = record.a.map(F::from_u8); } } @@ -265,11 +265,7 @@ where { for i in 0..NUM_LIMBS { if x[i] != y[i] { - return ( - !is_beq, - i, - (F::from_canonical_u8(x[i]) - F::from_canonical_u8(y[i])).inverse(), - ); + return (!is_beq, i, (F::from_u8(x[i]) - F::from_u8(y[i])).inverse()); } } (is_beq, 0, F::ZERO) diff --git a/extensions/rv32im/circuit/src/branch_eq/tests.rs b/extensions/rv32im/circuit/src/branch_eq/tests.rs index 93f98ec093..b62e3b0450 100644 --- a/extensions/rv32im/circuit/src/branch_eq/tests.rs +++ b/extensions/rv32im/circuit/src/branch_eq/tests.rs @@ -15,7 +15,7 @@ use openvm_instructions::{ use openvm_rv32im_transpiler::BranchEqualOpcode; use openvm_stark_backend::{ p3_air::BaseAir, - p3_field::{FieldAlgebra, PrimeField32}, + p3_field::{PrimeCharacteristicRing, PrimeField32}, p3_matrix::{ dense::{DenseMatrix, RowMajorMatrix}, Matrix, @@ -100,20 +100,20 @@ fn set_and_execute>( b: Option<[u8; RV32_REGISTER_NUM_LIMBS]>, imm: Option, ) { - let a = a.unwrap_or(array::from_fn(|_| rng.gen_range(0..=u8::MAX))); - let b = b.unwrap_or(if rng.gen_bool(0.5) { + let a = a.unwrap_or(array::from_fn(|_| rng.random_range(0..=u8::MAX))); + let b = b.unwrap_or(if rng.random_bool(0.5) { a } else { - array::from_fn(|_| rng.gen_range(0..=u8::MAX)) + array::from_fn(|_| rng.random_range(0..=u8::MAX)) }); - let imm = imm.unwrap_or(rng.gen_range((-ABS_MAX_IMM)..ABS_MAX_IMM)); + let imm = imm.unwrap_or(rng.random_range((-ABS_MAX_IMM)..ABS_MAX_IMM)); let rs1 = gen_pointer(rng, 4); let rs2 = gen_pointer(rng, 4); - tester.write::(1, rs1, a.map(F::from_canonical_u8)); - tester.write::(1, rs2, b.map(F::from_canonical_u8)); + tester.write::(1, rs1, a.map(F::from_u8)); + tester.write::(1, rs2, b.map(F::from_u8)); - let initial_pc = rng.gen_range(imm.unsigned_abs()..(1 << (PC_BITS - 1))); + let initial_pc = rng.random_range(imm.unsigned_abs()..(1 << (PC_BITS - 1))); tester.execute_with_pc( executor, arena, @@ -201,14 +201,14 @@ fn run_negative_branch_eq_test( let adapter_width = BaseAir::::width(&harness.air.adapter); let modify_trace = |trace: &mut DenseMatrix| { - let mut values = trace.row_slice(0).to_vec(); + let mut values = trace.row_slice(0).expect("row exists").to_vec(); let cols: &mut BranchEqualCoreCols = values.split_at_mut(adapter_width).1.borrow_mut(); if let Some(cmp_result) = prank_cmp_result { cols.cmp_result = F::from_bool(cmp_result); } if let Some(diff_inv_marker) = prank_diff_inv_marker { - cols.diff_inv_marker = diff_inv_marker.map(F::from_canonical_u32); + cols.diff_inv_marker = diff_inv_marker.map(F::from_u32); } *trace = RowMajorMatrix::new(values, trace.width()); }; @@ -367,14 +367,14 @@ fn run_ne_sanity_test() { let (cmp_result, diff_idx, diff_val) = run_eq::(true, &x, &y); assert!(!cmp_result); assert_eq!( - diff_val * (F::from_canonical_u8(x[diff_idx]) - F::from_canonical_u8(y[diff_idx])), + diff_val * (F::from_u8(x[diff_idx]) - F::from_u8(y[diff_idx])), F::ONE ); let (cmp_result, diff_idx, diff_val) = run_eq::(false, &x, &y); assert!(cmp_result); assert_eq!( - diff_val * (F::from_canonical_u8(x[diff_idx]) - F::from_canonical_u8(y[diff_idx])), + diff_val * (F::from_u8(x[diff_idx]) - F::from_u8(y[diff_idx])), F::ONE ); } diff --git a/extensions/rv32im/circuit/src/branch_lt/core.rs b/extensions/rv32im/circuit/src/branch_lt/core.rs index 7d52dacc18..68194e6255 100644 --- a/extensions/rv32im/circuit/src/branch_lt/core.rs +++ b/extensions/rv32im/circuit/src/branch_lt/core.rs @@ -15,7 +15,7 @@ use openvm_rv32im_transpiler::BranchLessThanOpcode; use openvm_stark_backend::{ interaction::InteractionBuilder, p3_air::{AirBuilder, BaseAir}, - p3_field::{Field, FieldAlgebra, PrimeField32}, + p3_field::{Field, PrimeCharacteristicRing, PrimeField32}, rap::BaseAirWithPublicValues, }; use strum::IntoEnumIterator; @@ -114,17 +114,15 @@ where // in prime field F. let a_diff = a[NUM_LIMBS - 1] - cols.a_msb_f; let b_diff = b[NUM_LIMBS - 1] - cols.b_msb_f; - builder - .assert_zero(a_diff.clone() * (AB::Expr::from_canonical_u32(1 << LIMB_BITS) - a_diff)); - builder - .assert_zero(b_diff.clone() * (AB::Expr::from_canonical_u32(1 << LIMB_BITS) - b_diff)); + builder.assert_zero(a_diff.clone() * (AB::Expr::from_u32(1 << LIMB_BITS) - a_diff)); + builder.assert_zero(b_diff.clone() * (AB::Expr::from_u32(1 << LIMB_BITS) - b_diff)); for i in (0..NUM_LIMBS).rev() { let diff = (if i == NUM_LIMBS - 1 { cols.b_msb_f - cols.a_msb_f } else { b[i] - a[i] - }) * (AB::Expr::from_canonical_u8(2) * cols.cmp_lt - AB::Expr::ONE); + }) * (AB::Expr::from_u8(2) * cols.cmp_lt - AB::Expr::ONE); prefix_sum += marker[i].into(); builder.assert_bool(marker[i]); builder.assert_zero(not::(prefix_sum.clone()) * diff.clone()); @@ -143,8 +141,8 @@ where // Check if a_msb_f and b_msb_f are in [-128, 127) if signed, [0, 256) if unsigned. self.bus .send_range( - cols.a_msb_f + AB::Expr::from_canonical_u32(1 << (LIMB_BITS - 1)) * signed.clone(), - cols.b_msb_f + AB::Expr::from_canonical_u32(1 << (LIMB_BITS - 1)) * signed.clone(), + cols.a_msb_f + AB::Expr::from_u32(1 << (LIMB_BITS - 1)) * signed.clone(), + cols.b_msb_f + AB::Expr::from_u32(1 << (LIMB_BITS - 1)) * signed.clone(), ) .eval(builder, is_valid.clone()); @@ -157,13 +155,13 @@ where .iter() .zip(BranchLessThanOpcode::iter()) .fold(AB::Expr::ZERO, |acc, (flag, opcode)| { - acc + (*flag).into() * AB::Expr::from_canonical_u8(opcode as u8) + acc + (*flag).into() * AB::Expr::from_u8(opcode as u8) }) - + AB::Expr::from_canonical_usize(self.offset); + + AB::Expr::from_usize(self.offset); let to_pc = from_pc + cols.cmp_result * cols.imm - + not(cols.cmp_result) * AB::Expr::from_canonical_u32(DEFAULT_PC_STEP); + + not(cols.cmp_result) * AB::Expr::from_u32(DEFAULT_PC_STEP); AdapterAirContext { to_pc: Some(to_pc), @@ -248,7 +246,7 @@ where core_record.local_opcode = opcode.local_opcode_idx(self.offset) as u8; if run_cmp::(core_record.local_opcode, &rs1, &rs2).0 { - *state.pc = (F::from_canonical_u32(*state.pc) + imm).as_canonical_u32(); + *state.pc = (F::from_u32(*state.pc) + imm).as_canonical_u32(); } else { *state.pc = state.pc.wrapping_add(DEFAULT_PC_STEP); } @@ -290,23 +288,23 @@ where // a_msb_f and b_msb_f if not let (a_msb_f, a_msb_range) = if a_sign { ( - -F::from_canonical_u32((1 << LIMB_BITS) - record.a[NUM_LIMBS - 1] as u32), + -F::from_u32((1 << LIMB_BITS) - record.a[NUM_LIMBS - 1] as u32), record.a[NUM_LIMBS - 1] as u32 - (1 << (LIMB_BITS - 1)), ) } else { ( - F::from_canonical_u32(record.a[NUM_LIMBS - 1] as u32), + F::from_u32(record.a[NUM_LIMBS - 1] as u32), record.a[NUM_LIMBS - 1] as u32 + ((signed as u32) << (LIMB_BITS - 1)), ) }; let (b_msb_f, b_msb_range) = if b_sign { ( - -F::from_canonical_u32((1 << LIMB_BITS) - record.b[NUM_LIMBS - 1] as u32), + -F::from_u32((1 << LIMB_BITS) - record.b[NUM_LIMBS - 1] as u32), record.b[NUM_LIMBS - 1] as u32 - (1 << (LIMB_BITS - 1)), ) } else { ( - F::from_canonical_u32(record.b[NUM_LIMBS - 1] as u32), + F::from_u32(record.b[NUM_LIMBS - 1] as u32), record.b[NUM_LIMBS - 1] as u32 + ((signed as u32) << (LIMB_BITS - 1)), ) }; @@ -320,9 +318,9 @@ where a_msb_f - b_msb_f } } else if cmp_lt { - F::from_canonical_u8(record.b[diff_idx] - record.a[diff_idx]) + F::from_u8(record.b[diff_idx] - record.a[diff_idx]) } else { - F::from_canonical_u8(record.a[diff_idx] - record.b[diff_idx]) + F::from_u8(record.a[diff_idx] - record.b[diff_idx]) }; self.bitwise_lookup_chip @@ -348,10 +346,10 @@ where core_row.opcode_blt_flag = F::from_bool(record.local_opcode == BranchLessThanOpcode::BLT as u8); - core_row.imm = F::from_canonical_u32(record.imm); + core_row.imm = F::from_u32(record.imm); core_row.cmp_result = F::from_bool(cmp_result); - core_row.b = record.b.map(F::from_canonical_u8); - core_row.a = record.a.map(F::from_canonical_u8); + core_row.b = record.b.map(F::from_u8); + core_row.a = record.a.map(F::from_u8); } } diff --git a/extensions/rv32im/circuit/src/branch_lt/tests.rs b/extensions/rv32im/circuit/src/branch_lt/tests.rs index 619c2509b5..a70324b4aa 100644 --- a/extensions/rv32im/circuit/src/branch_lt/tests.rs +++ b/extensions/rv32im/circuit/src/branch_lt/tests.rs @@ -19,7 +19,7 @@ use openvm_instructions::{instruction::Instruction, program::PC_BITS, LocalOpcod use openvm_rv32im_transpiler::BranchLessThanOpcode; use openvm_stark_backend::{ p3_air::BaseAir, - p3_field::{FieldAlgebra, PrimeField32}, + p3_field::{PrimeCharacteristicRing, PrimeField32}, p3_matrix::{ dense::{DenseMatrix, RowMajorMatrix}, Matrix, @@ -126,18 +126,18 @@ fn set_and_execute>( b: Option<[u8; RV32_REGISTER_NUM_LIMBS]>, imm: Option, ) { - let a = a.unwrap_or(array::from_fn(|_| rng.gen_range(0..=u8::MAX))); - let b = b.unwrap_or(if rng.gen_bool(0.5) { + let a = a.unwrap_or(array::from_fn(|_| rng.random_range(0..=u8::MAX))); + let b = b.unwrap_or(if rng.random_bool(0.5) { a } else { - array::from_fn(|_| rng.gen_range(0..=u8::MAX)) + array::from_fn(|_| rng.random_range(0..=u8::MAX)) }); - let imm = imm.unwrap_or(rng.gen_range((-ABS_MAX_IMM)..ABS_MAX_IMM)); + let imm = imm.unwrap_or(rng.random_range((-ABS_MAX_IMM)..ABS_MAX_IMM)); let rs1 = gen_pointer(rng, 4); let rs2 = gen_pointer(rng, 4); - tester.write::(1, rs1, a.map(F::from_canonical_u8)); - tester.write::(1, rs2, b.map(F::from_canonical_u8)); + tester.write::(1, rs1, a.map(F::from_u8)); + tester.write::(1, rs2, b.map(F::from_u8)); tester.execute_with_pc( executor, @@ -150,7 +150,7 @@ fn set_and_execute>( 1, 1, ), - rng.gen_range(imm.unsigned_abs()..(1 << (PC_BITS - 1))), + rng.random_range(imm.unsigned_abs()..(1 << (PC_BITS - 1))), ); let (cmp_result, _, _, _) = @@ -265,7 +265,7 @@ fn run_negative_branch_lt_test( let ge_opcode = opcode == BranchLessThanOpcode::BGE || opcode == BranchLessThanOpcode::BGEU; let modify_trace = |trace: &mut DenseMatrix| { - let mut values = trace.row_slice(0).to_vec(); + let mut values = trace.row_slice(0).expect("row exists").to_vec(); let cols: &mut BranchLessThanCoreCols = values.split_at_mut(adapter_width).1.borrow_mut(); @@ -276,10 +276,10 @@ fn run_negative_branch_lt_test( cols.b_msb_f = i32_to_f(b_msb); } if let Some(diff_marker) = prank_vals.diff_marker { - cols.diff_marker = diff_marker.map(F::from_canonical_u32); + cols.diff_marker = diff_marker.map(F::from_u32); } if let Some(diff_val) = prank_vals.diff_val { - cols.diff_val = F::from_canonical_u32(diff_val); + cols.diff_val = F::from_u32(diff_val); } cols.cmp_result = F::from_bool(prank_cmp_result); cols.cmp_lt = F::from_bool(ge_opcode ^ prank_cmp_result); diff --git a/extensions/rv32im/circuit/src/divrem/core.rs b/extensions/rv32im/circuit/src/divrem/core.rs index a7f18c1821..2e4bdd5c22 100644 --- a/extensions/rv32im/circuit/src/divrem/core.rs +++ b/extensions/rv32im/circuit/src/divrem/core.rs @@ -21,7 +21,7 @@ use openvm_rv32im_transpiler::DivRemOpcode; use openvm_stark_backend::{ interaction::InteractionBuilder, p3_air::{AirBuilder, BaseAir}, - p3_field::{Field, FieldAlgebra, PrimeField32}, + p3_field::{Field, PrimeCharacteristicRing, PrimeField32}, rap::BaseAirWithPublicValues, }; use strum::IntoEnumIterator; @@ -121,9 +121,9 @@ where // Constrain that b = (c * q + r) % 2^{NUM_LIMBS * LIMB_BITS} and range checkeach element in // q. - let b_ext = cols.b_sign * AB::F::from_canonical_u32((1 << LIMB_BITS) - 1); - let c_ext = cols.c_sign * AB::F::from_canonical_u32((1 << LIMB_BITS) - 1); - let carry_divide = AB::F::from_canonical_u32(1 << LIMB_BITS).inverse(); + let b_ext = cols.b_sign * AB::F::from_u32((1 << LIMB_BITS) - 1); + let c_ext = cols.c_sign * AB::F::from_u32((1 << LIMB_BITS) - 1); + let carry_divide = AB::F::from_u32(1 << LIMB_BITS).inverse(); let mut carry: [AB::Expr; NUM_LIMBS] = array::from_fn(|_| AB::Expr::ZERO); for i in 0..NUM_LIMBS { @@ -143,7 +143,7 @@ where // Constrain that the upper limbs of b = c * q + r are all equal to b_ext and // range check each element in r. - let q_ext = cols.q_sign * AB::F::from_canonical_u32((1 << LIMB_BITS) - 1); + let q_ext = cols.q_sign * AB::F::from_u32((1 << LIMB_BITS) - 1); let mut carry_ext: [AB::Expr; NUM_LIMBS] = array::from_fn(|_| AB::Expr::ZERO); for j in 0..NUM_LIMBS { @@ -183,7 +183,7 @@ where let mut when_zero_divisor = builder.when(cols.zero_divisor); for i in 0..NUM_LIMBS { when_zero_divisor.assert_zero(c[i]); - when_zero_divisor.assert_eq(q[i], AB::F::from_canonical_u32((1 << LIMB_BITS) - 1)); + when_zero_divisor.assert_eq(q[i], AB::F::from_u32((1 << LIMB_BITS) - 1)); } // c_sum is guaranteed to be non-zero if c is non-zero since we assume // each limb of c to be within [0, 2^LIMB_BITS) already. @@ -223,7 +223,7 @@ where .when(not::(signed.clone())) .assert_zero(cols.c_sign); builder.assert_eq( - cols.b_sign + cols.c_sign - AB::Expr::from_canonical_u32(2) * cols.b_sign * cols.c_sign, + cols.b_sign + cols.c_sign - AB::Expr::from_u32(2) * cols.b_sign * cols.c_sign, cols.sign_xor, ); @@ -247,11 +247,11 @@ where .assert_zero(cols.q_sign); // Check that the signs of b and c are correct. - let sign_mask = AB::F::from_canonical_u32(1 << (LIMB_BITS - 1)); + let sign_mask = AB::F::from_u32(1 << (LIMB_BITS - 1)); self.bitwise_lookup_bus .send_range( - AB::Expr::from_canonical_u32(2) * (b[NUM_LIMBS - 1] - cols.b_sign * sign_mask), - AB::Expr::from_canonical_u32(2) * (c[NUM_LIMBS - 1] - cols.c_sign * sign_mask), + AB::Expr::from_u32(2) * (b[NUM_LIMBS - 1] - cols.b_sign * sign_mask), + AB::Expr::from_u32(2) * (c[NUM_LIMBS - 1] - cols.c_sign * sign_mask), ) .eval(builder, signed.clone()); @@ -284,7 +284,7 @@ where ); builder .when(cols.sign_xor) - .assert_one((r_p[i] - AB::F::from_canonical_u32(1 << LIMB_BITS)) * cols.r_inv[i]); + .assert_one((r_p[i] - AB::F::from_u32(1 << LIMB_BITS)) * cols.r_inv[i]); builder .when(cols.sign_xor) .when(not::(carry_lt[i].clone())) @@ -295,8 +295,8 @@ where let mut prefix_sum = special_case.clone(); for i in (0..NUM_LIMBS).rev() { - let diff = r_p[i] * (AB::Expr::from_canonical_u8(2) * cols.c_sign - AB::Expr::ONE) - + c[i] * (AB::Expr::ONE - AB::Expr::from_canonical_u8(2) * cols.c_sign); + let diff = r_p[i] * (AB::Expr::from_u8(2) * cols.c_sign - AB::Expr::ONE) + + c[i] * (AB::Expr::ONE - AB::Expr::from_u8(2) * cols.c_sign); prefix_sum += marker[i].into(); builder.assert_bool(marker[i]); builder.assert_zero(not::(prefix_sum.clone()) * diff.clone()); @@ -317,9 +317,9 @@ where let expected_opcode = flags.iter().zip(DivRemOpcode::iter()).fold( AB::Expr::ZERO, |acc, (flag, local_opcode)| { - acc + (*flag).into() * AB::Expr::from_canonical_u8(local_opcode as u8) + acc + (*flag).into() * AB::Expr::from_u8(local_opcode as u8) }, - ) + AB::Expr::from_canonical_usize(self.offset); + ) + AB::Expr::from_usize(self.offset); let is_div = cols.opcode_div_flag + cols.opcode_divu_flag; let a = array::from_fn(|i| select(is_div.clone(), q[i], r[i])); @@ -534,20 +534,18 @@ where record.c[idx] as u32 - r_prime[idx] }; self.bitwise_lookup_chip.request_range(val - 1, 0); - core_row.lt_diff = F::from_canonical_u32(val); + core_row.lt_diff = F::from_u32(val); core_row.lt_marker[idx] = F::ONE; } - let r_prime_f = r_prime.map(F::from_canonical_u32); - core_row.r_inv = r_prime_f.map(|r| (r - F::from_canonical_u32(256)).inverse()); + let r_prime_f = r_prime.map(F::from_u32); + core_row.r_inv = r_prime_f.map(|r| (r - F::from_u32(256)).inverse()); core_row.r_prime = r_prime_f; - let r_sum_f = r - .iter() - .fold(F::ZERO, |acc, r| acc + F::from_canonical_u32(*r)); + let r_sum_f = r.iter().fold(F::ZERO, |acc, r| acc + F::from_u32(*r)); core_row.r_sum_inv = r_sum_f.try_inverse().unwrap_or(F::ZERO); - let c_sum_f = F::from_canonical_u32(record.c.iter().fold(0, |acc, c| acc + *c as u32)); + let c_sum_f = F::from_u32(record.c.iter().fold(0, |acc, c| acc + *c as u32)); core_row.c_sum_inv = c_sum_f.try_inverse().unwrap_or(F::ZERO); core_row.sign_xor = F::from_bool(sign_xor); @@ -558,10 +556,10 @@ where core_row.r_zero = F::from_bool(r_zero); core_row.zero_divisor = F::from_bool(case == DivRemCoreSpecialCase::ZeroDivisor); - core_row.r = r.map(F::from_canonical_u32); - core_row.q = q.map(F::from_canonical_u32); - core_row.c = record.c.map(F::from_canonical_u8); - core_row.b = record.b.map(F::from_canonical_u8); + core_row.r = r.map(F::from_u32); + core_row.q = q.map(F::from_u32); + core_row.c = record.c.map(F::from_u8); + core_row.b = record.b.map(F::from_u8); } } diff --git a/extensions/rv32im/circuit/src/divrem/tests.rs b/extensions/rv32im/circuit/src/divrem/tests.rs index 79347b0768..904b0ff0f4 100644 --- a/extensions/rv32im/circuit/src/divrem/tests.rs +++ b/extensions/rv32im/circuit/src/divrem/tests.rs @@ -25,7 +25,7 @@ use openvm_instructions::{instruction::Instruction, LocalOpcode}; use openvm_rv32im_transpiler::DivRemOpcode::{self, *}; use openvm_stark_backend::{ p3_air::BaseAir, - p3_field::{Field, FieldAlgebra}, + p3_field::{Field, PrimeCharacteristicRing}, p3_matrix::{ dense::{DenseMatrix, RowMajorMatrix}, Matrix, @@ -155,15 +155,15 @@ fn set_and_execute>( >(rng)); let c = c.unwrap_or(limb_sra::( generate_long_number::(rng), - rng.gen_range(0..(RV32_REGISTER_NUM_LIMBS - 1)), + rng.random_range(0..(RV32_REGISTER_NUM_LIMBS - 1)), )); let rs1 = gen_pointer(rng, 4); let rs2 = gen_pointer(rng, 4); let rd = gen_pointer(rng, 4); - tester.write::(1, rs1, b.map(F::from_canonical_u32)); - tester.write::(1, rs2, c.map(F::from_canonical_u32)); + tester.write::(1, rs1, b.map(F::from_u32)); + tester.write::(1, rs2, c.map(F::from_u32)); let is_div = opcode == DIV || opcode == DIVU; let is_signed = opcode == DIV || opcode == REM; @@ -177,7 +177,7 @@ fn set_and_execute>( ); assert_eq!( - (if is_div { q } else { r }).map(F::from_canonical_u32), + (if is_div { q } else { r }).map(F::from_u32), tester.read::(1, rd) ); } @@ -340,28 +340,24 @@ fn run_negative_divrem_test( let adapter_width = BaseAir::::width(&harness.air.adapter); let modify_trace = |trace: &mut DenseMatrix| { - let mut values = trace.row_slice(0).to_vec(); + let mut values = trace.row_slice(0).expect("row exists").to_vec(); let cols: &mut DivRemCoreCols = values.split_at_mut(adapter_width).1.borrow_mut(); if let Some(q) = prank_vals.q { - cols.q = q.map(F::from_canonical_u32); + cols.q = q.map(F::from_u32); } if let Some(r) = prank_vals.r { - cols.r = r.map(F::from_canonical_u32); + cols.r = r.map(F::from_u32); let r_sum = r.iter().sum::(); - cols.r_sum_inv = F::from_canonical_u32(r_sum) - .try_inverse() - .unwrap_or(F::ZERO); + cols.r_sum_inv = F::from_u32(r_sum).try_inverse().unwrap_or(F::ZERO); } if let Some(r_prime) = prank_vals.r_prime { - cols.r_prime = r_prime.map(F::from_canonical_u32); - cols.r_inv = cols - .r_prime - .map(|r| (r - F::from_canonical_u32(256)).inverse()); + cols.r_prime = r_prime.map(F::from_u32); + cols.r_inv = cols.r_prime.map(|r| (r - F::from_u32(256)).inverse()); } if let Some(diff_val) = prank_vals.diff_val { - cols.lt_diff = F::from_canonical_u32(diff_val); + cols.lt_diff = F::from_u32(diff_val); } if let Some(zero_divisor) = prank_vals.zero_divisor { cols.zero_divisor = F::from_bool(zero_divisor); diff --git a/extensions/rv32im/circuit/src/extension/mod.rs b/extensions/rv32im/circuit/src/extension/mod.rs index 726684e860..94bf0ec237 100644 --- a/extensions/rv32im/circuit/src/extension/mod.rs +++ b/extensions/rv32im/circuit/src/extension/mod.rs @@ -771,7 +771,7 @@ mod phantom { (hint.len() as u32) .to_le_bytes() .iter() - .map(|b| F::from_canonical_u8(*b)), + .map(|b| F::from_u8(*b)), ); // Extend by 0 for 4 byte alignment let capacity = hint.len().div_ceil(4) * 4; @@ -799,9 +799,9 @@ mod phantom { let len = read_rv32_register(memory, a) as usize; streams.hint_stream.clear(); - streams.hint_stream.extend( - std::iter::repeat_with(|| F::from_canonical_u8(rng.gen::())).take(len * 4), - ); + streams + .hint_stream + .extend(std::iter::repeat_with(|| F::from_u8(rng.random::())).take(len * 4)); Ok(()) } } @@ -866,7 +866,7 @@ mod phantom { offset += 4; let v = (0..v_len) .map(|_| { - let ret = F::from_canonical_u32(extract_u32(value, offset)); + let ret = F::from_u32(extract_u32(value, offset)); offset += 4; ret }) diff --git a/extensions/rv32im/circuit/src/hintstore/mod.rs b/extensions/rv32im/circuit/src/hintstore/mod.rs index 35955bb979..1f094e05e2 100644 --- a/extensions/rv32im/circuit/src/hintstore/mod.rs +++ b/extensions/rv32im/circuit/src/hintstore/mod.rs @@ -29,7 +29,7 @@ use openvm_rv32im_transpiler::{ use openvm_stark_backend::{ interaction::InteractionBuilder, p3_air::{Air, AirBuilder, BaseAir}, - p3_field::{Field, FieldAlgebra, PrimeField32}, + p3_field::{Field, PrimeCharacteristicRing, PrimeField32}, p3_matrix::{dense::RowMajorMatrix, Matrix}, p3_maybe_rayon::prelude::*, rap::{BaseAirWithPublicValues, PartitionedBaseAir}, @@ -91,16 +91,16 @@ impl PartitionedBaseAir for Rv32HintStoreAir {} impl Air for Rv32HintStoreAir { fn eval(&self, builder: &mut AB) { let main = builder.main(); - let local = main.row_slice(0); + let local = main.row_slice(0).expect("window should have two elements"); let local_cols: &Rv32HintStoreCols = (*local).borrow(); - let next = main.row_slice(1); + let next = main.row_slice(1).expect("window should have two elements"); let next_cols: &Rv32HintStoreCols = (*next).borrow(); let timestamp: AB::Var = local_cols.from_state.timestamp; let mut timestamp_delta: usize = 0; let mut timestamp_pp = || { timestamp_delta += 1; - timestamp + AB::Expr::from_canonical_usize(timestamp_delta - 1) + timestamp + AB::Expr::from_usize(timestamp_delta - 1) }; builder.assert_bool(local_cols.is_single); @@ -123,14 +123,13 @@ impl Air for Rv32HintStoreAir { let mut mem_ptr = AB::Expr::ZERO; let mut next_mem_ptr = AB::Expr::ZERO; for i in (0..RV32_REGISTER_NUM_LIMBS).rev() { - rem_words = rem_words * AB::F::from_canonical_u32(1 << RV32_CELL_BITS) - + local_cols.rem_words_limbs[i]; - next_rem_words = next_rem_words * AB::F::from_canonical_u32(1 << RV32_CELL_BITS) + rem_words = + rem_words * AB::F::from_u32(1 << RV32_CELL_BITS) + local_cols.rem_words_limbs[i]; + next_rem_words = next_rem_words * AB::F::from_u32(1 << RV32_CELL_BITS) + next_cols.rem_words_limbs[i]; - mem_ptr = mem_ptr * AB::F::from_canonical_u32(1 << RV32_CELL_BITS) - + local_cols.mem_ptr_limbs[i]; - next_mem_ptr = next_mem_ptr * AB::F::from_canonical_u32(1 << RV32_CELL_BITS) - + next_cols.mem_ptr_limbs[i]; + mem_ptr = mem_ptr * AB::F::from_u32(1 << RV32_CELL_BITS) + local_cols.mem_ptr_limbs[i]; + next_mem_ptr = + next_mem_ptr * AB::F::from_u32(1 << RV32_CELL_BITS) + next_cols.mem_ptr_limbs[i]; } // Constrain that if local is invalid, then the next state is invalid as well @@ -150,10 +149,7 @@ impl Air for Rv32HintStoreAir { // read mem_ptr self.memory_bridge .read( - MemoryAddress::new( - AB::F::from_canonical_u32(RV32_REGISTER_AS), - local_cols.mem_ptr_ptr, - ), + MemoryAddress::new(AB::F::from_u32(RV32_REGISTER_AS), local_cols.mem_ptr_ptr), local_cols.mem_ptr_limbs, timestamp_pp(), &local_cols.mem_ptr_aux_cols, @@ -163,10 +159,7 @@ impl Air for Rv32HintStoreAir { // read num_words self.memory_bridge .read( - MemoryAddress::new( - AB::F::from_canonical_u32(RV32_REGISTER_AS), - local_cols.num_words_ptr, - ), + MemoryAddress::new(AB::F::from_u32(RV32_REGISTER_AS), local_cols.num_words_ptr), local_cols.rem_words_limbs, timestamp_pp(), &local_cols.num_words_aux_cols, @@ -176,16 +169,15 @@ impl Air for Rv32HintStoreAir { // write hint self.memory_bridge .write( - MemoryAddress::new(AB::F::from_canonical_u32(RV32_MEMORY_AS), mem_ptr.clone()), + MemoryAddress::new(AB::F::from_u32(RV32_MEMORY_AS), mem_ptr.clone()), local_cols.data, timestamp_pp(), &local_cols.write_aux, ) .eval(builder, is_valid.clone()); let expected_opcode = (local_cols.is_single - * AB::F::from_canonical_usize(HINT_STOREW as usize + self.offset)) - + (local_cols.is_buffer - * AB::F::from_canonical_usize(HINT_BUFFER as usize + self.offset)); + * AB::F::from_usize(HINT_STOREW as usize + self.offset)) + + (local_cols.is_buffer * AB::F::from_usize(HINT_BUFFER as usize + self.offset)); self.execution_bridge .execute_and_increment_pc( @@ -194,11 +186,11 @@ impl Air for Rv32HintStoreAir { local_cols.is_buffer * (local_cols.num_words_ptr), local_cols.mem_ptr_ptr.into(), AB::Expr::ZERO, - AB::Expr::from_canonical_u32(RV32_REGISTER_AS), - AB::Expr::from_canonical_u32(RV32_MEMORY_AS), + AB::Expr::from_u32(RV32_REGISTER_AS), + AB::Expr::from_u32(RV32_MEMORY_AS), ], local_cols.from_state, - rem_words.clone() * AB::F::from_canonical_usize(timestamp_delta), + rem_words.clone() * AB::F::from_usize(timestamp_delta), ) .eval(builder, is_start.clone()); @@ -209,11 +201,11 @@ impl Air for Rv32HintStoreAir { self.bitwise_operation_lookup_bus .send_range( local_cols.mem_ptr_limbs[RV32_REGISTER_NUM_LIMBS - 1] - * AB::F::from_canonical_usize( + * AB::F::from_usize( 1 << (RV32_REGISTER_NUM_LIMBS * RV32_CELL_BITS - self.pointer_max_bits), ), local_cols.rem_words_limbs[RV32_REGISTER_NUM_LIMBS - 1] - * AB::F::from_canonical_usize( + * AB::F::from_usize( 1 << (RV32_REGISTER_NUM_LIMBS * RV32_CELL_BITS - self.pointer_max_bits), ), ) @@ -254,10 +246,10 @@ impl Air for Rv32HintStoreAir { // bounds memory access will be rejected by the memory bus before we overflow the field. when_buffer_transition.assert_eq( next_mem_ptr.clone() - mem_ptr.clone(), - AB::F::from_canonical_usize(RV32_REGISTER_NUM_LIMBS), + AB::F::from_usize(RV32_REGISTER_NUM_LIMBS), ); when_buffer_transition.assert_eq( - timestamp + AB::F::from_canonical_usize(timestamp_delta), + timestamp + AB::F::from_usize(timestamp_delta), next_cols.from_state.timestamp, ); } @@ -556,7 +548,7 @@ impl TraceFiller for Rv32HintStoreFiller { timestamp + 1, cols.num_words_aux_cols.as_mut(), ); - cols.num_words_ptr = F::from_canonical_u32(record.inner.num_words_ptr); + cols.num_words_ptr = F::from_u32(record.inner.num_words_ptr); } else { mem_helper.fill_zero(cols.num_words_aux_cols.as_mut()); cols.num_words_ptr = F::ZERO; @@ -565,13 +557,10 @@ impl TraceFiller for Rv32HintStoreFiller { cols.is_buffer_start = F::from_bool(idx == 0 && !is_single); // Note: writing in reverse - cols.data = var.data.map(|x| F::from_canonical_u8(x)); + cols.data = var.data.map(|x| F::from_u8(x)); - cols.write_aux.set_prev_data( - var.data_write_aux - .prev_data - .map(|x| F::from_canonical_u8(x)), - ); + cols.write_aux + .set_prev_data(var.data_write_aux.prev_data.map(|x| F::from_u8(x))); mem_helper.fill( var.data_write_aux.prev_timestamp, timestamp + 2, @@ -589,15 +578,15 @@ impl TraceFiller for Rv32HintStoreFiller { } mem_ptr -= RV32_REGISTER_NUM_LIMBS as u32; - cols.mem_ptr_limbs = mem_ptr.to_le_bytes().map(|x| F::from_canonical_u8(x)); - cols.mem_ptr_ptr = F::from_canonical_u32(record.inner.mem_ptr_ptr); + cols.mem_ptr_limbs = mem_ptr.to_le_bytes().map(|x| F::from_u8(x)); + cols.mem_ptr_ptr = F::from_u32(record.inner.mem_ptr_ptr); - cols.from_state.timestamp = F::from_canonical_u32(timestamp); - cols.from_state.pc = F::from_canonical_u32(record.inner.from_pc); + cols.from_state.timestamp = F::from_u32(timestamp); + cols.from_state.pc = F::from_u32(record.inner.from_pc); cols.rem_words_limbs = (num_words - idx as u32) .to_le_bytes() - .map(|x| F::from_canonical_u8(x)); + .map(|x| F::from_u8(x)); cols.is_buffer = F::from_bool(!is_single); cols.is_single = F::from_bool(is_single); }); diff --git a/extensions/rv32im/circuit/src/hintstore/tests.rs b/extensions/rv32im/circuit/src/hintstore/tests.rs index e79066aae6..5cc9e01f27 100644 --- a/extensions/rv32im/circuit/src/hintstore/tests.rs +++ b/extensions/rv32im/circuit/src/hintstore/tests.rs @@ -21,7 +21,7 @@ use openvm_instructions::{ }; use openvm_rv32im_transpiler::Rv32HintStoreOpcode::{self, *}; use openvm_stark_backend::{ - p3_field::FieldAlgebra, + p3_field::PrimeCharacteristicRing, p3_matrix::{ dense::{DenseMatrix, RowMajorMatrix}, Matrix, @@ -107,7 +107,7 @@ fn set_and_execute>( ) { let num_words = match opcode { HINT_STOREW => 1, - HINT_BUFFER => rng.gen_range(1..28), + HINT_BUFFER => rng.random_range(1..28), } as u32; let a = if opcode == HINT_BUFFER { @@ -115,7 +115,7 @@ fn set_and_execute>( tester.write( RV32_REGISTER_AS as usize, a, - num_words.to_le_bytes().map(F::from_canonical_u8), + num_words.to_le_bytes().map(F::from_u8), ); a } else { @@ -124,11 +124,11 @@ fn set_and_execute>( let mem_ptr = gen_pointer(rng, 4) as u32; let b = gen_pointer(rng, RV32_REGISTER_NUM_LIMBS); - tester.write(1, b, mem_ptr.to_le_bytes().map(F::from_canonical_u8)); + tester.write(1, b, mem_ptr.to_le_bytes().map(F::from_u8)); let mut input = Vec::with_capacity(num_words as usize * 4); for _ in 0..num_words { - let data = rng.next_u32().to_le_bytes().map(F::from_canonical_u8); + let data = rng.next_u32().to_le_bytes().map(F::from_u8); input.extend(data); tester.streams_mut().hint_stream.extend(data); } @@ -165,7 +165,7 @@ fn rand_hintstore_test() { let (mut harness, bitwise) = create_harness(&mut tester); let num_ops: usize = 100; for _ in 0..num_ops { - let opcode = if rng.gen_bool(0.5) { + let opcode = if rng.random_bool(0.5) { HINT_STOREW } else { HINT_BUFFER @@ -213,10 +213,10 @@ fn run_negative_hintstore_test( ); let modify_trace = |trace: &mut DenseMatrix| { - let mut trace_row = trace.row_slice(0).to_vec(); + let mut trace_row = trace.row_slice(0).expect("row exists").to_vec(); let cols: &mut Rv32HintStoreCols = trace_row.as_mut_slice().borrow_mut(); if let Some(data) = prank_data { - cols.data = data.map(F::from_canonical_u32); + cols.data = data.map(F::from_u32); } *trace = RowMajorMatrix::new(trace_row, trace.width()); }; @@ -310,7 +310,7 @@ fn test_cuda_rand_hintstore_tracegen() { let mut harness = create_cuda_harness(&tester); let num_ops = 50; for _ in 0..num_ops { - let opcode = if rng.gen_bool(0.5) { + let opcode = if rng.random_bool(0.5) { HINT_STOREW } else { HINT_BUFFER diff --git a/extensions/rv32im/circuit/src/jal_lui/core.rs b/extensions/rv32im/circuit/src/jal_lui/core.rs index 1662d6400c..10dde30300 100644 --- a/extensions/rv32im/circuit/src/jal_lui/core.rs +++ b/extensions/rv32im/circuit/src/jal_lui/core.rs @@ -18,7 +18,7 @@ use openvm_rv32im_transpiler::Rv32JalLuiOpcode::{self, *}; use openvm_stark_backend::{ interaction::InteractionBuilder, p3_air::{AirBuilder, BaseAir}, - p3_field::{Field, FieldAlgebra, PrimeField32}, + p3_field::{Field, PrimeCharacteristicRing, PrimeField32}, rap::BaseAirWithPublicValues, }; @@ -89,7 +89,7 @@ where let last_limb_bits = PC_BITS - RV32_CELL_BITS * (RV32_REGISTER_NUM_LIMBS - 1); let additional_bits = (last_limb_bits..RV32_CELL_BITS).fold(0, |acc, x| acc + (1 << x)); - let additional_bits = AB::F::from_canonical_u32(additional_bits); + let additional_bits = AB::F::from_u32(additional_bits); self.bus .send_xor(rd[3], additional_bits, rd[3] + additional_bits) .eval(builder, is_jal); @@ -99,29 +99,27 @@ where .skip(1) .enumerate() .fold(AB::Expr::ZERO, |acc, (i, &val)| { - acc + val * AB::Expr::from_canonical_u32(1 << (i * RV32_CELL_BITS)) + acc + val * AB::Expr::from_u32(1 << (i * RV32_CELL_BITS)) }); // Constrain that imm * 2^4 is the correct composition of intermed_val in case of LUI builder.when(is_lui).assert_eq( intermed_val.clone(), - imm * AB::F::from_canonical_u32(1 << (12 - RV32_CELL_BITS)), + imm * AB::F::from_u32(1 << (12 - RV32_CELL_BITS)), ); - let intermed_val = rd[0] + intermed_val * AB::Expr::from_canonical_u32(1 << RV32_CELL_BITS); + let intermed_val = rd[0] + intermed_val * AB::Expr::from_u32(1 << RV32_CELL_BITS); // Constrain that from_pc + DEFAULT_PC_STEP is the correct composition of intermed_val in // case of JAL - builder.when(is_jal).assert_eq( - intermed_val, - from_pc + AB::F::from_canonical_u32(DEFAULT_PC_STEP), - ); + builder + .when(is_jal) + .assert_eq(intermed_val, from_pc + AB::F::from_u32(DEFAULT_PC_STEP)); - let to_pc = from_pc + is_lui * AB::F::from_canonical_u32(DEFAULT_PC_STEP) + is_jal * imm; + let to_pc = from_pc + is_lui * AB::F::from_u32(DEFAULT_PC_STEP) + is_jal * imm; let expected_opcode = VmCoreAir::::expr_to_global_expr( self, - is_lui * AB::F::from_canonical_u32(LUI as u32) - + is_jal * AB::F::from_canonical_u32(JAL as u32), + is_lui * AB::F::from_u32(LUI as u32) + is_jal * AB::F::from_u32(JAL as u32), ); AdapterAirContext { @@ -235,8 +233,8 @@ where // Writing in reverse order core_row.is_lui = F::from_bool(!record.is_jal); core_row.is_jal = F::from_bool(record.is_jal); - core_row.rd_data = record.rd_data.map(F::from_canonical_u8); - core_row.imm = F::from_canonical_u32(record.imm); + core_row.rd_data = record.rd_data.map(F::from_u8); + core_row.imm = F::from_u32(record.imm); } } diff --git a/extensions/rv32im/circuit/src/jal_lui/tests.rs b/extensions/rv32im/circuit/src/jal_lui/tests.rs index 715528072d..a2666dfadf 100644 --- a/extensions/rv32im/circuit/src/jal_lui/tests.rs +++ b/extensions/rv32im/circuit/src/jal_lui/tests.rs @@ -15,7 +15,7 @@ use openvm_instructions::{instruction::Instruction, program::PC_BITS, LocalOpcod use openvm_rv32im_transpiler::Rv32JalLuiOpcode::{self, *}; use openvm_stark_backend::{ p3_air::BaseAir, - p3_field::{FieldAlgebra, PrimeField32}, + p3_field::{PrimeCharacteristicRing, PrimeField32}, p3_matrix::{ dense::{DenseMatrix, RowMajorMatrix}, Matrix, @@ -110,13 +110,13 @@ fn set_and_execute>( imm: Option, initial_pc: Option, ) { - let imm: i32 = imm.unwrap_or(rng.gen_range(0..(1 << IMM_BITS))); + let imm: i32 = imm.unwrap_or(rng.random_range(0..(1 << IMM_BITS))); let imm = match opcode { JAL => ((imm >> 1) << 2) - (1 << IMM_BITS), LUI => imm, }; - let a = rng.gen_range((opcode == LUI) as usize..32) << 2; + let a = rng.random_range((opcode == LUI) as usize..32) << 2; let needs_write = a != 0 || opcode == LUI; tester.execute_with_pc( @@ -132,7 +132,7 @@ fn set_and_execute>( needs_write as isize, 0, ), - initial_pc.unwrap_or(rng.gen_range(imm.unsigned_abs()..(1 << PC_BITS))), + initial_pc.unwrap_or(rng.random_range(imm.unsigned_abs()..(1 << PC_BITS))), ); let initial_pc = tester.last_from_pc().as_canonical_u32(); let final_pc = tester.last_to_pc().as_canonical_u32(); @@ -141,7 +141,7 @@ fn set_and_execute>( let rd_data = if needs_write { rd_data } else { [0; 4] }; assert_eq!(next_pc, final_pc); - assert_eq!(rd_data.map(F::from_canonical_u8), tester.read::<4>(1, a)); + assert_eq!(rd_data.map(F::from_u8), tester.read::<4>(1, a)); } /////////////////////////////////////////////////////////////////////////////////////// @@ -217,19 +217,19 @@ fn run_negative_jal_lui_test( let adapter_width = BaseAir::::width(&harness.air.adapter); let modify_trace = |trace: &mut DenseMatrix| { - let mut trace_row = trace.row_slice(0).to_vec(); + let mut trace_row = trace.row_slice(0).expect("row exists").to_vec(); let (adapter_row, core_row) = trace_row.split_at_mut(adapter_width); let adapter_cols: &mut Rv32CondRdWriteAdapterCols = adapter_row.borrow_mut(); let core_cols: &mut Rv32JalLuiCoreCols = core_row.borrow_mut(); if let Some(data) = prank_vals.rd_data { - core_cols.rd_data = data.map(F::from_canonical_u32); + core_cols.rd_data = data.map(F::from_u32); } if let Some(imm) = prank_vals.imm { core_cols.imm = if imm < 0 { - F::NEG_ONE * F::from_canonical_u32((-imm) as u32) + F::NEG_ONE * F::from_u32((-imm) as u32) } else { - F::from_canonical_u32(imm as u32) + F::from_u32(imm as u32) }; } if let Some(is_jal) = prank_vals.is_jal { diff --git a/extensions/rv32im/circuit/src/jalr/core.rs b/extensions/rv32im/circuit/src/jalr/core.rs index d912d0148e..3e84a5f015 100644 --- a/extensions/rv32im/circuit/src/jalr/core.rs +++ b/extensions/rv32im/circuit/src/jalr/core.rs @@ -22,7 +22,7 @@ use openvm_rv32im_transpiler::Rv32JalrOpcode::{self, *}; use openvm_stark_backend::{ interaction::InteractionBuilder, p3_air::{AirBuilder, BaseAir}, - p3_field::{Field, FieldAlgebra, PrimeField32}, + p3_field::{Field, PrimeCharacteristicRing, PrimeField32}, rap::BaseAirWithPublicValues, }; @@ -92,10 +92,10 @@ where .iter() .enumerate() .fold(AB::Expr::ZERO, |acc, (i, &val)| { - acc + val * AB::Expr::from_canonical_u32(1 << ((i + 1) * RV32_CELL_BITS)) + acc + val * AB::Expr::from_u32(1 << ((i + 1) * RV32_CELL_BITS)) }); - let least_sig_limb = from_pc + AB::F::from_canonical_u32(DEFAULT_PC_STEP) - composed; + let least_sig_limb = from_pc + AB::F::from_u32(DEFAULT_PC_STEP) - composed; // rd_data is the final decomposition of `from_pc + DEFAULT_PC_STEP` we need. // The range check on `least_sig_limb` also ensures that `rd_data` correctly represents @@ -127,15 +127,15 @@ where // Constrain to_pc_least_sig_bit + 2 * to_pc_limbs = rs1 + imm as a i32 addition with 2 // limbs RISC-V spec explicitly sets the least significant bit of `to_pc` to 0 - let rs1_limbs_01 = rs1[0] + rs1[1] * AB::F::from_canonical_u32(1 << RV32_CELL_BITS); - let rs1_limbs_23 = rs1[2] + rs1[3] * AB::F::from_canonical_u32(1 << RV32_CELL_BITS); - let inv = AB::F::from_canonical_u32(1 << 16).inverse(); + let rs1_limbs_01 = rs1[0] + rs1[1] * AB::F::from_u32(1 << RV32_CELL_BITS); + let rs1_limbs_23 = rs1[2] + rs1[3] * AB::F::from_u32(1 << RV32_CELL_BITS); + let inv = AB::F::from_u32(1 << 16).inverse(); builder.assert_bool(to_pc_least_sig_bit); let carry = (rs1_limbs_01 + imm - to_pc_limbs[0] * AB::F::TWO - to_pc_least_sig_bit) * inv; builder.when(is_valid).assert_bool(carry.clone()); - let imm_extend_limb = imm_sign * AB::F::from_canonical_u32((1 << 16) - 1); + let imm_extend_limb = imm_sign * AB::F::from_u32((1 << 16) - 1); let carry = (rs1_limbs_23 + imm_extend_limb + carry - to_pc_limbs[1]) * inv; builder.when(is_valid).assert_bool(carry); @@ -146,8 +146,7 @@ where self.range_bus .range_check(to_pc_limbs[0], 15) .eval(builder, is_valid); - let to_pc = - to_pc_limbs[0] * AB::F::TWO + to_pc_limbs[1] * AB::F::from_canonical_u32(1 << 16); + let to_pc = to_pc_limbs[0] * AB::F::TWO + to_pc_limbs[1] * AB::F::from_u32(1 << 16); let expected_opcode = VmCoreAir::::opcode_to_global_expr(self, JALR); @@ -302,20 +301,20 @@ where // Write in reverse order core_row.imm_sign = F::from_bool(record.imm_sign); - core_row.to_pc_limbs = to_pc_limbs.map(F::from_canonical_u32); + core_row.to_pc_limbs = to_pc_limbs.map(F::from_u32); core_row.to_pc_least_sig_bit = F::from_bool(to_pc & 1 == 1); // fill_trace_row is called only on valid rows core_row.is_valid = F::ONE; - core_row.rs1_data = record.rs1_val.to_le_bytes().map(F::from_canonical_u8); + core_row.rs1_data = record.rs1_val.to_le_bytes().map(F::from_u8); core_row .rd_data .iter_mut() .rev() .zip(rd_data.iter().skip(1).rev()) .for_each(|(dst, src)| { - *dst = F::from_canonical_u8(*src); + *dst = F::from_u8(*src); }); - core_row.imm = F::from_canonical_u16(record.imm); + core_row.imm = F::from_u16(record.imm); } } diff --git a/extensions/rv32im/circuit/src/jalr/tests.rs b/extensions/rv32im/circuit/src/jalr/tests.rs index 568a7edd49..902ca0b441 100644 --- a/extensions/rv32im/circuit/src/jalr/tests.rs +++ b/extensions/rv32im/circuit/src/jalr/tests.rs @@ -24,7 +24,7 @@ use openvm_rv32im_transpiler::BaseAluOpcode::ADD; use openvm_rv32im_transpiler::Rv32JalrOpcode::{self, *}; use openvm_stark_backend::{ p3_air::BaseAir, - p3_field::{FieldAlgebra, PrimeField32}, + p3_field::{PrimeCharacteristicRing, PrimeField32}, p3_matrix::{ dense::{DenseMatrix, RowMajorMatrix}, Matrix, @@ -129,19 +129,19 @@ fn set_and_execute>( initial_pc: Option, rs1: Option<[u32; RV32_REGISTER_NUM_LIMBS]>, ) { - let imm = initial_imm.unwrap_or(rng.gen_range(0..(1 << IMM_BITS))); - let imm_sign = initial_imm_sign.unwrap_or(rng.gen_range(0..2)); + let imm = initial_imm.unwrap_or(rng.random_range(0..(1 << IMM_BITS))); + let imm_sign = initial_imm_sign.unwrap_or(rng.random_range(0..2)); let imm_ext = imm + (imm_sign * 0xffff0000); - let a = rng.gen_range(0..32) << 2; - let b = rng.gen_range(1..32) << 2; - let to_pc = rng.gen_range(0..(1 << PC_BITS)); + let a = rng.random_range(0..32) << 2; + let b = rng.random_range(1..32) << 2; + let to_pc = rng.random_range(0..(1 << PC_BITS)); let rs1 = rs1.unwrap_or(into_limbs((to_pc as u32).wrapping_sub(imm_ext))); - let rs1 = rs1.map(F::from_canonical_u32); + let rs1 = rs1.map(F::from_u32); tester.write(1, b, rs1); - let initial_pc = initial_pc.unwrap_or(rng.gen_range(0..(1 << PC_BITS))); + let initial_pc = initial_pc.unwrap_or(rng.random_range(0..(1 << PC_BITS))); tester.execute_with_pc( executor, arena, @@ -167,7 +167,7 @@ fn set_and_execute>( let rd_data = if a == 0 { [0; 4] } else { rd_data }; assert_eq!(next_pc & !1, final_pc); - assert_eq!(rd_data.map(F::from_canonical_u8), tester.read::<4>(1, a)); + assert_eq!(rd_data.map(F::from_u8), tester.read::<4>(1, a)); } /////////////////////////////////////////////////////////////////////////////////////// @@ -250,24 +250,24 @@ fn run_negative_jalr_test( let adapter_width = BaseAir::::width(&harness.air.adapter); let modify_trace = |trace: &mut DenseMatrix| { - let mut trace_row = trace.row_slice(0).to_vec(); + let mut trace_row = trace.row_slice(0).expect("row exists").to_vec(); let (_, core_row) = trace_row.split_at_mut(adapter_width); let core_cols: &mut Rv32JalrCoreCols = core_row.borrow_mut(); if let Some(data) = prank_vals.rd_data { - core_cols.rd_data = data.map(F::from_canonical_u32); + core_cols.rd_data = data.map(F::from_u32); } if let Some(data) = prank_vals.rs1_data { - core_cols.rs1_data = data.map(F::from_canonical_u32); + core_cols.rs1_data = data.map(F::from_u32); } if let Some(data) = prank_vals.to_pc_least_sig_bit { - core_cols.to_pc_least_sig_bit = F::from_canonical_u32(data); + core_cols.to_pc_least_sig_bit = F::from_u32(data); } if let Some(data) = prank_vals.to_pc_limbs { - core_cols.to_pc_limbs = data.map(F::from_canonical_u32); + core_cols.to_pc_limbs = data.map(F::from_u32); } if let Some(data) = prank_vals.imm_sign { - core_cols.imm_sign = F::from_canonical_u32(data); + core_cols.imm_sign = F::from_u32(data); } *trace = RowMajorMatrix::new(trace_row, trace.width()); @@ -347,7 +347,7 @@ fn overflow_negative_tests() { Some(0), JalrPrankValues { to_pc_limbs: Some([ - (F::NEG_ONE * F::from_canonical_u32((1 << 14) + 1)).as_canonical_u32(), + (F::NEG_ONE * F::from_u32((1 << 14) + 1)).as_canonical_u32(), 1, ]), ..Default::default() diff --git a/extensions/rv32im/circuit/src/less_than/core.rs b/extensions/rv32im/circuit/src/less_than/core.rs index 2dfcece2ce..daeca07390 100644 --- a/extensions/rv32im/circuit/src/less_than/core.rs +++ b/extensions/rv32im/circuit/src/less_than/core.rs @@ -18,7 +18,7 @@ use openvm_rv32im_transpiler::LessThanOpcode; use openvm_stark_backend::{ interaction::InteractionBuilder, p3_air::{AirBuilder, BaseAir}, - p3_field::{Field, FieldAlgebra, PrimeField32}, + p3_field::{Field, PrimeCharacteristicRing, PrimeField32}, rap::BaseAirWithPublicValues, }; use strum::IntoEnumIterator; @@ -94,17 +94,15 @@ where let b_diff = b[NUM_LIMBS - 1] - cols.b_msb_f; let c_diff = c[NUM_LIMBS - 1] - cols.c_msb_f; - builder - .assert_zero(b_diff.clone() * (AB::Expr::from_canonical_u32(1 << LIMB_BITS) - b_diff)); - builder - .assert_zero(c_diff.clone() * (AB::Expr::from_canonical_u32(1 << LIMB_BITS) - c_diff)); + builder.assert_zero(b_diff.clone() * (AB::Expr::from_u32(1 << LIMB_BITS) - b_diff)); + builder.assert_zero(c_diff.clone() * (AB::Expr::from_u32(1 << LIMB_BITS) - c_diff)); for i in (0..NUM_LIMBS).rev() { let diff = (if i == NUM_LIMBS - 1 { cols.c_msb_f - cols.b_msb_f } else { c[i] - b[i] - }) * (AB::Expr::from_canonical_u8(2) * cols.cmp_result - AB::Expr::ONE); + }) * (AB::Expr::from_u8(2) * cols.cmp_result - AB::Expr::ONE); prefix_sum += marker[i].into(); builder.assert_bool(marker[i]); builder.assert_zero(not::(prefix_sum.clone()) * diff.clone()); @@ -123,10 +121,8 @@ where // Check if b_msb_f and c_msb_f are in [-128, 127) if signed, [0, 256) if unsigned. self.bus .send_range( - cols.b_msb_f - + AB::Expr::from_canonical_u32(1 << (LIMB_BITS - 1)) * cols.opcode_slt_flag, - cols.c_msb_f - + AB::Expr::from_canonical_u32(1 << (LIMB_BITS - 1)) * cols.opcode_slt_flag, + cols.b_msb_f + AB::Expr::from_u32(1 << (LIMB_BITS - 1)) * cols.opcode_slt_flag, + cols.c_msb_f + AB::Expr::from_u32(1 << (LIMB_BITS - 1)) * cols.opcode_slt_flag, ) .eval(builder, is_valid.clone()); @@ -139,9 +135,9 @@ where .iter() .zip(LessThanOpcode::iter()) .fold(AB::Expr::ZERO, |acc, (flag, opcode)| { - acc + (*flag).into() * AB::Expr::from_canonical_u8(opcode as u8) + acc + (*flag).into() * AB::Expr::from_u8(opcode as u8) }) - + AB::Expr::from_canonical_usize(self.offset); + + AB::Expr::from_usize(self.offset); let mut a: [AB::Expr; NUM_LIMBS] = array::from_fn(|_| AB::Expr::ZERO); a[0] = cols.cmp_result.into(); @@ -274,23 +270,23 @@ where // b_msb_f and c_msb_f if not let (b_msb_f, b_msb_range) = if b_sign { ( - -F::from_canonical_u16((1u16 << LIMB_BITS) - record.b[NUM_LIMBS - 1] as u16), + -F::from_u16((1u16 << LIMB_BITS) - record.b[NUM_LIMBS - 1] as u16), record.b[NUM_LIMBS - 1] - (1u8 << (LIMB_BITS - 1)), ) } else { ( - F::from_canonical_u8(record.b[NUM_LIMBS - 1]), + F::from_u8(record.b[NUM_LIMBS - 1]), record.b[NUM_LIMBS - 1] + ((is_slt as u8) << (LIMB_BITS - 1)), ) }; let (c_msb_f, c_msb_range) = if c_sign { ( - -F::from_canonical_u16((1u16 << LIMB_BITS) - record.c[NUM_LIMBS - 1] as u16), + -F::from_u16((1u16 << LIMB_BITS) - record.c[NUM_LIMBS - 1] as u16), record.c[NUM_LIMBS - 1] - (1u8 << (LIMB_BITS - 1)), ) } else { ( - F::from_canonical_u8(record.c[NUM_LIMBS - 1]), + F::from_u8(record.c[NUM_LIMBS - 1]), record.c[NUM_LIMBS - 1] + ((is_slt as u8) << (LIMB_BITS - 1)), ) }; @@ -304,9 +300,9 @@ where b_msb_f - c_msb_f } } else if cmp_result { - F::from_canonical_u8(record.c[diff_idx] - record.b[diff_idx]) + F::from_u8(record.c[diff_idx] - record.b[diff_idx]) } else { - F::from_canonical_u8(record.b[diff_idx] - record.c[diff_idx]) + F::from_u8(record.b[diff_idx] - record.c[diff_idx]) }; self.bitwise_lookup_chip @@ -324,8 +320,8 @@ where core_row.opcode_sltu_flag = F::from_bool(!is_slt); core_row.opcode_slt_flag = F::from_bool(is_slt); core_row.cmp_result = F::from_bool(cmp_result); - core_row.c = record.c.map(F::from_canonical_u8); - core_row.b = record.b.map(F::from_canonical_u8); + core_row.c = record.c.map(F::from_u8); + core_row.b = record.b.map(F::from_u8); } } diff --git a/extensions/rv32im/circuit/src/less_than/tests.rs b/extensions/rv32im/circuit/src/less_than/tests.rs index 51d7457c76..c67d647e78 100644 --- a/extensions/rv32im/circuit/src/less_than/tests.rs +++ b/extensions/rv32im/circuit/src/less_than/tests.rs @@ -16,7 +16,7 @@ use openvm_instructions::LocalOpcode; use openvm_rv32im_transpiler::LessThanOpcode::{self, *}; use openvm_stark_backend::{ p3_air::BaseAir, - p3_field::{FieldAlgebra, PrimeField32}, + p3_field::{PrimeCharacteristicRing, PrimeField32}, p3_matrix::{ dense::{DenseMatrix, RowMajorMatrix}, Matrix, @@ -110,8 +110,8 @@ fn set_and_execute>( is_imm: Option, c: Option<[u8; RV32_REGISTER_NUM_LIMBS]>, ) { - let b = b.unwrap_or(array::from_fn(|_| rng.gen_range(0..=u8::MAX))); - let (c_imm, c) = if is_imm.unwrap_or(rng.gen_bool(0.5)) { + let b = b.unwrap_or(array::from_fn(|_| rng.random_range(0..=u8::MAX))); + let (c_imm, c) = if is_imm.unwrap_or(rng.random_bool(0.5)) { let (imm, c) = if let Some(c) = c { ((u32::from_le_bytes(c) & 0xFFFFFF) as usize, c) } else { @@ -121,7 +121,7 @@ fn set_and_execute>( } else { ( None, - c.unwrap_or(array::from_fn(|_| rng.gen_range(0..=u8::MAX))), + c.unwrap_or(array::from_fn(|_| rng.random_range(0..=u8::MAX))), ) }; @@ -243,7 +243,7 @@ fn run_negative_less_than_test( let adapter_width = BaseAir::::width(&harness.air.adapter); let modify_trace = |trace: &mut DenseMatrix| { - let mut values = trace.row_slice(0).to_vec(); + let mut values = trace.row_slice(0).expect("row exists").to_vec(); let cols: &mut LessThanCoreCols = values.split_at_mut(adapter_width).1.borrow_mut(); @@ -254,10 +254,10 @@ fn run_negative_less_than_test( cols.c_msb_f = i32_to_f(c_msb); } if let Some(diff_marker) = prank_vals.diff_marker { - cols.diff_marker = diff_marker.map(F::from_canonical_u32); + cols.diff_marker = diff_marker.map(F::from_u32); } if let Some(diff_val) = prank_vals.diff_val { - cols.diff_val = F::from_canonical_u32(diff_val); + cols.diff_val = F::from_u32(diff_val); } cols.cmp_result = F::from_bool(prank_cmp_result); diff --git a/extensions/rv32im/circuit/src/lib.rs b/extensions/rv32im/circuit/src/lib.rs index 9463020858..0d51306af9 100644 --- a/extensions/rv32im/circuit/src/lib.rs +++ b/extensions/rv32im/circuit/src/lib.rs @@ -5,7 +5,7 @@ use openvm_circuit::{ arch::{ AirInventory, ChipInventoryError, InitFileGenerator, MatrixRecordArena, SystemConfig, - VmBuilder, VmChipComplex, VmProverExtension, + VmBuilder, VmChipComplex, VmField, VmProverExtension, }, system::{SystemChipInventory, SystemCpuBuilder, SystemExecutor}, }; @@ -13,7 +13,6 @@ use openvm_circuit_derive::{Executor, MeteredExecutor, PreflightExecutor, VmConf use openvm_stark_backend::{ config::{StarkGenericConfig, Val}, engine::StarkEngine, - p3_field::PrimeField32, prover::cpu::{CpuBackend, CpuDevice}, }; use serde::{Deserialize, Serialize}; @@ -157,7 +156,7 @@ impl VmBuilder for Rv32ICpuBuilder where SC: StarkGenericConfig, E: StarkEngine, PD = CpuDevice>, - Val: PrimeField32, + Val: VmField, { type VmConfig = Rv32IConfig; type SystemChipInventory = SystemChipInventory; @@ -187,7 +186,7 @@ impl VmBuilder for Rv32ImCpuBuilder where SC: StarkGenericConfig, E: StarkEngine, PD = CpuDevice>, - Val: PrimeField32, + Val: VmField, { type VmConfig = Rv32ImConfig; type SystemChipInventory = SystemChipInventory; diff --git a/extensions/rv32im/circuit/src/load_sign_extend/core.rs b/extensions/rv32im/circuit/src/load_sign_extend/core.rs index 6c4193a81a..2bf85f62be 100644 --- a/extensions/rv32im/circuit/src/load_sign_extend/core.rs +++ b/extensions/rv32im/circuit/src/load_sign_extend/core.rs @@ -23,7 +23,7 @@ use openvm_rv32im_transpiler::Rv32LoadStoreOpcode::{self, *}; use openvm_stark_backend::{ interaction::InteractionBuilder, p3_air::BaseAir, - p3_field::{Field, FieldAlgebra, PrimeField32}, + p3_field::{Field, PrimeCharacteristicRing, PrimeField32}, rap::BaseAirWithPublicValues, }; @@ -106,11 +106,11 @@ where builder.assert_bool(data_most_sig_bit); builder.assert_bool(shift_most_sig_bit); - let expected_opcode = (is_loadb0 + is_loadb1) * AB::F::from_canonical_u8(LOADB as u8) - + is_loadh * AB::F::from_canonical_u8(LOADH as u8) - + AB::Expr::from_canonical_usize(Rv32LoadStoreOpcode::CLASS_OFFSET); + let expected_opcode = (is_loadb0 + is_loadb1) * AB::F::from_u8(LOADB as u8) + + is_loadh * AB::F::from_u8(LOADH as u8) + + AB::Expr::from_usize(Rv32LoadStoreOpcode::CLASS_OFFSET); - let limb_mask = data_most_sig_bit * AB::Expr::from_canonical_u32((1 << LIMB_BITS) - 1); + let limb_mask = data_most_sig_bit * AB::Expr::from_u32((1 << LIMB_BITS) - 1); // there are three parts to write_data: // - 1st limb is always shifted_read_data @@ -134,8 +134,7 @@ where self.range_bus .range_check( - most_sig_limb - - data_most_sig_bit * AB::Expr::from_canonical_u32(1 << (LIMB_BITS - 1)), + most_sig_limb - data_most_sig_bit * AB::Expr::from_u32(1 << (LIMB_BITS - 1)), LIMB_BITS - 1, ) .eval(builder, is_valid.clone()); @@ -292,8 +291,8 @@ where self.range_checker_chip .add_count((most_sig_limb - most_sig_bit) as u32, 7); - core_row.prev_data = record.prev_data.map(F::from_canonical_u8); - core_row.shifted_read_data = record.read_data.map(F::from_canonical_u8); + core_row.prev_data = record.prev_data.map(F::from_u8); + core_row.shifted_read_data = record.read_data.map(F::from_u8); core_row.shifted_read_data.rotate_left((shift & 2) as usize); core_row.data_most_sig_bit = F::from_bool(most_sig_bit != 0); diff --git a/extensions/rv32im/circuit/src/load_sign_extend/tests.rs b/extensions/rv32im/circuit/src/load_sign_extend/tests.rs index 661f8fc654..77396a9142 100644 --- a/extensions/rv32im/circuit/src/load_sign_extend/tests.rs +++ b/extensions/rv32im/circuit/src/load_sign_extend/tests.rs @@ -12,7 +12,7 @@ use openvm_instructions::{instruction::Instruction, LocalOpcode}; use openvm_rv32im_transpiler::Rv32LoadStoreOpcode::{self, *}; use openvm_stark_backend::{ p3_air::BaseAir, - p3_field::FieldAlgebra, + p3_field::PrimeCharacteristicRing, p3_matrix::{ dense::{DenseMatrix, RowMajorMatrix}, Matrix, @@ -109,8 +109,8 @@ fn set_and_execute>( imm: Option, imm_sign: Option, ) { - let imm = imm.unwrap_or(rng.gen_range(0..(1 << IMM_BITS))); - let imm_sign = imm_sign.unwrap_or(rng.gen_range(0..2)); + let imm = imm.unwrap_or(rng.random_range(0..(1 << IMM_BITS))); + let imm_sign = imm_sign.unwrap_or(rng.random_range(0..2)); let imm_ext = imm + imm_sign * (0xffff0000); let alignment = match opcode { @@ -119,28 +119,28 @@ fn set_and_execute>( _ => unreachable!(), }; - let ptr_val: u32 = rng.gen_range(0..(1 << (tester.address_bits() - alignment))) << alignment; + let ptr_val: u32 = rng.random_range(0..(1 << (tester.address_bits() - alignment))) << alignment; let rs1 = rs1.unwrap_or(ptr_val.wrapping_sub(imm_ext).to_le_bytes()); let ptr_val = imm_ext.wrapping_add(u32::from_le_bytes(rs1)); let a = gen_pointer(rng, 4); let b = gen_pointer(rng, 4); let shift_amount = ptr_val % 4; - tester.write(1, b, rs1.map(F::from_canonical_u8)); + tester.write(1, b, rs1.map(F::from_u8)); let some_prev_data: [F; RV32_REGISTER_NUM_LIMBS] = if a != 0 { - array::from_fn(|_| F::from_canonical_u8(rng.gen())) + array::from_fn(|_| F::from_u8(rng.random())) } else { [F::ZERO; RV32_REGISTER_NUM_LIMBS] }; let read_data: [u8; RV32_REGISTER_NUM_LIMBS] = - read_data.unwrap_or(array::from_fn(|_| rng.gen())); + read_data.unwrap_or(array::from_fn(|_| rng.random())); tester.write(1, a, some_prev_data); tester.write( 2, (ptr_val - shift_amount) as usize, - read_data.map(F::from_canonical_u8), + read_data.map(F::from_u8), ); tester.execute( @@ -162,7 +162,7 @@ fn set_and_execute>( let write_data = run_write_data_sign_extend(opcode, read_data, shift_amount as usize); if a != 0 { - assert_eq!(write_data.map(F::from_canonical_u8), tester.read::<4>(1, a)); + assert_eq!(write_data.map(F::from_u8), tester.read::<4>(1, a)); } else { assert_eq!([F::ZERO; 4], tester.read::<4>(1, a)); } @@ -241,19 +241,19 @@ fn run_negative_load_sign_extend_test( let adapter_width = BaseAir::::width(&harness.air.adapter); let modify_trace = |trace: &mut DenseMatrix| { - let mut trace_row = trace.row_slice(0).to_vec(); + let mut trace_row = trace.row_slice(0).expect("row exists").to_vec(); let (_, core_row) = trace_row.split_at_mut(adapter_width); let core_cols: &mut LoadSignExtendCoreCols = core_row.borrow_mut(); if let Some(shifted_read_data) = read_data { - core_cols.shifted_read_data = shifted_read_data.map(F::from_canonical_u8); + core_cols.shifted_read_data = shifted_read_data.map(F::from_u8); } if let Some(data_most_sig_bit) = prank_vals.data_most_sig_bit { - core_cols.data_most_sig_bit = F::from_canonical_u32(data_most_sig_bit); + core_cols.data_most_sig_bit = F::from_u32(data_most_sig_bit); } if let Some(shift_most_sig_bit) = prank_vals.shift_most_sig_bit { - core_cols.shift_most_sig_bit = F::from_canonical_u32(shift_most_sig_bit); + core_cols.shift_most_sig_bit = F::from_u32(shift_most_sig_bit); } if let Some(opcode_flags) = prank_vals.opcode_flags { core_cols.opcode_loadb_flag0 = F::from_bool(opcode_flags[0]); diff --git a/extensions/rv32im/circuit/src/loadstore/core.rs b/extensions/rv32im/circuit/src/loadstore/core.rs index daf7738ff5..832fb79d21 100644 --- a/extensions/rv32im/circuit/src/loadstore/core.rs +++ b/extensions/rv32im/circuit/src/loadstore/core.rs @@ -16,7 +16,7 @@ use openvm_rv32im_transpiler::Rv32LoadStoreOpcode::{self, *}; use openvm_stark_backend::{ interaction::InteractionBuilder, p3_air::{AirBuilder, BaseAir}, - p3_field::{Field, FieldAlgebra, PrimeField32}, + p3_field::{Field, PrimeCharacteristicRing, PrimeField32}, rap::BaseAirWithPublicValues, }; @@ -111,7 +111,7 @@ where // We will use the InstructionOpcode enum to encode the opcodes // the appended digit to each opcode is the shift amount - let inv_2 = AB::F::from_canonical_u32(2).inverse(); + let inv_2 = AB::F::from_u32(2).inverse(); let mut opcode_flags = vec![]; for flag in flags { opcode_flags.push(flag * (flag - AB::F::ONE) * inv_2); @@ -199,23 +199,21 @@ where builder.assert_eq(*cell, expected_val); } - let expected_opcode = opcode_when(&[LoadW0]) * AB::Expr::from_canonical_u8(LOADW as u8) - + opcode_when(&[LoadHu0, LoadHu2]) * AB::Expr::from_canonical_u8(LOADHU as u8) - + opcode_when(&[LoadBu0, LoadBu1, LoadBu2, LoadBu3]) - * AB::Expr::from_canonical_u8(LOADBU as u8) - + opcode_when(&[StoreW0]) * AB::Expr::from_canonical_u8(STOREW as u8) - + opcode_when(&[StoreH0, StoreH2]) * AB::Expr::from_canonical_u8(STOREH as u8) - + opcode_when(&[StoreB0, StoreB1, StoreB2, StoreB3]) - * AB::Expr::from_canonical_u8(STOREB as u8); + let expected_opcode = opcode_when(&[LoadW0]) * AB::Expr::from_u8(LOADW as u8) + + opcode_when(&[LoadHu0, LoadHu2]) * AB::Expr::from_u8(LOADHU as u8) + + opcode_when(&[LoadBu0, LoadBu1, LoadBu2, LoadBu3]) * AB::Expr::from_u8(LOADBU as u8) + + opcode_when(&[StoreW0]) * AB::Expr::from_u8(STOREW as u8) + + opcode_when(&[StoreH0, StoreH2]) * AB::Expr::from_u8(STOREH as u8) + + opcode_when(&[StoreB0, StoreB1, StoreB2, StoreB3]) * AB::Expr::from_u8(STOREB as u8); let expected_opcode = VmCoreAir::::expr_to_global_expr(self, expected_opcode); let load_shift_amount = opcode_when(&[LoadBu1]) * AB::Expr::ONE + opcode_when(&[LoadHu2, LoadBu2]) * AB::Expr::TWO - + opcode_when(&[LoadBu3]) * AB::Expr::from_canonical_u32(3); + + opcode_when(&[LoadBu3]) * AB::Expr::from_u32(3); let store_shift_amount = opcode_when(&[StoreB1]) * AB::Expr::ONE + opcode_when(&[StoreH2, StoreB2]) * AB::Expr::TWO - + opcode_when(&[StoreB3]) * AB::Expr::from_canonical_u32(3); + + opcode_when(&[StoreB3]) * AB::Expr::from_u32(3); AdapterAirContext { to_pc: None, @@ -341,9 +339,9 @@ where let write_data = run_write_data(opcode, record.read_data, record.prev_data, shift as usize); // Writing in reverse order - core_row.write_data = write_data.map(F::from_canonical_u32); - core_row.prev_data = record.prev_data.map(F::from_canonical_u32); - core_row.read_data = record.read_data.map(F::from_canonical_u8); + core_row.write_data = write_data.map(F::from_u32); + core_row.prev_data = record.prev_data.map(F::from_u32); + core_row.read_data = record.read_data.map(F::from_u8); core_row.is_load = F::from_bool([LOADW, LOADHU, LOADBU].contains(&opcode)); core_row.is_valid = F::ONE; let flags = &mut core_row.flags; diff --git a/extensions/rv32im/circuit/src/loadstore/execution.rs b/extensions/rv32im/circuit/src/loadstore/execution.rs index 506f68331e..892c3af4ad 100644 --- a/extensions/rv32im/circuit/src/loadstore/execution.rs +++ b/extensions/rv32im/circuit/src/loadstore/execution.rs @@ -417,7 +417,7 @@ impl LoadStoreOp for StoreWOp { read_data: [u8; RV32_REGISTER_NUM_LIMBS], _shift_amount: usize, ) -> bool { - *write_data = read_data.map(F::from_canonical_u8); + *write_data = read_data.map(F::from_u8); true } } @@ -434,8 +434,8 @@ impl LoadStoreOp for StoreHOp { if shift_amount != 0 && shift_amount != 2 { return false; } - write_data[shift_amount] = F::from_canonical_u8(read_data[0]); - write_data[shift_amount + 1] = F::from_canonical_u8(read_data[1]); + write_data[shift_amount] = F::from_u8(read_data[0]); + write_data[shift_amount + 1] = F::from_u8(read_data[1]); true } } @@ -448,7 +448,7 @@ impl LoadStoreOp for StoreBOp { read_data: [u8; RV32_REGISTER_NUM_LIMBS], shift_amount: usize, ) -> bool { - write_data[shift_amount] = F::from_canonical_u8(read_data[0]); + write_data[shift_amount] = F::from_u8(read_data[0]); true } } diff --git a/extensions/rv32im/circuit/src/loadstore/tests.rs b/extensions/rv32im/circuit/src/loadstore/tests.rs index 240da983d0..8a2017aa89 100644 --- a/extensions/rv32im/circuit/src/loadstore/tests.rs +++ b/extensions/rv32im/circuit/src/loadstore/tests.rs @@ -14,7 +14,7 @@ use openvm_instructions::{instruction::Instruction, riscv::RV32_REGISTER_AS, Loc use openvm_rv32im_transpiler::Rv32LoadStoreOpcode::{self, *}; use openvm_stark_backend::{ p3_air::BaseAir, - p3_field::{FieldAlgebra, PrimeField32}, + p3_field::{PrimeCharacteristicRing, PrimeField32}, p3_matrix::{ dense::{DenseMatrix, RowMajorMatrix}, Matrix, @@ -22,7 +22,7 @@ use openvm_stark_backend::{ utils::disable_debug_builder, }; use openvm_stark_sdk::{p3_baby_bear::BabyBear, utils::create_seeded_rng}; -use rand::{rngs::StdRng, seq::SliceRandom, Rng}; +use rand::{prelude::IndexedRandom, rngs::StdRng, Rng}; use test_case::test_case; #[cfg(feature = "cuda")] use { @@ -110,8 +110,8 @@ fn set_and_execute>( imm_sign: Option, mem_as: Option, ) { - let imm = imm.unwrap_or(rng.gen_range(0..(1 << IMM_BITS))); - let imm_sign = imm_sign.unwrap_or(rng.gen_range(0..2)); + let imm = imm.unwrap_or(rng.random_range(0..(1 << IMM_BITS))); + let imm_sign = imm_sign.unwrap_or(rng.random_range(0..2)); let imm_ext = imm + imm_sign * 0xffff0000; let alignment = match opcode { @@ -121,7 +121,7 @@ fn set_and_execute>( _ => unreachable!(), }; - let ptr_val: u32 = rng.gen_range(0..(1 << (tester.address_bits() - alignment))) << alignment; + let ptr_val: u32 = rng.random_range(0..(1 << (tester.address_bits() - alignment))) << alignment; let rs1 = rs1.unwrap_or(ptr_val.wrapping_sub(imm_ext).to_le_bytes()); let ptr_val = imm_ext.wrapping_add(u32::from_le_bytes(rs1)); let a = gen_pointer(rng, 4); @@ -135,12 +135,12 @@ fn set_and_execute>( }); let shift_amount = ptr_val % 4; - tester.write(1, b, rs1.map(F::from_canonical_u8)); + tester.write(1, b, rs1.map(F::from_u8)); let mut some_prev_data: [F; RV32_REGISTER_NUM_LIMBS] = - array::from_fn(|_| F::from_canonical_u32(rng.gen_range(0..(1 << RV32_CELL_BITS)))); + array::from_fn(|_| F::from_u32(rng.random_range(0..(1 << RV32_CELL_BITS)))); let mut read_data: [F; RV32_REGISTER_NUM_LIMBS] = - array::from_fn(|_| F::from_canonical_u32(rng.gen_range(0..(1 << RV32_CELL_BITS)))); + array::from_fn(|_| F::from_u32(rng.random_range(0..(1 << RV32_CELL_BITS)))); if is_load { if a == 0 { @@ -150,7 +150,7 @@ fn set_and_execute>( tester.write(mem_as, (ptr_val - shift_amount) as usize, read_data); } else { if mem_as == 4 { - some_prev_data = array::from_fn(|_| rng.gen()); + some_prev_data = array::from_fn(|_| rng.random()); } if a == 0 { read_data = [F::ZERO; RV32_REGISTER_NUM_LIMBS]; @@ -184,7 +184,7 @@ fn set_and_execute>( some_prev_data.map(|x| x.as_canonical_u32()), shift_amount as usize, ) - .map(F::from_canonical_u32); + .map(F::from_u32); if is_load { if enabled_write { assert_eq!(write_data, tester.read::<4>(1, a)); @@ -289,28 +289,28 @@ fn run_negative_loadstore_test( let adapter_width = BaseAir::::width(&harness.air.adapter); let modify_trace = |trace: &mut DenseMatrix| { - let mut trace_row = trace.row_slice(0).to_vec(); + let mut trace_row = trace.row_slice(0).expect("row exists").to_vec(); let (adapter_row, core_row) = trace_row.split_at_mut(adapter_width); let adapter_cols: &mut Rv32LoadStoreAdapterCols = adapter_row.borrow_mut(); let core_cols: &mut LoadStoreCoreCols = core_row.borrow_mut(); if let Some(read_data) = prank_vals.read_data { - core_cols.read_data = read_data.map(F::from_canonical_u32); + core_cols.read_data = read_data.map(F::from_u32); } if let Some(prev_data) = prank_vals.prev_data { - core_cols.prev_data = prev_data.map(F::from_canonical_u32); + core_cols.prev_data = prev_data.map(F::from_u32); } if let Some(write_data) = prank_vals.write_data { - core_cols.write_data = write_data.map(F::from_canonical_u32); + core_cols.write_data = write_data.map(F::from_u32); } if let Some(flags) = prank_vals.flags { - core_cols.flags = flags.map(F::from_canonical_u32); + core_cols.flags = flags.map(F::from_u32); } if let Some(is_load) = prank_vals.is_load { core_cols.is_load = F::from_bool(is_load); } if let Some(mem_as) = prank_vals.mem_as { - adapter_cols.mem_as = F::from_canonical_u32(mem_as); + adapter_cols.mem_as = F::from_u32(mem_as); } *trace = RowMajorMatrix::new(trace_row, trace.width()); diff --git a/extensions/rv32im/circuit/src/mul/core.rs b/extensions/rv32im/circuit/src/mul/core.rs index e4d5e536b2..cce3e3b527 100644 --- a/extensions/rv32im/circuit/src/mul/core.rs +++ b/extensions/rv32im/circuit/src/mul/core.rs @@ -17,7 +17,7 @@ use openvm_rv32im_transpiler::MulOpcode; use openvm_stark_backend::{ interaction::InteractionBuilder, p3_air::BaseAir, - p3_field::{Field, FieldAlgebra, PrimeField32}, + p3_field::{Field, PrimeCharacteristicRing, PrimeField32}, rap::BaseAirWithPublicValues, }; @@ -74,7 +74,7 @@ where // If 0 <= a[i], carry[i] < 2^LIMB_BITS, it can be proven that a[i] = sum_{k=0}^{i} (b[k] * // c[i - k]) % 2^LIMB_BITS as necessary. let mut carry: [AB::Expr; NUM_LIMBS] = array::from_fn(|_| AB::Expr::ZERO); - let carry_divide = AB::F::from_canonical_u32(1 << LIMB_BITS).inverse(); + let carry_divide = AB::F::from_u32(1 << LIMB_BITS).inverse(); for i in 0..NUM_LIMBS { let expected_limb = if i == 0 { @@ -242,9 +242,9 @@ where // write in reverse order core_row.is_valid = F::ONE; - core_row.c = record.c.map(F::from_canonical_u8); - core_row.b = record.b.map(F::from_canonical_u8); - core_row.a = a.map(F::from_canonical_u8); + core_row.c = record.c.map(F::from_u8); + core_row.b = record.b.map(F::from_u8); + core_row.a = a.map(F::from_u8); } } diff --git a/extensions/rv32im/circuit/src/mul/tests.rs b/extensions/rv32im/circuit/src/mul/tests.rs index 1914c1fb27..e0edf082ae 100644 --- a/extensions/rv32im/circuit/src/mul/tests.rs +++ b/extensions/rv32im/circuit/src/mul/tests.rs @@ -32,7 +32,7 @@ use openvm_rv32im_transpiler::BaseAluOpcode::ADD; use openvm_rv32im_transpiler::MulOpcode::{self, MUL}; use openvm_stark_backend::{ p3_air::BaseAir, - p3_field::FieldAlgebra, + p3_field::PrimeCharacteristicRing, p3_matrix::{ dense::{DenseMatrix, RowMajorMatrix}, Matrix, @@ -137,8 +137,8 @@ fn set_and_execute>( b: Option<[u8; RV32_REGISTER_NUM_LIMBS]>, c: Option<[u8; RV32_REGISTER_NUM_LIMBS]>, ) { - let b = b.unwrap_or(array::from_fn(|_| rng.gen_range(0..=u8::MAX))); - let c = c.unwrap_or(array::from_fn(|_| rng.gen_range(0..=u8::MAX))); + let b = b.unwrap_or(array::from_fn(|_| rng.random_range(0..=u8::MAX))); + let c = c.unwrap_or(array::from_fn(|_| rng.random_range(0..=u8::MAX))); let (mut instruction, rd) = rv32_rand_write_register_or_imm(tester, b, c, None, opcode.global_opcode().as_usize(), rng); @@ -148,7 +148,7 @@ fn set_and_execute>( let (a, _) = run_mul::(&b, &c); assert_eq!( - a.map(F::from_canonical_u8), + a.map(F::from_u8), tester.read::(1, rd) ) } @@ -219,10 +219,10 @@ fn run_negative_mul_test( let adapter_width = BaseAir::::width(&harness.air.adapter); let modify_trace = |trace: &mut DenseMatrix| { - let mut values = trace.row_slice(0).to_vec(); + let mut values = trace.row_slice(0).expect("row exists").to_vec(); let cols: &mut MultiplicationCoreCols = values.split_at_mut(adapter_width).1.borrow_mut(); - cols.a = prank_a.map(F::from_canonical_u32); + cols.a = prank_a.map(F::from_u32); cols.is_valid = F::from_bool(prank_is_valid); *trace = RowMajorMatrix::new(values, trace.width()); }; @@ -388,7 +388,7 @@ fn test_aot_mul_randomized_pairs() { let mut expected = HashMap::new(); for &offset in &offsets { - let value_i32 = rng.gen_range(-(1i32 << 11)..(1i32 << 11)); + let value_i32 = rng.random_range(-(1i32 << 11)..(1i32 << 11)); let imm_field = (value_i32 as u32) & 0x00FF_FFFF; instructions.push(add_immediate(offset, imm_field)); expected.insert(offset, value_i32 as u32); diff --git a/extensions/rv32im/circuit/src/mulh/core.rs b/extensions/rv32im/circuit/src/mulh/core.rs index 9d522eafb1..33f6fc2dc3 100644 --- a/extensions/rv32im/circuit/src/mulh/core.rs +++ b/extensions/rv32im/circuit/src/mulh/core.rs @@ -18,7 +18,7 @@ use openvm_rv32im_transpiler::MulHOpcode; use openvm_stark_backend::{ interaction::InteractionBuilder, p3_air::{AirBuilder, BaseAir}, - p3_field::{Field, FieldAlgebra, PrimeField32}, + p3_field::{Field, PrimeCharacteristicRing, PrimeField32}, rap::BaseAirWithPublicValues, }; use strum::IntoEnumIterator; @@ -87,7 +87,7 @@ where let b = &cols.b; let c = &cols.c; - let carry_divide = AB::F::from_canonical_u32(1 << LIMB_BITS).inverse(); + let carry_divide = AB::F::from_u32(1 << LIMB_BITS).inverse(); // Note b * c = a << LIMB_BITS + a_mul, in order to constrain that a is correct we // need to compute the carries generated by a_mul. @@ -134,8 +134,8 @@ where // Check that b_ext and c_ext are correct using bitwise lookup. We check // both b and c when the opcode is MULH, and only b when MULHSU. - let sign_mask = AB::F::from_canonical_u32(1 << (LIMB_BITS - 1)); - let ext_inv = AB::F::from_canonical_u32((1 << LIMB_BITS) - 1).inverse(); + let sign_mask = AB::F::from_u32(1 << (LIMB_BITS - 1)); + let ext_inv = AB::F::from_u32((1 << LIMB_BITS) - 1).inverse(); let b_sign = cols.b_ext * ext_inv; let c_sign = cols.c_ext * ext_inv; @@ -150,7 +150,7 @@ where self.bitwise_lookup_bus .send_range( - AB::Expr::from_canonical_u32(2) * (b[NUM_LIMBS - 1] - b_sign * sign_mask), + AB::Expr::from_u32(2) * (b[NUM_LIMBS - 1] - b_sign * sign_mask), (cols.opcode_mulh_flag + AB::Expr::ONE) * (c[NUM_LIMBS - 1] - c_sign * sign_mask), ) .eval(builder, cols.opcode_mulh_flag + cols.opcode_mulhsu_flag); @@ -160,7 +160,7 @@ where flags.iter().zip(MulHOpcode::iter()).fold( AB::Expr::ZERO, |acc, (flag, local_opcode)| { - acc + (*flag).into() * AB::Expr::from_canonical_u8(local_opcode as u8) + acc + (*flag).into() * AB::Expr::from_u8(local_opcode as u8) }, ), ); @@ -336,12 +336,12 @@ where core_row.opcode_mulhu_flag = F::from_bool(opcode == MulHOpcode::MULHU); core_row.opcode_mulhsu_flag = F::from_bool(opcode == MulHOpcode::MULHSU); core_row.opcode_mulh_flag = F::from_bool(opcode == MulHOpcode::MULH); - core_row.c_ext = F::from_canonical_u32(c_ext); - core_row.b_ext = F::from_canonical_u32(b_ext); - core_row.a_mul = a_mul.map(F::from_canonical_u32); - core_row.c = record.c.map(F::from_canonical_u8); - core_row.b = record.b.map(F::from_canonical_u8); - core_row.a = a.map(F::from_canonical_u32); + core_row.c_ext = F::from_u32(c_ext); + core_row.b_ext = F::from_u32(b_ext); + core_row.a_mul = a_mul.map(F::from_u32); + core_row.c = record.c.map(F::from_u8); + core_row.b = record.b.map(F::from_u8); + core_row.a = a.map(F::from_u32); } } diff --git a/extensions/rv32im/circuit/src/mulh/tests.rs b/extensions/rv32im/circuit/src/mulh/tests.rs index 4e25892024..be3965d253 100644 --- a/extensions/rv32im/circuit/src/mulh/tests.rs +++ b/extensions/rv32im/circuit/src/mulh/tests.rs @@ -44,7 +44,7 @@ use openvm_rv32im_transpiler::BaseAluOpcode::ADD; use openvm_rv32im_transpiler::MulHOpcode::{self, *}; use openvm_stark_backend::{ p3_air::BaseAir, - p3_field::FieldAlgebra, + p3_field::PrimeCharacteristicRing, p3_matrix::{ dense::{DenseMatrix, RowMajorMatrix}, Matrix, @@ -171,8 +171,8 @@ fn set_and_execute>( let rs2 = gen_pointer(rng, 4); let rd = gen_pointer(rng, 4); - tester.write::(1, rs1, b.map(F::from_canonical_u32)); - tester.write::(1, rs2, c.map(F::from_canonical_u32)); + tester.write::(1, rs1, b.map(F::from_u32)); + tester.write::(1, rs2, c.map(F::from_u32)); tester.execute( executor, @@ -182,7 +182,7 @@ fn set_and_execute>( let (a, _, _, _, _) = run_mulh::(opcode, &b, &c); assert_eq!( - a.map(F::from_canonical_u32), + a.map(F::from_u32), tester.read::(1, rd) ); } @@ -257,13 +257,13 @@ fn run_negative_mulh_test( let adapter_width = BaseAir::::width(&harness.air.adapter); let modify_trace = |trace: &mut DenseMatrix| { - let mut values = trace.row_slice(0).to_vec(); + let mut values = trace.row_slice(0).expect("row exists").to_vec(); let cols: &mut MulHCoreCols = values.split_at_mut(adapter_width).1.borrow_mut(); - cols.a = prank_a.map(F::from_canonical_u32); - cols.a_mul = prank_a_mul.map(F::from_canonical_u32); - cols.b_ext = F::from_canonical_u32(prank_b_ext); - cols.c_ext = F::from_canonical_u32(prank_c_ext); + cols.a = prank_a.map(F::from_u32); + cols.a_mul = prank_a_mul.map(F::from_u32); + cols.b_ext = F::from_u32(prank_b_ext); + cols.c_ext = F::from_u32(prank_c_ext); *trace = RowMajorMatrix::new(values, trace.width()); }; @@ -706,7 +706,7 @@ fn test_aot_mulh_randomized() { let mut expected = HashMap::new(); for &offset in &offsets { - let value_i32 = rng.gen_range(-(1i32 << 11)..(1i32 << 11)); + let value_i32 = rng.random_range(-(1i32 << 11)..(1i32 << 11)); let imm_field = (value_i32 as u32) & 0x00FF_FFFF; instructions.push(add_immediate(offset, imm_field)); expected.insert(offset, value_i32 as u32); diff --git a/extensions/rv32im/circuit/src/shift/core.rs b/extensions/rv32im/circuit/src/shift/core.rs index 4e8efe6dbd..5e3e40ce62 100644 --- a/extensions/rv32im/circuit/src/shift/core.rs +++ b/extensions/rv32im/circuit/src/shift/core.rs @@ -19,7 +19,7 @@ use openvm_rv32im_transpiler::ShiftOpcode; use openvm_stark_backend::{ interaction::InteractionBuilder, p3_air::{AirBuilder, BaseAir}, - p3_field::{Field, FieldAlgebra, PrimeField32}, + p3_field::{Field, PrimeCharacteristicRing, PrimeField32}, rap::BaseAirWithPublicValues, }; use strum::IntoEnumIterator; @@ -114,16 +114,16 @@ where for i in 0..LIMB_BITS { builder.assert_bool(cols.bit_shift_marker[i]); bit_marker_sum += cols.bit_shift_marker[i].into(); - bit_shift += AB::Expr::from_canonical_usize(i) * cols.bit_shift_marker[i]; + bit_shift += AB::Expr::from_usize(i) * cols.bit_shift_marker[i]; let mut when_bit_shift = builder.when(cols.bit_shift_marker[i]); when_bit_shift.assert_eq( cols.bit_multiplier_left, - AB::Expr::from_canonical_usize(1 << i) * cols.opcode_sll_flag, + AB::Expr::from_usize(1 << i) * cols.opcode_sll_flag, ); when_bit_shift.assert_eq( cols.bit_multiplier_right, - AB::Expr::from_canonical_usize(1 << i) * right_shift.clone(), + AB::Expr::from_usize(1 << i) * right_shift.clone(), ); } builder.when(is_valid.clone()).assert_one(bit_marker_sum); @@ -135,7 +135,7 @@ where for i in 0..NUM_LIMBS { builder.assert_bool(cols.limb_shift_marker[i]); limb_marker_sum += cols.limb_shift_marker[i].into(); - limb_shift += AB::Expr::from_canonical_usize(i) * cols.limb_shift_marker[i]; + limb_shift += AB::Expr::from_usize(i) * cols.limb_shift_marker[i]; let mut when_limb_shift = builder.when(cols.limb_shift_marker[i]); @@ -149,7 +149,7 @@ where } else { cols.bit_shift_carry[j - i - 1].into() * cols.opcode_sll_flag } + b[j - i] * cols.bit_multiplier_left - - AB::Expr::from_canonical_usize(1 << LIMB_BITS) + - AB::Expr::from_usize(1 << LIMB_BITS) * cols.bit_shift_carry[j - i] * cols.opcode_sll_flag; when_limb_shift.assert_eq(a[j] * cols.opcode_sll_flag, expected_a_left); @@ -159,14 +159,14 @@ where if j + i > NUM_LIMBS - 1 { when_limb_shift.assert_eq( a[j] * right_shift.clone(), - cols.b_sign * AB::F::from_canonical_usize((1 << LIMB_BITS) - 1), + cols.b_sign * AB::F::from_usize((1 << LIMB_BITS) - 1), ); } else { let expected_a_right = if j + i == NUM_LIMBS - 1 { cols.b_sign * (cols.bit_multiplier_right - AB::F::ONE) } else { cols.bit_shift_carry[j + i + 1].into() * right_shift.clone() - } * AB::F::from_canonical_usize(1 << LIMB_BITS) + } * AB::F::from_usize(1 << LIMB_BITS) + right_shift.clone() * (b[j + i] - cols.bit_shift_carry[j + i]); when_limb_shift.assert_eq(a[j] * cols.bit_multiplier_right, expected_a_right); } @@ -175,10 +175,10 @@ where builder.when(is_valid.clone()).assert_one(limb_marker_sum); // Check that bit_shift and limb_shift are correct. - let num_bits = AB::F::from_canonical_usize(NUM_LIMBS * LIMB_BITS); + let num_bits = AB::F::from_usize(NUM_LIMBS * LIMB_BITS); self.range_bus .range_check( - (c[0] - limb_shift * AB::F::from_canonical_usize(LIMB_BITS) - bit_shift.clone()) + (c[0] - limb_shift * AB::F::from_usize(LIMB_BITS) - bit_shift.clone()) * num_bits.inverse(), LIMB_BITS - ((NUM_LIMBS * LIMB_BITS) as u32).ilog2() as usize, ) @@ -190,13 +190,13 @@ where .when(not(cols.opcode_sra_flag)) .assert_zero(cols.b_sign); - let mask = AB::F::from_canonical_u32(1 << (LIMB_BITS - 1)); + let mask = AB::F::from_u32(1 << (LIMB_BITS - 1)); let b_sign_shifted = cols.b_sign * mask; self.bitwise_lookup_bus .send_xor( b[NUM_LIMBS - 1], mask, - b[NUM_LIMBS - 1] + mask - (AB::Expr::from_canonical_u32(2) * b_sign_shifted), + b[NUM_LIMBS - 1] + mask - (AB::Expr::from_u32(2) * b_sign_shifted), ) .eval(builder, cols.opcode_sra_flag); @@ -218,7 +218,7 @@ where .iter() .zip(ShiftOpcode::iter()) .fold(AB::Expr::ZERO, |acc, (flag, opcode)| { - acc + (*flag).into() * AB::Expr::from_canonical_u8(opcode as u8) + acc + (*flag).into() * AB::Expr::from_u8(opcode as u8) }), ); @@ -389,7 +389,7 @@ where _ => record.b[i] % (1 << bit_shift), }; self.range_checker_chip.add_count(carry as u32, bit_shift); - F::from_canonical_u8(carry) + F::from_u8(carry) }) }; @@ -400,17 +400,17 @@ where core_row.b_sign = F::ZERO; if opcode == ShiftOpcode::SRA { - core_row.b_sign = F::from_canonical_u8(record.b[NUM_LIMBS - 1] >> (LIMB_BITS - 1)); + core_row.b_sign = F::from_u8(record.b[NUM_LIMBS - 1] >> (LIMB_BITS - 1)); self.bitwise_lookup_chip .request_xor(record.b[NUM_LIMBS - 1] as u32, 1 << (LIMB_BITS - 1)); } core_row.bit_multiplier_right = match opcode { ShiftOpcode::SLL => F::ZERO, - _ => F::from_canonical_usize(1 << bit_shift), + _ => F::from_usize(1 << bit_shift), }; core_row.bit_multiplier_left = match opcode { - ShiftOpcode::SLL => F::from_canonical_usize(1 << bit_shift), + ShiftOpcode::SLL => F::from_usize(1 << bit_shift), _ => F::ZERO, }; @@ -418,9 +418,9 @@ where core_row.opcode_srl_flag = F::from_bool(opcode == ShiftOpcode::SRL); core_row.opcode_sll_flag = F::from_bool(opcode == ShiftOpcode::SLL); - core_row.c = record.c.map(F::from_canonical_u8); - core_row.b = record.b.map(F::from_canonical_u8); - core_row.a = a.map(F::from_canonical_u8); + core_row.c = record.c.map(F::from_u8); + core_row.b = record.b.map(F::from_u8); + core_row.a = a.map(F::from_u8); } } diff --git a/extensions/rv32im/circuit/src/shift/tests.rs b/extensions/rv32im/circuit/src/shift/tests.rs index 5855367a27..96bdb49ada 100644 --- a/extensions/rv32im/circuit/src/shift/tests.rs +++ b/extensions/rv32im/circuit/src/shift/tests.rs @@ -18,7 +18,7 @@ use openvm_instructions::LocalOpcode; use openvm_rv32im_transpiler::ShiftOpcode::{self, *}; use openvm_stark_backend::{ p3_air::BaseAir, - p3_field::FieldAlgebra, + p3_field::PrimeCharacteristicRing, p3_matrix::{ dense::{DenseMatrix, RowMajorMatrix}, Matrix, @@ -122,8 +122,8 @@ fn set_and_execute>( is_imm: Option, c: Option<[u8; RV32_REGISTER_NUM_LIMBS]>, ) { - let b = b.unwrap_or(array::from_fn(|_| rng.gen_range(0..=u8::MAX))); - let (c_imm, c) = if is_imm.unwrap_or(rng.gen_bool(0.5)) { + let b = b.unwrap_or(array::from_fn(|_| rng.random_range(0..=u8::MAX))); + let (c_imm, c) = if is_imm.unwrap_or(rng.random_bool(0.5)) { let (imm, c) = if let Some(c) = c { ((u32::from_le_bytes(c) & 0xFFFFFF) as usize, c) } else { @@ -133,7 +133,7 @@ fn set_and_execute>( } else { ( None, - c.unwrap_or(array::from_fn(|_| rng.gen_range(0..=u8::MAX))), + c.unwrap_or(array::from_fn(|_| rng.random_range(0..=u8::MAX))), ) }; let (instruction, rd) = rv32_rand_write_register_or_imm( @@ -148,7 +148,7 @@ fn set_and_execute>( let (a, _, _) = run_shift::(opcode, &b, &c); assert_eq!( - a.map(F::from_canonical_u8), + a.map(F::from_u8), tester.read::(1, rd) ) } @@ -232,28 +232,28 @@ fn run_negative_shift_test( let adapter_width = BaseAir::::width(&harness.air.adapter); let modify_trace = |trace: &mut DenseMatrix| { - let mut values = trace.row_slice(0).to_vec(); + let mut values = trace.row_slice(0).expect("row exists").to_vec(); let cols: &mut ShiftCoreCols = values.split_at_mut(adapter_width).1.borrow_mut(); - cols.a = prank_a.map(F::from_canonical_u32); + cols.a = prank_a.map(F::from_u32); if let Some(bit_multiplier_left) = prank_vals.bit_multiplier_left { - cols.bit_multiplier_left = F::from_canonical_u32(bit_multiplier_left); + cols.bit_multiplier_left = F::from_u32(bit_multiplier_left); } if let Some(bit_multiplier_right) = prank_vals.bit_multiplier_right { - cols.bit_multiplier_right = F::from_canonical_u32(bit_multiplier_right); + cols.bit_multiplier_right = F::from_u32(bit_multiplier_right); } if let Some(b_sign) = prank_vals.b_sign { - cols.b_sign = F::from_canonical_u32(b_sign); + cols.b_sign = F::from_u32(b_sign); } if let Some(bit_shift_marker) = prank_vals.bit_shift_marker { - cols.bit_shift_marker = bit_shift_marker.map(F::from_canonical_u32); + cols.bit_shift_marker = bit_shift_marker.map(F::from_u32); } if let Some(limb_shift_marker) = prank_vals.limb_shift_marker { - cols.limb_shift_marker = limb_shift_marker.map(F::from_canonical_u32); + cols.limb_shift_marker = limb_shift_marker.map(F::from_u32); } if let Some(bit_shift_carry) = prank_vals.bit_shift_carry { - cols.bit_shift_carry = bit_shift_carry.map(F::from_canonical_u32); + cols.bit_shift_carry = bit_shift_carry.map(F::from_u32); } *trace = RowMajorMatrix::new(values, trace.width()); diff --git a/extensions/rv32im/circuit/src/test_utils.rs b/extensions/rv32im/circuit/src/test_utils.rs index 0780552a51..35c2b0e9bd 100644 --- a/extensions/rv32im/circuit/src/test_utils.rs +++ b/extensions/rv32im/circuit/src/test_utils.rs @@ -1,6 +1,6 @@ use openvm_circuit::arch::testing::{memory::gen_pointer, TestBuilder}; use openvm_instructions::{instruction::Instruction, VmOpcode}; -use openvm_stark_backend::{p3_field::FieldAlgebra, verifier::VerificationError}; +use openvm_stark_backend::{p3_field::PrimeCharacteristicRing, verifier::VerificationError}; use openvm_stark_sdk::p3_baby_bear::BabyBear; use rand::{rngs::StdRng, Rng}; @@ -22,9 +22,9 @@ pub fn rv32_rand_write_register_or_imm( let rs2 = imm.unwrap_or_else(|| gen_pointer(rng, NUM_LIMBS)); let rd = gen_pointer(rng, NUM_LIMBS); - tester.write::(1, rs1, rs1_writes.map(BabyBear::from_canonical_u8)); + tester.write::(1, rs1, rs1_writes.map(BabyBear::from_u8)); if !rs2_is_imm { - tester.write::(1, rs2, rs2_writes.map(BabyBear::from_canonical_u8)); + tester.write::(1, rs2, rs2_writes.map(BabyBear::from_u8)); } ( @@ -38,7 +38,7 @@ pub fn rv32_rand_write_register_or_imm( #[cfg_attr(all(feature = "test-utils", not(test)), allow(dead_code))] pub fn generate_rv32_is_type_immediate(rng: &mut StdRng) -> (usize, [u8; RV32_REGISTER_NUM_LIMBS]) { - let mut imm: u32 = rng.gen_range(0..(1 << RV_IS_TYPE_IMM_BITS)); + let mut imm: u32 = rng.random_range(0..(1 << RV_IS_TYPE_IMM_BITS)); if (imm & 0x800) != 0 { imm |= !0xFFF } diff --git a/extensions/rv32im/tests/src/lib.rs b/extensions/rv32im/tests/src/lib.rs index ff141398f5..18f889a2f8 100644 --- a/extensions/rv32im/tests/src/lib.rs +++ b/extensions/rv32im/tests/src/lib.rs @@ -18,7 +18,9 @@ mod tests { DivRemOpcode, MulHOpcode, MulOpcode, Rv32ITranspilerExtension, Rv32IoTranspilerExtension, Rv32MTranspilerExtension, }; - use openvm_stark_sdk::{openvm_stark_backend::p3_field::FieldAlgebra, p3_baby_bear::BabyBear}; + use openvm_stark_sdk::{ + openvm_stark_backend::p3_field::PrimeCharacteristicRing, p3_baby_bear::BabyBear, + }; use openvm_toolchain_tests::{ build_example_program_at_path, build_example_program_at_path_with_features, get_programs_dir, @@ -141,7 +143,7 @@ mod tests { .with_extension(Rv32MTranspilerExtension) .with_extension(Rv32IoTranspilerExtension), )?; - let input = vec![[0, 1, 2, 3].map(F::from_canonical_u8).to_vec()]; + let input = vec![[0, 1, 2, 3].map(F::from_u8).to_vec()]; air_test_with_min_segments(Rv32ImBuilder, config, exe, input, 1); Ok(()) } @@ -158,9 +160,9 @@ mod tests { .with_extension(Rv32IoTranspilerExtension), )?; // stdin will be read after reading kv_store - let stdin = vec![[0, 1, 2].map(F::from_canonical_u8).to_vec()]; + let stdin = vec![[0, 1, 2].map(F::from_u8).to_vec()]; let mut streams: Streams = stdin.into(); - let input = vec![[0, 1, 2, 3].map(F::from_canonical_u8).to_vec()]; + let input = vec![[0, 1, 2, 3].map(F::from_u8).to_vec()]; streams.kv_store = Arc::new(HashMap::from([( "key".as_bytes().to_vec(), hint_load_by_key_encode(&input), @@ -194,7 +196,7 @@ mod tests { let input = serialized_foo .into_iter() .flat_map(|w| w.to_le_bytes()) - .map(F::from_canonical_u8) + .map(F::from_u8) .collect(); air_test_with_min_segments(Rv32ImBuilder, config, exe, vec![input], 1); Ok(()) @@ -234,7 +236,7 @@ mod tests { .into_iter() .flat_map(|x| x.to_le_bytes()) ) - .map(F::from_canonical_u8) + .map(F::from_u8) .collect::>() ); Ok(()) @@ -269,7 +271,7 @@ mod tests { let executor = VmExecutor::new(config)?; let instance = executor.instance(&exe)?; - let input = vec![[0, 0, 0, 1].map(F::from_canonical_u8).to_vec()]; + let input = vec![[0, 0, 0, 1].map(F::from_u8).to_vec()]; match instance.execute(input.clone(), None) { Err(ExecutionError::FailedWithExitCode(_)) => Ok(()), Err(_) => panic!("should fail with `FailedWithExitCode`"), diff --git a/extensions/rv32im/transpiler/src/lib.rs b/extensions/rv32im/transpiler/src/lib.rs index 03a354517e..4db757e731 100644 --- a/extensions/rv32im/transpiler/src/lib.rs +++ b/extensions/rv32im/transpiler/src/lib.rs @@ -64,9 +64,7 @@ impl TranspilerExtension for Rv32ITranspilerExtension { let dec_insn = IType::new(instruction_u32); Some(Instruction { opcode: SystemOpcode::TERMINATE.global_opcode(), - c: F::from_canonical_u8( - dec_insn.imm.try_into().expect("exit code must be byte"), - ), + c: F::from_u8(dec_insn.imm.try_into().expect("exit code must be byte")), ..Default::default() }) } @@ -81,20 +79,20 @@ impl TranspilerExtension for Rv32ITranspilerExtension { ), PhantomImm::HintRandom => Instruction::phantom( PhantomDiscriminant(Rv32Phantom::HintRandom as u16), - F::from_canonical_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rd), + F::from_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rd), F::ZERO, 0, ), PhantomImm::PrintStr => Instruction::phantom( PhantomDiscriminant(Rv32Phantom::PrintStr as u16), - F::from_canonical_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rd), - F::from_canonical_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rs1), + F::from_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rd), + F::from_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rs1), 0, ), PhantomImm::HintLoadByKey => Instruction::phantom( PhantomDiscriminant(Rv32Phantom::HintLoadByKey as u16), - F::from_canonical_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rd), - F::from_canonical_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rs1), + F::from_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rd), + F::from_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rs1), 0, ), }) diff --git a/extensions/rv32im/transpiler/src/rrs.rs b/extensions/rv32im/transpiler/src/rrs.rs index 99d9183fb0..31aeedcf6a 100644 --- a/extensions/rv32im/transpiler/src/rrs.rs +++ b/extensions/rv32im/transpiler/src/rrs.rs @@ -248,9 +248,9 @@ impl InstructionProcessor for InstructionTranspiler { fn process_jalr(&mut self, dec_insn: IType) -> Self::InstructionResult { Instruction::new( Rv32JalrOpcode::JALR.global_opcode(), - F::from_canonical_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rd), - F::from_canonical_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rs1), - F::from_canonical_u32((dec_insn.imm as u32) & 0xffff), + F::from_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rd), + F::from_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rs1), + F::from_u32((dec_insn.imm as u32) & 0xffff), F::ONE, F::ZERO, F::from_bool(dec_insn.rd != 0), @@ -274,9 +274,9 @@ impl InstructionProcessor for InstructionTranspiler { } Instruction::new( Rv32AuipcOpcode::AUIPC.global_opcode(), - F::from_canonical_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rd), + F::from_usize(RV32_REGISTER_NUM_LIMBS * dec_insn.rd), F::ZERO, - F::from_canonical_u32(((dec_insn.imm as u32) & 0xfffff000) >> 8), + F::from_u32(((dec_insn.imm as u32) & 0xfffff000) >> 8), F::ONE, // rd is a register F::ZERO, F::ZERO, diff --git a/extensions/sha256/circuit/Cargo.toml b/extensions/sha256/circuit/Cargo.toml index 7b3a8d8edd..a09dec3818 100644 --- a/extensions/sha256/circuit/Cargo.toml +++ b/extensions/sha256/circuit/Cargo.toml @@ -44,7 +44,6 @@ aot = ["openvm-circuit/aot", "openvm-rv32im-circuit/aot"] mimalloc = ["openvm-circuit/mimalloc"] jemalloc = ["openvm-circuit/jemalloc"] jemalloc-prof = ["openvm-circuit/jemalloc-prof"] -nightly-features = ["openvm-circuit/nightly-features"] cuda = [ "dep:openvm-cuda-builder", diff --git a/extensions/sha256/circuit/src/lib.rs b/extensions/sha256/circuit/src/lib.rs index c726ba9ef7..f4ab371e9a 100644 --- a/extensions/sha256/circuit/src/lib.rs +++ b/extensions/sha256/circuit/src/lib.rs @@ -8,7 +8,7 @@ use std::result::Result; use openvm_circuit::{ arch::{ AirInventory, ChipInventoryError, InitFileGenerator, MatrixRecordArena, SystemConfig, - VmBuilder, VmChipComplex, VmProverExtension, + VmBuilder, VmChipComplex, VmField, VmProverExtension, }, system::{SystemChipInventory, SystemCpuBuilder, SystemExecutor}, }; @@ -18,7 +18,6 @@ use openvm_rv32im_circuit::{ }; use openvm_stark_backend::{ config::{StarkGenericConfig, Val}, - p3_field::PrimeField32, prover::cpu::{CpuBackend, CpuDevice}, }; use openvm_stark_sdk::engine::StarkEngine; @@ -80,7 +79,7 @@ impl VmBuilder for Sha256Rv32CpuBuilder where SC: StarkGenericConfig, E: StarkEngine, PD = CpuDevice>, - Val: PrimeField32, + Val: VmField, { type VmConfig = Sha256Rv32Config; type SystemChipInventory = SystemChipInventory; diff --git a/extensions/sha256/circuit/src/sha256_chip/air.rs b/extensions/sha256/circuit/src/sha256_chip/air.rs index 2fe1cb26c0..1903a1e60b 100644 --- a/extensions/sha256/circuit/src/sha256_chip/air.rs +++ b/extensions/sha256/circuit/src/sha256_chip/air.rs @@ -22,7 +22,7 @@ use openvm_sha256_transpiler::Rv32Sha256Opcode; use openvm_stark_backend::{ interaction::{BusIndex, InteractionBuilder}, p3_air::{Air, AirBuilder, BaseAir}, - p3_field::{Field, FieldAlgebra}, + p3_field::{Field, PrimeCharacteristicRing}, p3_matrix::Matrix, rap::{BaseAirWithPublicValues, PartitionedBaseAir}, }; @@ -140,7 +140,10 @@ impl Sha256VmAir { /// Implement all necessary constraints for the padding fn eval_padding(&self, builder: &mut AB) { let main = builder.main(); - let (local, next) = (main.row_slice(0), main.row_slice(1)); + let (local, next) = ( + main.row_slice(0).expect("window should have two elements"), + main.row_slice(1).expect("window should have two elements"), + ); let local_cols: &Sha256VmRoundCols = local[..SHA256VM_ROUND_WIDTH].borrow(); let next_cols: &Sha256VmRoundCols = next[..SHA256VM_ROUND_WIDTH].borrow(); @@ -226,8 +229,8 @@ impl Sha256VmAir { // - and next_padding_offset = 0 since `pad_flags = NotConsidered` let expected_len = next.inner.flags.local_block_idx * next.control.padding_occurred - * AB::Expr::from_canonical_usize(SHA256_BLOCK_U8S) - + next_row_idx * AB::Expr::from_canonical_usize(SHA256_READ_SIZE) + * AB::Expr::from_usize(SHA256_BLOCK_U8S) + + next_row_idx * AB::Expr::from_usize(SHA256_READ_SIZE) + next_padding_offset; // Note: `next_is_first_padding_row` is either -1,0,1 @@ -391,7 +394,7 @@ impl Sha256VmAir { builder .when(should_be_128) - .assert_eq(AB::Expr::from_canonical_u32(1 << 7), w); + .assert_eq(AB::Expr::from_u32(1 << 7), w); // should be len is handled outside of the loop } @@ -413,7 +416,7 @@ impl Sha256VmAir { ); builder.when(is_last_padding_row.clone()).assert_eq( - appended_len * AB::F::from_canonical_usize(RV32_CELL_BITS).inverse(), // bit to byte conversion + appended_len * AB::F::from_usize(RV32_CELL_BITS).inverse(), // bit to byte conversion actual_len, ); @@ -436,7 +439,10 @@ impl Sha256VmAir { /// Implement constraints on `len`, `read_ptr` and `cur_timestamp` fn eval_transitions(&self, builder: &mut AB) { let main = builder.main(); - let (local, next) = (main.row_slice(0), main.row_slice(1)); + let (local, next) = ( + main.row_slice(0).expect("window should have two elements"), + main.row_slice(1).expect("window should have two elements"), + ); let local_cols: &Sha256VmRoundCols = local[..SHA256VM_ROUND_WIDTH].borrow(); let next_cols: &Sha256VmRoundCols = next[..SHA256VM_ROUND_WIDTH].borrow(); @@ -451,8 +457,8 @@ impl Sha256VmAir { // Read ptr should increment by [SHA256_READ_SIZE] for the first 4 rows and stay the same // otherwise - let read_ptr_delta = local_cols.inner.flags.is_first_4_rows - * AB::Expr::from_canonical_usize(SHA256_READ_SIZE); + let read_ptr_delta = + local_cols.inner.flags.is_first_4_rows * AB::Expr::from_usize(SHA256_READ_SIZE); builder .when_transition() .when(not::(is_last_row.clone())) @@ -475,7 +481,7 @@ impl Sha256VmAir { /// Implement the reads for the first 4 rows of a block fn eval_reads(&self, builder: &mut AB) { let main = builder.main(); - let local = main.row_slice(0); + let local = main.row_slice(0).expect("window should have two elements"); let local_cols: &Sha256VmRoundCols = local[..SHA256VM_ROUND_WIDTH].borrow(); let message: [AB::Var; SHA256_READ_SIZE] = array::from_fn(|i| { @@ -486,7 +492,7 @@ impl Sha256VmAir { self.memory_bridge .read( MemoryAddress::new( - AB::Expr::from_canonical_u32(RV32_MEMORY_AS), + AB::Expr::from_u32(RV32_MEMORY_AS), local_cols.control.read_ptr, ), message, @@ -498,14 +504,14 @@ impl Sha256VmAir { /// Implement the constraints for the last row of a message fn eval_last_row(&self, builder: &mut AB) { let main = builder.main(); - let local = main.row_slice(0); + let local = main.row_slice(0).expect("window should have two elements"); let local_cols: &Sha256VmDigestCols = local[..SHA256VM_DIGEST_WIDTH].borrow(); let timestamp: AB::Var = local_cols.from_state.timestamp; let mut timestamp_delta: usize = 0; let mut timestamp_pp = || { timestamp_delta += 1; - timestamp + AB::Expr::from_canonical_usize(timestamp_delta - 1) + timestamp + AB::Expr::from_usize(timestamp_delta - 1) }; let is_last_row = @@ -513,10 +519,7 @@ impl Sha256VmAir { self.memory_bridge .read( - MemoryAddress::new( - AB::Expr::from_canonical_u32(RV32_REGISTER_AS), - local_cols.rd_ptr, - ), + MemoryAddress::new(AB::Expr::from_u32(RV32_REGISTER_AS), local_cols.rd_ptr), local_cols.dst_ptr, timestamp_pp(), &local_cols.register_reads_aux[0], @@ -525,10 +528,7 @@ impl Sha256VmAir { self.memory_bridge .read( - MemoryAddress::new( - AB::Expr::from_canonical_u32(RV32_REGISTER_AS), - local_cols.rs1_ptr, - ), + MemoryAddress::new(AB::Expr::from_u32(RV32_REGISTER_AS), local_cols.rs1_ptr), local_cols.src_ptr, timestamp_pp(), &local_cols.register_reads_aux[1], @@ -537,10 +537,7 @@ impl Sha256VmAir { self.memory_bridge .read( - MemoryAddress::new( - AB::Expr::from_canonical_u32(RV32_REGISTER_AS), - local_cols.rs2_ptr, - ), + MemoryAddress::new(AB::Expr::from_u32(RV32_REGISTER_AS), local_cols.rs2_ptr), local_cols.len_data, timestamp_pp(), &local_cols.register_reads_aux[2], @@ -550,7 +547,7 @@ impl Sha256VmAir { // range check that the memory pointers don't overflow // Note: no need to range check the length since we read from memory step by step and // the memory bus will catch any memory accesses beyond ptr_max_bits - let shift = AB::Expr::from_canonical_usize( + let shift = AB::Expr::from_usize( 1 << (RV32_REGISTER_NUM_LIMBS * RV32_CELL_BITS - self.ptr_max_bits), ); // This only works if self.ptr_max_bits >= 24 which is typically the case @@ -564,10 +561,10 @@ impl Sha256VmAir { .eval(builder, is_last_row.clone()); // the number of reads that happened to read the entire message: we do 4 reads per block - let time_delta = (local_cols.inner.flags.local_block_idx + AB::Expr::ONE) - * AB::Expr::from_canonical_usize(4); + let time_delta = + (local_cols.inner.flags.local_block_idx + AB::Expr::ONE) * AB::Expr::from_usize(4); // Every time we read the message we increment the read pointer by SHA256_READ_SIZE - let read_ptr_delta = time_delta.clone() * AB::Expr::from_canonical_usize(SHA256_READ_SIZE); + let read_ptr_delta = time_delta.clone() * AB::Expr::from_usize(SHA256_READ_SIZE); let result: [AB::Var; SHA256_WORD_U8S * SHA256_HASH_WORDS] = array::from_fn(|i| { // The limbs are written in big endian order to the memory so need to be reversed @@ -583,7 +580,7 @@ impl Sha256VmAir { // another hash self.memory_bridge .write( - MemoryAddress::new(AB::Expr::from_canonical_u32(RV32_MEMORY_AS), dst_ptr_val), + MemoryAddress::new(AB::Expr::from_u32(RV32_MEMORY_AS), dst_ptr_val), result, timestamp_pp() + time_delta.clone(), &local_cols.writes_aux, @@ -592,16 +589,16 @@ impl Sha256VmAir { self.execution_bridge .execute_and_increment_pc( - AB::Expr::from_canonical_usize(Rv32Sha256Opcode::SHA256.global_opcode().as_usize()), + AB::Expr::from_usize(Rv32Sha256Opcode::SHA256.global_opcode().as_usize()), [ local_cols.rd_ptr.into(), local_cols.rs1_ptr.into(), local_cols.rs2_ptr.into(), - AB::Expr::from_canonical_u32(RV32_REGISTER_AS), - AB::Expr::from_canonical_u32(RV32_MEMORY_AS), + AB::Expr::from_u32(RV32_REGISTER_AS), + AB::Expr::from_u32(RV32_MEMORY_AS), ], local_cols.from_state, - AB::Expr::from_canonical_usize(timestamp_delta) + time_delta.clone(), + AB::Expr::from_usize(timestamp_delta) + time_delta.clone(), ) .eval(builder, is_last_row.clone()); @@ -618,7 +615,7 @@ impl Sha256VmAir { // Assert that we started reading from the correct timestamp builder.when(is_last_row.clone()).assert_eq( local_cols.control.cur_timestamp, - local_cols.from_state.timestamp + AB::Expr::from_canonical_u32(3) + time_delta, + local_cols.from_state.timestamp + AB::Expr::from_u32(3) + time_delta, ); } } diff --git a/extensions/sha256/circuit/src/sha256_chip/tests.rs b/extensions/sha256/circuit/src/sha256_chip/tests.rs index 4f72ffd333..8f3b0243d6 100644 --- a/extensions/sha256/circuit/src/sha256_chip/tests.rs +++ b/extensions/sha256/circuit/src/sha256_chip/tests.rs @@ -23,7 +23,7 @@ use openvm_instructions::{ }; use openvm_sha256_air::{get_sha256_num_blocks, SHA256_BLOCK_U8S}; use openvm_sha256_transpiler::Rv32Sha256Opcode::{self, *}; -use openvm_stark_backend::{interaction::BusIndex, p3_field::FieldAlgebra}; +use openvm_stark_backend::{interaction::BusIndex, p3_field::PrimeCharacteristicRing}; use openvm_stark_sdk::{p3_baby_bear::BabyBear, utils::create_seeded_rng}; use rand::{rngs::StdRng, Rng}; #[cfg(feature = "cuda")] @@ -89,7 +89,7 @@ fn set_and_execute>( message: Option<&[u8]>, len: Option, ) { - let len = len.unwrap_or(rng.gen_range(1..3000)); + let len = len.unwrap_or(rng.random_range(1..3000)); let tmp = get_random_message(rng, len); let message: &[u8] = message.unwrap_or(&tmp); let len = message.len(); @@ -100,18 +100,18 @@ fn set_and_execute>( let dst_ptr = gen_pointer(rng, 4); let src_ptr = gen_pointer(rng, 4); - tester.write(1, rd, dst_ptr.to_le_bytes().map(F::from_canonical_u8)); - tester.write(1, rs1, src_ptr.to_le_bytes().map(F::from_canonical_u8)); - tester.write(1, rs2, len.to_le_bytes().map(F::from_canonical_u8)); + tester.write(1, rd, dst_ptr.to_le_bytes().map(F::from_u8)); + tester.write(1, rs1, src_ptr.to_le_bytes().map(F::from_u8)); + tester.write(1, rs2, len.to_le_bytes().map(F::from_u8)); // Adding random memory after the message let num_blocks = get_sha256_num_blocks(len as u32) as usize; for offset in (0..num_blocks * SHA256_BLOCK_U8S).step_by(4) { let chunk: [F; 4] = array::from_fn(|i| { if offset + i < message.len() { - F::from_canonical_u8(message[offset + i]) + F::from_u8(message[offset + i]) } else { - F::from_canonical_u8(rng.gen()) + F::from_u8(rng.random()) } }); @@ -126,7 +126,7 @@ fn set_and_execute>( let output = sha256_solve(message); assert_eq!( - output.map(F::from_canonical_u8), + output.map(F::from_u8), tester.read::<32>(RV32_MEMORY_AS as usize, dst_ptr) ); } diff --git a/extensions/sha256/circuit/src/sha256_chip/trace.rs b/extensions/sha256/circuit/src/sha256_chip/trace.rs index 7fc5c7062c..0b3d317e0b 100644 --- a/extensions/sha256/circuit/src/sha256_chip/trace.rs +++ b/extensions/sha256/circuit/src/sha256_chip/trace.rs @@ -464,14 +464,14 @@ impl Sha256VmFiller { // This is a digest row let digest_cols: &mut Sha256VmDigestCols = row_slice[..SHA256VM_DIGEST_WIDTH].borrow_mut(); - digest_cols.from_state.timestamp = F::from_canonical_u32(record.timestamp); - digest_cols.from_state.pc = F::from_canonical_u32(record.from_pc); - digest_cols.rd_ptr = F::from_canonical_u32(record.rd_ptr); - digest_cols.rs1_ptr = F::from_canonical_u32(record.rs1_ptr); - digest_cols.rs2_ptr = F::from_canonical_u32(record.rs2_ptr); - digest_cols.dst_ptr = record.dst_ptr.to_le_bytes().map(F::from_canonical_u8); - digest_cols.src_ptr = record.src_ptr.to_le_bytes().map(F::from_canonical_u8); - digest_cols.len_data = record.len.to_le_bytes().map(F::from_canonical_u8); + digest_cols.from_state.timestamp = F::from_u32(record.timestamp); + digest_cols.from_state.pc = F::from_u32(record.from_pc); + digest_cols.rd_ptr = F::from_u32(record.rd_ptr); + digest_cols.rs1_ptr = F::from_u32(record.rs1_ptr); + digest_cols.rs2_ptr = F::from_u32(record.rs2_ptr); + digest_cols.dst_ptr = record.dst_ptr.to_le_bytes().map(F::from_u8); + digest_cols.src_ptr = record.src_ptr.to_le_bytes().map(F::from_u8); + digest_cols.len_data = record.len.to_le_bytes().map(F::from_u8); if is_last_block { digest_cols .register_reads_aux @@ -487,7 +487,7 @@ impl Sha256VmFiller { }); digest_cols .writes_aux - .set_prev_data(record.write_aux.prev_data.map(F::from_canonical_u8)); + .set_prev_data(record.write_aux.prev_data.map(F::from_u8)); // In the last block we do `SHA256_NUM_READ_ROWS` reads and then write the // result thus the timestamp of the write is // `block_start_timestamp + SHA256_NUM_READ_ROWS` @@ -536,7 +536,7 @@ impl Sha256VmFiller { .iter(), ) .for_each(|(cell, data)| { - *cell = F::from_canonical_u8(*data); + *cell = F::from_u8(*data); }); mem_helper.fill( read_aux_records[row_idx].prev_timestamp, @@ -550,12 +550,11 @@ impl Sha256VmFiller { // Fill in the control cols, doesn't matter if it is a round or digest row let control_cols: &mut Sha256VmControlCols = row_slice[..SHA256VM_CONTROL_WIDTH].borrow_mut(); - control_cols.len = F::from_canonical_u32(record.len); + control_cols.len = F::from_u32(record.len); // Only the first `SHA256_NUM_READ_ROWS` rows increment the timestamp and read ptr - control_cols.cur_timestamp = F::from_canonical_u32( - block_start_timestamp + min(row_idx, SHA256_NUM_READ_ROWS) as u32, - ); - control_cols.read_ptr = F::from_canonical_u32( + control_cols.cur_timestamp = + F::from_u32(block_start_timestamp + min(row_idx, SHA256_NUM_READ_ROWS) as u32); + control_cols.read_ptr = F::from_u32( block_start_read_ptr + (SHA256_READ_SIZE * min(row_idx, SHA256_NUM_READ_ROWS)) as u32, ); @@ -568,7 +567,7 @@ impl Sha256VmFiller { &self.padding_encoder, PaddingFlags::NotPadding as usize, ) - .map(F::from_canonical_u32); + .map(F::from_u32); } else if row_idx as i32 == first_padding_row { let len = message_left - row_idx * SHA256_READ_SIZE; control_cols.pad_flags = get_flag_pt_array( @@ -580,7 +579,7 @@ impl Sha256VmFiller { } as usize + len, ) - .map(F::from_canonical_u32); + .map(F::from_u32); } else { control_cols.pad_flags = get_flag_pt_array( &self.padding_encoder, @@ -590,14 +589,14 @@ impl Sha256VmFiller { PaddingFlags::EntirePadding } as usize, ) - .map(F::from_canonical_u32); + .map(F::from_u32); } } else { control_cols.pad_flags = get_flag_pt_array( &self.padding_encoder, PaddingFlags::NotConsidered as usize, ) - .map(F::from_canonical_u32); + .map(F::from_u32); } if is_last_block && row_idx == SHA256_ROWS_PER_BLOCK - 1 { // If last digest row, then we set padding_occurred = 0 diff --git a/guest-libs/ff_derive/Cargo.toml b/guest-libs/ff_derive/Cargo.toml index acb017123f..793edef4f1 100644 --- a/guest-libs/ff_derive/Cargo.toml +++ b/guest-libs/ff_derive/Cargo.toml @@ -20,7 +20,7 @@ proc-macro = true [dependencies] addchain = "0.2" -num-bigint = "0.3" +num-bigint03 = { package = "num-bigint", version = "0.3.3" } num-traits = "0.2" num-integer = "0.1" proc-macro2 = "1" diff --git a/guest-libs/ff_derive/src/lib.rs b/guest-libs/ff_derive/src/lib.rs index 79c6c17efc..cc9d70c3fe 100644 --- a/guest-libs/ff_derive/src/lib.rs +++ b/guest-libs/ff_derive/src/lib.rs @@ -6,7 +6,7 @@ extern crate proc_macro2; use std::{iter, str::FromStr}; -use num_bigint::BigUint; +use num_bigint03::BigUint; use num_integer::Integer; use num_traits::{One, ToPrimitive, Zero}; use quote::{quote, TokenStreamExt}; diff --git a/guest-libs/ff_derive/src/pow_fixed.rs b/guest-libs/ff_derive/src/pow_fixed.rs index 810de17264..e4561407f5 100644 --- a/guest-libs/ff_derive/src/pow_fixed.rs +++ b/guest-libs/ff_derive/src/pow_fixed.rs @@ -1,7 +1,7 @@ //! Fixed-exponent variable-base exponentiation using addition chains. use addchain::{build_addition_chain, Step}; -use num_bigint::BigUint; +use num_bigint03::BigUint; use quote::quote; use syn::Ident; diff --git a/guest-libs/k256/tests/lib.rs b/guest-libs/k256/tests/lib.rs index 59eb42dde3..2cbdc6e839 100644 --- a/guest-libs/k256/tests/lib.rs +++ b/guest-libs/k256/tests/lib.rs @@ -114,11 +114,13 @@ mod guest_tests { }; #[cfg(not(feature = "cuda"))] use { - openvm_circuit::{arch::MatrixRecordArena, system::SystemChipInventory}, + openvm_circuit::{ + arch::{MatrixRecordArena, VmField}, + system::SystemChipInventory, + }, openvm_stark_backend::{ config::{StarkGenericConfig, Val}, engine::StarkEngine, - p3_field::PrimeField32, prover::cpu::{CpuBackend, CpuDevice}, }, }; @@ -158,7 +160,7 @@ mod guest_tests { where SC: StarkGenericConfig, E: StarkEngine, PD = CpuDevice>, - Val: PrimeField32, + Val: VmField, { type VmConfig = EcdsaConfig; type SystemChipInventory = SystemChipInventory; diff --git a/guest-libs/p256/tests/lib.rs b/guest-libs/p256/tests/lib.rs index 9eaf2b2c74..1858b994aa 100644 --- a/guest-libs/p256/tests/lib.rs +++ b/guest-libs/p256/tests/lib.rs @@ -114,11 +114,13 @@ mod guest_tests { }; #[cfg(not(feature = "cuda"))] use { - openvm_circuit::{arch::MatrixRecordArena, system::SystemChipInventory}, + openvm_circuit::{ + arch::{MatrixRecordArena, VmField}, + system::SystemChipInventory, + }, openvm_stark_backend::{ config::{StarkGenericConfig, Val}, engine::StarkEngine, - p3_field::PrimeField32, prover::cpu::{CpuBackend, CpuDevice}, }, }; @@ -158,7 +160,7 @@ mod guest_tests { where SC: StarkGenericConfig, E: StarkEngine, PD = CpuDevice>, - Val: PrimeField32, + Val: VmField, { type VmConfig = EcdsaConfig; type SystemChipInventory = SystemChipInventory; diff --git a/guest-libs/pairing/Cargo.toml b/guest-libs/pairing/Cargo.toml index 774c61c968..b13502712b 100644 --- a/guest-libs/pairing/Cargo.toml +++ b/guest-libs/pairing/Cargo.toml @@ -12,7 +12,6 @@ openvm = { workspace = true } openvm-platform = { workspace = true } serde = { workspace = true } itertools = { workspace = true, features = ["use_alloc"] } -rand.workspace = true hex-literal = { workspace = true } openvm-algebra-guest = { workspace = true } openvm-algebra-moduli-macros = { workspace = true } @@ -49,11 +48,11 @@ openvm-rv32im-transpiler.workspace = true openvm = { workspace = true } openvm-toolchain-tests = { workspace = true } eyre.workspace = true -rand.workspace = true num-bigint.workspace = true num-traits.workspace = true halo2curves-axiom = { workspace = true } openvm-pairing = { path = ".", features = ["halo2curves"] } +rand08 = { package = "rand", version = "0.8.5", features = ["std_rng"] } [features] default = [] diff --git a/guest-libs/pairing/src/bls12_381/tests.rs b/guest-libs/pairing/src/bls12_381/tests.rs index dad4258c44..b109e0d9b2 100644 --- a/guest-libs/pairing/src/bls12_381/tests.rs +++ b/guest-libs/pairing/src/bls12_381/tests.rs @@ -10,7 +10,7 @@ use openvm_pairing_guest::{ bls12_381::{BLS12_381_MODULUS, BLS12_381_ORDER}, pairing::{FinalExp, MultiMillerLoop, PairingCheck, PairingIntrinsics}, }; -use rand::{rngs::StdRng, SeedableRng}; +use rand08::{rngs::StdRng, SeedableRng}; use super::{Fp, Fp12, Fp2}; use crate::{ diff --git a/guest-libs/pairing/src/bn254/tests.rs b/guest-libs/pairing/src/bn254/tests.rs index fb4503e282..4b89b7ac7b 100644 --- a/guest-libs/pairing/src/bn254/tests.rs +++ b/guest-libs/pairing/src/bn254/tests.rs @@ -11,7 +11,7 @@ use openvm_pairing_guest::{ bn254::{BN254_MODULUS, BN254_ORDER}, pairing::{FinalExp, MultiMillerLoop, PairingCheck, PairingIntrinsics}, }; -use rand::{rngs::StdRng, SeedableRng}; +use rand08::{rngs::StdRng, SeedableRng}; use super::{Fp, Fp12, Fp2}; use crate::{ diff --git a/guest-libs/pairing/tests/lib.rs b/guest-libs/pairing/tests/lib.rs index 68150d536a..f2244885e1 100644 --- a/guest-libs/pairing/tests/lib.rs +++ b/guest-libs/pairing/tests/lib.rs @@ -37,11 +37,12 @@ mod bn254 { Rv32ITranspilerExtension, Rv32IoTranspilerExtension, Rv32MTranspilerExtension, }; use openvm_stark_sdk::{ - config::FriParameters, openvm_stark_backend::p3_field::FieldAlgebra, p3_baby_bear::BabyBear, + config::FriParameters, openvm_stark_backend::p3_field::PrimeCharacteristicRing, + p3_baby_bear::BabyBear, }; use openvm_toolchain_tests::{build_example_program_at_path_with_features, get_programs_dir}; use openvm_transpiler::{transpiler::Transpiler, FromElf}; - use rand::SeedableRng; + use rand08::SeedableRng; type F = BabyBear; @@ -111,7 +112,7 @@ mod bn254 { .with_extension(Fp2TranspilerExtension), )?; - let mut rng = rand::rngs::StdRng::seed_from_u64(2); + let mut rng = rand08::rngs::StdRng::seed_from_u64(2); let f0 = Fq12::random(&mut rng); let f1 = Fq12::random(&mut rng); let r = f0 * f1; @@ -120,7 +121,7 @@ mod bn254 { .into_iter() .flat_map(|fp12| fp12.to_coeffs()) .flat_map(|fp2| fp2.to_bytes()) - .map(F::from_canonical_u8) + .map(F::from_u8) .collect::>(); air_test_with_min_segments(Rv32PairingBuilder, config, openvm_exe, vec![io], 1); @@ -147,7 +148,7 @@ mod bn254 { .with_extension(Fp2TranspilerExtension), )?; - let mut rng = rand::rngs::StdRng::seed_from_u64(2); + let mut rng = rand08::rngs::StdRng::seed_from_u64(2); let a = G2Affine::random(&mut rng); let b = G2Affine::random(&mut rng); let c = G2Affine::random(&mut rng); @@ -164,7 +165,7 @@ mod bn254 { .chain(r0) .flat_map(|fp2| fp2.to_coeffs()) .flat_map(|fp| fp.to_bytes()) - .map(F::from_canonical_u8) + .map(F::from_u8) .collect::>(); // Test mul_by_01234 @@ -176,7 +177,7 @@ mod bn254 { .chain(r1.to_coeffs()) .flat_map(|fp2| fp2.to_coeffs()) .flat_map(|fp| fp.to_bytes()) - .map(F::from_canonical_u8) + .map(F::from_u8) .collect::>(); let io_all = io0.into_iter().chain(io1).collect::>(); @@ -205,7 +206,7 @@ mod bn254 { .with_extension(Fp2TranspilerExtension), )?; - let mut rng = rand::rngs::StdRng::seed_from_u64(20); + let mut rng = rand08::rngs::StdRng::seed_from_u64(20); let S = G2Affine::random(&mut rng); let Q = G2Affine::random(&mut rng); @@ -217,7 +218,7 @@ mod bn254 { let io0 = [s.x, s.y, pt.x, pt.y, l.b, l.c] .into_iter() .flat_map(|fp| fp.to_bytes()) - .map(F::from_canonical_u8) + .map(F::from_u8) .collect::>(); // Test miller_double_and_add_step @@ -225,7 +226,7 @@ mod bn254 { let io1 = [s.x, s.y, q.x, q.y, pt.x, pt.y, l0.b, l0.c, l1.b, l1.c] .into_iter() .flat_map(|fp| fp.to_bytes()) - .map(F::from_canonical_u8) + .map(F::from_u8) .collect::>(); let io_all = io0.into_iter().chain(io1).collect::>(); @@ -269,7 +270,7 @@ mod bn254 { let io0 = s .into_iter() .flat_map(|pt| [pt.x, pt.y].into_iter().flat_map(|fp| fp.to_bytes())) - .map(F::from_canonical_u8) + .map(F::from_u8) .collect::>(); let io1 = q @@ -278,7 +279,7 @@ mod bn254 { .chain(f.to_coeffs()) .flat_map(|fp2| fp2.to_coeffs()) .flat_map(|fp| fp.to_bytes()) - .map(F::from_canonical_u8) + .map(F::from_u8) .collect::>(); let io_all = io0.into_iter().chain(io1).collect::>(); @@ -327,7 +328,7 @@ mod bn254 { let io0 = s .into_iter() .flat_map(|pt| [pt.x, pt.y].into_iter().flat_map(|fp| fp.to_bytes())) - .map(F::from_canonical_u8) + .map(F::from_u8) .collect::>(); let io1 = q @@ -335,7 +336,7 @@ mod bn254 { .flat_map(|pt| [pt.x, pt.y].into_iter()) .flat_map(|fp2| fp2.to_coeffs()) .flat_map(|fp| fp.to_bytes()) - .map(F::from_canonical_u8) + .map(F::from_u8) .collect::>(); let io_all = io0.into_iter().chain(io1).collect::>(); @@ -384,7 +385,7 @@ mod bn254 { let io0 = s .into_iter() .flat_map(|pt| [pt.x, pt.y].into_iter().flat_map(|fp| fp.to_bytes())) - .map(F::from_canonical_u8) + .map(F::from_u8) .collect::>(); let io1 = q @@ -392,7 +393,7 @@ mod bn254 { .flat_map(|pt| [pt.x, pt.y].into_iter()) .flat_map(|fp2| fp2.to_coeffs()) .flat_map(|fp| fp.to_bytes()) - .map(F::from_canonical_u8) + .map(F::from_u8) .collect::>(); let io_all = io0.into_iter().chain(io1).collect::>(); @@ -457,7 +458,7 @@ mod bn254 { let io = io .into_iter() .flat_map(|w| w.to_le_bytes()) - .map(F::from_canonical_u8) + .map(F::from_u8) .collect(); air_test_with_min_segments(Rv32PairingBuilder, config, openvm_exe, vec![io], 1); Ok(()) @@ -506,11 +507,12 @@ mod bls12_381 { Rv32ITranspilerExtension, Rv32IoTranspilerExtension, Rv32MTranspilerExtension, }; use openvm_stark_sdk::{ - config::FriParameters, openvm_stark_backend::p3_field::FieldAlgebra, p3_baby_bear::BabyBear, + config::FriParameters, openvm_stark_backend::p3_field::PrimeCharacteristicRing, + p3_baby_bear::BabyBear, }; use openvm_toolchain_tests::{build_example_program_at_path_with_features, get_programs_dir}; use openvm_transpiler::{transpiler::Transpiler, FromElf}; - use rand::SeedableRng; + use rand08::SeedableRng; type F = BabyBear; @@ -586,7 +588,7 @@ mod bls12_381 { .with_extension(Fp2TranspilerExtension), )?; - let mut rng = rand::rngs::StdRng::seed_from_u64(50); + let mut rng = rand08::rngs::StdRng::seed_from_u64(50); let f0 = Fq12::random(&mut rng); let f1 = Fq12::random(&mut rng); let r = f0 * f1; @@ -595,7 +597,7 @@ mod bls12_381 { .into_iter() .flat_map(|fp12| fp12.to_coeffs()) .flat_map(|fp2| fp2.to_bytes()) - .map(F::from_canonical_u8) + .map(F::from_u8) .collect::>(); air_test_with_min_segments(Rv32PairingBuilder, config, openvm_exe, vec![io], 1); @@ -622,7 +624,7 @@ mod bls12_381 { .with_extension(Fp2TranspilerExtension), )?; - let mut rng = rand::rngs::StdRng::seed_from_u64(5); + let mut rng = rand08::rngs::StdRng::seed_from_u64(5); let a = G2Affine::random(&mut rng); let b = G2Affine::random(&mut rng); let c = G2Affine::random(&mut rng); @@ -639,7 +641,7 @@ mod bls12_381 { .chain(r0) .flat_map(|fp2| fp2.to_coeffs()) .flat_map(|fp| fp.to_bytes()) - .map(F::from_canonical_u8) + .map(F::from_u8) .collect::>(); // Test mul_by_02345 @@ -652,7 +654,7 @@ mod bls12_381 { .chain(r1.to_coeffs()) .flat_map(|fp2| fp2.to_coeffs()) .flat_map(|fp| fp.to_bytes()) - .map(F::from_canonical_u8) + .map(F::from_u8) .collect::>(); let io_all = io0.into_iter().chain(io1).collect::>(); @@ -681,7 +683,7 @@ mod bls12_381 { .with_extension(Fp2TranspilerExtension), )?; - let mut rng = rand::rngs::StdRng::seed_from_u64(88); + let mut rng = rand08::rngs::StdRng::seed_from_u64(88); let S = G2Affine::random(&mut rng); let Q = G2Affine::random(&mut rng); @@ -693,7 +695,7 @@ mod bls12_381 { let io0 = [s.x, s.y, pt.x, pt.y, l.b, l.c] .into_iter() .flat_map(|fp| fp.to_bytes()) - .map(F::from_canonical_u8) + .map(F::from_u8) .collect::>(); // Test miller_double_and_add_step @@ -701,7 +703,7 @@ mod bls12_381 { let io1 = [s.x, s.y, q.x, q.y, pt.x, pt.y, l0.b, l0.c, l1.b, l1.c] .into_iter() .flat_map(|fp| fp.to_bytes()) - .map(F::from_canonical_u8) + .map(F::from_u8) .collect::>(); let io_all = io0.into_iter().chain(io1).collect::>(); @@ -751,7 +753,7 @@ mod bls12_381 { let io0 = s .into_iter() .flat_map(|pt| [pt.x, pt.y].into_iter().flat_map(|fp| fp.to_bytes())) - .map(F::from_canonical_u8) + .map(F::from_u8) .collect::>(); let io1 = q @@ -760,7 +762,7 @@ mod bls12_381 { .chain(f.to_coeffs()) .flat_map(|fp2| fp2.to_coeffs()) .flat_map(|fp| fp.to_bytes()) - .map(F::from_canonical_u8) + .map(F::from_u8) .collect::>(); let io_all = io0.into_iter().chain(io1).collect::>(); @@ -808,7 +810,7 @@ mod bls12_381 { let io0 = s .into_iter() .flat_map(|pt| [pt.x, pt.y].into_iter().flat_map(|fp| fp.to_bytes())) - .map(F::from_canonical_u8) + .map(F::from_u8) .collect::>(); let io1 = q @@ -816,7 +818,7 @@ mod bls12_381 { .flat_map(|pt| [pt.x, pt.y].into_iter()) .flat_map(|fp2| fp2.to_coeffs()) .flat_map(|fp| fp.to_bytes()) - .map(F::from_canonical_u8) + .map(F::from_u8) .collect::>(); let io_all = io0.into_iter().chain(io1).collect::>(); @@ -865,7 +867,7 @@ mod bls12_381 { let io0 = s .into_iter() .flat_map(|pt| [pt.x, pt.y].into_iter().flat_map(|fp| fp.to_bytes())) - .map(F::from_canonical_u8) + .map(F::from_u8) .collect::>(); let io1 = q @@ -873,7 +875,7 @@ mod bls12_381 { .flat_map(|pt| [pt.x, pt.y].into_iter()) .flat_map(|fp2| fp2.to_coeffs()) .flat_map(|fp| fp.to_bytes()) - .map(F::from_canonical_u8) + .map(F::from_u8) .collect::>(); let io_all = io0.into_iter().chain(io1).collect::>(); @@ -938,7 +940,7 @@ mod bls12_381 { let io = io .into_iter() .flat_map(|w| w.to_le_bytes()) - .map(F::from_canonical_u8) + .map(F::from_u8) .collect(); air_test_with_min_segments(Rv32PairingBuilder, config, openvm_exe, vec![io], 1); Ok(()) diff --git a/guest-libs/pairing/tests/programs/openvm_init_bls_final_exp_hint_bls12_381.rs b/guest-libs/pairing/tests/programs/openvm_init_bls_final_exp_hint_bls12_381.rs index ec5d5ed804..d3bc1e4d6c 100644 --- a/guest-libs/pairing/tests/programs/openvm_init_bls_final_exp_hint_bls12_381.rs +++ b/guest-libs/pairing/tests/programs/openvm_init_bls_final_exp_hint_bls12_381.rs @@ -1,4 +1,4 @@ // This file is automatically generated by cargo openvm. Do not rename or edit. openvm_algebra_guest::moduli_macros::moduli_init! { "4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272559787" } openvm_algebra_guest::complex_macros::complex_init! { "Bls12_381Fp2" { mod_idx = 0 } } -openvm_ecc_guest::sw_macros::sw_init! {} +openvm_ecc_guest::sw_macros::sw_init! { } diff --git a/guest-libs/pairing/tests/programs/openvm_init_bn_final_exp_hint_bn254.rs b/guest-libs/pairing/tests/programs/openvm_init_bn_final_exp_hint_bn254.rs index 1a1e1f95ea..2fb140d0b7 100644 --- a/guest-libs/pairing/tests/programs/openvm_init_bn_final_exp_hint_bn254.rs +++ b/guest-libs/pairing/tests/programs/openvm_init_bn_final_exp_hint_bn254.rs @@ -1,4 +1,4 @@ // This file is automatically generated by cargo openvm. Do not rename or edit. openvm_algebra_guest::moduli_macros::moduli_init! { "21888242871839275222246405745257275088696311157297823662689037894645226208583" } openvm_algebra_guest::complex_macros::complex_init! { "Bn254Fp2" { mod_idx = 0 } } -openvm_ecc_guest::sw_macros::sw_init! {} +openvm_ecc_guest::sw_macros::sw_init! { } diff --git a/guest-libs/pairing/tests/programs/openvm_init_fp12_mul_bls12_381.rs b/guest-libs/pairing/tests/programs/openvm_init_fp12_mul_bls12_381.rs index ec5d5ed804..d3bc1e4d6c 100644 --- a/guest-libs/pairing/tests/programs/openvm_init_fp12_mul_bls12_381.rs +++ b/guest-libs/pairing/tests/programs/openvm_init_fp12_mul_bls12_381.rs @@ -1,4 +1,4 @@ // This file is automatically generated by cargo openvm. Do not rename or edit. openvm_algebra_guest::moduli_macros::moduli_init! { "4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272559787" } openvm_algebra_guest::complex_macros::complex_init! { "Bls12_381Fp2" { mod_idx = 0 } } -openvm_ecc_guest::sw_macros::sw_init! {} +openvm_ecc_guest::sw_macros::sw_init! { } diff --git a/guest-libs/pairing/tests/programs/openvm_init_fp12_mul_bn254.rs b/guest-libs/pairing/tests/programs/openvm_init_fp12_mul_bn254.rs index 1a1e1f95ea..2fb140d0b7 100644 --- a/guest-libs/pairing/tests/programs/openvm_init_fp12_mul_bn254.rs +++ b/guest-libs/pairing/tests/programs/openvm_init_fp12_mul_bn254.rs @@ -1,4 +1,4 @@ // This file is automatically generated by cargo openvm. Do not rename or edit. openvm_algebra_guest::moduli_macros::moduli_init! { "21888242871839275222246405745257275088696311157297823662689037894645226208583" } openvm_algebra_guest::complex_macros::complex_init! { "Bn254Fp2" { mod_idx = 0 } } -openvm_ecc_guest::sw_macros::sw_init! {} +openvm_ecc_guest::sw_macros::sw_init! { } diff --git a/guest-libs/pairing/tests/programs/openvm_init_pairing_check_bls12_381.rs b/guest-libs/pairing/tests/programs/openvm_init_pairing_check_bls12_381.rs index ec5d5ed804..d3bc1e4d6c 100644 --- a/guest-libs/pairing/tests/programs/openvm_init_pairing_check_bls12_381.rs +++ b/guest-libs/pairing/tests/programs/openvm_init_pairing_check_bls12_381.rs @@ -1,4 +1,4 @@ // This file is automatically generated by cargo openvm. Do not rename or edit. openvm_algebra_guest::moduli_macros::moduli_init! { "4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272559787" } openvm_algebra_guest::complex_macros::complex_init! { "Bls12_381Fp2" { mod_idx = 0 } } -openvm_ecc_guest::sw_macros::sw_init! {} +openvm_ecc_guest::sw_macros::sw_init! { } diff --git a/guest-libs/pairing/tests/programs/openvm_init_pairing_check_bn254.rs b/guest-libs/pairing/tests/programs/openvm_init_pairing_check_bn254.rs index 1a1e1f95ea..2fb140d0b7 100644 --- a/guest-libs/pairing/tests/programs/openvm_init_pairing_check_bn254.rs +++ b/guest-libs/pairing/tests/programs/openvm_init_pairing_check_bn254.rs @@ -1,4 +1,4 @@ // This file is automatically generated by cargo openvm. Do not rename or edit. openvm_algebra_guest::moduli_macros::moduli_init! { "21888242871839275222246405745257275088696311157297823662689037894645226208583" } openvm_algebra_guest::complex_macros::complex_init! { "Bn254Fp2" { mod_idx = 0 } } -openvm_ecc_guest::sw_macros::sw_init! {} +openvm_ecc_guest::sw_macros::sw_init! { } diff --git a/guest-libs/pairing/tests/programs/openvm_init_pairing_line_bls12_381.rs b/guest-libs/pairing/tests/programs/openvm_init_pairing_line_bls12_381.rs index ec5d5ed804..d3bc1e4d6c 100644 --- a/guest-libs/pairing/tests/programs/openvm_init_pairing_line_bls12_381.rs +++ b/guest-libs/pairing/tests/programs/openvm_init_pairing_line_bls12_381.rs @@ -1,4 +1,4 @@ // This file is automatically generated by cargo openvm. Do not rename or edit. openvm_algebra_guest::moduli_macros::moduli_init! { "4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272559787" } openvm_algebra_guest::complex_macros::complex_init! { "Bls12_381Fp2" { mod_idx = 0 } } -openvm_ecc_guest::sw_macros::sw_init! {} +openvm_ecc_guest::sw_macros::sw_init! { } diff --git a/guest-libs/pairing/tests/programs/openvm_init_pairing_line_bn254.rs b/guest-libs/pairing/tests/programs/openvm_init_pairing_line_bn254.rs index 1a1e1f95ea..2fb140d0b7 100644 --- a/guest-libs/pairing/tests/programs/openvm_init_pairing_line_bn254.rs +++ b/guest-libs/pairing/tests/programs/openvm_init_pairing_line_bn254.rs @@ -1,4 +1,4 @@ // This file is automatically generated by cargo openvm. Do not rename or edit. openvm_algebra_guest::moduli_macros::moduli_init! { "21888242871839275222246405745257275088696311157297823662689037894645226208583" } openvm_algebra_guest::complex_macros::complex_init! { "Bn254Fp2" { mod_idx = 0 } } -openvm_ecc_guest::sw_macros::sw_init! {} +openvm_ecc_guest::sw_macros::sw_init! { } diff --git a/guest-libs/pairing/tests/programs/openvm_init_pairing_miller_loop_bls12_381.rs b/guest-libs/pairing/tests/programs/openvm_init_pairing_miller_loop_bls12_381.rs index ec5d5ed804..d3bc1e4d6c 100644 --- a/guest-libs/pairing/tests/programs/openvm_init_pairing_miller_loop_bls12_381.rs +++ b/guest-libs/pairing/tests/programs/openvm_init_pairing_miller_loop_bls12_381.rs @@ -1,4 +1,4 @@ // This file is automatically generated by cargo openvm. Do not rename or edit. openvm_algebra_guest::moduli_macros::moduli_init! { "4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272559787" } openvm_algebra_guest::complex_macros::complex_init! { "Bls12_381Fp2" { mod_idx = 0 } } -openvm_ecc_guest::sw_macros::sw_init! {} +openvm_ecc_guest::sw_macros::sw_init! { } diff --git a/guest-libs/pairing/tests/programs/openvm_init_pairing_miller_loop_bn254.rs b/guest-libs/pairing/tests/programs/openvm_init_pairing_miller_loop_bn254.rs index 1a1e1f95ea..2fb140d0b7 100644 --- a/guest-libs/pairing/tests/programs/openvm_init_pairing_miller_loop_bn254.rs +++ b/guest-libs/pairing/tests/programs/openvm_init_pairing_miller_loop_bn254.rs @@ -1,4 +1,4 @@ // This file is automatically generated by cargo openvm. Do not rename or edit. openvm_algebra_guest::moduli_macros::moduli_init! { "21888242871839275222246405745257275088696311157297823662689037894645226208583" } openvm_algebra_guest::complex_macros::complex_init! { "Bn254Fp2" { mod_idx = 0 } } -openvm_ecc_guest::sw_macros::sw_init! {} +openvm_ecc_guest::sw_macros::sw_init! { } diff --git a/guest-libs/pairing/tests/programs/openvm_init_pairing_miller_step_bls12_381.rs b/guest-libs/pairing/tests/programs/openvm_init_pairing_miller_step_bls12_381.rs index ec5d5ed804..d3bc1e4d6c 100644 --- a/guest-libs/pairing/tests/programs/openvm_init_pairing_miller_step_bls12_381.rs +++ b/guest-libs/pairing/tests/programs/openvm_init_pairing_miller_step_bls12_381.rs @@ -1,4 +1,4 @@ // This file is automatically generated by cargo openvm. Do not rename or edit. openvm_algebra_guest::moduli_macros::moduli_init! { "4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272559787" } openvm_algebra_guest::complex_macros::complex_init! { "Bls12_381Fp2" { mod_idx = 0 } } -openvm_ecc_guest::sw_macros::sw_init! {} +openvm_ecc_guest::sw_macros::sw_init! { } diff --git a/guest-libs/pairing/tests/programs/openvm_init_pairing_miller_step_bn254.rs b/guest-libs/pairing/tests/programs/openvm_init_pairing_miller_step_bn254.rs index 1a1e1f95ea..2fb140d0b7 100644 --- a/guest-libs/pairing/tests/programs/openvm_init_pairing_miller_step_bn254.rs +++ b/guest-libs/pairing/tests/programs/openvm_init_pairing_miller_step_bn254.rs @@ -1,4 +1,4 @@ // This file is automatically generated by cargo openvm. Do not rename or edit. openvm_algebra_guest::moduli_macros::moduli_init! { "21888242871839275222246405745257275088696311157297823662689037894645226208583" } openvm_algebra_guest::complex_macros::complex_init! { "Bn254Fp2" { mod_idx = 0 } } -openvm_ecc_guest::sw_macros::sw_init! {} +openvm_ecc_guest::sw_macros::sw_init! { } From 6d6ca6b01d37f73e0d361f49709a6f33c2271425 Mon Sep 17 00:00:00 2001 From: Zach Langley Date: Fri, 5 Dec 2025 10:48:58 -0500 Subject: [PATCH 2/3] feat: update to provable params --- Cargo.lock | 18 ++++++++--------- benchmarks/guest/kitchen-sink/openvm.toml | 2 -- benchmarks/guest/kitchen-sink/openvm_init.rs | 4 ++-- benchmarks/guest/kitchen-sink/src/main.rs | 12 ----------- benchmarks/prove/src/bin/verify_fibair.rs | 5 ++--- benchmarks/prove/src/util.rs | 12 +++-------- crates/circuits/poseidon2-air/src/tests.rs | 4 ++-- crates/cli/src/default.rs | 12 ++++------- crates/sdk/src/config/mod.rs | 14 +++++-------- crates/sdk/src/keygen/dummy.rs | 8 ++++---- crates/sdk/src/keygen/mod.rs | 2 +- crates/sdk/src/lib.rs | 8 ++++++-- crates/sdk/src/prover/agg.rs | 15 +++++++++++++- .../native/circuit/src/extension/mod.rs | 20 +++++++++++++++++-- .../native/circuit/tests/integration_test.rs | 7 +++---- 15 files changed, 73 insertions(+), 70 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e67707a8da..4d23783382 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6328,7 +6328,7 @@ dependencies = [ [[package]] name = "openvm-cuda-backend" version = "1.2.2" -source = "git+https://github.com/openvm-org/stark-backend.git?branch=develop-v1.3.0#40e0be820e8b889e00b67f7a679f1ec3480b7c84" +source = "git+https://github.com/openvm-org/stark-backend.git?branch=develop-v1.3.0#222e5df31a0cc5cf5e95082da4fd463c87d2c048" dependencies = [ "bincode 2.0.1", "bincode_derive", @@ -6360,7 +6360,7 @@ dependencies = [ [[package]] name = "openvm-cuda-builder" version = "1.2.2" -source = "git+https://github.com/openvm-org/stark-backend.git?branch=develop-v1.3.0#40e0be820e8b889e00b67f7a679f1ec3480b7c84" +source = "git+https://github.com/openvm-org/stark-backend.git?branch=develop-v1.3.0#222e5df31a0cc5cf5e95082da4fd463c87d2c048" dependencies = [ "cc", "glob", @@ -6369,7 +6369,7 @@ dependencies = [ [[package]] name = "openvm-cuda-common" version = "1.2.2" -source = "git+https://github.com/openvm-org/stark-backend.git?branch=develop-v1.3.0#40e0be820e8b889e00b67f7a679f1ec3480b7c84" +source = "git+https://github.com/openvm-org/stark-backend.git?branch=develop-v1.3.0#222e5df31a0cc5cf5e95082da4fd463c87d2c048" dependencies = [ "bytesize", "ctor", @@ -7121,7 +7121,7 @@ dependencies = [ [[package]] name = "openvm-stark-backend" version = "1.2.2" -source = "git+https://github.com/openvm-org/stark-backend.git?branch=develop-v1.3.0#40e0be820e8b889e00b67f7a679f1ec3480b7c84" +source = "git+https://github.com/openvm-org/stark-backend.git?branch=develop-v1.3.0#222e5df31a0cc5cf5e95082da4fd463c87d2c048" dependencies = [ "bitcode", "cfg-if", @@ -7151,7 +7151,7 @@ dependencies = [ [[package]] name = "openvm-stark-sdk" version = "1.2.2" -source = "git+https://github.com/openvm-org/stark-backend.git?branch=develop-v1.3.0#40e0be820e8b889e00b67f7a679f1ec3480b7c84" +source = "git+https://github.com/openvm-org/stark-backend.git?branch=develop-v1.3.0#222e5df31a0cc5cf5e95082da4fd463c87d2c048" dependencies = [ "dashmap", "derivative", @@ -10029,7 +10029,7 @@ dependencies = [ "derive_more 2.0.1", "dunce", "inturn", - "itertools 0.10.5", + "itertools 0.11.0", "itoa", "normalize-path", "once_map", @@ -10040,7 +10040,7 @@ dependencies = [ "solar-config", "solar-data-structures", "solar-macros", - "thiserror 1.0.69", + "thiserror 2.0.15", "tracing", "unicode-width 0.2.2", ] @@ -10065,7 +10065,7 @@ dependencies = [ "alloy-primitives", "bitflags", "bumpalo", - "itertools 0.10.5", + "itertools 0.11.0", "memchr", "num-bigint 0.4.6", "num-rational", @@ -10398,7 +10398,7 @@ dependencies = [ "serde_json", "sha2 0.10.9", "tempfile", - "thiserror 1.0.69", + "thiserror 2.0.15", "url", "zip", ] diff --git a/benchmarks/guest/kitchen-sink/openvm.toml b/benchmarks/guest/kitchen-sink/openvm.toml index 2d1b307eef..7f70a95cea 100644 --- a/benchmarks/guest/kitchen-sink/openvm.toml +++ b/benchmarks/guest/kitchen-sink/openvm.toml @@ -7,7 +7,6 @@ [app_vm_config.modular] supported_moduli = [ - "1000000000000000003", # secp256k1 "115792089237316195423570985008687907853269984665640564039457584007908834671663", # coordinate "115792089237316195423570985008687907852837564279074904382605163141518161494337", # scalar @@ -22,7 +21,6 @@ supported_moduli = [ "52435875175126190479447740508185965837690552500527637822603658699938581184513", # scalar # 2^61 - 1 "2305843009213693951", - "7", ] [app_vm_config.fp2] diff --git a/benchmarks/guest/kitchen-sink/openvm_init.rs b/benchmarks/guest/kitchen-sink/openvm_init.rs index fdec4a6bdb..27875df628 100644 --- a/benchmarks/guest/kitchen-sink/openvm_init.rs +++ b/benchmarks/guest/kitchen-sink/openvm_init.rs @@ -1,4 +1,4 @@ // This file is automatically generated by cargo openvm. Do not rename or edit. -openvm_algebra_guest::moduli_macros::moduli_init! { "1000000000000000003", "115792089237316195423570985008687907853269984665640564039457584007908834671663", "115792089237316195423570985008687907852837564279074904382605163141518161494337", "115792089210356248762697446949407573530086143415290314195533631308867097853951", "115792089210356248762697446949407573529996955224135760342422259061068512044369", "21888242871839275222246405745257275088696311157297823662689037894645226208583", "21888242871839275222246405745257275088548364400416034343698204186575808495617", "4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272559787", "52435875175126190479447740508185965837690552500527637822603658699938581184513", "2305843009213693951", "7" } -openvm_algebra_guest::complex_macros::complex_init! { "Bn254Fp2" { mod_idx = 5 }, "Bls12_381Fp2" { mod_idx = 7 } } +openvm_algebra_guest::moduli_macros::moduli_init! { "115792089237316195423570985008687907853269984665640564039457584007908834671663", "115792089237316195423570985008687907852837564279074904382605163141518161494337", "115792089210356248762697446949407573530086143415290314195533631308867097853951", "115792089210356248762697446949407573529996955224135760342422259061068512044369", "21888242871839275222246405745257275088696311157297823662689037894645226208583", "21888242871839275222246405745257275088548364400416034343698204186575808495617", "4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272559787", "52435875175126190479447740508185965837690552500527637822603658699938581184513", "2305843009213693951" } +openvm_algebra_guest::complex_macros::complex_init! { "Bn254Fp2" { mod_idx = 4 }, "Bls12_381Fp2" { mod_idx = 6 } } openvm_ecc_guest::sw_macros::sw_init! { "Secp256k1Point", "P256Point", "Bn254G1Affine", "Bls12_381G1Affine" } diff --git a/benchmarks/guest/kitchen-sink/src/main.rs b/benchmarks/guest/kitchen-sink/src/main.rs index 3367181c6a..5c0b7b1c3e 100644 --- a/benchmarks/guest/kitchen-sink/src/main.rs +++ b/benchmarks/guest/kitchen-sink/src/main.rs @@ -23,8 +23,6 @@ use { // Note: these will all currently be represented as bytes32 even though they could be smaller openvm_algebra_guest::moduli_macros::moduli_declare! { - Seven { modulus = "7" }, - Mod1e18 { modulus = "1000000000000000003" }, Mersenne61 { modulus = "0x1fffffffffffffff" }, } @@ -67,7 +65,6 @@ fn materialize_ecc_chip() { pub fn main() { // Since we don't explicitly call setup functions anymore, we must ensure every declared modulus // and curve chip is materialized. - materialize_modular_chip::(); materialize_modular_chip::(); materialize_modular_chip::(); materialize_modular_chip::(); @@ -77,7 +74,6 @@ pub fn main() { materialize_modular_chip::(); materialize_modular_chip::(); materialize_modular_chip::(); - materialize_modular_chip::(); materialize_complex_chip!(Bn254Fp2, Bn254Fp); materialize_complex_chip!(Bls12_381Fp2, Bls12_381Fp); @@ -87,14 +83,6 @@ pub fn main() { materialize_ecc_chip::(); materialize_ecc_chip::(); - let [one, six] = [1, 6].map(Seven::from_u32); - assert_eq!(one + six, Seven::ZERO); - - let y = Mod1e18::from_u32(100); - let y = (&y * &y) * &y; - let y = y.clone() * y.clone() * y.clone(); - assert_eq!(y + Mod1e18::from_u32(3), Mod1e18::ZERO); - let mut bytes = [0u8; 32]; bytes[7] = 1 << 5; // 2^61 = modulus + 1 let mut res = Mersenne61::from_le_bytes_unchecked(&bytes); // No need to start from reduced representation diff --git a/benchmarks/prove/src/bin/verify_fibair.rs b/benchmarks/prove/src/bin/verify_fibair.rs index f73926e17e..a0539ce696 100644 --- a/benchmarks/prove/src/bin/verify_fibair.rs +++ b/benchmarks/prove/src/bin/verify_fibair.rs @@ -37,7 +37,7 @@ fn main() -> Result<()> { let n = 1 << 15; // STARK to calculate (2 ** 15)th Fibonacci number. let fib_chip = FibonacciChip::new(0, 1, n); - let engine = Poseidon2Engine::new(FriParameters::standard_with_100_bits_conjectured_security( + let engine = Poseidon2Engine::new(FriParameters::standard_with_100_bits_security( app_log_blowup, )); @@ -52,8 +52,7 @@ fn main() -> Result<()> { let fib_ctx = fib_ctx.into_iter().map(cpu_proving_ctx_to_gpu).collect(); let vdata = engine.run_test(fib_air, fib_ctx).unwrap(); // Unlike other apps, this "app" does not have continuations enabled. - let app_fri_params = - FriParameters::standard_with_100_bits_conjectured_security(leaf_log_blowup); + let app_fri_params = FriParameters::standard_with_100_bits_security(leaf_log_blowup); let mut app_vm_config = NativeConfig::aggregation( DEFAULT_MAX_NUM_PUBLIC_VALUES, app_fri_params.max_constraint_degree().min(7), diff --git a/benchmarks/prove/src/util.rs b/benchmarks/prove/src/util.rs index ac231ba7c9..256e985c32 100644 --- a/benchmarks/prove/src/util.rs +++ b/benchmarks/prove/src/util.rs @@ -99,15 +99,9 @@ impl BenchmarkCli { app_vm_config.as_mut().segmentation_limits.max_cells = max_cells; } AppConfig { - app_fri_params: FriParameters::standard_with_100_bits_conjectured_security( - app_log_blowup, - ) - .into(), + app_fri_params: FriParameters::standard_with_100_bits_security(app_log_blowup).into(), app_vm_config, - leaf_fri_params: FriParameters::standard_with_100_bits_conjectured_security( - leaf_log_blowup, - ) - .into(), + leaf_fri_params: FriParameters::standard_with_100_bits_security(leaf_log_blowup).into(), compiler_options: CompilerOptions { enable_cycle_tracker: self.profiling, ..Default::default() @@ -124,7 +118,7 @@ impl BenchmarkCli { let [leaf_fri_params, internal_fri_params, root_fri_params] = [leaf_log_blowup, internal_log_blowup, root_log_blowup] - .map(FriParameters::standard_with_100_bits_conjectured_security); + .map(FriParameters::standard_with_100_bits_security); AggregationConfig { leaf_fri_params, diff --git a/crates/circuits/poseidon2-air/src/tests.rs b/crates/circuits/poseidon2-air/src/tests.rs index 844aea20e4..23b370f4e6 100644 --- a/crates/circuits/poseidon2-air/src/tests.rs +++ b/crates/circuits/poseidon2-air/src/tests.rs @@ -7,7 +7,7 @@ use openvm_stark_backend::{ use openvm_stark_sdk::{ config::{ baby_bear_poseidon2::BabyBearPoseidon2Engine, - fri_params::standard_fri_params_with_100_bits_conjectured_security, + fri_params::standard_fri_params_with_100_bits_security, }, engine::StarkFriEngine, p3_baby_bear::BabyBear, @@ -41,7 +41,7 @@ fn run_poseidon2_subchip_test(subchip: Arc>, rng: .collect(); let mut poseidon2_trace = subchip.generate_trace(states.clone()); - let fri_params = standard_fri_params_with_100_bits_conjectured_security(3); // max constraint degree = 7 requires log blowup = 3 + let fri_params = standard_fri_params_with_100_bits_security(3); // max constraint degree = 7 requires log blowup = 3 let engine = BabyBearPoseidon2Engine::new(fri_params); // positive test diff --git a/crates/cli/src/default.rs b/crates/cli/src/default.rs index 390dfb9e82..8d17ac323e 100644 --- a/crates/cli/src/default.rs +++ b/crates/cli/src/default.rs @@ -34,20 +34,16 @@ pub fn default_evm_halo2_verifier_path() -> String { pub fn default_app_config() -> AppConfig { AppConfig { - app_fri_params: FriParameters::standard_with_100_bits_conjectured_security( - DEFAULT_APP_LOG_BLOWUP, - ) - .into(), + app_fri_params: FriParameters::standard_with_100_bits_security(DEFAULT_APP_LOG_BLOWUP) + .into(), app_vm_config: SdkVmConfig::builder() .system(Default::default()) .rv32i(Default::default()) .rv32m(Default::default()) .io(Default::default()) .build(), - leaf_fri_params: FriParameters::standard_with_100_bits_conjectured_security( - DEFAULT_LEAF_LOG_BLOWUP, - ) - .into(), + leaf_fri_params: FriParameters::standard_with_100_bits_security(DEFAULT_LEAF_LOG_BLOWUP) + .into(), compiler_options: Default::default(), } } diff --git a/crates/sdk/src/config/mod.rs b/crates/sdk/src/config/mod.rs index 7955186152..98e13fd358 100644 --- a/crates/sdk/src/config/mod.rs +++ b/crates/sdk/src/config/mod.rs @@ -127,13 +127,13 @@ impl Default for AggregationConfig { fn default() -> Self { Self { max_num_user_public_values: DEFAULT_MAX_NUM_PUBLIC_VALUES, - leaf_fri_params: FriParameters::standard_with_100_bits_conjectured_security( + leaf_fri_params: FriParameters::standard_with_100_bits_security( DEFAULT_LEAF_LOG_BLOWUP, ), - internal_fri_params: FriParameters::standard_with_100_bits_conjectured_security( + internal_fri_params: FriParameters::standard_with_100_bits_security( DEFAULT_INTERNAL_LOG_BLOWUP, ), - root_fri_params: FriParameters::standard_with_100_bits_conjectured_security( + root_fri_params: FriParameters::standard_with_100_bits_security( DEFAULT_ROOT_LOG_BLOWUP, ), profiling: false, @@ -161,9 +161,7 @@ pub struct AppFriParams { impl Default for AppFriParams { fn default() -> Self { Self { - fri_params: FriParameters::standard_with_100_bits_conjectured_security( - DEFAULT_APP_LOG_BLOWUP, - ), + fri_params: FriParameters::standard_with_100_bits_security(DEFAULT_APP_LOG_BLOWUP), } } } @@ -182,9 +180,7 @@ pub struct LeafFriParams { impl Default for LeafFriParams { fn default() -> Self { Self { - fri_params: FriParameters::standard_with_100_bits_conjectured_security( - DEFAULT_LEAF_LOG_BLOWUP, - ), + fri_params: FriParameters::standard_with_100_bits_security(DEFAULT_LEAF_LOG_BLOWUP), } } } diff --git a/crates/sdk/src/keygen/dummy.rs b/crates/sdk/src/keygen/dummy.rs index 677a4b6ec0..f4a1ae8d3f 100644 --- a/crates/sdk/src/keygen/dummy.rs +++ b/crates/sdk/src/keygen/dummy.rs @@ -33,7 +33,6 @@ use openvm_stark_sdk::{ config::{ baby_bear_poseidon2::BabyBearPoseidon2Engine, baby_bear_poseidon2_root::{BabyBearPoseidon2RootConfig, BabyBearPoseidon2RootEngine}, - fri_params::standard_fri_params_with_100_bits_conjectured_security, FriParameters, }, engine::StarkFriEngine, @@ -119,9 +118,9 @@ pub(super) fn dummy_internal_proof_riscv_app_vm( internal_vm_pk: Arc>, internal_exe: Arc>, num_public_values: usize, + app_fri_params: FriParameters, ) -> Result, VirtualMachineError> { - let fri_params = standard_fri_params_with_100_bits_conjectured_security(1); - let leaf_proof = dummy_leaf_proof_riscv_app_vm(leaf_vm_pk, num_public_values, fri_params)?; + let leaf_proof = dummy_leaf_proof_riscv_app_vm(leaf_vm_pk, num_public_values, app_fri_params)?; dummy_internal_proof(internal_vm_pk, internal_exe, leaf_proof) } @@ -190,7 +189,8 @@ fn dummy_app_proof( where VB: VmBuilder>, VC: VmExecutionConfig, - >::Executor: Executor + MeteredExecutor + PreflightExecutor, + >::Executor: + Executor + MeteredExecutor + PreflightExecutor>, { let dummy_exe = Arc::new(VmExe::new(dummy_app_program())); let mut app_prover = diff --git a/crates/sdk/src/keygen/mod.rs b/crates/sdk/src/keygen/mod.rs index f3f0ed4cc9..035d60cb63 100644 --- a/crates/sdk/src/keygen/mod.rs +++ b/crates/sdk/src/keygen/mod.rs @@ -1,7 +1,6 @@ use std::sync::Arc; use derivative::Derivative; -// use dummy::{compute_root_proof_heights, dummy_internal_proof_riscv_app_vm}; use openvm_circuit::{ arch::{AirInventoryError, SystemConfig, VirtualMachine, VirtualMachineError, VmCircuitConfig}, system::memory::dimensions::MemoryDimensions, @@ -361,6 +360,7 @@ impl AggProvingKey { internal_vm_pk.clone(), internal_committed_exe.clone(), config.max_num_user_public_values, + config.leaf_fri_params, )?; let root_verifier_pk = { diff --git a/crates/sdk/src/lib.rs b/crates/sdk/src/lib.rs index 9b45411ed4..cab84398e3 100644 --- a/crates/sdk/src/lib.rs +++ b/crates/sdk/src/lib.rs @@ -11,7 +11,9 @@ use std::{ #[cfg(feature = "evm-verify")] use alloy_sol_types::sol; use commit::AppExecutionCommit; -use config::{AggregationTreeConfig, AppConfig}; +use config::{ + AggregationTreeConfig, AppConfig, DEFAULT_INTERNAL_LOG_BLOWUP, DEFAULT_ROOT_LOG_BLOWUP, +}; use getset::{Getters, MutGetters, WithSetters}; use keygen::{AppProvingKey, AppVerifyingKey}; use openvm_build::{ @@ -49,7 +51,7 @@ use openvm_native_compiler::conversion::CompilerOptions; use openvm_native_recursion::halo2::utils::{CacheHalo2ParamsReader, Halo2ParamsReader}; use openvm_stark_backend::proof::Proof; use openvm_stark_sdk::{ - config::baby_bear_poseidon2::BabyBearPoseidon2Engine, + config::{baby_bear_poseidon2::BabyBearPoseidon2Engine, FriParameters}, engine::{StarkEngine, StarkFriEngine}, }; use openvm_transpiler::{ @@ -239,6 +241,8 @@ where let agg_config = AggregationConfig { max_num_user_public_values: system_config.num_public_values, leaf_fri_params: app_config.leaf_fri_params.fri_params, + internal_fri_params: FriParameters::new_for_testing(DEFAULT_INTERNAL_LOG_BLOWUP), + root_fri_params: FriParameters::new_for_testing(DEFAULT_ROOT_LOG_BLOWUP), profiling, compiler_options, ..Default::default() diff --git a/crates/sdk/src/prover/agg.rs b/crates/sdk/src/prover/agg.rs index f6ed745d82..12d5633c55 100644 --- a/crates/sdk/src/prover/agg.rs +++ b/crates/sdk/src/prover/agg.rs @@ -232,7 +232,20 @@ where break; } if wrapper_layers >= max_internal_wrapper_layers { - panic!("The heights of the root verifier still exceed the required heights after {max_internal_wrapper_layers} wrapper layers"); + let fixed = root_prover.fixed_air_heights(); + let exceeding: Vec<_> = actual_air_heights + .iter() + .zip(fixed.iter()) + .enumerate() + .filter(|(_, (actual, fixed))| actual > fixed) + .map(|(i, (actual, fixed))| format!("AIR {i}: actual={actual}, fixed={fixed}")) + .collect(); + panic!( + "The heights of the root verifier still exceed the required heights after {max_internal_wrapper_layers} wrapper layers.\n\ + Exceeding AIRs: {exceeding:?}\n\ + All actual heights: {actual_air_heights:?}\n\ + All fixed heights: {fixed:?}" + ); } wrapper_layers += 1; let input = InternalVmVerifierInput { diff --git a/extensions/native/circuit/src/extension/mod.rs b/extensions/native/circuit/src/extension/mod.rs index abe3a0c952..714afe3867 100644 --- a/extensions/native/circuit/src/extension/mod.rs +++ b/extensions/native/circuit/src/extension/mod.rs @@ -576,7 +576,23 @@ where // Pre-computed maximum trace heights for NativeConfig. Found by doubling // the actual trace heights of kitchen-sink leaf verification (except for // VariableRangeChecker, which has a fixed height). +#[rustfmt::skip] pub const NATIVE_MAX_TRACE_HEIGHTS: &[u32] = &[ - 4194304, 4, 128, 2097152, 8388608, 4194304, 262144, 2097152, 16777216, 2097152, 8388608, - 262144, 2097152, 1048576, 4194304, 65536, 262144, + 4194304, // 0: Program + 4, // 1: Connector + 64, // 2: PublicValues + 2097152, // 3: Boundary + 8388608, // 4: AccessAdapter (1-cell) + 4194304, // 5: AccessAdapter (2-cell) + 262144, // 6: AccessAdapter (4-cell) + 4194304, // 7: VerifyBatch (NativePoseidon2Air) + 33554432, // 8: FriReducedOpeningAir + 2097152, // 9: FieldExtensionAir + 16777216, // 10: FieldArithmeticAir + 262144, // 11: JalRangeCheckAir + 4194304, // 12: NativeBranchEqAir + 1048576, // 13: NativeLoadStoreAir<4> + 4194304, // 14: NativeLoadStoreAir<1> + 131072, // 15: PhantomAir + 262144, // 16: VariableRangeCheckerAir ]; diff --git a/extensions/native/circuit/tests/integration_test.rs b/extensions/native/circuit/tests/integration_test.rs index 314d424514..1afa38f263 100644 --- a/extensions/native/circuit/tests/integration_test.rs +++ b/extensions/native/circuit/tests/integration_test.rs @@ -52,8 +52,7 @@ use openvm_stark_backend::{ use openvm_stark_sdk::{ config::{ baby_bear_poseidon2::BabyBearPoseidon2Config, - fri_params::standard_fri_params_with_100_bits_conjectured_security, setup_tracing, - FriParameters, + fri_params::standard_fri_params_with_100_bits_security, setup_tracing, FriParameters, }, engine::StarkFriEngine, p3_baby_bear::BabyBear, @@ -182,7 +181,7 @@ fn test_vm_1_optional_air() -> eyre::Result<()> { // Aggregation VmConfig has Core/Poseidon2/FieldArithmetic/FieldExtension chips. The program // only uses Core and FieldArithmetic. All other chips should not have AIR proof inputs. let config = NativeConfig::aggregation(4, 3); - let engine = TestEngine::new(standard_fri_params_with_100_bits_conjectured_security(3)); + let engine = TestEngine::new(standard_fri_params_with_100_bits_security(3)); let (vm, pk) = VirtualMachine::new_with_keygen(engine, NativeBuilder::default(), config)?; let num_airs = pk.per_air.len(); @@ -217,7 +216,7 @@ fn test_vm_public_values() -> eyre::Result<()> { let num_public_values = 100; let config = test_system_config_without_continuations().with_public_values(num_public_values); assert!(!config.continuation_enabled); - let engine = TestEngine::new(standard_fri_params_with_100_bits_conjectured_security(3)); + let engine = TestEngine::new(standard_fri_params_with_100_bits_security(3)); let (vm, pk) = VirtualMachine::new_with_keygen(engine, SystemBuilder, config)?; let instructions = vec![ From b8064c4fdf72a38ad8ae531213236d3e324cd709 Mon Sep 17 00:00:00 2001 From: Zach Langley Date: Fri, 19 Dec 2025 11:12:08 -0500 Subject: [PATCH 3/3] increase instance size --- ci/benchmark-config.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ci/benchmark-config.json b/ci/benchmark-config.json index 666ca66fae..c2dde9b587 100644 --- a/ci/benchmark-config.json +++ b/ci/benchmark-config.json @@ -77,7 +77,7 @@ "e2e_bench": true, "run_params": [ { - "instance_type": "g6.2xlarge", + "instance_type": "g6e.4xlarge", "memory_allocator": "jemalloc", "app_log_blowup": 1, "leaf_log_blowup": 1, @@ -105,4 +105,4 @@ ] } ] -} \ No newline at end of file +}