openvm_sdk/
stdin.rs

1use std::collections::VecDeque;
2
3use openvm_circuit::arch::Streams;
4use openvm_stark_backend::p3_field::FieldAlgebra;
5use serde::{Deserialize, Serialize};
6
7use crate::F;
8
9#[derive(Clone, Default, Serialize, Deserialize)]
10pub struct StdIn {
11    pub buffer: VecDeque<Vec<F>>,
12}
13
14impl StdIn {
15    pub fn from_bytes(data: &[u8]) -> Self {
16        let mut ret = Self::default();
17        ret.write_bytes(data);
18        ret
19    }
20
21    pub fn read(&mut self) -> Option<Vec<F>> {
22        self.buffer.pop_front()
23    }
24
25    pub fn write<T: Serialize>(&mut self, data: &T) {
26        let words = openvm::serde::to_vec(data).unwrap();
27        let bytes: Vec<u8> = words.into_iter().flat_map(|w| w.to_le_bytes()).collect();
28        self.write_bytes(&bytes);
29    }
30
31    pub fn write_bytes(&mut self, data: &[u8]) {
32        let field_data = data.iter().map(|b| F::from_canonical_u8(*b)).collect();
33        self.buffer.push_back(field_data);
34    }
35
36    pub fn write_field(&mut self, data: &[F]) {
37        self.buffer.push_back(data.to_vec());
38    }
39}
40
41impl From<StdIn> for Streams<F> {
42    fn from(mut std_in: StdIn) -> Self {
43        let mut data = Vec::<Vec<F>>::new();
44        while let Some(input) = std_in.read() {
45            data.push(input);
46        }
47        Streams::new(data)
48    }
49}
50
51impl From<Vec<Vec<F>>> for StdIn {
52    fn from(inputs: Vec<Vec<F>>) -> Self {
53        let mut ret = StdIn::default();
54        for input in inputs {
55            ret.write_field(&input);
56        }
57        ret
58    }
59}