Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
sha256_mem_impl.hpp
Go to the documentation of this file.
1// AUTOGENERATED FILE
2#pragma once
3
5
6namespace bb::avm2 {
7
8template <typename FF_>
9template <typename ContainerOverSubrelations, typename AllEntities>
10void sha256_memImpl<FF_>::accumulate(ContainerOverSubrelations& evals,
11 const AllEntities& in,
12 [[maybe_unused]] const RelationParameters<FF_>&,
13 [[maybe_unused]] const FF_& scaling_factor)
14{
15 using C = ColumnAndShifts;
16
17 PROFILE_THIS_NAME("accumulate/sha256_mem");
18
19 const auto constants_MEM_TAG_U32 = FF(4);
20 const auto constants_AVM_HIGHEST_MEM_ADDRESS = FF(4294967295UL);
21 const auto sha256_LATCH_CONDITION = in.get(C::sha256_latch) + in.get(C::precomputed_first_row);
22 const auto sha256_STATE_READ_CONDITION = in.get(C::sha256_start) * (FF(1) - in.get(C::sha256_mem_out_of_range_err));
23 const auto sha256_OUTPUT_WRITE_CONDITION = in.get(C::sha256_latch) * (FF(1) - in.get(C::sha256_err));
24 const auto sha256_MEM_ADDR = sha256_STATE_READ_CONDITION * in.get(C::sha256_state_addr) +
25 sha256_OUTPUT_WRITE_CONDITION * in.get(C::sha256_output_addr);
26 const auto sha256_STATE_TAG_DIFF_0 = (in.get(C::sha256_memory_tag_0_) - constants_MEM_TAG_U32);
27 const auto sha256_STATE_TAG_DIFF_1 = (in.get(C::sha256_memory_tag_1_) - constants_MEM_TAG_U32);
28 const auto sha256_STATE_TAG_DIFF_2 = (in.get(C::sha256_memory_tag_2_) - constants_MEM_TAG_U32);
29 const auto sha256_STATE_TAG_DIFF_3 = (in.get(C::sha256_memory_tag_3_) - constants_MEM_TAG_U32);
30 const auto sha256_STATE_TAG_DIFF_4 = (in.get(C::sha256_memory_tag_4_) - constants_MEM_TAG_U32);
31 const auto sha256_STATE_TAG_DIFF_5 = (in.get(C::sha256_memory_tag_5_) - constants_MEM_TAG_U32);
32 const auto sha256_STATE_TAG_DIFF_6 = (in.get(C::sha256_memory_tag_6_) - constants_MEM_TAG_U32);
33 const auto sha256_STATE_TAG_DIFF_7 = (in.get(C::sha256_memory_tag_7_) - constants_MEM_TAG_U32);
34 const auto sha256_BATCHED_TAG_CHECK = FF(1) * sha256_STATE_TAG_DIFF_0 + FF(8) * sha256_STATE_TAG_DIFF_1 +
35 FF(64) * sha256_STATE_TAG_DIFF_2 + FF(512) * sha256_STATE_TAG_DIFF_3 +
36 FF(4096) * sha256_STATE_TAG_DIFF_4 + FF(32768) * sha256_STATE_TAG_DIFF_5 +
37 FF(262144) * sha256_STATE_TAG_DIFF_6 + FF(2097152) * sha256_STATE_TAG_DIFF_7;
38 const auto sha256_INPUT_TAG_DIFF =
39 in.get(C::sha256_sel_read_input_from_memory) * (in.get(C::sha256_input_tag) - constants_MEM_TAG_U32);
40 const auto sha256_LATCH_ON_ERROR = (FF(1) - (FF(1) - in.get(C::sha256_mem_out_of_range_err)) *
41 (FF(1) - in.get(C::sha256_sel_invalid_state_tag_err)) *
42 (FF(1) - in.get(C::sha256_sel_invalid_input_row_tag_err)));
43
44 {
45 using Accumulator = typename std::tuple_element_t<0, ContainerOverSubrelations>;
46 auto tmp = in.get(C::sha256_sel) * (FF(1) - in.get(C::sha256_sel));
47 tmp *= scaling_factor;
48 std::get<0>(evals) += typename Accumulator::View(tmp);
49 }
50 {
51 using Accumulator = typename std::tuple_element_t<1, ContainerOverSubrelations>;
52 auto tmp = in.get(C::sha256_start) * (FF(1) - in.get(C::sha256_sel));
53 tmp *= scaling_factor;
54 std::get<1>(evals) += typename Accumulator::View(tmp);
55 }
56 {
57 using Accumulator = typename std::tuple_element_t<2, ContainerOverSubrelations>;
58 auto tmp = in.get(C::sha256_latch) * (FF(1) - in.get(C::sha256_latch));
59 tmp *= scaling_factor;
60 std::get<2>(evals) += typename Accumulator::View(tmp);
61 }
62 { // LATCH_HAS_SEL_ON
63 using Accumulator = typename std::tuple_element_t<3, ContainerOverSubrelations>;
64 auto tmp = in.get(C::sha256_latch) * (FF(1) - in.get(C::sha256_sel));
65 tmp *= scaling_factor;
66 std::get<3>(evals) += typename Accumulator::View(tmp);
67 }
68 { // START_AFTER_LAST
69 using Accumulator = typename std::tuple_element_t<4, ContainerOverSubrelations>;
70 auto tmp = in.get(C::sha256_sel_shift) * (in.get(C::sha256_start_shift) - sha256_LATCH_CONDITION);
71 tmp *= scaling_factor;
72 std::get<4>(evals) += typename Accumulator::View(tmp);
73 }
74 { // CONTINUITY_SEL
75 using Accumulator = typename std::tuple_element_t<5, ContainerOverSubrelations>;
76 auto tmp = (FF(1) - sha256_LATCH_CONDITION) * (in.get(C::sha256_sel_shift) - in.get(C::sha256_sel));
77 tmp *= scaling_factor;
78 std::get<5>(evals) += typename Accumulator::View(tmp);
79 }
80 { // CONTINUITY_EXEC_CLK
81 using Accumulator = typename std::tuple_element_t<6, ContainerOverSubrelations>;
82 auto tmp = (FF(1) - sha256_LATCH_CONDITION) *
83 (in.get(C::sha256_execution_clk_shift) - in.get(C::sha256_execution_clk));
84 tmp *= scaling_factor;
85 std::get<6>(evals) += typename Accumulator::View(tmp);
86 }
87 { // CONTINUITY_SPACE_ID
88 using Accumulator = typename std::tuple_element_t<7, ContainerOverSubrelations>;
89 auto tmp = (FF(1) - sha256_LATCH_CONDITION) * (in.get(C::sha256_space_id_shift) - in.get(C::sha256_space_id));
90 tmp *= scaling_factor;
91 std::get<7>(evals) += typename Accumulator::View(tmp);
92 }
93 { // CONTINUITY_OUTPUT_ADDR
94 using Accumulator = typename std::tuple_element_t<8, ContainerOverSubrelations>;
95 auto tmp =
96 (FF(1) - sha256_LATCH_CONDITION) * (in.get(C::sha256_output_addr_shift) - in.get(C::sha256_output_addr));
97 tmp *= scaling_factor;
98 std::get<8>(evals) += typename Accumulator::View(tmp);
99 }
100 {
101 using Accumulator = typename std::tuple_element_t<9, ContainerOverSubrelations>;
102 auto tmp = in.get(C::sha256_start) * (in.get(C::sha256_max_mem_addr) - constants_AVM_HIGHEST_MEM_ADDRESS);
103 tmp *= scaling_factor;
104 std::get<9>(evals) += typename Accumulator::View(tmp);
105 }
106 {
107 using Accumulator = typename std::tuple_element_t<10, ContainerOverSubrelations>;
108 auto tmp =
109 (in.get(C::sha256_max_state_addr) - in.get(C::sha256_start) * (in.get(C::sha256_state_addr) + FF(7)));
110 tmp *= scaling_factor;
111 std::get<10>(evals) += typename Accumulator::View(tmp);
112 }
113 {
114 using Accumulator = typename std::tuple_element_t<11, ContainerOverSubrelations>;
115 auto tmp =
116 (in.get(C::sha256_max_input_addr) - in.get(C::sha256_start) * (in.get(C::sha256_input_addr) + FF(15)));
117 tmp *= scaling_factor;
118 std::get<11>(evals) += typename Accumulator::View(tmp);
119 }
120 {
121 using Accumulator = typename std::tuple_element_t<12, ContainerOverSubrelations>;
122 auto tmp =
123 (in.get(C::sha256_max_output_addr) - in.get(C::sha256_start) * (in.get(C::sha256_output_addr) + FF(7)));
124 tmp *= scaling_factor;
125 std::get<12>(evals) += typename Accumulator::View(tmp);
126 }
127 {
128 using Accumulator = typename std::tuple_element_t<13, ContainerOverSubrelations>;
129 auto tmp = (in.get(C::sha256_mem_out_of_range_err) -
130 (FF(1) - (FF(1) - in.get(C::sha256_sel_state_out_of_range_err)) *
131 (FF(1) - in.get(C::sha256_sel_input_out_of_range_err)) *
132 (FF(1) - in.get(C::sha256_sel_output_out_of_range_err))));
133 tmp *= scaling_factor;
134 std::get<13>(evals) += typename Accumulator::View(tmp);
135 }
136 {
137 using Accumulator = typename std::tuple_element_t<14, ContainerOverSubrelations>;
138 auto tmp = (in.get(C::sha256_u32_tag) - in.get(C::sha256_sel) * constants_MEM_TAG_U32);
139 tmp *= scaling_factor;
140 std::get<14>(evals) += typename Accumulator::View(tmp);
141 }
142 { // START_OR_LAST_MEM
143 using Accumulator = typename std::tuple_element_t<15, ContainerOverSubrelations>;
144 auto tmp =
145 (in.get(C::sha256_sel_mem_state_or_output) - (sha256_STATE_READ_CONDITION + sha256_OUTPUT_WRITE_CONDITION));
146 tmp *= scaling_factor;
147 std::get<15>(evals) += typename Accumulator::View(tmp);
148 }
149 {
150 using Accumulator = typename std::tuple_element_t<16, ContainerOverSubrelations>;
151 auto tmp = in.get(C::sha256_sel_mem_state_or_output) *
152 (in.get(C::sha256_memory_address_0_) - (sha256_MEM_ADDR + FF(0)));
153 tmp *= scaling_factor;
154 std::get<16>(evals) += typename Accumulator::View(tmp);
155 }
156 {
157 using Accumulator = typename std::tuple_element_t<17, ContainerOverSubrelations>;
158 auto tmp = in.get(C::sha256_sel_mem_state_or_output) *
159 (in.get(C::sha256_memory_address_1_) - (sha256_MEM_ADDR + FF(1)));
160 tmp *= scaling_factor;
161 std::get<17>(evals) += typename Accumulator::View(tmp);
162 }
163 {
164 using Accumulator = typename std::tuple_element_t<18, ContainerOverSubrelations>;
165 auto tmp = in.get(C::sha256_sel_mem_state_or_output) *
166 (in.get(C::sha256_memory_address_2_) - (sha256_MEM_ADDR + FF(2)));
167 tmp *= scaling_factor;
168 std::get<18>(evals) += typename Accumulator::View(tmp);
169 }
170 {
171 using Accumulator = typename std::tuple_element_t<19, ContainerOverSubrelations>;
172 auto tmp = in.get(C::sha256_sel_mem_state_or_output) *
173 (in.get(C::sha256_memory_address_3_) - (sha256_MEM_ADDR + FF(3)));
174 tmp *= scaling_factor;
175 std::get<19>(evals) += typename Accumulator::View(tmp);
176 }
177 {
178 using Accumulator = typename std::tuple_element_t<20, ContainerOverSubrelations>;
179 auto tmp = in.get(C::sha256_sel_mem_state_or_output) *
180 (in.get(C::sha256_memory_address_4_) - (sha256_MEM_ADDR + FF(4)));
181 tmp *= scaling_factor;
182 std::get<20>(evals) += typename Accumulator::View(tmp);
183 }
184 {
185 using Accumulator = typename std::tuple_element_t<21, ContainerOverSubrelations>;
186 auto tmp = in.get(C::sha256_sel_mem_state_or_output) *
187 (in.get(C::sha256_memory_address_5_) - (sha256_MEM_ADDR + FF(5)));
188 tmp *= scaling_factor;
189 std::get<21>(evals) += typename Accumulator::View(tmp);
190 }
191 {
192 using Accumulator = typename std::tuple_element_t<22, ContainerOverSubrelations>;
193 auto tmp = in.get(C::sha256_sel_mem_state_or_output) *
194 (in.get(C::sha256_memory_address_6_) - (sha256_MEM_ADDR + FF(6)));
195 tmp *= scaling_factor;
196 std::get<22>(evals) += typename Accumulator::View(tmp);
197 }
198 {
199 using Accumulator = typename std::tuple_element_t<23, ContainerOverSubrelations>;
200 auto tmp = in.get(C::sha256_sel_mem_state_or_output) *
201 (in.get(C::sha256_memory_address_7_) - (sha256_MEM_ADDR + FF(7)));
202 tmp *= scaling_factor;
203 std::get<23>(evals) += typename Accumulator::View(tmp);
204 }
205 {
206 using Accumulator = typename std::tuple_element_t<24, ContainerOverSubrelations>;
207 auto tmp =
208 in.get(C::sha256_sel_mem_state_or_output) *
209 (sha256_STATE_READ_CONDITION * (in.get(C::sha256_memory_register_0_) - in.get(C::sha256_init_a)) +
210 sha256_OUTPUT_WRITE_CONDITION * (in.get(C::sha256_memory_register_0_) - in.get(C::sha256_output_a_rhs)));
211 tmp *= scaling_factor;
212 std::get<24>(evals) += typename Accumulator::View(tmp);
213 }
214 {
215 using Accumulator = typename std::tuple_element_t<25, ContainerOverSubrelations>;
216 auto tmp =
217 in.get(C::sha256_sel_mem_state_or_output) *
218 (sha256_STATE_READ_CONDITION * (in.get(C::sha256_memory_register_1_) - in.get(C::sha256_init_b)) +
219 sha256_OUTPUT_WRITE_CONDITION * (in.get(C::sha256_memory_register_1_) - in.get(C::sha256_output_b_rhs)));
220 tmp *= scaling_factor;
221 std::get<25>(evals) += typename Accumulator::View(tmp);
222 }
223 {
224 using Accumulator = typename std::tuple_element_t<26, ContainerOverSubrelations>;
225 auto tmp =
226 in.get(C::sha256_sel_mem_state_or_output) *
227 (sha256_STATE_READ_CONDITION * (in.get(C::sha256_memory_register_2_) - in.get(C::sha256_init_c)) +
228 sha256_OUTPUT_WRITE_CONDITION * (in.get(C::sha256_memory_register_2_) - in.get(C::sha256_output_c_rhs)));
229 tmp *= scaling_factor;
230 std::get<26>(evals) += typename Accumulator::View(tmp);
231 }
232 {
233 using Accumulator = typename std::tuple_element_t<27, ContainerOverSubrelations>;
234 auto tmp =
235 in.get(C::sha256_sel_mem_state_or_output) *
236 (sha256_STATE_READ_CONDITION * (in.get(C::sha256_memory_register_3_) - in.get(C::sha256_init_d)) +
237 sha256_OUTPUT_WRITE_CONDITION * (in.get(C::sha256_memory_register_3_) - in.get(C::sha256_output_d_rhs)));
238 tmp *= scaling_factor;
239 std::get<27>(evals) += typename Accumulator::View(tmp);
240 }
241 {
242 using Accumulator = typename std::tuple_element_t<28, ContainerOverSubrelations>;
243 auto tmp =
244 in.get(C::sha256_sel_mem_state_or_output) *
245 (sha256_STATE_READ_CONDITION * (in.get(C::sha256_memory_register_4_) - in.get(C::sha256_init_e)) +
246 sha256_OUTPUT_WRITE_CONDITION * (in.get(C::sha256_memory_register_4_) - in.get(C::sha256_output_e_rhs)));
247 tmp *= scaling_factor;
248 std::get<28>(evals) += typename Accumulator::View(tmp);
249 }
250 {
251 using Accumulator = typename std::tuple_element_t<29, ContainerOverSubrelations>;
252 auto tmp =
253 in.get(C::sha256_sel_mem_state_or_output) *
254 (sha256_STATE_READ_CONDITION * (in.get(C::sha256_memory_register_5_) - in.get(C::sha256_init_f)) +
255 sha256_OUTPUT_WRITE_CONDITION * (in.get(C::sha256_memory_register_5_) - in.get(C::sha256_output_f_rhs)));
256 tmp *= scaling_factor;
257 std::get<29>(evals) += typename Accumulator::View(tmp);
258 }
259 {
260 using Accumulator = typename std::tuple_element_t<30, ContainerOverSubrelations>;
261 auto tmp =
262 in.get(C::sha256_sel_mem_state_or_output) *
263 (sha256_STATE_READ_CONDITION * (in.get(C::sha256_memory_register_6_) - in.get(C::sha256_init_g)) +
264 sha256_OUTPUT_WRITE_CONDITION * (in.get(C::sha256_memory_register_6_) - in.get(C::sha256_output_g_rhs)));
265 tmp *= scaling_factor;
266 std::get<30>(evals) += typename Accumulator::View(tmp);
267 }
268 {
269 using Accumulator = typename std::tuple_element_t<31, ContainerOverSubrelations>;
270 auto tmp =
271 in.get(C::sha256_sel_mem_state_or_output) *
272 (sha256_STATE_READ_CONDITION * (in.get(C::sha256_memory_register_7_) - in.get(C::sha256_init_h)) +
273 sha256_OUTPUT_WRITE_CONDITION * (in.get(C::sha256_memory_register_7_) - in.get(C::sha256_output_h_rhs)));
274 tmp *= scaling_factor;
275 std::get<31>(evals) += typename Accumulator::View(tmp);
276 }
277 {
278 using Accumulator = typename std::tuple_element_t<32, ContainerOverSubrelations>;
279 auto tmp = (in.get(C::sha256_rw) - sha256_OUTPUT_WRITE_CONDITION);
280 tmp *= scaling_factor;
281 std::get<32>(evals) += typename Accumulator::View(tmp);
282 }
283 {
284 using Accumulator = typename std::tuple_element_t<33, ContainerOverSubrelations>;
285 auto tmp = in.get(C::sha256_sel_invalid_state_tag_err) * (FF(1) - in.get(C::sha256_sel_invalid_state_tag_err));
286 tmp *= scaling_factor;
287 std::get<33>(evals) += typename Accumulator::View(tmp);
288 }
289 { // BATCH_ZERO_CHECK_READ
290 using Accumulator = typename std::tuple_element_t<34, ContainerOverSubrelations>;
291 auto tmp =
292 (sha256_STATE_READ_CONDITION * sha256_BATCHED_TAG_CHECK *
293 ((FF(1) - in.get(C::sha256_sel_invalid_state_tag_err)) * (FF(1) - in.get(C::sha256_batch_tag_inv)) +
294 in.get(C::sha256_batch_tag_inv)) -
295 in.get(C::sha256_sel_invalid_state_tag_err));
296 tmp *= scaling_factor;
297 std::get<34>(evals) += typename Accumulator::View(tmp);
298 }
299 { // BATCH_ENFORCE_ZERO_WRITE
300 using Accumulator = typename std::tuple_element_t<35, ContainerOverSubrelations>;
301 auto tmp = sha256_OUTPUT_WRITE_CONDITION * sha256_BATCHED_TAG_CHECK;
302 tmp *= scaling_factor;
303 std::get<35>(evals) += typename Accumulator::View(tmp);
304 }
305 {
306 using Accumulator = typename std::tuple_element_t<36, ContainerOverSubrelations>;
307 auto tmp = in.get(C::sha256_sel_is_input_round) * (FF(1) - in.get(C::sha256_sel_is_input_round));
308 tmp *= scaling_factor;
309 std::get<36>(evals) += typename Accumulator::View(tmp);
310 }
311 { // SEL_IS_INPUT_ROUND_START_COND
312 using Accumulator = typename std::tuple_element_t<37, ContainerOverSubrelations>;
313 auto tmp = in.get(C::sha256_start) * (in.get(C::sha256_sel_is_input_round) - FF(1));
314 tmp *= scaling_factor;
315 std::get<37>(evals) += typename Accumulator::View(tmp);
316 }
317 { // SEL_IS_INPUT_END
318 using Accumulator = typename std::tuple_element_t<38, ContainerOverSubrelations>;
319 auto tmp = (FF(1) - sha256_LATCH_CONDITION) *
320 (in.get(C::sha256_input_rounds_rem) * ((FF(1) - in.get(C::sha256_sel_is_input_round)) *
321 (FF(1) - in.get(C::sha256_input_rounds_rem_inv)) +
322 in.get(C::sha256_input_rounds_rem_inv)) -
323 in.get(C::sha256_sel_is_input_round));
324 tmp *= scaling_factor;
325 std::get<38>(evals) += typename Accumulator::View(tmp);
326 }
327 { // SEL_IS_INPUT_PROPAGATE
328 using Accumulator = typename std::tuple_element_t<39, ContainerOverSubrelations>;
329 auto tmp = (FF(1) - sha256_LATCH_CONDITION) * (FF(1) - in.get(C::sha256_sel_is_input_round)) *
330 in.get(C::sha256_sel_is_input_round_shift);
331 tmp *= scaling_factor;
332 std::get<39>(evals) += typename Accumulator::View(tmp);
333 }
334 { // INPUT_ROUND_CTR_START_COND
335 using Accumulator = typename std::tuple_element_t<40, ContainerOverSubrelations>;
336 auto tmp = in.get(C::sha256_start) * (in.get(C::sha256_input_rounds_rem) - FF(16));
337 tmp *= scaling_factor;
338 std::get<40>(evals) += typename Accumulator::View(tmp);
339 }
340 { // INPUT_ROUND_CTR_DECR_COND
341 using Accumulator = typename std::tuple_element_t<41, ContainerOverSubrelations>;
342 auto tmp = in.get(C::sha256_sel) * (FF(1) - sha256_LATCH_CONDITION) *
343 (in.get(C::sha256_input_rounds_rem_shift) -
344 (in.get(C::sha256_input_rounds_rem) - in.get(C::sha256_sel_is_input_round)));
345 tmp *= scaling_factor;
346 std::get<41>(evals) += typename Accumulator::View(tmp);
347 }
348 {
349 using Accumulator = typename std::tuple_element_t<42, ContainerOverSubrelations>;
350 auto tmp = (in.get(C::sha256_sel_read_input_from_memory) -
351 in.get(C::sha256_sel) * (FF(1) - in.get(C::sha256_mem_out_of_range_err)) *
352 in.get(C::sha256_sel_is_input_round) * (FF(1) - in.get(C::sha256_sel_invalid_state_tag_err)));
353 tmp *= scaling_factor;
354 std::get<42>(evals) += typename Accumulator::View(tmp);
355 }
356 {
357 using Accumulator = typename std::tuple_element_t<43, ContainerOverSubrelations>;
358 auto tmp = in.get(C::sha256_sel_is_input_round) * (in.get(C::sha256_input) - in.get(C::sha256_w));
359 tmp *= scaling_factor;
360 std::get<43>(evals) += typename Accumulator::View(tmp);
361 }
362 {
363 using Accumulator = typename std::tuple_element_t<44, ContainerOverSubrelations>;
364 auto tmp = in.get(C::sha256_sel_invalid_input_tag_err) * (FF(1) - in.get(C::sha256_sel_invalid_input_tag_err));
365 tmp *= scaling_factor;
366 std::get<44>(evals) += typename Accumulator::View(tmp);
367 }
368 {
369 using Accumulator = typename std::tuple_element_t<45, ContainerOverSubrelations>;
370 auto tmp =
371 in.get(C::sha256_sel_invalid_input_row_tag_err) * (FF(1) - in.get(C::sha256_sel_invalid_input_row_tag_err));
372 tmp *= scaling_factor;
373 std::get<45>(evals) += typename Accumulator::View(tmp);
374 }
375 { // INPUT_TAG_DIFF_CHECK
376 using Accumulator = typename std::tuple_element_t<46, ContainerOverSubrelations>;
377 auto tmp = (sha256_INPUT_TAG_DIFF * ((FF(1) - in.get(C::sha256_sel_invalid_input_row_tag_err)) *
378 (FF(1) - in.get(C::sha256_input_tag_diff_inv)) +
379 in.get(C::sha256_input_tag_diff_inv)) -
380 in.get(C::sha256_sel_invalid_input_row_tag_err));
381 tmp *= scaling_factor;
382 std::get<46>(evals) += typename Accumulator::View(tmp);
383 }
384 {
385 using Accumulator = typename std::tuple_element_t<47, ContainerOverSubrelations>;
386 auto tmp = in.get(C::sha256_sel) * sha256_LATCH_ON_ERROR * (in.get(C::sha256_latch) - FF(1));
387 tmp *= scaling_factor;
388 std::get<47>(evals) += typename Accumulator::View(tmp);
389 }
390 { // TAG_ERROR_INIT
391 using Accumulator = typename std::tuple_element_t<48, ContainerOverSubrelations>;
392 auto tmp = sha256_LATCH_CONDITION *
393 (in.get(C::sha256_sel_invalid_input_tag_err) - in.get(C::sha256_sel_invalid_input_row_tag_err));
394 tmp *= scaling_factor;
395 std::get<48>(evals) += typename Accumulator::View(tmp);
396 }
397 { // TAG_ERROR_PROPAGATION
398 using Accumulator = typename std::tuple_element_t<49, ContainerOverSubrelations>;
399 auto tmp = (FF(1) - sha256_LATCH_CONDITION) *
400 (in.get(C::sha256_sel_invalid_input_tag_err) - in.get(C::sha256_sel_invalid_input_tag_err_shift));
401 tmp *= scaling_factor;
402 std::get<49>(evals) += typename Accumulator::View(tmp);
403 }
404 {
405 using Accumulator = typename std::tuple_element_t<50, ContainerOverSubrelations>;
406 auto tmp = (in.get(C::sha256_err) - (FF(1) - (FF(1) - in.get(C::sha256_mem_out_of_range_err)) *
407 (FF(1) - in.get(C::sha256_sel_invalid_state_tag_err)) *
408 (FF(1) - in.get(C::sha256_sel_invalid_input_tag_err))));
409 tmp *= scaling_factor;
410 std::get<50>(evals) += typename Accumulator::View(tmp);
411 }
412}
413
414} // namespace bb::avm2
static void accumulate(ContainerOverSubrelations &evals, const AllEntities &in, const RelationParameters< FF > &, const FF &scaling_factor)
ColumnAndShifts
Definition columns.hpp:35
AvmFlavorSettings::FF FF
Definition field.hpp:10
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
#define PROFILE_THIS_NAME(name)
Definition op_count.hpp:16
Container for parameters used by the grand product (permutation, lookup) Honk relations.