1#![cfg_attr(feature = "tco", allow(incomplete_features))]
2#![cfg_attr(feature = "tco", feature(explicit_tail_calls))]
3
4use std::result::Result;
5
6use openvm_circuit::{
7 arch::{
8 AirInventory, ChipInventoryError, InitFileGenerator, MatrixRecordArena, SystemConfig,
9 VmBuilder, VmChipComplex, VmProverExtension,
10 },
11 system::{SystemChipInventory, SystemCpuBuilder, SystemExecutor},
12};
13use openvm_circuit_derive::VmConfig;
14use openvm_rv32im_circuit::{
15 Rv32I, Rv32IExecutor, Rv32ImCpuProverExt, Rv32Io, Rv32IoExecutor, Rv32M, Rv32MExecutor,
16};
17use openvm_stark_backend::{
18 config::{StarkGenericConfig, Val},
19 p3_field::PrimeField32,
20 prover::cpu::{CpuBackend, CpuDevice},
21};
22use openvm_stark_sdk::engine::StarkEngine;
23use serde::{Deserialize, Serialize};
24
25mod sha256_chip;
26pub use sha256_chip::*;
27
28mod extension;
29pub use extension::*;
30
31cfg_if::cfg_if! {
32 if #[cfg(feature = "cuda")] {
33 use openvm_circuit::arch::DenseRecordArena;
34 use openvm_circuit::system::cuda::{extensions::SystemGpuBuilder, SystemChipInventoryGPU};
35 use openvm_cuda_backend::{engine::GpuBabyBearPoseidon2Engine, prover_backend::GpuBackend};
36 use openvm_stark_sdk::config::baby_bear_poseidon2::BabyBearPoseidon2Config;
37 use openvm_rv32im_circuit::Rv32ImGpuProverExt;
38 pub(crate) mod cuda_abi;
39 pub use Sha256Rv32GpuBuilder as Sha256Rv32Builder;
40 } else {
41 pub use Sha256Rv32CpuBuilder as Sha256Rv32Builder;
42 }
43}
44
45#[derive(Clone, Debug, VmConfig, derive_new::new, Serialize, Deserialize)]
46pub struct Sha256Rv32Config {
47 #[config(executor = "SystemExecutor<F>")]
48 pub system: SystemConfig,
49 #[extension]
50 pub rv32i: Rv32I,
51 #[extension]
52 pub rv32m: Rv32M,
53 #[extension]
54 pub io: Rv32Io,
55 #[extension]
56 pub sha256: Sha256,
57}
58
59impl Default for Sha256Rv32Config {
60 fn default() -> Self {
61 Self {
62 system: SystemConfig::default(),
63 rv32i: Rv32I,
64 rv32m: Rv32M::default(),
65 io: Rv32Io,
66 sha256: Sha256,
67 }
68 }
69}
70
71impl InitFileGenerator for Sha256Rv32Config {}
73
74#[derive(Clone)]
75pub struct Sha256Rv32CpuBuilder;
76
77impl<E, SC> VmBuilder<E> for Sha256Rv32CpuBuilder
78where
79 SC: StarkGenericConfig,
80 E: StarkEngine<SC = SC, PB = CpuBackend<SC>, PD = CpuDevice<SC>>,
81 Val<SC>: PrimeField32,
82{
83 type VmConfig = Sha256Rv32Config;
84 type SystemChipInventory = SystemChipInventory<SC>;
85 type RecordArena = MatrixRecordArena<Val<SC>>;
86
87 fn create_chip_complex(
88 &self,
89 config: &Sha256Rv32Config,
90 circuit: AirInventory<SC>,
91 ) -> Result<
92 VmChipComplex<SC, Self::RecordArena, E::PB, Self::SystemChipInventory>,
93 ChipInventoryError,
94 > {
95 let mut chip_complex =
96 VmBuilder::<E>::create_chip_complex(&SystemCpuBuilder, &config.system, circuit)?;
97 let inventory = &mut chip_complex.inventory;
98 VmProverExtension::<E, _, _>::extend_prover(&Rv32ImCpuProverExt, &config.rv32i, inventory)?;
99 VmProverExtension::<E, _, _>::extend_prover(&Rv32ImCpuProverExt, &config.rv32m, inventory)?;
100 VmProverExtension::<E, _, _>::extend_prover(&Rv32ImCpuProverExt, &config.io, inventory)?;
101 VmProverExtension::<E, _, _>::extend_prover(&Sha2CpuProverExt, &config.sha256, inventory)?;
102 Ok(chip_complex)
103 }
104}
105
106#[cfg(feature = "cuda")]
107#[derive(Clone)]
108pub struct Sha256Rv32GpuBuilder;
109
110#[cfg(feature = "cuda")]
111impl VmBuilder<GpuBabyBearPoseidon2Engine> for Sha256Rv32GpuBuilder {
112 type VmConfig = Sha256Rv32Config;
113 type SystemChipInventory = SystemChipInventoryGPU;
114 type RecordArena = DenseRecordArena;
115
116 fn create_chip_complex(
117 &self,
118 config: &Sha256Rv32Config,
119 circuit: AirInventory<BabyBearPoseidon2Config>,
120 ) -> Result<
121 VmChipComplex<
122 BabyBearPoseidon2Config,
123 Self::RecordArena,
124 GpuBackend,
125 Self::SystemChipInventory,
126 >,
127 ChipInventoryError,
128 > {
129 let mut chip_complex = VmBuilder::<GpuBabyBearPoseidon2Engine>::create_chip_complex(
130 &SystemGpuBuilder,
131 &config.system,
132 circuit,
133 )?;
134 let inventory = &mut chip_complex.inventory;
135 VmProverExtension::<GpuBabyBearPoseidon2Engine, _, _>::extend_prover(
136 &Rv32ImGpuProverExt,
137 &config.rv32i,
138 inventory,
139 )?;
140 VmProverExtension::<GpuBabyBearPoseidon2Engine, _, _>::extend_prover(
141 &Rv32ImGpuProverExt,
142 &config.rv32m,
143 inventory,
144 )?;
145 VmProverExtension::<GpuBabyBearPoseidon2Engine, _, _>::extend_prover(
146 &Rv32ImGpuProverExt,
147 &config.io,
148 inventory,
149 )?;
150 VmProverExtension::<GpuBabyBearPoseidon2Engine, _, _>::extend_prover(
151 &Sha256GpuProverExt,
152 &config.sha256,
153 inventory,
154 )?;
155 Ok(chip_complex)
156 }
157}