4#include <gmock/gmock.h>
5#include <gtest/gtest.h>
21using ::testing::ElementsAre;
22using ::testing::Return;
23using ::testing::StrictMock;
27TEST(AvmSimulationAluTest, Add)
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));
245 auto c = alu.div(
a,
b);
247 EXPECT_EQ(c, MemoryValue::from<uint32_t>(2));
249 auto events = alu_event_emitter.dump_events();
250 EXPECT_THAT(events, ElementsAre(AluEvent{ .operation =
AluOperation::DIV, .a =
a, .b =
b, .c = c }));
253TEST(AvmSimulationAluTest, DivU128)
255 EventEmitter<AluEvent> alu_event_emitter;
256 StrictMock<MockGreaterThan>
gt;
257 StrictMock<MockFieldGreaterThan>
field_gt;
259 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
263 auto a = MemoryValue::from<uint128_t>(max);
264 auto b = MemoryValue::from<uint128_t>(2);
266 EXPECT_CALL(gt,
gt(
b, MemoryValue::from<uint128_t>(1))).WillOnce(Return(
true));
269 EXPECT_CALL(range_check, assert_range(_, 64)).Times(4);
271 auto c = alu.div(
a,
b);
273 EXPECT_EQ(c, MemoryValue::from<uint128_t>(max >> 1));
275 auto events = alu_event_emitter.dump_events();
276 EXPECT_THAT(events, ElementsAre(AluEvent{ .operation =
AluOperation::DIV, .a =
a, .b =
b, .c = c }));
279TEST(AvmSimulationAluTest, DivByZero)
281 EventEmitter<AluEvent> alu_event_emitter;
282 StrictMock<MockGreaterThan>
gt;
283 StrictMock<MockFieldGreaterThan>
field_gt;
285 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
287 auto a = MemoryValue::from<uint32_t>(6);
288 auto b = MemoryValue::from<uint32_t>(0);
290 EXPECT_THROW(alu.div(
a,
b), AluException);
292 auto events = alu_event_emitter.dump_events();
293 EXPECT_THAT(events, ElementsAre(AluEvent{ .operation =
AluOperation::DIV, .a =
a, .b =
b, .error =
true }));
296TEST(AvmSimulationAluTest, DivFFTag)
298 EventEmitter<AluEvent> alu_event_emitter;
299 StrictMock<MockGreaterThan>
gt;
300 StrictMock<MockFieldGreaterThan>
field_gt;
302 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
304 auto a = MemoryValue::from<FF>(2);
305 auto b = MemoryValue::from<FF>(2);
307 EXPECT_THROW(alu.div(
a,
b), AluException);
309 auto events = alu_event_emitter.dump_events();
318TEST(AvmSimulationAluTest, FDiv)
320 EventEmitter<AluEvent> alu_event_emitter;
321 StrictMock<MockGreaterThan>
gt;
322 StrictMock<MockFieldGreaterThan>
field_gt;
324 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
327 auto b = MemoryValue::from<FF>(2);
329 auto c = alu.fdiv(
a,
b);
331 EXPECT_EQ(c, MemoryValue::from<FF>(
FF::modulus - 2));
333 auto events = alu_event_emitter.dump_events();
334 EXPECT_THAT(events, ElementsAre(AluEvent{ .operation =
AluOperation::FDIV, .a =
a, .b =
b, .c = c }));
337TEST(AvmSimulationAluTest, FDivByZero)
339 EventEmitter<AluEvent> alu_event_emitter;
340 StrictMock<MockGreaterThan>
gt;
341 StrictMock<MockFieldGreaterThan>
field_gt;
343 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
346 auto b = MemoryValue::from<FF>(0);
348 EXPECT_THROW(alu.fdiv(
a,
b), AluException);
350 auto events = alu_event_emitter.dump_events();
351 EXPECT_THAT(events, ElementsAre(AluEvent{ .operation =
AluOperation::FDIV, .a =
a, .b =
b, .error =
true }));
354TEST(AvmSimulationAluTest, FDivNonFFTag)
356 EventEmitter<AluEvent> alu_event_emitter;
357 StrictMock<MockGreaterThan>
gt;
358 StrictMock<MockFieldGreaterThan>
field_gt;
360 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
362 auto a = MemoryValue::from<uint64_t>(2);
363 auto b = MemoryValue::from<uint64_t>(2);
365 EXPECT_THROW(alu.fdiv(
a,
b), AluException);
367 auto events = alu_event_emitter.dump_events();
376TEST(AvmSimulationAluTest,
LT)
378 EventEmitter<AluEvent> alu_event_emitter;
379 StrictMock<MockGreaterThan>
gt;
380 StrictMock<MockFieldGreaterThan>
field_gt;
382 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
384 auto a = MemoryValue::from<uint32_t>(1);
385 auto b = MemoryValue::from<uint32_t>(2);
387 EXPECT_CALL(gt,
gt(
b,
a)).WillOnce(Return(
true));
389 auto c = alu.lt(
a,
b);
391 EXPECT_EQ(c, MemoryValue::from<uint1_t>(1));
393 auto events = alu_event_emitter.dump_events();
394 EXPECT_THAT(events, ElementsAre(AluEvent{ .operation =
AluOperation::LT, .a =
a, .b =
b, .c = c }));
397TEST(AvmSimulationAluTest, LTFF)
399 EventEmitter<AluEvent> alu_event_emitter;
400 StrictMock<MockGreaterThan>
gt;
401 StrictMock<MockFieldGreaterThan>
field_gt;
403 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
406 auto b = MemoryValue::from<FF>(2);
408 EXPECT_CALL(gt,
gt(
b,
a)).WillOnce(Return(
false));
410 auto c = alu.lt(
a,
b);
412 EXPECT_EQ(c, MemoryValue::from<uint1_t>(0));
414 auto events = alu_event_emitter.dump_events();
415 EXPECT_THAT(events, ElementsAre(AluEvent{ .operation =
AluOperation::LT, .a =
a, .b =
b, .c = c }));
418TEST(AvmSimulationAluTest, NegativeLTTag)
420 EventEmitter<AluEvent> alu_event_emitter;
421 StrictMock<MockGreaterThan>
gt;
422 StrictMock<MockFieldGreaterThan>
field_gt;
424 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
426 auto a = MemoryValue::from<uint32_t>(1);
427 auto b = MemoryValue::from<uint64_t>(2);
429 EXPECT_THROW(alu.lt(
a,
b), AluException);
431 auto events = alu_event_emitter.dump_events();
442 EventEmitter<AluEvent> alu_event_emitter;
443 StrictMock<MockGreaterThan>
gt;
444 StrictMock<MockFieldGreaterThan>
field_gt;
446 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
448 auto a = MemoryValue::from<uint32_t>(1);
449 auto b = MemoryValue::from<uint32_t>(2);
451 EXPECT_CALL(gt,
gt(
a,
b)).WillOnce(Return(
false));
453 auto c = alu.lte(
a,
b);
455 EXPECT_EQ(c, MemoryValue::from<uint1_t>(1));
457 auto events = alu_event_emitter.dump_events();
458 EXPECT_THAT(events, ElementsAre(AluEvent{ .operation =
AluOperation::LTE, .a =
a, .b =
b, .c = c }));
461TEST(AvmSimulationAluTest, LTEEq)
463 EventEmitter<AluEvent> alu_event_emitter;
464 StrictMock<MockGreaterThan>
gt;
465 StrictMock<MockFieldGreaterThan>
field_gt;
467 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
469 auto a = MemoryValue::from<uint128_t>(2);
470 auto b = MemoryValue::from<uint128_t>(2);
472 EXPECT_CALL(gt,
gt(
a,
b)).WillOnce(Return(
false));
474 auto c = alu.lte(
a,
b);
476 EXPECT_EQ(c, MemoryValue::from<uint1_t>(1));
478 auto events = alu_event_emitter.dump_events();
479 EXPECT_THAT(events, ElementsAre(AluEvent{ .operation =
AluOperation::LTE, .a =
a, .b =
b, .c = c }));
482TEST(AvmSimulationAluTest, LTEFF)
484 EventEmitter<AluEvent> alu_event_emitter;
485 StrictMock<MockGreaterThan>
gt;
486 StrictMock<MockFieldGreaterThan>
field_gt;
488 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
491 auto b = MemoryValue::from<FF>(2);
493 EXPECT_CALL(gt,
gt(
a,
b)).WillOnce(Return(
true));
495 auto c = alu.lte(
a,
b);
497 EXPECT_EQ(c, MemoryValue::from<uint1_t>(0));
499 auto events = alu_event_emitter.dump_events();
500 EXPECT_THAT(events, ElementsAre(AluEvent{ .operation =
AluOperation::LTE, .a =
a, .b =
b, .c = c }));
504TEST(AvmSimulationAluTest, NegativeLTETag)
506 EventEmitter<AluEvent> alu_event_emitter;
507 StrictMock<MockGreaterThan>
gt;
508 StrictMock<MockFieldGreaterThan>
field_gt;
510 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
512 auto a = MemoryValue::from<uint32_t>(1);
513 auto b = MemoryValue::from<uint64_t>(2);
515 EXPECT_THROW(alu.lte(
a,
b), AluException);
517 auto events = alu_event_emitter.dump_events();
518 EXPECT_THAT(events, ElementsAre(AluEvent{ .operation =
AluOperation::LTE, .a =
a, .b =
b, .error =
true }));
521TEST(AvmSimulationAluTest, EQEquality)
523 EventEmitter<AluEvent> alu_event_emitter;
524 StrictMock<MockGreaterThan>
gt;
525 StrictMock<MockFieldGreaterThan>
field_gt;
527 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
529 auto a = MemoryValue::from<uint128_t>(123456789);
530 auto b = MemoryValue::from<uint128_t>(123456789);
532 auto c = alu.eq(
a,
b);
534 EXPECT_EQ(c, MemoryValue::from<uint1_t>(1));
536 auto events = alu_event_emitter.dump_events();
537 EXPECT_THAT(events, ElementsAre(AluEvent{ .operation =
AluOperation::EQ, .a =
a, .b =
b, .c = c, .error =
false }));
540TEST(AvmSimulationAluTest, EQInequality)
542 EventEmitter<AluEvent> alu_event_emitter;
543 StrictMock<MockGreaterThan>
gt;
544 StrictMock<MockFieldGreaterThan>
field_gt;
546 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
548 auto a = MemoryValue::from<FF>(123456789);
549 auto b = MemoryValue::from<FF>(123456788);
551 auto c = alu.eq(
a,
b);
553 EXPECT_EQ(c, MemoryValue::from<uint1_t>(0));
555 auto events = alu_event_emitter.dump_events();
556 EXPECT_THAT(events, ElementsAre(AluEvent{ .operation =
AluOperation::EQ, .a =
a, .b =
b, .c = c, .error =
false }));
559TEST(AvmSimulationAluTest, EQTagError)
561 EventEmitter<AluEvent> alu_event_emitter;
562 StrictMock<MockGreaterThan>
gt;
563 StrictMock<MockFieldGreaterThan>
field_gt;
565 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
567 auto a = MemoryValue::from<uint1_t>(1);
568 auto b = MemoryValue::from<uint8_t>(1);
570 EXPECT_THROW(alu.eq(
a,
b), AluException);
572 auto events = alu_event_emitter.dump_events();
581TEST(AvmSimulationAluTest, NotBasic)
583 EventEmitter<AluEvent> alu_event_emitter;
584 StrictMock<MockGreaterThan>
gt;
585 StrictMock<MockFieldGreaterThan>
field_gt;
587 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
589 const auto a = MemoryValue::from<uint64_t>(98321);
590 const auto b = alu.op_not(
a);
594 auto events = alu_event_emitter.dump_events();
595 EXPECT_THAT(events, ElementsAre(AluEvent{ .operation =
AluOperation::NOT, .a =
a, .b =
b, .error =
false }));
598TEST(AvmSimulationAluTest, NotFFTagError)
600 EventEmitter<AluEvent> alu_event_emitter;
601 StrictMock<MockGreaterThan>
gt;
602 StrictMock<MockFieldGreaterThan>
field_gt;
604 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
608 EXPECT_THROW(alu.op_not(
a), AluException);
610 auto events = alu_event_emitter.dump_events();
618TEST(AvmSimulationAluTest, Shl)
620 EventEmitter<AluEvent> alu_event_emitter;
621 StrictMock<MockGreaterThan>
gt;
622 StrictMock<MockFieldGreaterThan>
field_gt;
624 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
626 auto a = MemoryValue::from<uint32_t>(64);
627 auto b = MemoryValue::from<uint32_t>(2);
630 EXPECT_CALL(range_check, assert_range(64, 30)).Times(1);
631 EXPECT_CALL(range_check, assert_range(0, 2)).Times(1);
633 auto c = alu.shl(
a,
b);
635 EXPECT_EQ(c, MemoryValue::from<uint32_t>(256));
637 auto events = alu_event_emitter.dump_events();
638 EXPECT_THAT(events, ElementsAre(AluEvent{ .operation =
AluOperation::SHL, .a =
a, .b =
b, .c = c }));
641TEST(AvmSimulationAluTest, ShlOverflow)
643 EventEmitter<AluEvent> alu_event_emitter;
644 StrictMock<MockGreaterThan>
gt;
645 StrictMock<MockFieldGreaterThan>
field_gt;
647 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
649 auto a = MemoryValue::from<uint32_t>(64);
650 auto b = MemoryValue::from<uint32_t>(100);
653 EXPECT_CALL(range_check, assert_range(68, 32)).Times(1);
654 EXPECT_CALL(range_check, assert_range(0, 32)).Times(1);
656 auto c = alu.shl(
a,
b);
658 EXPECT_EQ(c, MemoryValue::from<uint32_t>(0));
660 auto events = alu_event_emitter.dump_events();
661 EXPECT_THAT(events, ElementsAre(AluEvent{ .operation =
AluOperation::SHL, .a =
a, .b =
b, .c = c }));
665TEST(AvmSimulationAluTest, ShlOverflowU128)
667 EventEmitter<AluEvent> alu_event_emitter;
668 StrictMock<MockGreaterThan>
gt;
669 StrictMock<MockFieldGreaterThan>
field_gt;
671 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
673 auto a = MemoryValue::from<uint128_t>(177);
674 auto b = MemoryValue::from<uint128_t>(129);
677 EXPECT_CALL(range_check, assert_range(1, 128)).Times(1);
678 EXPECT_CALL(range_check, assert_range(0, 128)).Times(1);
680 auto c = alu.shl(
a,
b);
682 auto events = alu_event_emitter.dump_events();
683 EXPECT_THAT(events, ElementsAre(AluEvent{ .operation =
AluOperation::SHL, .a =
a, .b =
b, .c = c }));
686TEST(AvmSimulationAluTest, NegativeShlTagMismatch)
688 EventEmitter<AluEvent> alu_event_emitter;
689 StrictMock<MockGreaterThan>
gt;
690 StrictMock<MockFieldGreaterThan>
field_gt;
692 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
694 auto a = MemoryValue::from<uint32_t>(64);
695 auto b = MemoryValue::from<uint64_t>(2);
697 EXPECT_THROW(alu.shl(
a,
b), AluException);
699 auto events = alu_event_emitter.dump_events();
708TEST(AvmSimulationAluTest, Shr)
710 EventEmitter<AluEvent> alu_event_emitter;
711 StrictMock<MockGreaterThan>
gt;
712 StrictMock<MockFieldGreaterThan>
field_gt;
714 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
716 auto a = MemoryValue::from<uint32_t>(64);
717 auto b = MemoryValue::from<uint32_t>(2);
720 EXPECT_CALL(range_check, assert_range(0, 2)).Times(1);
721 EXPECT_CALL(range_check, assert_range(16, 30)).Times(1);
723 auto c = alu.shr(
a,
b);
725 EXPECT_EQ(c, MemoryValue::from<uint32_t>(16));
727 auto events = alu_event_emitter.dump_events();
728 EXPECT_THAT(events, ElementsAre(AluEvent{ .operation =
AluOperation::SHR, .a =
a, .b =
b, .c = c }));
732TEST(AvmSimulationAluTest, ShrOverflowU128)
734 EventEmitter<AluEvent> alu_event_emitter;
735 StrictMock<MockGreaterThan>
gt;
736 StrictMock<MockFieldGreaterThan>
field_gt;
738 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
740 auto a = MemoryValue::from<uint128_t>(177);
741 auto b = MemoryValue::from<uint128_t>(129);
744 EXPECT_CALL(range_check, assert_range(1, 128)).Times(1);
745 EXPECT_CALL(range_check, assert_range(0, 128)).Times(1);
747 auto c = alu.shr(
a,
b);
749 auto events = alu_event_emitter.dump_events();
750 EXPECT_THAT(events, ElementsAre(AluEvent{ .operation =
AluOperation::SHR, .a =
a, .b =
b, .c = c }));
753TEST(AvmSimulationAluTest, ShrFFTag)
755 EventEmitter<AluEvent> alu_event_emitter;
756 StrictMock<MockGreaterThan>
gt;
757 StrictMock<MockFieldGreaterThan>
field_gt;
759 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
761 auto a = MemoryValue::from<FF>(64);
762 auto b = MemoryValue::from<FF>(2);
764 EXPECT_THROW(alu.shr(
a,
b), AluException);
766 auto events = alu_event_emitter.dump_events();
775TEST(AvmSimulationAluTest, TruncateTrivial)
777 EventEmitter<AluEvent> alu_event_emitter;
778 StrictMock<MockGreaterThan>
gt;
779 StrictMock<MockFieldGreaterThan>
field_gt;
781 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
786 auto c = MemoryValue::from<uint16_t>(8762);
789 auto events = alu_event_emitter.dump_events();
798TEST(AvmSimulationAluTest, TruncateLess128Bits)
800 EventEmitter<AluEvent> alu_event_emitter;
801 StrictMock<MockGreaterThan>
gt;
802 StrictMock<MockFieldGreaterThan>
field_gt;
804 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
806 FF a = (1 << 16) + 12222;
808 EXPECT_CALL(range_check, assert_range(1, 112)).Times(1);
811 auto c = MemoryValue::from<uint16_t>(12222);
814 auto events = alu_event_emitter.dump_events();
823TEST(AvmSimulationAluTest, TruncateGreater128Bits)
825 EventEmitter<AluEvent> alu_event_emitter;
826 StrictMock<MockGreaterThan>
gt;
827 StrictMock<MockFieldGreaterThan>
field_gt;
829 Alu alu(gt,
field_gt, range_check, alu_event_emitter);
832 U256Decomposition decomposition_a = { .lo = (
static_cast<uint128_t>(234) << 32) + 123456789, .hi = 176 };
834 EXPECT_CALL(range_check, assert_range(234, 96)).Times(1);
835 EXPECT_CALL(
field_gt, canon_dec(
a)).Times(1).WillOnce(Return(decomposition_a));
838 auto c = MemoryValue::from<uint32_t>(123456789);
842 auto events = alu_event_emitter.dump_events();
FieldGreaterThan field_gt
static TaggedValue from_tag(ValueTag tag, FF value)
uint256_t get_tag_max_value(ValueTag tag)
TEST(BoomerangMegaCircuitBuilder, BasicCircuit)
unsigned __int128 uint128_t
static constexpr uint256_t modulus