1#include <gmock/gmock.h>
2#include <gtest/gtest.h>
22using tracegen::BitwiseTraceBuilder;
23using tracegen::ExecutionTraceBuilder;
24using tracegen::TestTraceContainer;
29using tracegen::PrecomputedTraceBuilder;
31TEST(BitwiseConstrainingTest, EmptyRow)
37TEST(BitwiseConstrainingTest, AndWithTracegen)
39 TestTraceContainer
trace;
47 .a = MemoryValue::from<uint8_t>(85),
48 .b = MemoryValue::from<uint8_t>(175),
51 .a = MemoryValue::from<uint16_t>(5323),
52 .b = MemoryValue::from<uint16_t>(321),
55 .a = MemoryValue::from<uint32_t>(13793),
56 .b = MemoryValue::from<uint32_t>(10590617),
59 .a = MemoryValue::from<uint64_t>(0x7bff744e3cdf79LLU),
60 .b = MemoryValue::from<uint64_t>(0x14ccccccccb6LLU),
61 .res = 0x14444c0ccc30LLU },
63 .a = MemoryValue::from<uint128_t>((
uint128_t{ 0xb900000000000001 } << 64)),
64 .b = MemoryValue::from<uint128_t>((
uint128_t{ 0x1006021301080000 } << 64) +
65 uint128_t{ 0x000000000000001080876844827 }),
66 .res =
uint128_t{ 0x1000000000000000 } << 64 }
72 check_relation<bitwise>(
trace);
76TEST(BitwiseConstrainingTest, OrWithTracegen)
78 TestTraceContainer
trace;
86 .a = MemoryValue::from<uint8_t>(128),
87 .b = MemoryValue::from<uint8_t>(127),
90 .a = MemoryValue::from<uint16_t>(5323),
91 .b = MemoryValue::from<uint16_t>(321),
94 .a = MemoryValue::from<uint32_t>(13793),
95 .b = MemoryValue::from<uint32_t>(10590617),
98 .a = MemoryValue::from<uint64_t>(0x7bff744e3cdf79LLU),
99 .b = MemoryValue::from<uint64_t>(0x14ccccccccb6LLU),
100 .res = 0x7bfffccefcdfffLLU },
102 .a = MemoryValue::from<uint128_t>((
uint128_t{ 0xb900000000000000 } << 64)),
103 .b = MemoryValue::from<uint128_t>((
uint128_t{ 0x1006021301080000 } << 64) +
104 uint128_t{ 0x000000000000001080876844827 }),
111 check_relation<bitwise>(
trace);
115TEST(BitwiseConstrainingTest, XorWithTracegen)
117 TestTraceContainer
trace;
126 .a = MemoryValue::from<uint8_t>(85),
127 .b = MemoryValue::from<uint8_t>(175),
130 .a = MemoryValue::from<uint16_t>(5323),
131 .b = MemoryValue::from<uint16_t>(321),
134 .a = MemoryValue::from<uint32_t>(13793),
135 .b = MemoryValue::from<uint32_t>(10590617),
138 .a = MemoryValue::from<uint64_t>(0x7bff744e3cdf79LLU),
139 .b = MemoryValue::from<uint64_t>(0x14ccccccccb6LLU),
140 .res = 0x7bebb882f013cfLLU },
142 .a = MemoryValue::from<uint128_t>((
uint128_t{ 0xb900000000000001 } << 64)),
143 .b = MemoryValue::from<uint128_t>((
uint128_t{ 0x1006021301080000 } << 64) +
144 uint128_t{ 0x000000000000001080876844827 }),
151 check_relation<bitwise>(
trace);
154TEST(BitwiseConstrainingTest, MixedOperationsWithTracegen)
156 TestTraceContainer
trace;
164 .a = MemoryValue::from<uint32_t>(13793),
165 .b = MemoryValue::from<uint32_t>(10590617),
168 .a = MemoryValue::from<uint16_t>(5323),
169 .b = MemoryValue::from<uint16_t>(321),
172 .a = MemoryValue::from<uint32_t>(13793),
173 .b = MemoryValue::from<uint32_t>(10590617),
176 .a = MemoryValue::from<uint8_t>(85),
177 .b = MemoryValue::from<uint8_t>(175),
180 .a = MemoryValue::from<uint8_t>(85),
181 .b = MemoryValue::from<uint8_t>(175),
188 check_relation<bitwise>(
trace);
191TEST(BitwiseConstrainingTest, NegativeWrongInit)
193 TestTraceContainer
trace({
195 { C::bitwise_ia_byte, 25 },
196 { C::bitwise_ib_byte, 25 },
197 { C::bitwise_ic_byte, 25 },
198 { C::bitwise_last, 1 },
199 { C::bitwise_acc_ia, 25 },
200 { C::bitwise_acc_ib, 25 },
201 { C::bitwise_acc_ic, 25 },
207 trace.
set(C::bitwise_ia_byte, 0, 24);
208 trace.
set(C::bitwise_ib_byte, 0, 27);
209 trace.
set(C::bitwise_ic_byte, 0, 28);
216TEST(BitwiseConstrainingTest, NegativeTruncateCtr)
218 TestTraceContainer
trace({
220 { C::bitwise_sel, 1 },
221 { C::bitwise_ctr, 4 },
224 { C::bitwise_sel, 1 },
225 { C::bitwise_ctr, 3 },
228 { C::bitwise_sel, 1 },
229 { C::bitwise_ctr, 2 },
232 { C::bitwise_last, 1 },
233 { C::bitwise_sel, 1 },
234 { C::bitwise_ctr, 1 },
248TEST(BitwiseConstrainingTest, NegativeGapCtr)
250 TestTraceContainer
trace({
252 { C::bitwise_sel, 1 },
253 { C::bitwise_ctr, 4 },
256 { C::bitwise_last, 1 },
257 { C::bitwise_sel, 1 },
258 { C::bitwise_ctr, 3 },
267TEST(BitwiseConstrainingTest, NegativeLastSetBeforeEnd)
269 TestTraceContainer
trace({
271 { C::bitwise_ctr_min_one_inv,
FF(7).invert() },
272 { C::bitwise_sel, 1 },
273 { C::bitwise_ctr, 8 },
276 { C::bitwise_ctr_min_one_inv,
FF(6).invert() },
277 { C::bitwise_sel, 1 },
278 { C::bitwise_ctr, 7 },
282 { C::bitwise_ctr_min_one_inv,
FF(5).invert() },
283 { C::bitwise_sel, 1 },
284 { C::bitwise_ctr, 6 },
291 "BITW_LAST_FOR_CTR_ONE");
294TEST(BitwiseConstrainingTest, NegativeDeactivateRow)
296 TestTraceContainer
trace({
298 { C::bitwise_ctr_inv,
FF(8).invert() },
299 { C::bitwise_sel, 1 },
300 { C::bitwise_ctr, 8 },
303 { C::bitwise_ctr_inv,
FF(7).invert() },
304 { C::bitwise_sel, 1 },
305 { C::bitwise_ctr, 7 },
308 { C::bitwise_ctr_inv,
FF(6).invert() },
309 { C::bitwise_sel, 1 },
310 { C::bitwise_ctr, 6 },
317 "BITW_SEL_CTR_NON_ZERO");
320TEST(BitwiseConstrainingTest, NegativeChangeOpIDBeforeEnd)
322 TestTraceContainer
trace({
330 { C::bitwise_last, 1 },
340TEST(BitwiseConstrainingTest, NegativeWrongAccumulation)
342 TestTraceContainer
trace({
344 { C::bitwise_ia_byte, 0x11 },
345 { C::bitwise_ib_byte, 0x22 },
346 { C::bitwise_ic_byte, 0x33 },
347 { C::bitwise_acc_ia, 0xaa11 },
348 { C::bitwise_acc_ib, 0xbb22 },
349 { C::bitwise_acc_ic, 0xcc33 },
352 { C::bitwise_last, 1 },
353 { C::bitwise_acc_ia, 0xaa },
354 { C::bitwise_acc_ib, 0xbb },
355 { C::bitwise_acc_ic, 0xcc },
361 trace.
set(C::bitwise_acc_ia, 0, 0xaa1f);
362 trace.
set(C::bitwise_acc_ib, 0, 0xbb2f);
363 trace.
set(C::bitwise_acc_ic, 0, 0xcc3f);
370TEST(BitwiseConstrainingTest, MixedOperationsInteractions)
372 TestTraceContainer
trace;
381 .a = MemoryValue::from<uint32_t>(13793),
382 .b = MemoryValue::from<uint32_t>(10590617),
385 .a = MemoryValue::from<uint16_t>(5323),
386 .b = MemoryValue::from<uint16_t>(321),
389 .a = MemoryValue::from<uint32_t>(13793),
390 .b = MemoryValue::from<uint32_t>(10590617),
393 .a = MemoryValue::from<uint8_t>(85),
394 .b = MemoryValue::from<uint8_t>(175),
397 .a = MemoryValue::from<uint8_t>(85),
398 .b = MemoryValue::from<uint8_t>(175),
408 check_all_interactions<BitwiseTraceBuilder>(
trace);
409 check_relation<bitwise>(
trace);
412TEST(BitwiseConstrainingTest, BitwiseExecInteraction)
414 TestTraceContainer
trace({ {
416 { C::bitwise_err, 1 },
417 { C::bitwise_sel, 1 },
418 { C::bitwise_tag_a,
static_cast<uint8_t
>(
ValueTag::FF) },
419 { C::bitwise_tag_b,
static_cast<uint8_t
>(
ValueTag::U8) },
420 { C::bitwise_acc_ia, 0x01 },
421 { C::bitwise_tag_c,
static_cast<uint8_t
>(
ValueTag::U8) },
422 { C::bitwise_acc_ib, 0x01 },
423 { C::bitwise_acc_ic, 0x00 },
425 { C::execution_mem_tag_reg_0_,
static_cast<uint8_t
>(
ValueTag::FF) },
426 { C::execution_mem_tag_reg_1_,
static_cast<uint8_t
>(
ValueTag::U8) },
428 { C::execution_mem_tag_reg_2_,
static_cast<uint8_t
>(
ValueTag::U8) },
429 { C::execution_register_0_, 0x01 },
430 { C::execution_register_1_, 0x01 },
431 { C::execution_register_2_, 0x00 },
432 { C::execution_sel_exec_dispatch_bitwise, 1 },
433 { C::execution_sel_opcode_error, 1 },
437 check_interaction<ExecutionTraceBuilder, lookup_execution_dispatch_to_bitwise_settings>(
trace);
440TEST(BitwiseConstrainingTest, InvalidBitwiseExecInteraction)
442 TestTraceContainer
trace({ {
444 { C::bitwise_sel, 1 },
445 { C::bitwise_acc_ib, 0x01 },
446 { C::bitwise_acc_ia, 0x01 },
447 { C::bitwise_tag_a,
static_cast<uint8_t
>(
ValueTag::U8) },
448 { C::bitwise_tag_b,
static_cast<uint8_t
>(
ValueTag::U8) },
449 { C::bitwise_acc_ic, 0x00 },
450 { C::bitwise_tag_c,
static_cast<uint8_t
>(
ValueTag::U8) },
454 { C::execution_mem_tag_reg_0_,
static_cast<uint8_t
>(
ValueTag::U8) },
455 { C::execution_mem_tag_reg_1_,
static_cast<uint8_t
>(
ValueTag::U16) },
456 { C::execution_mem_tag_reg_2_,
static_cast<uint8_t
>(
ValueTag::U8) },
457 { C::execution_register_0_, 0x01 },
458 { C::execution_register_1_, 0x01 },
459 { C::execution_register_2_, 0x00 },
460 { C::execution_sel_exec_dispatch_bitwise, 1 },
465 (check_interaction<ExecutionTraceBuilder, lookup_execution_dispatch_to_bitwise_settings>(
trace)),
466 "Failed.*EXECUTION_DISPATCH_TO_BITWISE. Could not find tuple in destination.");
469TEST(BitwiseConstrainingTest, ErrorHandlingInputFF)
471 TestTraceContainer
trace;
485 check_relation<bitwise>(
trace);
488TEST(BitwiseConstrainingTest, ErrorHandlingInputTagMismatch)
490 TestTraceContainer
trace;
501 check_relation<bitwise>(
trace);
502 check_all_interactions<BitwiseTraceBuilder>(
trace);
505TEST(BitwiseConstrainingTest, ErrorHandlingMultiple)
507 TestTraceContainer
trace;
518 check_relation<bitwise>(
trace);
static TaggedValue from(T value)
static TaggedValue from_tag(ValueTag tag, FF value)
static constexpr size_t SR_BITW_CTR_DECREMENT
static constexpr size_t SR_BITW_LAST_FOR_CTR_ONE
static constexpr size_t SR_BITW_OP_ID_REL
static constexpr size_t SR_BITW_ACC_REL_C
static constexpr size_t SR_BITW_ACC_REL_B
static constexpr size_t SR_BITW_ACC_REL_A
static constexpr size_t SR_BITW_INIT_C
static constexpr size_t SR_BITW_INIT_B
static constexpr size_t SR_BITW_INIT_A
static constexpr size_t SR_BITW_SEL_CTR_NON_ZERO
void process(const simulation::EventEmitterInterface< simulation::AluEvent >::Container &events, TraceContainer &trace)
void process_bitwise(TraceContainer &trace)
void process_misc(TraceContainer &trace, const uint32_t num_rows=MAX_AVM_TRACE_SIZE)
void process_tag_parameters(TraceContainer &trace)
uint32_t get_num_rows() const
void set(Column col, uint32_t row, const FF &value)
PrecomputedTraceBuilder precomputed_builder
#define EXPECT_THROW_WITH_MESSAGE(code, expectedMessage)
TEST(TxExecutionConstrainingTest, WriteTreeValue)
TestTraceContainer empty_trace()
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
unsigned __int128 uint128_t