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}