1+ use p3_koala_bear:: KoalaBear ;
2+ use std:: collections:: BTreeMap ;
13
4+ type Label = String ;
5+ type F = KoalaBear ;
6+
7+ #[ derive( Debug , Clone , PartialEq , Eq , PartialOrd , Ord , Hash ) ]
8+ pub struct Bytecode {
9+ pub instructions : Vec < Instruction > ,
10+ pub hints : BTreeMap < usize , Vec < Hint > > , // pc -> hints
11+ pub public_input_start : usize ,
12+ pub ending_pc : usize ,
13+ }
14+
15+ #[ derive( Debug , Clone , Copy , PartialEq , Eq , PartialOrd , Ord , Hash ) ]
16+ pub enum MemOrConstant {
17+ Constant ( F ) ,
18+ MemoryAfterFp { shift : usize } , // m[fp + shift]
19+ }
20+ #[ derive( Debug , Clone , Copy , PartialEq , Eq , PartialOrd , Ord , Hash ) ]
21+ pub enum MemOrFpOrConstant {
22+ MemoryAfterFp { shift : usize } , // m[fp + shift]
23+ Fp ,
24+ Constant ( F ) ,
25+ }
26+
27+ #[ derive( Debug , Clone , Copy , PartialEq , Eq , PartialOrd , Ord , Hash ) ]
28+ pub enum MemOrFp {
29+ MemoryAfterFp { shift : usize } , // m[fp + shift]
30+ Fp ,
31+ }
32+
33+ #[ derive( Debug , Clone , PartialEq , Eq , PartialOrd , Ord , Hash ) ]
34+ pub enum Operation {
35+ Add ,
36+ Mul ,
37+ }
38+
39+ #[ derive( Debug , Clone , PartialEq , Eq , PartialOrd , Ord , Hash ) ]
40+ pub enum Instruction {
41+ Computation {
42+ operation : Operation ,
43+ arg_a : MemOrConstant ,
44+ arg_b : MemOrFp ,
45+ res : MemOrConstant ,
46+ } ,
47+ Deref {
48+ shift_0 : usize ,
49+ shift_1 : usize ,
50+ res : MemOrFpOrConstant ,
51+ } , // res = m[m[fp + shift_0] + shift_1]
52+ JumpIfNotZero {
53+ condition : MemOrConstant ,
54+ dest : MemOrConstant ,
55+ updated_fp : MemOrFp ,
56+ } ,
57+ Poseidon2_16 {
58+ shift : usize ,
59+ } , /*
60+ Read 4 vectorized pointers from stack:
61+ Poseidon2(m[8 * m[fp + shift]] .. 8 * (1 + m[fp + shift])] | m[8 * m[fp + shift + 1]] .. 8 * (1 + m[fp + shift + 1])])
62+ = m[8 * m[fp + shift + 2]] .. 8 * (1 + m[fp + shift + 2])] | m[8 * m[fp + shift + 3]] .. 8 * (1 + m[fp + shift + 3])]
63+ */
64+ Poseidon2_24 {
65+ shift : usize ,
66+ } , // same as above, but with 24 field elements
67+ ExtensionMul {
68+ args : [ usize ; 3 ] , // offset after fp
69+ } ,
70+ }
71+
72+ /// Hints does not appear in the verified bytecode, but are useful during execution
73+ #[ derive( Debug , Clone , PartialEq , Eq , PartialOrd , Ord , Hash ) ]
74+ pub enum Hint {
75+ RequestMemory {
76+ offset : usize , // the pointer to the allocated memory range will be stored at m[fp + offset]
77+ size : MemOrConstant ,
78+ /// if vectorized == true, the start of the allocated memory will be aligned to 8 field elements
79+ /// m[8X...] and we set m[fp + offset] = X
80+ vectorized : bool ,
81+ } ,
82+ DecomposeBits {
83+ res_offset : usize , // m[fp + res_offset..fp + res_offset + 31] will contain the decomposed bits
84+ to_decompose : MemOrConstant ,
85+ } ,
86+ // Debug purpose
87+ Print {
88+ line_info : String ,
89+ content : Vec < MemOrConstant > ,
90+ } ,
91+ }
0 commit comments