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::{BabyBearPoseidon2GpuEngine as GpuBabyBearPoseidon2Engine, 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        device_ctx: &openvm_stark_backend::EngineDeviceCtx<E>,
33    ) -> Result<
34        VmChipComplex<
35            BabyBearPoseidon2Config,
36            Self::RecordArena,
37            GpuBackend,
38            Self::SystemChipInventory,
39        >,
40        ChipInventoryError,
41    > {
42        let mut chip_complex = VmBuilder::<E>::create_chip_complex(
43            &Rv32ModularBuilder,
44            &config.modular,
45            circuit,
46            device_ctx,
47        )?;
48        let inventory = &mut chip_complex.inventory;
49        VmProverExtension::<E, _, _>::extend_prover(&AlgebraProverExt, &config.fp2, inventory)?;
50        VmProverExtension::<E, _, _>::extend_prover(&EccProverExt, &config.weierstrass, inventory)?;
51        VmProverExtension::<E, _, _>::extend_prover(&PairingProverExt, &config.pairing, inventory)?;
52        Ok(chip_complex)
53    }
54}