-
Notifications
You must be signed in to change notification settings - Fork 103
/
Copy pathposeidon2_gl_test.asm
172 lines (139 loc) · 4.88 KB
/
poseidon2_gl_test.asm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
use std::machines::hash::poseidon2_gl::Poseidon2GL;
use std::machines::range::Byte2;
use std::machines::large_field::memory::Memory;
use std::machines::split::ByteCompare;
use std::machines::split::split_gl::SplitGL;
let main_degree: int = 2**10;
let memory_degree: int = 2**12;
let poseidon2_degree: int = 2**12;
let split_degree: int = 2**12;
machine Main with degree: main_degree {
reg pc[@pc];
reg X1[<=];
reg X2[<=];
reg ADDR1[<=];
reg ADDR2[<=];
// Increase the time step by 2 in each row, so that the poseidon machine
// can read in the given time step and write in the next time step.
col fixed STEP(i) { 2 * i };
Byte2 byte2;
Memory memory(byte2, memory_degree, memory_degree);
instr mstore ADDR1, X1 ->
link ~> memory.mstore(ADDR1, STEP, X1);
Poseidon2GL poseidon2(memory, poseidon2_degree, poseidon2_degree);
instr poseidon2 ADDR1, ADDR2, X1 ->
link ~> poseidon2.permute(ADDR1, STEP, ADDR2, STEP + 1, X1);
col witness val;
instr assert_eq ADDR1, X1 ->
link ~> val = memory.mload(ADDR1, STEP)
{
val = X1
}
function main {
// Test vectors generated by `cargo run --bin gen_poseidon_consts poseidon2-gl`
// Test vector 0:
mstore 0, 0;
mstore 4, 0;
mstore 8, 0;
mstore 12, 0;
mstore 16, 0;
mstore 20, 0;
mstore 24, 0;
mstore 28, 0;
// Test only second half output
poseidon2 0, 100, 2;
assert_eq 100, 5905145432652609062;
assert_eq 104, 9814446752588696081;
assert_eq 108, 13759450385053274731;
assert_eq 112, 2402148582355896469;
// Test only first half output
poseidon2 0, 100, 1;
assert_eq 100, 14905565590733827480;
assert_eq 104, 640905753703258831;
assert_eq 108, 4579128623722792381;
assert_eq 112, 158153743058056413;
// Test full state output
poseidon2 0, 0, 3;
assert_eq 0, 14905565590733827480;
assert_eq 4, 640905753703258831;
assert_eq 8, 4579128623722792381;
assert_eq 12, 158153743058056413;
assert_eq 16, 5905145432652609062;
assert_eq 20, 9814446752588696081;
assert_eq 24, 13759450385053274731;
assert_eq 28, 2402148582355896469;
// Test vector 1:
mstore 0, 1;
mstore 4, 1;
mstore 8, 1;
mstore 12, 1;
mstore 16, 1;
mstore 20, 1;
mstore 24, 1;
mstore 28, 1;
poseidon2 0, 0, 3;
assert_eq 0, 18201552556563266798;
assert_eq 4, 6814935789744812745;
assert_eq 8, 5947349602629011250;
assert_eq 12, 15482468195247053191;
assert_eq 16, 2971437633000883992;
assert_eq 20, 9752341516515962403;
assert_eq 24, 15477293561177957600;
assert_eq 28, 13574628582471329853;
// Test vector 2:
mstore 0, 0xffffffff00000000;
mstore 4, 0xffffffff00000000;
mstore 8, 0xffffffff00000000;
mstore 12, 0xffffffff00000000;
mstore 16, 0xffffffff00000000;
mstore 20, 0xffffffff00000000;
mstore 24, 0xffffffff00000000;
mstore 28, 0xffffffff00000000;
poseidon2 0, 0, 3;
assert_eq 0, 13601391594672984423;
assert_eq 4, 7799837486760213030;
assert_eq 8, 4721195013230721931;
assert_eq 12, 6190752424007146655;
assert_eq 16, 5006958669091947377;
assert_eq 20, 716937639216173272;
assert_eq 24, 10656923966581845557;
assert_eq 28, 6633446230068695780;
// Test vector 3:
mstore 0, 923978;
mstore 4, 54 * 2**32 + 3835263602;
mstore 8, 2288 * 2**32 + 750480250;
mstore 12, 112870;
mstore 16, 67351775 * 2**32 + 2528393476;
mstore 20, 53619936 * 2**32 + 3453132820;
mstore 24, 1456 * 2**32 + 1394942011;
mstore 28, 2087;
poseidon2 0, 0, 3;
assert_eq 0, 14498150941209346562;
assert_eq 4, 8038616707062714447;
assert_eq 8, 17242548914990530484;
assert_eq 12, 3240738938335106853;
assert_eq 16, 13554879377661635843;
assert_eq 20, 12505236434419724338;
assert_eq 24, 3134668969942435695;
assert_eq 28, 1912726109528180442;
// Test vector 0, but with input at 100 and output at 104:
mstore 100, 0;
mstore 104, 0;
mstore 108, 0;
mstore 112, 0;
mstore 116, 0;
mstore 120, 0;
mstore 124, 0;
mstore 128, 0;
poseidon2 100, 104, 3;
assert_eq 104, 14905565590733827480;
assert_eq 108, 640905753703258831;
assert_eq 112, 4579128623722792381;
assert_eq 116, 158153743058056413;
assert_eq 120, 5905145432652609062;
assert_eq 124, 9814446752588696081;
assert_eq 128, 13759450385053274731;
assert_eq 132, 2402148582355896469;
return;
}
}