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}