openvm_pairing_circuit/
cuda.rs

1//! GPU builder where the [Rv32ModularBuilder], [AlgebraProverExt], and [EccProverExt] will use
2//! either cuda tracegen or hybrid CPU tracegen depending on what [openvm_algebra_circuit] and
3//! [openvm_ecc_circuit] crates export.
4use openvm_algebra_circuit::{AlgebraProverExt, Rv32ModularBuilder};
5use openvm_circuit::{
6    arch::{
7        AirInventory, ChipInventoryError, DenseRecordArena, VmBuilder, VmChipComplex,
8        VmProverExtension,
9    },
10    system::cuda::SystemChipInventoryGPU,
11};
12use openvm_cuda_backend::{engine::GpuBabyBearPoseidon2Engine, prover_backend::GpuBackend};
13use openvm_ecc_circuit::EccProverExt;
14use openvm_stark_sdk::config::baby_bear_poseidon2::BabyBearPoseidon2Config;
15
16use crate::{PairingProverExt, Rv32PairingConfig};
17
18#[derive(Clone)]
19pub struct Rv32PairingGpuBuilder;
20
21type E = GpuBabyBearPoseidon2Engine;
22
23impl VmBuilder<E> for Rv32PairingGpuBuilder {
24    type VmConfig = Rv32PairingConfig;
25    type SystemChipInventory = SystemChipInventoryGPU;
26    type RecordArena = DenseRecordArena;
27
28    fn create_chip_complex(
29        &self,
30        config: &Rv32PairingConfig,
31        circuit: AirInventory<BabyBearPoseidon2Config>,
32    ) -> Result<
33        VmChipComplex<
34            BabyBearPoseidon2Config,
35            Self::RecordArena,
36            GpuBackend,
37            Self::SystemChipInventory,
38        >,
39        ChipInventoryError,
40    > {
41        let mut chip_complex =
42            VmBuilder::<E>::create_chip_complex(&Rv32ModularBuilder, &config.modular, circuit)?;
43        let inventory = &mut chip_complex.inventory;
44        VmProverExtension::<E, _, _>::extend_prover(&AlgebraProverExt, &config.fp2, inventory)?;
45        VmProverExtension::<E, _, _>::extend_prover(&EccProverExt, &config.weierstrass, inventory)?;
46        VmProverExtension::<E, _, _>::extend_prover(&PairingProverExt, &config.pairing, inventory)?;
47        Ok(chip_complex)
48    }
49}