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::{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}