1#include <gmock/gmock.h>
2#include <gtest/gtest.h>
18using tracegen::RangeCheckTraceBuilder;
19using tracegen::TestTraceContainer;
24TEST(RangeCheckConstrainingTest, EmptyRow)
29TEST(RangeCheckConstrainingTest, IsLteMutuallyExclusive)
31 TestTraceContainer
trace({
32 { { C::range_check_sel, 1 }, { C::range_check_is_lte_u32, 1 } },
38TEST(RangeCheckConstrainingTest, NegativeIsLteMutuallyExclusive)
40 TestTraceContainer
trace({
42 { { C::range_check_sel, 1 }, { C::range_check_is_lte_u32, 1 }, { C::range_check_is_lte_u112, 1 } },
46 "IS_LTE_MUTUALLY_EXCLUSIVE");
49TEST(RangeCheckConstrainingTest, CheckRecomposition)
54 uint16_t u16_r0 = 0xFFFD;
55 uint16_t u16_r1 = 0xFFFF;
56 uint16_t dynamic_slice_register = 0x0003;
58 TestTraceContainer
trace({ {
59 { C::range_check_sel, 1 },
60 { C::range_check_value, value_u256 },
61 { C::range_check_is_lte_u48, 1 },
62 { C::range_check_u16_r0, u16_r0 },
63 { C::range_check_u16_r1, u16_r1 },
64 { C::range_check_u16_r7, dynamic_slice_register },
70TEST(RangeCheckConstrainingTest, NegativeCheckRecomposition)
76 uint16_t u16_r0 =
value & 0xFFFF;
77 uint16_t u16_r1 = (
value >> 16) & 0xFFFF;
78 uint16_t dynamic_slice_register = (
value >> 32) & 0xFFFF;
80 TestTraceContainer
trace({ {
81 { C::range_check_sel, 1 },
82 { C::range_check_value, bad_value },
83 { C::range_check_is_lte_u48, 1 },
84 { C::range_check_u16_r0, u16_r0 },
85 { C::range_check_u16_r1, u16_r1 },
86 { C::range_check_u16_r7, dynamic_slice_register },
90 "CHECK_RECOMPOSITION");
93TEST(RangeCheckConstrainingTest, Full)
95 uint8_t num_bits = 34;
96 uint8_t non_dynamic_bits = 32;
97 uint8_t dynamic_bits = num_bits - non_dynamic_bits;
103 uint16_t u16_r0 =
value & 0xFFFF;
104 uint16_t u16_r1 = (
value >> 16) & 0xFFFF;
105 uint16_t dynamic_slice_register = (
value >> 32) & 0xFFFF;
107 uint16_t dynamic_bits_pow_2 =
static_cast<uint16_t
>(1 << dynamic_bits);
108 uint16_t dynamic_diff =
static_cast<uint16_t
>(dynamic_bits_pow_2 - dynamic_slice_register - 1);
110 TestTraceContainer
trace({ {
111 { C::range_check_sel, 1 },
112 { C::range_check_value, value_u256 },
113 { C::range_check_rng_chk_bits, num_bits },
114 { C::range_check_is_lte_u48, 1 },
115 { C::range_check_u16_r0, u16_r0 },
116 { C::range_check_u16_r1, u16_r1 },
117 { C::range_check_u16_r7, dynamic_slice_register },
118 { C::range_check_dyn_rng_chk_bits, dynamic_bits },
119 { C::range_check_dyn_rng_chk_pow_2, dynamic_bits_pow_2 },
120 { C::range_check_dyn_diff, dynamic_diff },
122 { C::range_check_sel_r0_16_bit_rng_lookup, 1 },
123 { C::range_check_sel_r1_16_bit_rng_lookup, 1 },
126 check_relation<range_check>(trace);
129TEST(RangeCheckConstrainingTest, NegativeMissingLookup)
131 uint8_t num_bits = 34;
132 uint8_t non_dynamic_bits = 32;
133 uint8_t dynamic_bits = num_bits - non_dynamic_bits;
139 uint16_t u16_r0 =
value & 0xFFFF;
140 uint16_t u16_r1 = (
value >> 16) & 0xFFFF;
141 uint16_t dynamic_slice_register = (
value >> 32) & 0xFFFF;
143 uint16_t dynamic_bits_pow_2 =
static_cast<uint16_t
>(1 << dynamic_bits);
144 uint16_t dynamic_diff =
static_cast<uint16_t
>(dynamic_bits_pow_2 - dynamic_slice_register - 1);
146 TestTraceContainer
trace({ {
147 { C::range_check_sel, 1 },
148 { C::range_check_value, value_u256 },
149 { C::range_check_rng_chk_bits, num_bits },
150 { C::range_check_is_lte_u48, 1 },
151 { C::range_check_u16_r0, u16_r0 },
152 { C::range_check_u16_r1, u16_r1 },
153 { C::range_check_u16_r7, dynamic_slice_register },
154 { C::range_check_dyn_rng_chk_bits, dynamic_bits },
155 { C::range_check_dyn_rng_chk_pow_2, dynamic_bits_pow_2 },
156 { C::range_check_dyn_diff, dynamic_diff },
158 { C::range_check_sel_r0_16_bit_rng_lookup, 1 },
159 { C::range_check_sel_r1_16_bit_rng_lookup, 0 },
165TEST(RangeCheckConstrainingTest, WithTracegen)
167 TestTraceContainer
trace;
168 RangeCheckTraceBuilder
builder;
172 { .value = 0, .num_bits = 0 },
173 { .value = 0, .num_bits = 1 },
174 { .value = 0, .num_bits = 16 },
175 { .value = 2, .num_bits = 2 },
176 { .value = 255, .num_bits = 8 },
177 { .value = 1 << 16, .num_bits = 17 },
178 { .value = 1 << 18, .num_bits = 32 },
179 { .value =
static_cast<uint128_t>(1) << 66, .num_bits = 67 },
180 { .value = 1024, .num_bits = 109 },
181 { .value = 1, .num_bits = 128 },
182 { .value = 0xFFFFFFFFFFFFFFFF, .num_bits = 128 },
183 { .value = 0x1FFF, .num_bits = 13 },
187 check_relation<range_check>(trace);
190TEST(RangeCheckConstrainingTest, NegativeWithTracegen)
192 TestTraceContainer
trace;
193 RangeCheckTraceBuilder
builder;
197 { .value = 1, .num_bits = 0 },
198 { .value = 2, .num_bits = 1 },
199 { .value = 255, .num_bits = 7 },
200 { .value = 1 << 16, .num_bits = 16 },
201 { .value = 1 << 18, .num_bits = 18 },
202 { .value =
static_cast<uint128_t>(1) << 66, .num_bits = 66 },
203 { .value = 1024, .num_bits = 9 },
204 { .value = 1, .num_bits = 0 },
205 { .value = 0xFFFFFFFFFFFFFFFF, .num_bits = 127 },
206 { .value = 0x1FFF, .num_bits = 12 },
#define EXPECT_THROW_WITH_MESSAGE(code, expectedMessageRegex)
static constexpr size_t SR_IS_LTE_MUTUALLY_EXCLUSIVE
static constexpr size_t SR_CHECK_RECOMPOSITION
void process(const simulation::EventEmitterInterface< simulation::AluEvent >::Container &events, TraceContainer &trace)
Process the ALU events and populate the ALU relevant columns in the trace.
TEST(AvmFixedVKTests, FixedVKCommitments)
Test that the fixed VK commitments agree with the ones computed from precomputed columns.
TestTraceContainer empty_trace()
unsigned __int128 uint128_t