1use std::ops::{Add, Mul, MulAssign, Sub};
2
3use slop_air::AirBuilder;
4use slop_algebra::{AbstractField, ExtensionField, Field};
5use slop_uni_stark::SymbolicAirBuilder;
6use sp1_hypercube::{
7 air::SP1AirBuilder, ConstraintSumcheckFolder, DebugConstraintBuilder,
8 GenericVerifierConstraintFolder, InteractionBuilder,
9};
10
11use crate::{
12 adapter::{
13 register::{
14 alu_type::ALUTypeReader,
15 i_type::{ITypeReader, ITypeReaderImmutable},
16 j_type::JTypeReader,
17 r_type::{RTypeReader, RTypeReaderImmutable},
18 },
19 state::CPUState,
20 },
21 operations::{
22 AddOperation, AddrAddOperation, AddressOperation, AddwOperation, BitwiseOperation,
23 BitwiseU16Operation, IsEqualWordOperation, IsZeroOperation, IsZeroWordOperation,
24 LtOperationSigned, LtOperationUnsigned, MulOperation, SubOperation, SubwOperation,
25 U16CompareOperation, U16MSBOperation, U16toU8OperationSafe, U16toU8OperationUnsafe,
26 },
27};
28
29type F<AB> = <AB as AirBuilder>::F;
30
31pub trait SP1CoreOperationBuilder:
32 SP1AirBuilder
33 + SP1OperationBuilder<AddOperation<F<Self>>>
34 + SP1OperationBuilder<U16toU8OperationSafe>
35 + SP1OperationBuilder<U16toU8OperationUnsafe>
36 + SP1OperationBuilder<IsZeroOperation<F<Self>>>
37 + SP1OperationBuilder<IsZeroWordOperation<F<Self>>>
38 + SP1OperationBuilder<IsEqualWordOperation<F<Self>>>
39 + SP1OperationBuilder<BitwiseOperation<F<Self>>>
40 + SP1OperationBuilder<BitwiseU16Operation<F<Self>>>
41 + SP1OperationBuilder<RTypeReader<F<Self>>>
42 + SP1OperationBuilder<CPUState<F<Self>>>
43 + SP1OperationBuilder<RTypeReaderImmutable>
44 + SP1OperationBuilder<ALUTypeReader<F<Self>>>
45 + SP1OperationBuilder<CPUState<F<Self>>>
46 + SP1OperationBuilder<SubOperation<F<Self>>>
47 + SP1OperationBuilder<U16CompareOperation<F<Self>>>
48 + SP1OperationBuilder<U16MSBOperation<F<Self>>>
49 + SP1OperationBuilder<LtOperationUnsigned<F<Self>>>
50 + SP1OperationBuilder<LtOperationSigned<F<Self>>>
51 + SP1OperationBuilder<CPUState<F<Self>>>
52 + SP1OperationBuilder<MulOperation<F<Self>>>
53 + SP1OperationBuilder<ITypeReader<F<Self>>>
54 + SP1OperationBuilder<AddwOperation<F<Self>>>
55 + SP1OperationBuilder<SubwOperation<F<Self>>>
56 + SP1OperationBuilder<JTypeReader<F<Self>>>
57 + SP1OperationBuilder<ITypeReaderImmutable>
58 + SP1OperationBuilder<AddrAddOperation<F<Self>>>
59 + SP1OperationBuilder<AddressOperation<F<Self>>>
60{
61}
62
63impl<AB> SP1CoreOperationBuilder for AB where
64 AB: SP1AirBuilder
65 + SP1OperationBuilder<AddOperation<F<Self>>>
66 + SP1OperationBuilder<U16toU8OperationSafe>
67 + SP1OperationBuilder<U16toU8OperationUnsafe>
68 + SP1OperationBuilder<IsZeroOperation<F<Self>>>
69 + SP1OperationBuilder<IsZeroWordOperation<F<Self>>>
70 + SP1OperationBuilder<IsEqualWordOperation<F<Self>>>
71 + SP1OperationBuilder<BitwiseOperation<F<Self>>>
72 + SP1OperationBuilder<BitwiseU16Operation<F<Self>>>
73 + SP1OperationBuilder<RTypeReaderImmutable>
74 + SP1OperationBuilder<ALUTypeReader<F<Self>>>
75 + SP1OperationBuilder<RTypeReader<F<Self>>>
76 + SP1OperationBuilder<CPUState<F<Self>>>
77 + SP1OperationBuilder<SubOperation<F<Self>>>
78 + SP1OperationBuilder<U16CompareOperation<F<Self>>>
79 + SP1OperationBuilder<U16MSBOperation<F<Self>>>
80 + SP1OperationBuilder<LtOperationUnsigned<F<Self>>>
81 + SP1OperationBuilder<LtOperationSigned<F<Self>>>
82 + SP1OperationBuilder<MulOperation<F<Self>>>
83 + SP1OperationBuilder<ITypeReader<F<Self>>>
84 + SP1OperationBuilder<AddwOperation<F<Self>>>
85 + SP1OperationBuilder<SubwOperation<F<Self>>>
86 + SP1OperationBuilder<JTypeReader<F<Self>>>
87 + SP1OperationBuilder<ITypeReaderImmutable>
88 + SP1OperationBuilder<AddrAddOperation<F<Self>>>
89 + SP1OperationBuilder<AddressOperation<F<Self>>>
90{
91}
92
93pub trait SP1Operation<AB: SP1AirBuilder> {
95 type Input;
97
98 type Output;
100
101 fn lower(builder: &mut AB, input: Self::Input) -> Self::Output;
103
104 fn eval(builder: &mut AB, input: Self::Input) -> Self::Output
106 where
107 Self: Sized,
108 AB: SP1OperationBuilder<Self>,
109 {
110 builder.eval_operation(input)
111 }
112}
113
114pub trait SP1OperationBuilder<O: SP1Operation<Self>>: SP1AirBuilder {
120 fn eval_operation(&mut self, input: O::Input) -> O::Output;
121}
122
123pub trait TrivialOperationBuilder: SP1AirBuilder {}
125
126impl<AB: TrivialOperationBuilder, O: SP1Operation<AB>> SP1OperationBuilder<O> for AB {
127 fn eval_operation(&mut self, input: O::Input) -> O::Output {
128 O::lower(self, input)
129 }
130}
131
132impl<F: Field> TrivialOperationBuilder for InteractionBuilder<F> {}
133
134impl<F: Field> TrivialOperationBuilder for SymbolicAirBuilder<F> {}
135
136impl<F: Field, EF: ExtensionField<F>> TrivialOperationBuilder
137 for DebugConstraintBuilder<'_, F, EF>
138{
139}
140
141impl<
142 'a,
143 F: Field,
144 K: Field + From<F> + Add<F, Output = K> + Sub<F, Output = K> + Mul<F, Output = K>,
145 EF: Field + Mul<K, Output = EF>,
146 > TrivialOperationBuilder for ConstraintSumcheckFolder<'a, F, K, EF>
147{
148}
149
150impl<'a, F, EF, PubVar, Var, Expr> TrivialOperationBuilder
151 for GenericVerifierConstraintFolder<'a, F, EF, PubVar, Var, Expr>
152where
153 F: Field,
154 EF: ExtensionField<F>,
155 Expr: AbstractField<F = EF>
156 + From<F>
157 + Add<Var, Output = Expr>
158 + Add<F, Output = Expr>
159 + Sub<Var, Output = Expr>
160 + Sub<F, Output = Expr>
161 + Mul<Var, Output = Expr>
162 + Mul<F, Output = Expr>
163 + MulAssign<EF>,
164 Var: Into<Expr>
165 + Copy
166 + Add<F, Output = Expr>
167 + Add<Var, Output = Expr>
168 + Add<Expr, Output = Expr>
169 + Sub<F, Output = Expr>
170 + Sub<Var, Output = Expr>
171 + Sub<Expr, Output = Expr>
172 + Mul<F, Output = Expr>
173 + Mul<Var, Output = Expr>
174 + Mul<Expr, Output = Expr>
175 + Send
176 + Sync,
177 PubVar: Into<Expr> + Copy,
178{
179}