openvm_sdk/
stdin.rs

1use std::collections::VecDeque;
2
3use itertools::Itertools;
4use openvm_circuit::arch::{deferral::DeferralState, Streams};
5use openvm_stark_backend::{
6    codec::{Decode, Encode},
7    p3_field::Field,
8};
9use serde::{Deserialize, Serialize};
10
11#[derive(Clone, Default, Serialize, Deserialize)]
12pub struct StdIn<F = crate::F> {
13    pub buffer: VecDeque<Vec<F>>,
14    pub deferrals: Vec<DeferralState>,
15}
16
17impl<F: Field> StdIn<F> {
18    pub fn from_bytes(data: &[u8]) -> Self {
19        let mut ret = Self::default();
20        ret.write_bytes(data);
21        ret
22    }
23
24    pub fn read(&mut self) -> Option<Vec<F>> {
25        self.buffer.pop_front()
26    }
27
28    pub fn write<T: Serialize>(&mut self, data: &T) {
29        let words = openvm::serde::to_vec(data).unwrap();
30        let bytes: Vec<u8> = words.into_iter().flat_map(|w| w.to_le_bytes()).collect();
31        self.write_bytes(&bytes);
32    }
33
34    pub fn write_bytes(&mut self, data: &[u8]) {
35        let field_data = data.iter().map(|b| F::from_u8(*b)).collect();
36        self.buffer.push_back(field_data);
37    }
38
39    pub fn write_field(&mut self, data: &[F]) {
40        self.buffer.push_back(data.to_vec());
41    }
42}
43
44impl<F: Field> From<StdIn<F>> for Streams<F> {
45    fn from(mut std_in: StdIn<F>) -> Self {
46        let mut data = Vec::<Vec<F>>::new();
47        while let Some(input) = std_in.read() {
48            data.push(input);
49        }
50        let mut ret = Streams::new(data);
51        ret.deferrals = std_in.deferrals;
52        ret
53    }
54}
55
56impl<F: Field> From<Vec<Vec<F>>> for StdIn<F> {
57    fn from(inputs: Vec<Vec<F>>) -> Self {
58        let mut ret = StdIn::<F>::default();
59        for input in inputs {
60            ret.write_field(&input);
61        }
62        ret
63    }
64}
65
66#[derive(Clone, Default, Serialize, Deserialize)]
67pub struct DeferralInput {
68    pub byte_vec: Vec<Vec<u8>>,
69}
70
71impl DeferralInput {
72    pub fn is_empty(&self) -> bool {
73        self.byte_vec.is_empty()
74    }
75
76    pub fn into_inputs<I: Decode>(self) -> Vec<I> {
77        self.byte_vec
78            .iter()
79            .map(|input| I::decode_from_bytes(input).unwrap())
80            .collect_vec()
81    }
82
83    pub fn from_inputs<I: Encode>(inputs: &[I]) -> Self {
84        let byte_vec = inputs
85            .iter()
86            .map(|input| input.encode_to_vec().unwrap())
87            .collect_vec();
88        Self { byte_vec }
89    }
90}