Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions barretenberg/cpp/pil/vm2/poseidon2_mem.pil
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ include "gt.pil";
namespace poseidon2_perm_mem;

pol commit sel;
sel * (1 - sel) = 0;

#[skippable_if]
sel = 0;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ template <typename FF_> class poseidon2_memImpl {
public:
using FF = FF_;

static constexpr std::array<size_t, 12> SUBRELATION_PARTIAL_LENGTHS = { 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 4, 3 };
static constexpr std::array<size_t, 13> SUBRELATION_PARTIAL_LENGTHS = { 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 4, 3 };

template <typename AllEntities> inline static bool skip(const AllEntities& in)
{
Expand All @@ -35,9 +35,9 @@ template <typename FF> class poseidon2_mem : public Relation<poseidon2_memImpl<F
static constexpr const std::string_view NAME = "poseidon2_mem";

// Subrelation indices constants, to be used in tests.
static constexpr size_t SR_READ_ADDR_INCR = 0;
static constexpr size_t SR_WRITE_ADDR_INCR = 3;
static constexpr size_t SR_BATCH_ZERO_CHECK = 9;
static constexpr size_t SR_READ_ADDR_INCR = 1;
static constexpr size_t SR_WRITE_ADDR_INCR = 4;
static constexpr size_t SR_BATCH_ZERO_CHECK = 10;

static std::string get_subrelation_label(size_t index)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,92 +29,98 @@ void poseidon2_memImpl<FF_>::accumulate(ContainerOverSubrelations& evals,
FF(1) * poseidon2_perm_mem_INPUT_TAG_DIFF_0 + FF(8) * poseidon2_perm_mem_INPUT_TAG_DIFF_1 +
FF(64) * poseidon2_perm_mem_INPUT_TAG_DIFF_2 + FF(512) * poseidon2_perm_mem_INPUT_TAG_DIFF_3;

{ // READ_ADDR_INCR
{
using View = typename std::tuple_element_t<0, ContainerOverSubrelations>::View;
auto tmp = static_cast<View>(in.get(C::poseidon2_perm_mem_sel)) *
(FF(1) - static_cast<View>(in.get(C::poseidon2_perm_mem_sel)));
std::get<0>(evals) += (tmp * scaling_factor);
}
{ // READ_ADDR_INCR
using View = typename std::tuple_element_t<1, ContainerOverSubrelations>::View;
auto tmp = (static_cast<View>(in.get(C::poseidon2_perm_mem_read_address_1_)) -
static_cast<View>(in.get(C::poseidon2_perm_mem_sel)) *
(static_cast<View>(in.get(C::poseidon2_perm_mem_read_address_0_)) + FF(1)));
std::get<0>(evals) += (tmp * scaling_factor);
std::get<1>(evals) += (tmp * scaling_factor);
}
{
using View = typename std::tuple_element_t<1, ContainerOverSubrelations>::View;
using View = typename std::tuple_element_t<2, ContainerOverSubrelations>::View;
auto tmp = (static_cast<View>(in.get(C::poseidon2_perm_mem_read_address_2_)) -
static_cast<View>(in.get(C::poseidon2_perm_mem_sel)) *
(static_cast<View>(in.get(C::poseidon2_perm_mem_read_address_0_)) + FF(2)));
std::get<1>(evals) += (tmp * scaling_factor);
std::get<2>(evals) += (tmp * scaling_factor);
}
{
using View = typename std::tuple_element_t<2, ContainerOverSubrelations>::View;
using View = typename std::tuple_element_t<3, ContainerOverSubrelations>::View;
auto tmp = (static_cast<View>(in.get(C::poseidon2_perm_mem_read_address_3_)) -
static_cast<View>(in.get(C::poseidon2_perm_mem_sel)) *
(static_cast<View>(in.get(C::poseidon2_perm_mem_read_address_0_)) + FF(3)));
std::get<2>(evals) += (tmp * scaling_factor);
std::get<3>(evals) += (tmp * scaling_factor);
}
{ // WRITE_ADDR_INCR
using View = typename std::tuple_element_t<3, ContainerOverSubrelations>::View;
using View = typename std::tuple_element_t<4, ContainerOverSubrelations>::View;
auto tmp = (static_cast<View>(in.get(C::poseidon2_perm_mem_write_address_1_)) -
static_cast<View>(in.get(C::poseidon2_perm_mem_sel)) *
(static_cast<View>(in.get(C::poseidon2_perm_mem_write_address_0_)) + FF(1)));
std::get<3>(evals) += (tmp * scaling_factor);
std::get<4>(evals) += (tmp * scaling_factor);
}
{
using View = typename std::tuple_element_t<4, ContainerOverSubrelations>::View;
using View = typename std::tuple_element_t<5, ContainerOverSubrelations>::View;
auto tmp = (static_cast<View>(in.get(C::poseidon2_perm_mem_write_address_2_)) -
static_cast<View>(in.get(C::poseidon2_perm_mem_sel)) *
(static_cast<View>(in.get(C::poseidon2_perm_mem_write_address_0_)) + FF(2)));
std::get<4>(evals) += (tmp * scaling_factor);
std::get<5>(evals) += (tmp * scaling_factor);
}
{
using View = typename std::tuple_element_t<5, ContainerOverSubrelations>::View;
using View = typename std::tuple_element_t<6, ContainerOverSubrelations>::View;
auto tmp = (static_cast<View>(in.get(C::poseidon2_perm_mem_write_address_3_)) -
static_cast<View>(in.get(C::poseidon2_perm_mem_sel)) *
(static_cast<View>(in.get(C::poseidon2_perm_mem_write_address_0_)) + FF(3)));
std::get<5>(evals) += (tmp * scaling_factor);
std::get<6>(evals) += (tmp * scaling_factor);
}
{
using View = typename std::tuple_element_t<6, ContainerOverSubrelations>::View;
using View = typename std::tuple_element_t<7, ContainerOverSubrelations>::View;
auto tmp =
static_cast<View>(in.get(C::poseidon2_perm_mem_sel)) *
(static_cast<View>(in.get(C::poseidon2_perm_mem_max_mem_addr)) - CView(constants_AVM_HIGHEST_MEM_ADDRESS));
std::get<6>(evals) += (tmp * scaling_factor);
std::get<7>(evals) += (tmp * scaling_factor);
}
{
using View = typename std::tuple_element_t<7, ContainerOverSubrelations>::View;
using View = typename std::tuple_element_t<8, ContainerOverSubrelations>::View;
auto tmp = (static_cast<View>(in.get(C::poseidon2_perm_mem_sel_should_read_mem)) -
static_cast<View>(in.get(C::poseidon2_perm_mem_sel)) *
(FF(1) - static_cast<View>(in.get(C::poseidon2_perm_mem_sel_src_out_of_range_err))) *
(FF(1) - static_cast<View>(in.get(C::poseidon2_perm_mem_sel_dst_out_of_range_err))));
std::get<7>(evals) += (tmp * scaling_factor);
std::get<8>(evals) += (tmp * scaling_factor);
}
{
using View = typename std::tuple_element_t<8, ContainerOverSubrelations>::View;
using View = typename std::tuple_element_t<9, ContainerOverSubrelations>::View;
auto tmp = static_cast<View>(in.get(C::poseidon2_perm_mem_sel_invalid_tag_err)) *
(FF(1) - static_cast<View>(in.get(C::poseidon2_perm_mem_sel_invalid_tag_err)));
std::get<8>(evals) += (tmp * scaling_factor);
std::get<9>(evals) += (tmp * scaling_factor);
}
{ // BATCH_ZERO_CHECK
using View = typename std::tuple_element_t<9, ContainerOverSubrelations>::View;
using View = typename std::tuple_element_t<10, ContainerOverSubrelations>::View;
auto tmp = (CView(poseidon2_perm_mem_BATCHED_TAG_CHECK) *
((FF(1) - static_cast<View>(in.get(C::poseidon2_perm_mem_sel_invalid_tag_err))) *
(FF(1) - static_cast<View>(in.get(C::poseidon2_perm_mem_batch_tag_inv))) +
static_cast<View>(in.get(C::poseidon2_perm_mem_batch_tag_inv))) -
static_cast<View>(in.get(C::poseidon2_perm_mem_sel_invalid_tag_err)));
std::get<9>(evals) += (tmp * scaling_factor);
std::get<10>(evals) += (tmp * scaling_factor);
}
{
using View = typename std::tuple_element_t<10, ContainerOverSubrelations>::View;
using View = typename std::tuple_element_t<11, ContainerOverSubrelations>::View;
auto tmp = (static_cast<View>(in.get(C::poseidon2_perm_mem_err)) -
(FF(1) - (FF(1) - static_cast<View>(in.get(C::poseidon2_perm_mem_sel_src_out_of_range_err))) *
(FF(1) - static_cast<View>(in.get(C::poseidon2_perm_mem_sel_dst_out_of_range_err))) *
(FF(1) - static_cast<View>(in.get(C::poseidon2_perm_mem_sel_invalid_tag_err)))));
std::get<10>(evals) += (tmp * scaling_factor);
std::get<11>(evals) += (tmp * scaling_factor);
}
{
using View = typename std::tuple_element_t<11, ContainerOverSubrelations>::View;
using View = typename std::tuple_element_t<12, ContainerOverSubrelations>::View;
auto tmp = (static_cast<View>(in.get(C::poseidon2_perm_mem_sel_should_exec)) -
static_cast<View>(in.get(C::poseidon2_perm_mem_sel)) *
(FF(1) - static_cast<View>(in.get(C::poseidon2_perm_mem_err))));
std::get<11>(evals) += (tmp * scaling_factor);
std::get<12>(evals) += (tmp * scaling_factor);
}
}

Expand Down
Loading