Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
bitwise_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
10
11namespace bb::avm2::tracegen {
12namespace {
13
14using testing::ElementsAre;
15
16TEST(BitwiseTraceGenTest, U1And)
17{
18 TestTraceContainer trace;
19 BitwiseTraceBuilder builder;
20
22 {
23 {
24 .operation = BitwiseOperation::AND,
25 .a = MemoryValue::from(uint1_t(0)),
26 .b = MemoryValue::from(uint1_t(1)),
27 .res = 0,
28 },
29 },
30 trace);
31
32 EXPECT_EQ(trace.as_rows().size(), 1);
33
34 EXPECT_THAT(trace.as_rows()[0],
35 AllOf(ROW_FIELD_EQ(bitwise_op_id, static_cast<uint8_t>(BitwiseOperation::AND)),
36 ROW_FIELD_EQ(bitwise_sel, 1),
37 ROW_FIELD_EQ(bitwise_sel_compute, 1),
38 ROW_FIELD_EQ(bitwise_sel_and, 1),
39 ROW_FIELD_EQ(bitwise_sel_u16, 0),
40 ROW_FIELD_EQ(bitwise_tag_byte_len, 1),
41 ROW_FIELD_EQ(bitwise_ia, 0),
42 ROW_FIELD_EQ(bitwise_ib, 1),
43 ROW_FIELD_EQ(bitwise_ic, 0),
44 ROW_FIELD_EQ(bitwise_ia_byte_0_, 0),
45 ROW_FIELD_EQ(bitwise_ib_byte_0_, 1),
46 ROW_FIELD_EQ(bitwise_output_and_0_, 0), // IC_BYTE_0 = output_and_0 = 0
47 ROW_FIELD_EQ(bitwise_tag_a, static_cast<int>(MemoryTag::U1)),
48 ROW_FIELD_EQ(bitwise_tag_b, static_cast<int>(MemoryTag::U1)),
49 ROW_FIELD_EQ(bitwise_tag_c, static_cast<int>(MemoryTag::U1))));
50}
51
52TEST(BitwiseTraceGenTest, U32And)
53{
54 TestTraceContainer trace;
55 BitwiseTraceBuilder builder;
56
58 {
59 {
60 .operation = BitwiseOperation::AND,
61 .a = MemoryValue::from<uint32_t>(0x52488425),
62 .b = MemoryValue::from<uint32_t>(0xC684486C),
63 .res = 0x42000024,
64 },
65 },
66 trace);
67
68 EXPECT_EQ(trace.as_rows().size(), 1);
69
70 EXPECT_THAT(trace.as_rows()[0],
71 AllOf(ROW_FIELD_EQ(bitwise_op_id, static_cast<uint8_t>(BitwiseOperation::AND)),
72 ROW_FIELD_EQ(bitwise_sel, 1),
73 ROW_FIELD_EQ(bitwise_sel_compute, 1),
74 ROW_FIELD_EQ(bitwise_sel_and, 1),
75 ROW_FIELD_EQ(bitwise_sel_u16, 1),
76 ROW_FIELD_EQ(bitwise_sel_u32, 1),
77 ROW_FIELD_EQ(bitwise_sel_u64, 0),
78 ROW_FIELD_EQ(bitwise_sel_u128, 0),
79 ROW_FIELD_EQ(bitwise_tag_byte_len, 4),
80 ROW_FIELD_EQ(bitwise_ia, 0x52488425),
81 ROW_FIELD_EQ(bitwise_ib, 0xC684486C),
82 ROW_FIELD_EQ(bitwise_ic, 0x42000024),
83 // Little-endian byte limbs of a, b and c.
84 ROW_FIELD_EQ(bitwise_ia_byte_0_, 0x25),
85 ROW_FIELD_EQ(bitwise_ia_byte_1_, 0x84),
86 ROW_FIELD_EQ(bitwise_ia_byte_2_, 0x48),
87 ROW_FIELD_EQ(bitwise_ia_byte_3_, 0x52),
88 ROW_FIELD_EQ(bitwise_ib_byte_0_, 0x6C),
89 ROW_FIELD_EQ(bitwise_ib_byte_1_, 0x48),
90 ROW_FIELD_EQ(bitwise_ib_byte_2_, 0x84),
91 ROW_FIELD_EQ(bitwise_ib_byte_3_, 0xC6),
92 // Per-limb AND outputs (IC_BYTE_i = output_and_i for an AND op).
93 ROW_FIELD_EQ(bitwise_output_and_0_, 0x24),
94 ROW_FIELD_EQ(bitwise_output_and_1_, 0x00),
95 ROW_FIELD_EQ(bitwise_output_and_2_, 0x00),
96 ROW_FIELD_EQ(bitwise_output_and_3_, 0x42),
97 // Inactive high-order limbs stay zero.
98 ROW_FIELD_EQ(bitwise_ia_byte_4_, 0),
99 ROW_FIELD_EQ(bitwise_output_and_15_, 0),
100 ROW_FIELD_EQ(bitwise_tag_a, static_cast<int>(MemoryTag::U32)),
101 ROW_FIELD_EQ(bitwise_tag_b, static_cast<int>(MemoryTag::U32)),
102 ROW_FIELD_EQ(bitwise_tag_c, static_cast<int>(MemoryTag::U32))));
103}
104
105TEST(BitwiseTraceGenTest, ErrorInputFF)
106{
107 TestTraceContainer trace;
108 BitwiseTraceBuilder builder;
109
111 { .operation = BitwiseOperation::AND,
114 .res = 0 },
115 };
116 builder.process(events, trace);
117
118 EXPECT_EQ(trace.as_rows().size(), 1);
119 EXPECT_THAT(trace.as_rows()[0],
120 AllOf(ROW_FIELD_EQ(bitwise_op_id, static_cast<uint8_t>(BitwiseOperation::AND)),
121 ROW_FIELD_EQ(bitwise_sel, 1),
122 ROW_FIELD_EQ(bitwise_sel_compute, 0),
123 ROW_FIELD_EQ(bitwise_ia, 1),
124 ROW_FIELD_EQ(bitwise_ib, 1),
125 ROW_FIELD_EQ(bitwise_ic, 0),
126 ROW_FIELD_EQ(bitwise_tag_a, static_cast<int>(MemoryTag::FF)),
127 ROW_FIELD_EQ(bitwise_tag_b, static_cast<int>(MemoryTag::FF)),
128 ROW_FIELD_EQ(bitwise_tag_c, static_cast<int>(MemoryTag::FF)),
129 ROW_FIELD_EQ(bitwise_sel_tag_ff_err, 1),
130 ROW_FIELD_EQ(bitwise_sel_tag_mismatch_err, 0),
131 ROW_FIELD_EQ(bitwise_err, 1),
132 ROW_FIELD_EQ(bitwise_tag_a_inv, 0)));
133}
134
135TEST(BitwiseTraceGenTest, ErrorTagMismatch)
136{
137 TestTraceContainer trace;
138 BitwiseTraceBuilder builder;
139
141 { .operation = BitwiseOperation::AND,
144 .res = 0 },
145 };
146 builder.process(events, trace);
147
148 EXPECT_EQ(trace.as_rows().size(), 1);
149
150 EXPECT_THAT(
151 trace.as_rows()[0],
152 AllOf(ROW_FIELD_EQ(bitwise_op_id, static_cast<uint8_t>(BitwiseOperation::AND)),
153 ROW_FIELD_EQ(bitwise_sel, 1),
154 ROW_FIELD_EQ(bitwise_sel_compute, 0),
155 ROW_FIELD_EQ(bitwise_ia, 1),
156 ROW_FIELD_EQ(bitwise_ib, 1),
157 ROW_FIELD_EQ(bitwise_ic, 0),
158 ROW_FIELD_EQ(bitwise_tag_a, static_cast<int>(MemoryTag::U8)),
159 ROW_FIELD_EQ(bitwise_tag_b, static_cast<int>(MemoryTag::U16)),
160 ROW_FIELD_EQ(bitwise_tag_c, static_cast<int>(MemoryTag::FF)),
161 // Err Flags
162 ROW_FIELD_EQ(bitwise_sel_tag_ff_err, 0),
163 ROW_FIELD_EQ(bitwise_sel_tag_mismatch_err, 1),
164 ROW_FIELD_EQ(bitwise_err, 1),
165 ROW_FIELD_EQ(bitwise_tag_ab_diff_inv,
166 FF(static_cast<uint8_t>(MemoryTag::U8) - static_cast<uint8_t>(MemoryTag::U16)).invert())));
167}
168
169TEST(BitwiseTraceGenTest, ErrorFFAndTagMismatch)
170{
171 TestTraceContainer trace;
172 BitwiseTraceBuilder builder;
173
175 { .operation = BitwiseOperation::AND,
178 .res = 0 },
179 };
180 builder.process(events, trace);
181
182 EXPECT_EQ(trace.as_rows().size(), 1);
183
184 EXPECT_THAT(
185 trace.as_rows()[0],
186 AllOf(ROW_FIELD_EQ(bitwise_op_id, static_cast<uint8_t>(BitwiseOperation::AND)),
187 ROW_FIELD_EQ(bitwise_sel, 1),
188 ROW_FIELD_EQ(bitwise_sel_compute, 0),
189 ROW_FIELD_EQ(bitwise_ia, 1),
190 ROW_FIELD_EQ(bitwise_ib, 1),
191 ROW_FIELD_EQ(bitwise_ic, 0),
192 ROW_FIELD_EQ(bitwise_tag_a, static_cast<int>(MemoryTag::FF)),
193 ROW_FIELD_EQ(bitwise_tag_b, static_cast<int>(MemoryTag::U16)),
194 ROW_FIELD_EQ(bitwise_tag_c, static_cast<int>(MemoryTag::FF)),
195 // Err Flags
196 ROW_FIELD_EQ(bitwise_sel_tag_ff_err, 1),
197 ROW_FIELD_EQ(bitwise_sel_tag_mismatch_err, 1),
198 ROW_FIELD_EQ(bitwise_err, 1),
199 ROW_FIELD_EQ(bitwise_tag_a_inv, 0),
201 bitwise_tag_ab_diff_inv,
202 (FF(static_cast<uint8_t>(MemoryTag::FF)) - FF(static_cast<uint8_t>(MemoryTag::U16))).invert())));
203}
204
205} // namespace
206} // namespace bb::avm2::tracegen
static TaggedValue from(T value)
static TaggedValue from_tag(ValueTag tag, FF value)
void process(const simulation::EventEmitterInterface< simulation::AluEvent >::Container &events, TraceContainer &trace)
Process the ALU events and populate the ALU relevant columns in the trace.
std::vector< AvmFullRowConstRef > as_rows() const
AluTraceBuilder builder
Definition alu.test.cpp:124
TestTraceContainer trace
#define ROW_FIELD_EQ(field_name, expression)
Definition macros.hpp:7
AvmFlavorSettings::FF FF
Definition field.hpp:10
TEST(BoomerangMegaCircuitBuilder, BasicCircuit)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13