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