openvm_ecc_circuit/extension/
mod.rs

1use std::result::Result;
2
3use openvm_algebra_circuit::{Rv32ModularConfig, Rv32ModularConfigExecutor, Rv32ModularCpuBuilder};
4use openvm_circuit::{
5    arch::{
6        AirInventory, ChipInventoryError, InitFileGenerator, MatrixRecordArena, SystemConfig,
7        VmBuilder, VmChipComplex, VmField, VmProverExtension,
8    },
9    system::SystemChipInventory,
10};
11use openvm_circuit_derive::VmConfig;
12use openvm_stark_backend::{
13    config::{StarkGenericConfig, Val},
14    engine::StarkEngine,
15    prover::cpu::{CpuBackend, CpuDevice},
16};
17use serde::{Deserialize, Serialize};
18
19mod weierstrass;
20pub use weierstrass::*;
21
22cfg_if::cfg_if! {
23    if #[cfg(feature = "cuda")] {
24        mod cuda;
25        mod hybrid;
26        pub use cuda::*;
27        pub use hybrid::*;
28        pub use {
29            EccHybridProverExt as EccProverExt,
30            Rv32WeierstrassHybridBuilder as Rv32WeierstrassBuilder,
31        };
32    } else {
33        pub use self::{
34            EccCpuProverExt as EccProverExt,
35            Rv32WeierstrassCpuBuilder as Rv32WeierstrassBuilder,
36        };
37    }
38}
39pub struct EccCpuProverExt;
40
41#[derive(Clone, Debug, VmConfig, Serialize, Deserialize)]
42pub struct Rv32WeierstrassConfig {
43    #[config(generics = true)]
44    pub modular: Rv32ModularConfig,
45    #[extension]
46    pub weierstrass: WeierstrassExtension,
47}
48
49impl Rv32WeierstrassConfig {
50    pub fn new(curves: Vec<CurveConfig>) -> Self {
51        let primes: Vec<_> = curves
52            .iter()
53            .flat_map(|c| [c.modulus.clone(), c.scalar.clone()])
54            .collect();
55        Self {
56            modular: Rv32ModularConfig::new(primes),
57            weierstrass: WeierstrassExtension::new(curves),
58        }
59    }
60}
61
62impl InitFileGenerator for Rv32WeierstrassConfig {
63    fn generate_init_file_contents(&self) -> Option<String> {
64        Some(format!(
65            "// This file is automatically generated by cargo openvm. Do not rename or edit.\n{}\n{}\n",
66            self.modular.modular.generate_moduli_init(),
67            self.weierstrass.generate_sw_init()
68        ))
69    }
70}
71
72#[derive(Clone)]
73pub struct Rv32WeierstrassCpuBuilder;
74
75impl<E, SC> VmBuilder<E> for Rv32WeierstrassCpuBuilder
76where
77    SC: StarkGenericConfig,
78    E: StarkEngine<SC = SC, PB = CpuBackend<SC>, PD = CpuDevice<SC>>,
79    Val<SC>: VmField,
80{
81    type VmConfig = Rv32WeierstrassConfig;
82    type SystemChipInventory = SystemChipInventory<SC>;
83    type RecordArena = MatrixRecordArena<Val<SC>>;
84
85    fn create_chip_complex(
86        &self,
87        config: &Self::VmConfig,
88        circuit: AirInventory<SC>,
89    ) -> Result<
90        VmChipComplex<SC, Self::RecordArena, E::PB, Self::SystemChipInventory>,
91        ChipInventoryError,
92    > {
93        let mut chip_complex =
94            VmBuilder::<E>::create_chip_complex(&Rv32ModularCpuBuilder, &config.modular, circuit)?;
95        let inventory = &mut chip_complex.inventory;
96        VmProverExtension::<E, _, _>::extend_prover(
97            &EccCpuProverExt,
98            &config.weierstrass,
99            inventory,
100        )?;
101        Ok(chip_complex)
102    }
103}