4#include <gmock/gmock.h>
5#include <gtest/gtest.h>
21using ::testing::ElementsAre;
22using ::testing::Return;
23using ::testing::StrictMock;
29 EventEmitter<AluEvent> alu_event_emitter;
30 StrictMock<MockGreaterThan>
gt;
31 StrictMock<MockFieldGreaterThan>
field_gt;
33 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
35 auto a = MemoryValue::from<uint32_t>(1);
36 auto b = MemoryValue::from<uint32_t>(2);
38 auto c = alu.add(
a,
b);
40 EXPECT_EQ(c, MemoryValue::from<uint32_t>(3));
42 auto events = alu_event_emitter.dump_events();
43 EXPECT_THAT(events, ElementsAre(AluEvent{ .operation =
AluOperation::ADD, .a =
a, .b =
b, .c = c }));
46TEST(AvmSimulationAluTest, AddOverflow)
48 EventEmitter<AluEvent> alu_event_emitter;
49 StrictMock<MockGreaterThan>
gt;
50 StrictMock<MockFieldGreaterThan>
field_gt;
52 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
55 auto b = MemoryValue::from<uint32_t>(2);
57 auto c = alu.add(
a,
b);
59 EXPECT_EQ(c, MemoryValue::from<uint32_t>(1));
61 auto events = alu_event_emitter.dump_events();
62 EXPECT_THAT(events, ElementsAre(AluEvent{ .operation =
AluOperation::ADD, .a =
a, .b =
b, .c = c }));
65TEST(AvmSimulationAluTest, NegativeAddTag)
67 EventEmitter<AluEvent> alu_event_emitter;
68 StrictMock<MockGreaterThan>
gt;
69 StrictMock<MockFieldGreaterThan>
field_gt;
71 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
73 auto a = MemoryValue::from<uint32_t>(1);
74 auto b = MemoryValue::from<uint64_t>(2);
76 EXPECT_THROW(alu.add(
a,
b), AluException);
78 auto events = alu_event_emitter.dump_events();
87TEST(AvmSimulationAluTest, Sub)
89 EventEmitter<AluEvent> alu_event_emitter;
90 StrictMock<MockGreaterThan>
gt;
91 StrictMock<MockFieldGreaterThan>
field_gt;
93 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
95 auto a = MemoryValue::from<uint32_t>(2);
96 auto b = MemoryValue::from<uint32_t>(1);
98 auto c = alu.sub(
a,
b);
100 EXPECT_EQ(c, MemoryValue::from<uint32_t>(1));
102 auto events = alu_event_emitter.dump_events();
103 EXPECT_THAT(events, ElementsAre(AluEvent{ .operation =
AluOperation::SUB, .a =
a, .b =
b, .c = c }));
106TEST(AvmSimulationAluTest, SubUnderflow)
108 EventEmitter<AluEvent> alu_event_emitter;
109 StrictMock<MockGreaterThan>
gt;
110 StrictMock<MockFieldGreaterThan>
field_gt;
112 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
114 auto a = MemoryValue::from<uint64_t>(1);
115 auto b = MemoryValue::from<uint64_t>(2);
117 auto c = alu.sub(
a,
b);
121 auto events = alu_event_emitter.dump_events();
122 EXPECT_THAT(events, ElementsAre(AluEvent{ .operation =
AluOperation::SUB, .a =
a, .b =
b, .c = c }));
125TEST(AvmSimulationAluTest, SubFFUnderflow)
127 EventEmitter<AluEvent> alu_event_emitter;
128 StrictMock<MockGreaterThan>
gt;
129 StrictMock<MockFieldGreaterThan>
field_gt;
131 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
133 auto a = MemoryValue::from<FF>(1);
134 auto b = MemoryValue::from<FF>(2);
136 auto c = alu.sub(
a,
b);
140 auto events = alu_event_emitter.dump_events();
141 EXPECT_THAT(events, ElementsAre(AluEvent{ .operation =
AluOperation::SUB, .a =
a, .b =
b, .c = c }));
144TEST(AvmSimulationAluTest, NegativeSubTag)
146 EventEmitter<AluEvent> alu_event_emitter;
147 StrictMock<MockGreaterThan>
gt;
148 StrictMock<MockFieldGreaterThan>
field_gt;
150 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
152 auto a = MemoryValue::from<uint32_t>(2);
153 auto b = MemoryValue::from<uint64_t>(1);
155 EXPECT_THROW(alu.sub(
a,
b), AluException);
157 auto events = alu_event_emitter.dump_events();
166TEST(AvmSimulationAluTest, Mul)
168 EventEmitter<AluEvent> alu_event_emitter;
169 StrictMock<MockGreaterThan>
gt;
170 StrictMock<MockFieldGreaterThan>
field_gt;
172 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
174 auto a = MemoryValue::from<uint32_t>(2);
175 auto b = MemoryValue::from<uint32_t>(3);
177 EXPECT_CALL(range_check, assert_range(_, 64)).Times(1);
179 auto c = alu.mul(
a,
b);
181 EXPECT_EQ(c, MemoryValue::from<uint32_t>(6));
183 auto events = alu_event_emitter.dump_events();
184 EXPECT_THAT(events, ElementsAre(AluEvent{ .operation =
AluOperation::MUL, .a =
a, .b =
b, .c = c }));
187TEST(AvmSimulationAluTest, MulOverflow)
189 EventEmitter<AluEvent> alu_event_emitter;
190 StrictMock<MockGreaterThan>
gt;
191 StrictMock<MockFieldGreaterThan>
field_gt;
193 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
196 auto b = MemoryValue::from<uint32_t>(2);
198 EXPECT_CALL(range_check, assert_range(_, 64)).Times(1);
200 auto c = alu.mul(
a,
b);
204 auto events = alu_event_emitter.dump_events();
205 EXPECT_THAT(events, ElementsAre(AluEvent{ .operation =
AluOperation::MUL, .a =
a, .b =
b, .c = c }));
208TEST(AvmSimulationAluTest, MulOverflowU128)
210 EventEmitter<AluEvent> alu_event_emitter;
211 StrictMock<MockGreaterThan>
gt;
212 StrictMock<MockFieldGreaterThan>
field_gt;
214 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
218 auto a = MemoryValue::from<uint128_t>(max);
219 auto b = MemoryValue::from<uint128_t>(max - 3);
222 EXPECT_CALL(range_check, assert_range(_, 64)).Times(5);
224 auto c = alu.mul(
a,
b);
226 EXPECT_EQ(c, MemoryValue::from<uint128_t>(4));
228 auto events = alu_event_emitter.dump_events();
229 EXPECT_THAT(events, ElementsAre(AluEvent{ .operation =
AluOperation::MUL, .a =
a, .b =
b, .c = c }));
232TEST(AvmSimulationAluTest, Div)
234 EventEmitter<AluEvent> alu_event_emitter;
235 StrictMock<MockGreaterThan>
gt;
236 StrictMock<MockFieldGreaterThan>
field_gt;
238 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
240 auto a = MemoryValue::from<uint32_t>(6);
241 auto b = MemoryValue::from<uint32_t>(3);
243 EXPECT_CALL(gt,
gt(
b, MemoryValue::from<uint32_t>(0))).WillOnce(Return(
true));
244 EXPECT_CALL(range_check, assert_range(0, 32)).Times(1);
246 auto c = alu.div(
a,
b);
248 EXPECT_EQ(c, MemoryValue::from<uint32_t>(2));
250 auto events = alu_event_emitter.dump_events();
251 EXPECT_THAT(events, ElementsAre(AluEvent{ .operation =
AluOperation::DIV, .a =
a, .b =
b, .c = c }));
254TEST(AvmSimulationAluTest, DivU128)
256 EventEmitter<AluEvent> alu_event_emitter;
257 StrictMock<MockGreaterThan>
gt;
258 StrictMock<MockFieldGreaterThan>
field_gt;
260 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
264 auto a = MemoryValue::from<uint128_t>(max);
265 auto b = MemoryValue::from<uint128_t>(2);
267 EXPECT_CALL(gt,
gt(
b, MemoryValue::from<uint128_t>(1))).WillOnce(Return(
true));
270 EXPECT_CALL(range_check, assert_range(1, 128)).Times(1);
272 EXPECT_CALL(range_check, assert_range(_, 64)).Times(4);
274 auto c = alu.div(
a,
b);
276 EXPECT_EQ(c, MemoryValue::from<uint128_t>(max >> 1));
278 auto events = alu_event_emitter.dump_events();
279 EXPECT_THAT(events, ElementsAre(AluEvent{ .operation =
AluOperation::DIV, .a =
a, .b =
b, .c = c }));
282TEST(AvmSimulationAluTest, DivByZero)
284 EventEmitter<AluEvent> alu_event_emitter;
285 StrictMock<MockGreaterThan>
gt;
286 StrictMock<MockFieldGreaterThan>
field_gt;
288 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
290 auto a = MemoryValue::from<uint32_t>(6);
291 auto b = MemoryValue::from<uint32_t>(0);
293 EXPECT_THROW(alu.div(
a,
b), AluException);
295 auto events = alu_event_emitter.dump_events();
296 EXPECT_THAT(events, ElementsAre(AluEvent{ .operation =
AluOperation::DIV, .a =
a, .b =
b, .error =
true }));
299TEST(AvmSimulationAluTest, DivFFTag)
301 EventEmitter<AluEvent> alu_event_emitter;
302 StrictMock<MockGreaterThan>
gt;
303 StrictMock<MockFieldGreaterThan>
field_gt;
305 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
307 auto a = MemoryValue::from<FF>(2);
308 auto b = MemoryValue::from<FF>(2);
310 EXPECT_THROW(alu.div(
a,
b), AluException);
312 auto events = alu_event_emitter.dump_events();
321TEST(AvmSimulationAluTest, FDiv)
323 EventEmitter<AluEvent> alu_event_emitter;
324 StrictMock<MockGreaterThan>
gt;
325 StrictMock<MockFieldGreaterThan>
field_gt;
327 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
330 auto b = MemoryValue::from<FF>(2);
332 auto c = alu.fdiv(
a,
b);
334 EXPECT_EQ(c, MemoryValue::from<FF>(
FF::modulus - 2));
336 auto events = alu_event_emitter.dump_events();
337 EXPECT_THAT(events, ElementsAre(AluEvent{ .operation =
AluOperation::FDIV, .a =
a, .b =
b, .c = c }));
340TEST(AvmSimulationAluTest, FDivByZero)
342 EventEmitter<AluEvent> alu_event_emitter;
343 StrictMock<MockGreaterThan>
gt;
344 StrictMock<MockFieldGreaterThan>
field_gt;
346 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
349 auto b = MemoryValue::from<FF>(0);
351 EXPECT_THROW(alu.fdiv(
a,
b), AluException);
353 auto events = alu_event_emitter.dump_events();
354 EXPECT_THAT(events, ElementsAre(AluEvent{ .operation =
AluOperation::FDIV, .a =
a, .b =
b, .error =
true }));
357TEST(AvmSimulationAluTest, FDivNonFFTag)
359 EventEmitter<AluEvent> alu_event_emitter;
360 StrictMock<MockGreaterThan>
gt;
361 StrictMock<MockFieldGreaterThan>
field_gt;
363 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
365 auto a = MemoryValue::from<uint64_t>(2);
366 auto b = MemoryValue::from<uint64_t>(2);
368 EXPECT_THROW(alu.fdiv(
a,
b), AluException);
370 auto events = alu_event_emitter.dump_events();
379TEST(AvmSimulationAluTest,
LT)
381 EventEmitter<AluEvent> alu_event_emitter;
382 StrictMock<MockGreaterThan>
gt;
383 StrictMock<MockFieldGreaterThan>
field_gt;
385 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
387 auto a = MemoryValue::from<uint32_t>(1);
388 auto b = MemoryValue::from<uint32_t>(2);
390 EXPECT_CALL(gt,
gt(
b,
a)).WillOnce(Return(
true));
392 auto c = alu.lt(
a,
b);
394 EXPECT_EQ(c, MemoryValue::from<uint1_t>(1));
396 auto events = alu_event_emitter.dump_events();
397 EXPECT_THAT(events, ElementsAre(AluEvent{ .operation =
AluOperation::LT, .a =
a, .b =
b, .c = c }));
400TEST(AvmSimulationAluTest, LTFF)
402 EventEmitter<AluEvent> alu_event_emitter;
403 StrictMock<MockGreaterThan>
gt;
404 StrictMock<MockFieldGreaterThan>
field_gt;
406 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
409 auto b = MemoryValue::from<FF>(2);
411 EXPECT_CALL(gt,
gt(
b,
a)).WillOnce(Return(
false));
413 auto c = alu.lt(
a,
b);
415 EXPECT_EQ(c, MemoryValue::from<uint1_t>(0));
417 auto events = alu_event_emitter.dump_events();
418 EXPECT_THAT(events, ElementsAre(AluEvent{ .operation =
AluOperation::LT, .a =
a, .b =
b, .c = c }));
421TEST(AvmSimulationAluTest, NegativeLTTag)
423 EventEmitter<AluEvent> alu_event_emitter;
424 StrictMock<MockGreaterThan>
gt;
425 StrictMock<MockFieldGreaterThan>
field_gt;
427 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
429 auto a = MemoryValue::from<uint32_t>(1);
430 auto b = MemoryValue::from<uint64_t>(2);
432 EXPECT_THROW(alu.lt(
a,
b), AluException);
434 auto events = alu_event_emitter.dump_events();
445 EventEmitter<AluEvent> alu_event_emitter;
446 StrictMock<MockGreaterThan>
gt;
447 StrictMock<MockFieldGreaterThan>
field_gt;
449 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
451 auto a = MemoryValue::from<uint32_t>(1);
452 auto b = MemoryValue::from<uint32_t>(2);
454 EXPECT_CALL(gt,
gt(
a,
b)).WillOnce(Return(
false));
456 auto c = alu.lte(
a,
b);
458 EXPECT_EQ(c, MemoryValue::from<uint1_t>(1));
460 auto events = alu_event_emitter.dump_events();
461 EXPECT_THAT(events, ElementsAre(AluEvent{ .operation =
AluOperation::LTE, .a =
a, .b =
b, .c = c }));
464TEST(AvmSimulationAluTest, LTEEq)
466 EventEmitter<AluEvent> alu_event_emitter;
467 StrictMock<MockGreaterThan>
gt;
468 StrictMock<MockFieldGreaterThan>
field_gt;
470 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
472 auto a = MemoryValue::from<uint128_t>(2);
473 auto b = MemoryValue::from<uint128_t>(2);
475 EXPECT_CALL(gt,
gt(
a,
b)).WillOnce(Return(
false));
477 auto c = alu.lte(
a,
b);
479 EXPECT_EQ(c, MemoryValue::from<uint1_t>(1));
481 auto events = alu_event_emitter.dump_events();
482 EXPECT_THAT(events, ElementsAre(AluEvent{ .operation =
AluOperation::LTE, .a =
a, .b =
b, .c = c }));
485TEST(AvmSimulationAluTest, LTEFF)
487 EventEmitter<AluEvent> alu_event_emitter;
488 StrictMock<MockGreaterThan>
gt;
489 StrictMock<MockFieldGreaterThan>
field_gt;
491 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
494 auto b = MemoryValue::from<FF>(2);
496 EXPECT_CALL(gt,
gt(
a,
b)).WillOnce(Return(
true));
498 auto c = alu.lte(
a,
b);
500 EXPECT_EQ(c, MemoryValue::from<uint1_t>(0));
502 auto events = alu_event_emitter.dump_events();
503 EXPECT_THAT(events, ElementsAre(AluEvent{ .operation =
AluOperation::LTE, .a =
a, .b =
b, .c = c }));
507TEST(AvmSimulationAluTest, NegativeLTETag)
509 EventEmitter<AluEvent> alu_event_emitter;
510 StrictMock<MockGreaterThan>
gt;
511 StrictMock<MockFieldGreaterThan>
field_gt;
513 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
515 auto a = MemoryValue::from<uint32_t>(1);
516 auto b = MemoryValue::from<uint64_t>(2);
518 EXPECT_THROW(alu.lte(
a,
b), AluException);
520 auto events = alu_event_emitter.dump_events();
521 EXPECT_THAT(events, ElementsAre(AluEvent{ .operation =
AluOperation::LTE, .a =
a, .b =
b, .error =
true }));
524TEST(AvmSimulationAluTest, EQEquality)
526 EventEmitter<AluEvent> alu_event_emitter;
527 StrictMock<MockGreaterThan>
gt;
528 StrictMock<MockFieldGreaterThan>
field_gt;
530 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
532 auto a = MemoryValue::from<uint128_t>(123456789);
533 auto b = MemoryValue::from<uint128_t>(123456789);
535 auto c = alu.eq(
a,
b);
537 EXPECT_EQ(c, MemoryValue::from<uint1_t>(1));
539 auto events = alu_event_emitter.dump_events();
540 EXPECT_THAT(events, ElementsAre(AluEvent{ .operation =
AluOperation::EQ, .a =
a, .b =
b, .c = c, .error =
false }));
543TEST(AvmSimulationAluTest, EQInequality)
545 EventEmitter<AluEvent> alu_event_emitter;
546 StrictMock<MockGreaterThan>
gt;
547 StrictMock<MockFieldGreaterThan>
field_gt;
549 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
551 auto a = MemoryValue::from<FF>(123456789);
552 auto b = MemoryValue::from<FF>(123456788);
554 auto c = alu.eq(
a,
b);
556 EXPECT_EQ(c, MemoryValue::from<uint1_t>(0));
558 auto events = alu_event_emitter.dump_events();
559 EXPECT_THAT(events, ElementsAre(AluEvent{ .operation =
AluOperation::EQ, .a =
a, .b =
b, .c = c, .error =
false }));
562TEST(AvmSimulationAluTest, EQTagError)
564 EventEmitter<AluEvent> alu_event_emitter;
565 StrictMock<MockGreaterThan>
gt;
566 StrictMock<MockFieldGreaterThan>
field_gt;
568 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
570 auto a = MemoryValue::from<uint1_t>(1);
571 auto b = MemoryValue::from<uint8_t>(1);
573 EXPECT_THROW(alu.eq(
a,
b), AluException);
575 auto events = alu_event_emitter.dump_events();
584TEST(AvmSimulationAluTest, NotBasic)
586 EventEmitter<AluEvent> alu_event_emitter;
587 StrictMock<MockGreaterThan>
gt;
588 StrictMock<MockFieldGreaterThan>
field_gt;
590 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
592 const auto a = MemoryValue::from<uint64_t>(98321);
593 const auto b = alu.op_not(
a);
597 auto events = alu_event_emitter.dump_events();
598 EXPECT_THAT(events, ElementsAre(AluEvent{ .operation =
AluOperation::NOT, .a =
a, .b =
b, .error =
false }));
601TEST(AvmSimulationAluTest, NotFFTagError)
603 EventEmitter<AluEvent> alu_event_emitter;
604 StrictMock<MockGreaterThan>
gt;
605 StrictMock<MockFieldGreaterThan>
field_gt;
607 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
611 EXPECT_THROW(alu.op_not(
a), AluException);
613 auto events = alu_event_emitter.dump_events();
621TEST(AvmSimulationAluTest, Shl)
623 EventEmitter<AluEvent> alu_event_emitter;
624 StrictMock<MockGreaterThan>
gt;
625 StrictMock<MockFieldGreaterThan>
field_gt;
627 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
629 auto a = MemoryValue::from<uint32_t>(64);
630 auto b = MemoryValue::from<uint32_t>(2);
633 EXPECT_CALL(range_check, assert_range(64, 30)).Times(1);
634 EXPECT_CALL(range_check, assert_range(0, 2)).Times(1);
636 auto c = alu.shl(
a,
b);
638 EXPECT_EQ(c, MemoryValue::from<uint32_t>(256));
640 auto events = alu_event_emitter.dump_events();
641 EXPECT_THAT(events, ElementsAre(AluEvent{ .operation =
AluOperation::SHL, .a =
a, .b =
b, .c = c }));
644TEST(AvmSimulationAluTest, ShlOverflow)
646 EventEmitter<AluEvent> alu_event_emitter;
647 StrictMock<MockGreaterThan>
gt;
648 StrictMock<MockFieldGreaterThan>
field_gt;
650 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
652 auto a = MemoryValue::from<uint32_t>(64);
653 auto b = MemoryValue::from<uint32_t>(100);
656 EXPECT_CALL(range_check, assert_range(68, 32)).Times(1);
657 EXPECT_CALL(range_check, assert_range(0, 32)).Times(1);
659 auto c = alu.shl(
a,
b);
661 EXPECT_EQ(c, MemoryValue::from<uint32_t>(0));
663 auto events = alu_event_emitter.dump_events();
664 EXPECT_THAT(events, ElementsAre(AluEvent{ .operation =
AluOperation::SHL, .a =
a, .b =
b, .c = c }));
668TEST(AvmSimulationAluTest, ShlOverflowU128)
670 EventEmitter<AluEvent> alu_event_emitter;
671 StrictMock<MockGreaterThan>
gt;
672 StrictMock<MockFieldGreaterThan>
field_gt;
674 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
676 auto a = MemoryValue::from<uint128_t>(177);
677 auto b = MemoryValue::from<uint128_t>(129);
680 EXPECT_CALL(range_check, assert_range(1, 128)).Times(1);
681 EXPECT_CALL(range_check, assert_range(0, 128)).Times(1);
683 auto c = alu.shl(
a,
b);
685 auto events = alu_event_emitter.dump_events();
686 EXPECT_THAT(events, ElementsAre(AluEvent{ .operation =
AluOperation::SHL, .a =
a, .b =
b, .c = c }));
689TEST(AvmSimulationAluTest, NegativeShlTagMismatch)
691 EventEmitter<AluEvent> alu_event_emitter;
692 StrictMock<MockGreaterThan>
gt;
693 StrictMock<MockFieldGreaterThan>
field_gt;
695 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
697 auto a = MemoryValue::from<uint32_t>(64);
698 auto b = MemoryValue::from<uint64_t>(2);
700 EXPECT_THROW(alu.shl(
a,
b), AluException);
702 auto events = alu_event_emitter.dump_events();
711TEST(AvmSimulationAluTest, Shr)
713 EventEmitter<AluEvent> alu_event_emitter;
714 StrictMock<MockGreaterThan>
gt;
715 StrictMock<MockFieldGreaterThan>
field_gt;
717 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
719 auto a = MemoryValue::from<uint32_t>(64);
720 auto b = MemoryValue::from<uint32_t>(2);
723 EXPECT_CALL(range_check, assert_range(0, 2)).Times(1);
724 EXPECT_CALL(range_check, assert_range(16, 30)).Times(1);
726 auto c = alu.shr(
a,
b);
728 EXPECT_EQ(c, MemoryValue::from<uint32_t>(16));
730 auto events = alu_event_emitter.dump_events();
731 EXPECT_THAT(events, ElementsAre(AluEvent{ .operation =
AluOperation::SHR, .a =
a, .b =
b, .c = c }));
735TEST(AvmSimulationAluTest, ShrOverflowU128)
737 EventEmitter<AluEvent> alu_event_emitter;
738 StrictMock<MockGreaterThan>
gt;
739 StrictMock<MockFieldGreaterThan>
field_gt;
741 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
743 auto a = MemoryValue::from<uint128_t>(177);
744 auto b = MemoryValue::from<uint128_t>(129);
747 EXPECT_CALL(range_check, assert_range(1, 128)).Times(1);
748 EXPECT_CALL(range_check, assert_range(0, 128)).Times(1);
750 auto c = alu.shr(
a,
b);
752 auto events = alu_event_emitter.dump_events();
753 EXPECT_THAT(events, ElementsAre(AluEvent{ .operation =
AluOperation::SHR, .a =
a, .b =
b, .c = c }));
756TEST(AvmSimulationAluTest, ShrFFTag)
758 EventEmitter<AluEvent> alu_event_emitter;
759 StrictMock<MockGreaterThan>
gt;
760 StrictMock<MockFieldGreaterThan>
field_gt;
762 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
764 auto a = MemoryValue::from<FF>(64);
765 auto b = MemoryValue::from<FF>(2);
767 EXPECT_THROW(alu.shr(
a,
b), AluException);
769 auto events = alu_event_emitter.dump_events();
778TEST(AvmSimulationAluTest, TruncateTrivial)
780 EventEmitter<AluEvent> alu_event_emitter;
781 StrictMock<MockGreaterThan>
gt;
782 StrictMock<MockFieldGreaterThan>
field_gt;
784 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
789 auto c = MemoryValue::from<uint16_t>(8762);
792 auto events = alu_event_emitter.dump_events();
801TEST(AvmSimulationAluTest, TruncateLess128Bits)
803 EventEmitter<AluEvent> alu_event_emitter;
804 StrictMock<MockGreaterThan>
gt;
805 StrictMock<MockFieldGreaterThan>
field_gt;
807 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
809 FF a = (1 << 16) + 12222;
811 EXPECT_CALL(range_check, assert_range(1, 112)).Times(1);
814 auto c = MemoryValue::from<uint16_t>(12222);
817 auto events = alu_event_emitter.dump_events();
826TEST(AvmSimulationAluTest, TruncateGreater128Bits)
828 EventEmitter<AluEvent> alu_event_emitter;
829 StrictMock<MockGreaterThan>
gt;
830 StrictMock<MockFieldGreaterThan>
field_gt;
832 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
835 U256Decomposition decomposition_a = { .lo = (
static_cast<uint128_t>(234) << 32) + 123456789, .hi = 176 };
837 EXPECT_CALL(range_check, assert_range(234, 96)).Times(1);
838 EXPECT_CALL(
field_gt, canon_dec(
a)).Times(1).WillOnce(Return(decomposition_a));
841 auto c = MemoryValue::from<uint32_t>(123456789);
845 auto events = alu_event_emitter.dump_events();
FieldGreaterThan field_gt
static TaggedValue from_tag(ValueTag tag, FF value)
AVM range check gadget for witness generation.
uint256_t get_tag_max_value(ValueTag tag)
TEST(BoomerangMegaCircuitBuilder, BasicCircuit)
unsigned __int128 uint128_t
static constexpr uint256_t modulus