openvm_ecc_circuit/extension/
mod.rs1use 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}