1#include <gmock/gmock.h>
2#include <gtest/gtest.h>
41using ::testing::Return;
42using ::testing::StrictMock;
44using simulation::Bitwise;
45using simulation::BitwiseEvent;
46using simulation::DeduplicatingEventEmitter;
47using simulation::EventEmitter;
48using simulation::FieldGreaterThan;
49using simulation::FieldGreaterThanEvent;
50using simulation::GreaterThan;
51using simulation::GreaterThanEvent;
52using simulation::MemoryStore;
53using simulation::MockExecutionIdManager;
54using simulation::PureBitwise;
55using simulation::PureGreaterThan;
56using simulation::RangeCheck;
57using simulation::RangeCheckEvent;
58using simulation::Sha256;
59using simulation::Sha256CompressionEvent;
61using tracegen::BitwiseTraceBuilder;
62using tracegen::GreaterThanTraceBuilder;
63using tracegen::PrecomputedTraceBuilder;
64using tracegen::RangeCheckTraceBuilder;
65using tracegen::Sha256TraceBuilder;
66using tracegen::TestTraceContainer;
73TEST(Sha256ConstrainingTest, EmptyRow)
82TEST(Sha256ConstrainingTest, Basic)
92 EventEmitter<Sha256CompressionEvent> sha256_event_emitter;
95 std::array<uint32_t, 8> state = { 0, 1, 2, 3, 4, 5, 6, 7 };
97 for (uint32_t i = 0; i < 8; ++i) {
98 mem.
set(state_addr + i, MemoryValue::from<uint32_t>(state[i]));
101 std::array<uint32_t, 16> input = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
103 for (uint32_t i = 0; i < 16; ++i) {
104 mem.
set(input_addr + i, MemoryValue::from<uint32_t>(input[i]));
109 sha256_gadget.compression(
mem, state_addr, input_addr, output_addr);
110 sha256_gadget.compression(
mem, state_addr, input_addr, output_addr);
111 TestTraceContainer
trace;
112 trace.
set(C::precomputed_first_row, 0, 1);
114 const auto sha256_event_container = sha256_event_emitter.dump_events();
117 check_relation<sha256>(trace);
120TEST(Sha256ConstrainingTest, Interaction)
136 EventEmitter<Sha256CompressionEvent> sha256_event_emitter;
139 std::array<uint32_t, 8> state = { 0, 1, 2, 3, 4, 5, 6, 7 };
141 for (uint32_t i = 0; i < 8; ++i) {
142 mem.
set(state_addr + i, MemoryValue::from<uint32_t>(state[i]));
145 std::array<uint32_t, 16> input = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
147 for (uint32_t i = 0; i < 16; ++i) {
148 mem.
set(input_addr + i, MemoryValue::from<uint32_t>(input[i]));
152 sha256_gadget.compression(
mem, state_addr, input_addr, output_addr);
154 TestTraceContainer
trace;
161 BitwiseTraceBuilder bitwise_builder;
218 check_relation<sha256>(trace);
225TEST(Sha256MemoryConstrainingTest, Basic)
240 EventEmitter<Sha256CompressionEvent> sha256_event_emitter;
243 std::array<uint32_t, 8> state = { 0, 1, 2, 3, 4, 5, 6, 7 };
245 for (uint32_t i = 0; i < 8; ++i) {
246 mem.
set(state_addr + i, MemoryValue::from<uint32_t>(state[i]));
249 std::array<uint32_t, 16> input = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
251 for (uint32_t i = 0; i < 16; ++i) {
252 mem.
set(input_addr + i, MemoryValue::from<uint32_t>(input[i]));
257 sha256_gadget.compression(
mem, state_addr, input_addr, output_addr);
258 sha256_gadget.compression(
mem, state_addr, input_addr, output_addr);
259 TestTraceContainer
trace;
260 trace.
set(C::precomputed_first_row, 0, 1);
263 const auto sha256_event_container = sha256_event_emitter.dump_events();
268 check_relation<sha256_mem>(trace);
269 check_relation<sha256>(trace);
276TEST(Sha256MemoryConstrainingTest, SimpleOutOfRangeMemoryAddresses)
291 EventEmitter<Sha256CompressionEvent> sha256_event_emitter;
299 ".*Memory address out of range.*");
300 TestTraceContainer
trace;
301 trace.
set(C::precomputed_first_row, 0, 1);
304 const auto sha256_event_container = sha256_event_emitter.dump_events();
309 check_relation<sha256_mem>(trace);
310 check_relation<sha256>(trace);
317TEST(Sha256MemoryConstrainingTest, MultiOutOfRangeMemoryAddresses)
332 EventEmitter<Sha256CompressionEvent> sha256_event_emitter;
340 ".*Memory address out of range.*");
341 TestTraceContainer
trace;
342 trace.
set(C::precomputed_first_row, 0, 1);
345 const auto sha256_event_container = sha256_event_emitter.dump_events();
350 check_relation<sha256_mem>(trace);
351 check_relation<sha256>(trace);
358TEST(Sha256MemoryConstrainingTest, InvalidStateTagErr)
373 EventEmitter<Sha256CompressionEvent> sha256_event_emitter;
378 for (uint32_t i = 0; i < 7; ++i) {
379 mem.
set(state_addr + i, MemoryValue::from<uint32_t>(state[i]));
382 mem.
set(state_addr + 7, MemoryValue::from<uint64_t>(7));
388 ".*Invalid tag for sha256 state values.*");
389 TestTraceContainer
trace;
390 trace.
set(C::precomputed_first_row, 0, 1);
393 const auto sha256_event_container = sha256_event_emitter.dump_events();
398 check_relation<sha256_mem>(trace);
399 check_relation<sha256>(trace);
406TEST(Sha256MemoryConstrainingTest, InvalidInputTagErr)
421 EventEmitter<Sha256CompressionEvent> sha256_event_emitter;
424 std::array<uint32_t, 8> state = { 0, 1, 2, 3, 4, 5, 6, 7 };
426 for (uint32_t i = 0; i < 8; ++i) {
427 mem.
set(state_addr + i, MemoryValue::from<uint32_t>(state[i]));
430 std::array<uint32_t, 14> input = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 };
432 for (uint32_t i = 0; i < 14; ++i) {
433 mem.
set(input_addr + i, MemoryValue::from<uint32_t>(input[i]));
435 mem.
set(input_addr + 14, MemoryValue::from<uint64_t>(14));
436 mem.
set(input_addr + 15, MemoryValue::from<uint64_t>(15));
440 ".*Invalid tag for sha256 input values.*");
441 TestTraceContainer
trace;
442 trace.
set(C::precomputed_first_row, 0, 1);
445 const auto sha256_event_container = sha256_event_emitter.dump_events();
449 if (getenv(
"AVM_DEBUG") !=
nullptr) {
450 InteractiveDebugger debugger(trace);
454 check_relation<sha256_mem>(trace);
455 check_relation<sha256>(trace);
462TEST(Sha256MemoryConstrainingTest, PropagateError)
471 EventEmitter<Sha256CompressionEvent> sha256_event_emitter;
485 TestTraceContainer
trace({
487 { C::precomputed_first_row, 1 },
489 { C::execution_sel, 1 },
491 { C::execution_sel_exec_dispatch_sha256_compression, 1 },
492 { C::execution_rop_0_, output_addr },
493 { C::execution_rop_1_, state_addr },
494 { C::execution_rop_2_, input_addr },
495 { C::execution_sel_opcode_error, 1 },
499 std::array<uint32_t, 8> state = { 0, 1, 2, 3, 4, 5, 6, 7 };
500 for (uint32_t i = 0; i < state.size(); ++i) {
501 mem.
set(state_addr + i, MemoryValue::from<uint32_t>(state[i]));
504 { C::memory_sel, 1 },
506 { C::memory_address, state_addr + i },
507 { C::memory_value, state[i] },
513 std::array<uint32_t, 13> input = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
514 for (uint32_t i = 0; i < input.size(); ++i) {
515 mem.
set(input_addr + i, MemoryValue::from<uint32_t>(input[i]));
518 { C::memory_sel, 1 },
520 { C::memory_address, input_addr + i },
521 { C::memory_value, input[i] },
527 mem.
set(input_addr + 13, MemoryValue::from<uint64_t>(13));
528 trace.
set(state.size() + input.size(),
530 { C::memory_sel, 1 },
532 { C::memory_address, input_addr + 13 },
533 { C::memory_value, 13 },
537 EXPECT_THROW(sha256_gadget.compression(
mem, state_addr, input_addr, output_addr),
541 const auto sha256_event_container = sha256_event_emitter.dump_events();
551 if (getenv(
"AVM_DEBUG") !=
nullptr) {
552 InteractiveDebugger debugger(trace);
556 check_relation<sha256_mem>(trace);
557 check_relation<sha256>(trace);
558 check_all_interactions<Sha256TraceBuilder>(trace);
561TEST(Sha256MemoryConstrainingTest, Complex)
570 EventEmitter<Sha256CompressionEvent> sha256_event_emitter;
585 TestTraceContainer
trace({
587 { C::precomputed_first_row, 1 },
589 { C::execution_sel, 1 },
591 { C::execution_sel_exec_dispatch_sha256_compression, 1 },
592 { C::execution_rop_0_,
static_cast<MemoryAddress>(AVM_HIGHEST_MEM_ADDRESS - 1) },
593 { C::execution_rop_1_, state_addr },
594 { C::execution_rop_2_, input_addr },
595 { C::execution_sel_opcode_error, 1 },
599 { C::execution_sel, 1 },
601 { C::execution_sel_exec_dispatch_sha256_compression, 1 },
602 { C::execution_rop_0_, output_addr },
603 { C::execution_rop_1_, state_addr },
604 { C::execution_rop_2_, input_addr },
608 std::array<uint32_t, 8> state = { 0, 1, 2, 3, 4, 5, 6, 7 };
609 for (uint32_t i = 0; i < state.size(); ++i) {
610 mem.
set(state_addr + i, MemoryValue::from<uint32_t>(state[i]));
613 { C::memory_sel, 1 },
614 { C::memory_clk, 1 },
616 { C::memory_address, state_addr + i },
617 { C::memory_value, state[i] },
623 std::array<uint32_t, 16> input = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
624 for (uint32_t i = 0; i < input.size(); ++i) {
625 mem.
set(input_addr + i, MemoryValue::from<uint32_t>(input[i]));
628 { C::memory_sel, 1 },
629 { C::memory_clk, 1 },
631 { C::memory_address, input_addr + i },
632 { C::memory_value, input[i] },
639 for (uint32_t i = 0; i < expected_output.size(); ++i) {
640 mem.
set(output_addr + i, MemoryValue::from<uint32_t>(expected_output[i]));
641 trace.
set(i + state.size() + input.size(),
643 { C::memory_sel, 1 },
644 { C::memory_clk, 1 },
645 { C::memory_space_id, mem.get_space_id() },
646 { C::memory_address, output_addr + i },
647 { C::memory_value, expected_output[i] },
648 { C::memory_tag, static_cast<uint8_t>(MemoryTag::U32) },
654 sha256_gadget.compression(
mem, state_addr, input_addr,
static_cast<MemoryAddress>(AVM_HIGHEST_MEM_ADDRESS - 1)),
656 sha256_gadget.compression(
mem, state_addr, input_addr, output_addr);
659 const auto sha256_event_container = sha256_event_emitter.dump_events();
672 BitwiseTraceBuilder bitwise_builder;
675 if (getenv(
"AVM_DEBUG") !=
nullptr) {
676 InteractiveDebugger debugger(trace);
680 check_relation<sha256_mem>(trace);
681 check_relation<sha256>(trace);
682 check_all_interactions<Sha256TraceBuilder>(trace);
698TEST(Sha256MemoryConstrainingTest, InputAddrTamperingIsCaughtByConstraint)
709 EventEmitter<Sha256CompressionEvent> sha256_event_emitter;
713 std::array<uint32_t, 8> state = { 0, 1, 2, 3, 4, 5, 6, 7 };
715 for (uint32_t i = 0; i < 8; ++i) {
716 mem.
set(state_addr + i, MemoryValue::from<uint32_t>(state[i]));
719 std::array<uint32_t, 16> input = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
721 for (uint32_t i = 0; i < 16; ++i) {
722 mem.
set(input_addr + i, MemoryValue::from<uint32_t>(input[i]));
727 sha256_gadget.compression(
mem, state_addr, input_addr, output_addr);
730 TestTraceContainer
trace;
731 trace.
set(C::precomputed_first_row, 0, 1);
736 ASSERT_NO_THROW(check_relation<sha256_mem>(trace)) <<
"Trace should be valid before tampering";
740 constexpr uint32_t MALICIOUS_ADDR = 9999;
741 trace.
set(C::sha256_input_addr, 1, MALICIOUS_ADDR);
765TEST(Sha256ConstrainingTest, InitStateTamperingIsCaughtByPropagationConstraint)
776 EventEmitter<Sha256CompressionEvent> sha256_event_emitter;
780 std::array<uint32_t, 8> state = { 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,
781 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19 };
783 for (uint32_t i = 0; i < 8; ++i) {
784 mem.
set(state_addr + i, MemoryValue::from<uint32_t>(state[i]));
787 std::array<uint32_t, 16> input = { 0x61626380, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x18 };
789 for (uint32_t i = 0; i < 16; ++i) {
790 mem.
set(input_addr + i, MemoryValue::from<uint32_t>(input[i]));
794 sha256_gadget.compression(
mem, state_addr, input_addr, output_addr);
796 TestTraceContainer
trace;
797 trace.
set(C::precomputed_first_row, 0, 1);
802 ASSERT_NO_THROW(check_relation<sha256>(trace));
806 constexpr uint32_t TAMPER_ROW = 1;
807 ASSERT_EQ(
trace.
get(C::sha256_perform_round, TAMPER_ROW),
FF(1)) <<
"Row 1 should have perform_round=1";
810 FF original_init_a =
trace.
get(C::sha256_init_a, TAMPER_ROW);
811 FF tampered_init_a = original_init_a +
FF(0x12345678);
812 trace.
set(C::sha256_init_a, TAMPER_ROW, tampered_init_a);
827TEST(Sha256ConstrainingTest, RoundsRemainingInitTamperingIsCaught)
837 EventEmitter<Sha256CompressionEvent> sha256_event_emitter;
840 std::array<uint32_t, 8> state = { 0, 1, 2, 3, 4, 5, 6, 7 };
842 for (uint32_t i = 0; i < 8; ++i) {
843 mem.
set(state_addr + i, MemoryValue::from<uint32_t>(state[i]));
846 std::array<uint32_t, 16> input = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
848 for (uint32_t i = 0; i < 16; ++i) {
849 mem.
set(input_addr + i, MemoryValue::from<uint32_t>(input[i]));
853 sha256_gadget.compression(
mem, state_addr, input_addr, output_addr);
855 TestTraceContainer
trace;
856 trace.
set(C::precomputed_first_row, 0, 1);
861 ASSERT_NO_THROW(check_relation<sha256>(trace));
863 constexpr uint32_t START_ROW = 1;
864 ASSERT_EQ(
trace.
get(C::sha256_start, START_ROW),
FF(1)) <<
"Row 1 should be the sha256 start row";
865 ASSERT_EQ(
trace.
get(C::sha256_rounds_remaining, START_ROW),
FF(64))
866 <<
"rounds_remaining should be 64 on the start row";
869 trace.
set(C::sha256_rounds_remaining, START_ROW,
FF(50));
877TEST(Sha256ConstrainingTest, RoundsRemainingDecrementTamperingIsCaught)
887 EventEmitter<Sha256CompressionEvent> sha256_event_emitter;
890 std::array<uint32_t, 8> state = { 0, 1, 2, 3, 4, 5, 6, 7 };
892 for (uint32_t i = 0; i < 8; ++i) {
893 mem.
set(state_addr + i, MemoryValue::from<uint32_t>(state[i]));
896 std::array<uint32_t, 16> input = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
898 for (uint32_t i = 0; i < 16; ++i) {
899 mem.
set(input_addr + i, MemoryValue::from<uint32_t>(input[i]));
903 sha256_gadget.compression(
mem, state_addr, input_addr, output_addr);
905 TestTraceContainer
trace;
906 trace.
set(C::precomputed_first_row, 0, 1);
911 ASSERT_NO_THROW(check_relation<sha256>(trace));
916 constexpr uint32_t TAMPER_ROW = 5;
917 ASSERT_EQ(
trace.
get(C::sha256_perform_round, TAMPER_ROW),
FF(1));
918 FF original =
trace.
get(C::sha256_rounds_remaining, TAMPER_ROW);
919 trace.
set(C::sha256_rounds_remaining, TAMPER_ROW, original -
FF(1));
#define EXPECT_THROW_WITH_MESSAGE(code, expectedMessageRegex)
FieldGreaterThan field_gt
static constexpr size_t SR_CONTINUITY_INPUT_ADDR
static std::string get_subrelation_label(size_t index)
static constexpr size_t SR_ROUNDS_REM_DECREMENT
static std::string get_subrelation_label(size_t index)
static constexpr size_t SR_PROPAGATE_INIT_A
static constexpr size_t SR_ROUNDS_REM_INIT
void set(MemoryAddress index, MemoryValue value) override
uint16_t get_space_id() const override
void process(const simulation::EventEmitterInterface< simulation::AluEvent >::Container &events, TraceContainer &trace)
Process the ALU events and populate the ALU relevant columns in the trace.
void process(const simulation::EventEmitterInterface< simulation::GreaterThanEvent >::Container &events, TraceContainer &trace)
Process the greater-than events and populate the relevant columns in the trace.
void process_sha256_round_constants(TraceContainer &trace)
Populate the 64 SHA-256 round constants (K_0 .. K_63) and their selector. The sel_sha256_compression ...
void process_misc(TraceContainer &trace, const uint32_t num_rows=PRECOMPUTED_TRACE_SIZE)
Populate miscellaneous precomputed columns: first_row selector and idx (row index).
void process(const simulation::EventEmitterInterface< simulation::RangeCheckEvent >::Container &events, TraceContainer &trace)
Processes range check events and populates the trace with decomposed value columns.
const FF & get(Column col, uint32_t row) const
void set(Column col, uint32_t row, const FF &value, bool use_atomic_limbs=false)
RangeCheckTraceBuilder range_check_builder
PrecomputedTraceBuilder precomputed_builder
GreaterThanTraceBuilder gt_builder
EventEmitter< GreaterThanEvent > gt_event_emitter
ExecutionIdManager execution_id_manager
EventEmitter< RangeCheckEvent > range_check_event_emitter
void check_interaction(tracegen::TestTraceContainer &trace)
TEST(AvmFixedVKTests, FixedVKCommitments)
Test that the fixed VK commitments agree with the ones computed from precomputed columns.
std::array< uint32_t, 8 > sha256_block(const std::array< uint32_t, 8 > &h_init, const std::array< uint32_t, 16 > &input)
TestTraceContainer empty_trace()
lookup_settings< lookup_sha256_range_rhs_e_6_settings_ > lookup_sha256_range_rhs_e_6_settings
lookup_settings< lookup_sha256_w_s_1_xor_1_settings_ > lookup_sha256_w_s_1_xor_1_settings
lookup_settings< lookup_sha256_range_comp_w_rhs_settings_ > lookup_sha256_range_comp_w_rhs_settings
lookup_settings< lookup_sha256_range_rhs_a_13_settings_ > lookup_sha256_range_rhs_a_13_settings
lookup_settings< lookup_sha256_range_rhs_e_11_settings_ > lookup_sha256_range_rhs_e_11_settings
lookup_settings< lookup_sha256_range_rhs_a_22_settings_ > lookup_sha256_range_rhs_a_22_settings
lookup_settings< lookup_sha256_range_comp_h_rhs_settings_ > lookup_sha256_range_comp_h_rhs_settings
lookup_settings< lookup_sha256_mem_check_input_addr_in_range_settings_ > lookup_sha256_mem_check_input_addr_in_range_settings
lookup_settings< lookup_sha256_maj_xor_0_settings_ > lookup_sha256_maj_xor_0_settings
lookup_settings< lookup_sha256_s_1_xor_0_settings_ > lookup_sha256_s_1_xor_0_settings
lookup_settings< lookup_sha256_w_s_0_xor_0_settings_ > lookup_sha256_w_s_0_xor_0_settings
lookup_settings< lookup_sha256_range_rhs_w_18_settings_ > lookup_sha256_range_rhs_w_18_settings
lookup_settings< lookup_sha256_w_s_1_xor_0_settings_ > lookup_sha256_w_s_1_xor_0_settings
lookup_settings< lookup_sha256_range_comp_w_lhs_settings_ > lookup_sha256_range_comp_w_lhs_settings
lookup_settings< lookup_sha256_s_1_xor_1_settings_ > lookup_sha256_s_1_xor_1_settings
lookup_settings< lookup_sha256_range_comp_b_rhs_settings_ > lookup_sha256_range_comp_b_rhs_settings
lookup_settings< lookup_sha256_range_rhs_w_10_settings_ > lookup_sha256_range_rhs_w_10_settings
lookup_settings< lookup_sha256_ch_xor_settings_ > lookup_sha256_ch_xor_settings
lookup_settings< lookup_sha256_range_comp_c_rhs_settings_ > lookup_sha256_range_comp_c_rhs_settings
lookup_settings< lookup_sha256_range_comp_next_e_lhs_settings_ > lookup_sha256_range_comp_next_e_lhs_settings
lookup_settings< lookup_sha256_maj_and_0_settings_ > lookup_sha256_maj_and_0_settings
lookup_settings< lookup_sha256_ch_and_0_settings_ > lookup_sha256_ch_and_0_settings
lookup_settings< lookup_sha256_maj_and_2_settings_ > lookup_sha256_maj_and_2_settings
lookup_settings< lookup_sha256_range_rhs_w_3_settings_ > lookup_sha256_range_rhs_w_3_settings
lookup_settings< lookup_sha256_round_constant_settings_ > lookup_sha256_round_constant_settings
lookup_settings< lookup_sha256_mem_check_state_addr_in_range_settings_ > lookup_sha256_mem_check_state_addr_in_range_settings
lookup_settings< lookup_sha256_range_rhs_e_25_settings_ > lookup_sha256_range_rhs_e_25_settings
lookup_settings< lookup_sha256_range_comp_next_e_rhs_settings_ > lookup_sha256_range_comp_next_e_rhs_settings
lookup_settings< lookup_sha256_maj_xor_1_settings_ > lookup_sha256_maj_xor_1_settings
lookup_settings< lookup_sha256_range_comp_f_rhs_settings_ > lookup_sha256_range_comp_f_rhs_settings
lookup_settings< lookup_sha256_range_comp_next_a_lhs_settings_ > lookup_sha256_range_comp_next_a_lhs_settings
lookup_settings< lookup_sha256_s_0_xor_0_settings_ > lookup_sha256_s_0_xor_0_settings
lookup_settings< lookup_sha256_w_s_0_xor_1_settings_ > lookup_sha256_w_s_0_xor_1_settings
lookup_settings< lookup_sha256_range_rhs_a_2_settings_ > lookup_sha256_range_rhs_a_2_settings
lookup_settings< lookup_sha256_range_comp_g_rhs_settings_ > lookup_sha256_range_comp_g_rhs_settings
lookup_settings< lookup_sha256_range_rhs_w_17_settings_ > lookup_sha256_range_rhs_w_17_settings
lookup_settings< lookup_sha256_s_0_xor_1_settings_ > lookup_sha256_s_0_xor_1_settings
lookup_settings< lookup_sha256_range_rhs_w_7_settings_ > lookup_sha256_range_rhs_w_7_settings
lookup_settings< lookup_sha256_ch_and_1_settings_ > lookup_sha256_ch_and_1_settings
lookup_settings< lookup_sha256_maj_and_1_settings_ > lookup_sha256_maj_and_1_settings
lookup_settings< lookup_sha256_mem_check_output_addr_in_range_settings_ > lookup_sha256_mem_check_output_addr_in_range_settings
lookup_settings< lookup_sha256_range_comp_next_a_rhs_settings_ > lookup_sha256_range_comp_next_a_rhs_settings
lookup_settings< lookup_sha256_range_rhs_w_19_settings_ > lookup_sha256_range_rhs_w_19_settings
lookup_settings< lookup_sha256_range_comp_d_rhs_settings_ > lookup_sha256_range_comp_d_rhs_settings
lookup_settings< lookup_sha256_range_comp_a_rhs_settings_ > lookup_sha256_range_comp_a_rhs_settings
lookup_settings< lookup_sha256_range_comp_e_rhs_settings_ > lookup_sha256_range_comp_e_rhs_settings
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
NoopEventEmitter< FieldGreaterThanEvent > field_gt_event_emitter
NoopEventEmitter< BitwiseEvent > bitwise_event_emitter