sp1_hypercube/air/
machine.rs1use std::mem::MaybeUninit;
2
3use crate::{septic_digest::SepticDigest, MachineRecord, UntrustedConfig};
4use slop_air::BaseAir;
5use slop_algebra::Field;
6use slop_matrix::dense::RowMajorMatrix;
7pub use sp1_derive::MachineAir;
8
9#[macro_export]
10macro_rules! chip_name {
12 ($chip:ident, $field:ty) => {
13 <$chip as MachineAir<$field>>::name(&$chip {})
14 };
15}
16
17pub trait MachineAir<F: Field>: BaseAir<F> + 'static + Send + Sync {
19 type Record: MachineRecord;
21
22 type Program: MachineProgram<F>;
24
25 fn name(&self) -> &'static str;
27
28 fn column_names(&self) -> Vec<String> {
30 (0..self.width()).map(|i| format!("col_{i}")).collect()
32 }
33
34 fn num_rows(&self, _input: &Self::Record) -> Option<usize> {
38 None
39 }
40
41 fn generate_trace(&self, input: &Self::Record, output: &mut Self::Record) -> RowMajorMatrix<F> {
47 let padded_nb_rows = self.num_rows(input).unwrap();
48 let num_columns = <Self as BaseAir<F>>::width(self);
49 let mut values: Vec<F> = Vec::with_capacity(padded_nb_rows * num_columns);
50 self.generate_trace_into(input, output, values.spare_capacity_mut());
51
52 unsafe {
53 values.set_len(padded_nb_rows * num_columns);
54 }
55
56 RowMajorMatrix::new(values, num_columns)
57 }
58
59 fn generate_dependencies(&self, input: &Self::Record, output: &mut Self::Record) {
61 self.generate_trace(input, output);
62 }
63
64 fn generate_trace_into(
66 &self,
67 input: &Self::Record,
68 output: &mut Self::Record,
69 buffer: &mut [MaybeUninit<F>],
70 );
71
72 fn included(&self, shard: &Self::Record) -> bool;
74
75 fn preprocessed_width(&self) -> usize {
77 0
78 }
79
80 fn preprocessed_num_rows(&self, _program: &Self::Program) -> Option<usize> {
82 None
83 }
84
85 fn preprocessed_num_rows_with_instrs_len(
87 &self,
88 _program: &Self::Program,
89 _instrs_len: usize,
90 ) -> Option<usize> {
91 None
92 }
93
94 fn generate_preprocessed_trace_into(&self, _: &Self::Program, _: &mut [MaybeUninit<F>]) {}
96
97 fn generate_preprocessed_trace(&self, program: &Self::Program) -> Option<RowMajorMatrix<F>> {
99 if self.preprocessed_width() == 0 {
100 return None;
101 }
102
103 let padded_nb_rows = self.preprocessed_num_rows(program).unwrap();
104 let num_columns = self.preprocessed_width();
105 let mut values: Vec<F> = Vec::with_capacity(padded_nb_rows * num_columns);
106 self.generate_preprocessed_trace_into(program, values.spare_capacity_mut());
107
108 unsafe {
109 values.set_len(padded_nb_rows * num_columns);
110 }
111
112 Some(RowMajorMatrix::new(values, num_columns))
113 }
114}
115
116pub trait MachineProgram<F>: Send + Sync {
118 fn pc_start(&self) -> [F; 3];
120 fn initial_global_cumulative_sum(&self) -> SepticDigest<F>;
122 fn untrusted_config(&self) -> UntrustedConfig<F>;
124}