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