openvm_pairing_circuit/
cuda.rs1use 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}