Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
range_check_trace.test.cpp
Go to the documentation of this file.
1#include <gmock/gmock.h>
2#include <gtest/gtest.h>
3
4#include <cstdint>
5
11
12namespace bb::avm2::tracegen {
13namespace {
14
15using testing::ElementsAre;
16
17TEST(RangeCheckTraceGenTest, RangeCheckLte16Bit)
18{
19 TestTraceContainer trace;
20 RangeCheckTraceBuilder builder;
21
22 uint8_t num_bits = 7;
23 uint8_t dynamic_bits = 7;
24
25 // Choose a value that has num_bits
26 uint128_t value = (static_cast<uint128_t>(1) << num_bits) - 3;
28
29 // <= 16 bits means that the only register used is the dynamic slice
30 uint16_t dynamic_slice_register = value & 0xFFFF;
31
32 uint16_t dynamic_bits_pow_2 = static_cast<uint16_t>(1 << dynamic_bits);
33 uint16_t dynamic_diff = static_cast<uint16_t>(dynamic_bits_pow_2 - dynamic_slice_register - 1);
34
35 builder.process({ { .value = value, .num_bits = num_bits } }, trace);
36
37 EXPECT_THAT(trace.as_rows(),
38 ElementsAre(
39 // Only one row.
40 AllOf(ROW_FIELD_EQ(range_check_sel, 1),
41 ROW_FIELD_EQ(range_check_value, value_u256),
42 ROW_FIELD_EQ(range_check_rng_chk_bits, FF(num_bits)),
43 ROW_FIELD_EQ(range_check_is_lte_u16, 1),
44 ROW_FIELD_EQ(range_check_u16_r7, dynamic_slice_register),
45 ROW_FIELD_EQ(range_check_dyn_rng_chk_bits, dynamic_bits),
46 ROW_FIELD_EQ(range_check_dyn_rng_chk_pow_2, dynamic_bits_pow_2),
47 ROW_FIELD_EQ(range_check_dyn_diff, dynamic_diff))));
48}
49
50TEST(RangeCheckTraceGenTest, RangeCheckLte48Bit)
51{
52 TestTraceContainer trace;
53 RangeCheckTraceBuilder builder;
54
55 uint8_t num_bits = 34;
56 uint8_t non_dynamic_bits = 32;
57 uint8_t dynamic_bits = num_bits - non_dynamic_bits;
58
59 // Choose a value that has num_bits
60 uint128_t value = (static_cast<uint128_t>(1) << num_bits) - 3;
62
63 uint16_t u16_r0 = value & 0xFFFF;
64 uint16_t u16_r1 = (value >> 16) & 0xFFFF;
65 uint16_t dynamic_slice_register = (value >> 32) & 0xFFFF;
66
67 uint16_t dynamic_bits_pow_2 = static_cast<uint16_t>(1 << dynamic_bits);
68 uint16_t dynamic_diff = static_cast<uint16_t>(dynamic_bits_pow_2 - dynamic_slice_register - 1);
69
70 builder.process({ { .value = value, .num_bits = num_bits } }, trace);
71
72 EXPECT_THAT(trace.as_rows(),
73 ElementsAre(
74 // Only one row.
75 AllOf(ROW_FIELD_EQ(range_check_sel, 1),
76 ROW_FIELD_EQ(range_check_value, value_u256),
77 ROW_FIELD_EQ(range_check_rng_chk_bits, num_bits),
78 ROW_FIELD_EQ(range_check_is_lte_u48, 1),
79 ROW_FIELD_EQ(range_check_u16_r0, u16_r0),
80 ROW_FIELD_EQ(range_check_u16_r1, u16_r1),
81 ROW_FIELD_EQ(range_check_u16_r7, dynamic_slice_register),
82 ROW_FIELD_EQ(range_check_dyn_rng_chk_bits, dynamic_bits),
83 ROW_FIELD_EQ(range_check_dyn_rng_chk_pow_2, dynamic_bits_pow_2),
84 ROW_FIELD_EQ(range_check_dyn_diff, dynamic_diff),
85
86 ROW_FIELD_EQ(range_check_sel_r0_16_bit_rng_lookup, 1),
87 ROW_FIELD_EQ(range_check_sel_r1_16_bit_rng_lookup, 1))));
88}
89
90TEST(RangeCheckTraceGenTest, RangeCheckLte128Bit)
91{
92 TestTraceContainer trace;
93 RangeCheckTraceBuilder builder;
94
95 uint8_t num_bits = 128;
96 uint8_t non_dynamic_bits = 112;
97 uint8_t dynamic_bits = num_bits - non_dynamic_bits;
98
99 // Choose a value that has num_bits
100 uint128_t value = static_cast<uint128_t>((static_cast<uint256_t>(1) << (num_bits)) - 3);
102
103 uint16_t u16_r0 = value & 0xFFFF;
104 uint16_t u16_r1 = (value >> 16) & 0xFFFF;
105 uint16_t u16_r2 = (value >> 32) & 0xFFFF;
106 uint16_t u16_r3 = (value >> 48) & 0xFFFF;
107 uint16_t u16_r4 = (value >> 64) & 0xFFFF;
108 uint16_t u16_r5 = (value >> 80) & 0xFFFF;
109 uint16_t u16_r6 = (value >> 96) & 0xFFFF;
110 uint16_t dynamic_slice_register = (value >> 112) & 0xFFFF;
111
112 uint32_t dynamic_bits_pow_2 = static_cast<uint32_t>(1 << dynamic_bits);
113 uint16_t dynamic_diff = static_cast<uint16_t>(dynamic_bits_pow_2 - dynamic_slice_register - 1);
114
115 builder.process({ { .value = value, .num_bits = num_bits } }, trace);
116
117 EXPECT_THAT(trace.as_rows(),
118 ElementsAre(
119 // Only one row.
120 AllOf(ROW_FIELD_EQ(range_check_sel, 1),
121 ROW_FIELD_EQ(range_check_value, value_u256),
122 ROW_FIELD_EQ(range_check_rng_chk_bits, num_bits),
123 ROW_FIELD_EQ(range_check_is_lte_u128, 1),
124 ROW_FIELD_EQ(range_check_u16_r0, u16_r0),
125 ROW_FIELD_EQ(range_check_u16_r1, u16_r1),
126 ROW_FIELD_EQ(range_check_u16_r2, u16_r2),
127 ROW_FIELD_EQ(range_check_u16_r3, u16_r3),
128 ROW_FIELD_EQ(range_check_u16_r4, u16_r4),
129 ROW_FIELD_EQ(range_check_u16_r5, u16_r5),
130 ROW_FIELD_EQ(range_check_u16_r6, u16_r6),
131 ROW_FIELD_EQ(range_check_u16_r7, dynamic_slice_register),
132 ROW_FIELD_EQ(range_check_dyn_rng_chk_bits, dynamic_bits),
133 ROW_FIELD_EQ(range_check_dyn_rng_chk_pow_2, dynamic_bits_pow_2),
134 ROW_FIELD_EQ(range_check_dyn_diff, dynamic_diff),
135
136 ROW_FIELD_EQ(range_check_sel_r0_16_bit_rng_lookup, 1),
137 ROW_FIELD_EQ(range_check_sel_r1_16_bit_rng_lookup, 1),
138 ROW_FIELD_EQ(range_check_sel_r2_16_bit_rng_lookup, 1),
139 ROW_FIELD_EQ(range_check_sel_r3_16_bit_rng_lookup, 1),
140 ROW_FIELD_EQ(range_check_sel_r4_16_bit_rng_lookup, 1),
141 ROW_FIELD_EQ(range_check_sel_r5_16_bit_rng_lookup, 1),
142 ROW_FIELD_EQ(range_check_sel_r6_16_bit_rng_lookup, 1))));
143}
144} // namespace
145} // namespace bb::avm2::tracegen
void process(const simulation::EventEmitterInterface< simulation::AluEvent >::Container &events, TraceContainer &trace)
std::vector< AvmFullRowConstRef > as_rows() const
static constexpr uint256_t from_uint128(const uint128_t a) noexcept
Definition uint256.hpp:94
AluTraceBuilder builder
Definition alu.test.cpp:123
TestTraceContainer trace
#define ROW_FIELD_EQ(field_name, expression)
Definition macros.hpp:15
TEST(EmitUnencryptedLogTest, Basic)
AvmFlavorSettings::FF FF
Definition field.hpp:10
unsigned __int128 uint128_t
Definition serialize.hpp:44