2#include <gmock/gmock.h>
3#include <gtest/gtest.h>
5#include "barretenberg/aztec/aztec_constants.hpp"
18using ::testing::Field;
23simulation::KeccakF1600Event create_standard_event_mem_slice()
25 simulation::KeccakF1600Event
event;
31 for (
size_t i = 0; i < 5; i++) {
32 for (
size_t j = 0; j < 5; j++) {
33 const uint64_t input_value = (i * 5 + j) + 1000;
34 const uint64_t output_value = (i * 5 + j) + 10000;
36 event.src_mem_values[(5 * j) + i] = MemoryValue::from<uint64_t>(input_value);
37 event.rounds[0].state[i][j] = input_value;
38 if (i == 0 && j == 0) {
39 event.rounds[AVM_KECCAKF1600_NUM_ROUNDS - 1].state_iota_00 = output_value;
41 event.rounds[AVM_KECCAKF1600_NUM_ROUNDS - 1].state_chi[i][j] = output_value;
49TEST(KeccakF1600TraceGenTest, MemorySliceReadAndWrite)
51 TestTraceContainer
trace;
52 KeccakF1600TraceBuilder
builder;
55 auto event = create_standard_event_mem_slice();
64 ASSERT_EQ(rows.size(), 2 * AVM_KECCAKF1600_STATE_SIZE + 1);
67 EXPECT_THAT(rows.at(1),
82 ROW_FIELD_EQ(keccak_memory_state_size_min_ctr_inv, (
FF(AVM_KECCAKF1600_STATE_SIZE - 1)).invert()),
86 EXPECT_THAT(rows.at(AVM_KECCAKF1600_STATE_SIZE),
88 ROW_FIELD_EQ(keccak_memory_ctr, AVM_KECCAKF1600_STATE_SIZE),
94 ROW_FIELD_EQ(keccak_memory_addr, 100 + AVM_KECCAKF1600_STATE_SIZE - 1),
96 ROW_FIELD_EQ(keccak_memory_val_0_, 1000 + AVM_KECCAKF1600_STATE_SIZE - 1),
105 EXPECT_THAT(rows.at(AVM_KECCAKF1600_STATE_SIZE + 1),
120 ROW_FIELD_EQ(keccak_memory_state_size_min_ctr_inv, (
FF(AVM_KECCAKF1600_STATE_SIZE - 1)).invert()),
124 EXPECT_THAT(rows.at(2 * AVM_KECCAKF1600_STATE_SIZE),
126 ROW_FIELD_EQ(keccak_memory_ctr, AVM_KECCAKF1600_STATE_SIZE),
132 ROW_FIELD_EQ(keccak_memory_addr, 200 + AVM_KECCAKF1600_STATE_SIZE - 1),
134 ROW_FIELD_EQ(keccak_memory_val_0_, 10000 + AVM_KECCAKF1600_STATE_SIZE - 1),
144TEST(KeccakF1600TraceGenTest, MainKeccakTraceWithSimulation)
146 TestTraceContainer
trace;
150 const uint16_t space_id = 23;
157 ASSERT_GT(rows.size(), AVM_KECCAKF1600_NUM_ROUNDS);
164 ROW_FIELD_EQ(keccakf1600_highest_slice_address, AVM_HIGHEST_MEM_ADDRESS - AVM_KECCAKF1600_STATE_SIZE + 1),
171 for (
size_t i = 1; i < AVM_KECCAKF1600_NUM_ROUNDS + 1; i++) {
172 EXPECT_THAT(rows.at(i),
189 EXPECT_THAT(rows.at(AVM_KECCAKF1600_NUM_ROUNDS),
201TEST(KeccakF1600TraceGenTest, TagErrorHandling)
203 TestTraceContainer
trace;
207 const uint16_t space_id = 79;
210 const size_t error_offset = 7;
217 ASSERT_GT(rows.size(),
std::max(
static_cast<size_t>(AVM_KECCAKF1600_NUM_ROUNDS), error_offset + 2));
220 for (
size_t i = 1; i < error_offset + 2; i++) {
221 EXPECT_THAT(rows.at(i),
231 for (
size_t i = 1; i < error_offset + 1; i++) {
232 EXPECT_THAT(rows.at(i),
240 rows.at(error_offset + 1),
242 (
FF(
static_cast<uint8_t
>(error_tag)) -
FF(
static_cast<uint8_t
>(
MemoryTag::U64))).invert()),
246 EXPECT_THAT(rows.at(error_offset + 2),
ROW_FIELD_EQ(keccak_memory_sel, 0));
251 EXPECT_THAT(rows.at(1),
266 for (
size_t i = 2; i < AVM_KECCAKF1600_NUM_ROUNDS + 1; i++) {
267 EXPECT_THAT(rows.at(i),
278TEST(KeccakF1600TraceGenTest, SrcAddressOutOfBounds)
280 TestTraceContainer
trace;
284 const uint16_t space_id = 23;
290 ASSERT_GT(rows.size(), AVM_KECCAKF1600_NUM_ROUNDS);
293 EXPECT_THAT(rows.at(1),
306 for (
size_t i = 2; i < AVM_KECCAKF1600_NUM_ROUNDS + 1; i++) {
307 EXPECT_THAT(rows.at(i),
314 EXPECT_THAT(rows.at(1),
ROW_FIELD_EQ(keccak_memory_sel, 0));
321TEST(KeccakF1600TraceGenTest, DstAddressOutOfBounds)
323 TestTraceContainer
trace;
327 const uint16_t space_id = 23;
333 ASSERT_GT(rows.size(), AVM_KECCAKF1600_NUM_ROUNDS);
336 EXPECT_THAT(rows.at(1),
349 for (
size_t i = 2; i < AVM_KECCAKF1600_NUM_ROUNDS + 1; i++) {
350 EXPECT_THAT(rows.at(i),
357 EXPECT_THAT(rows.at(1),
ROW_FIELD_EQ(keccak_memory_sel, 0));
std::vector< AvmFullRowConstRef > as_rows() const
#define ROW_FIELD_EQ(field_name, expression)
constexpr std::array< uint64_t, 24 > keccak_round_constants
void generate_keccak_trace(TestTraceContainer &trace, const std::vector< MemoryAddress > &dst_addresses, const std::vector< MemoryAddress > &src_addresses, uint16_t space_id)
void generate_keccak_trace_with_slice_error(TestTraceContainer &trace, MemoryAddress dst_address, MemoryAddress src_address, uint16_t space_id)
void generate_keccak_trace_with_tag_error(TestTraceContainer &trace, MemoryAddress dst_address, MemoryAddress src_address, size_t error_offset, MemoryTag error_tag, uint16_t space_id)
TEST(BoomerangMegaCircuitBuilder, BasicCircuit)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
simulation::PublicDataTreeReadWriteEvent event