Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: poseidon2 input pack (byte-input-padding-only) #1352

Open
wants to merge 90 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
90 commits
Select commit Hold shift + click to select a range
9ef4635
comments ...
reshmem Mar 6, 2024
c04d848
comments ...
reshmem Mar 7, 2024
fc0101b
comments
reshmem Mar 7, 2024
28ce14c
comments
reshmem Mar 7, 2024
451ade7
WIP
reshmem Mar 10, 2024
fede12c
WIP
reshmem Mar 17, 2024
b704a0e
WIP
reshmem Mar 17, 2024
1e58ec8
WIP - reduce_with_powers does not work
reshmem Mar 18, 2024
558bf34
WIP - fix
reshmem Mar 18, 2024
767f8b9
fix tests
reshmem Mar 18, 2024
553d5d7
pack to 7 - max for 64-b field + clippy
reshmem Mar 18, 2024
2cb1d44
cleanups
reshmem Mar 18, 2024
d762387
refactor...
reshmem Mar 18, 2024
89bf4d2
refactor...
reshmem Mar 18, 2024
99f416d
fix
reshmem Mar 18, 2024
7202f0d
refactor...
reshmem Mar 19, 2024
f953edc
fix - bit-padded-input
reshmem Mar 19, 2024
a4cbd2e
fix input_addr_padding constraint
reshmem Mar 19, 2024
fe41a7f
Merge branch 'main' into roman/poseidon-input-pack
reshmem Mar 19, 2024
9ebd02d
after merge from main
reshmem Mar 19, 2024
1885a88
clippy...
reshmem Mar 19, 2024
8501dfb
Merge branch 'main' into roman/poseidon-input-pack
reshmem Mar 28, 2024
2966a7d
fix after merge from main
reshmem Mar 28, 2024
5fc696d
Merge branch 'main' into roman/poseidon-input-pack
reshmem Apr 1, 2024
bf3682d
unpack logic in its own place
reshmem Apr 1, 2024
528e59f
fixes...
reshmem Apr 1, 2024
54c001c
fixes...
reshmem Apr 1, 2024
0fd0ab8
fixes...
reshmem Apr 1, 2024
7d9ce7e
Merge branch 'main' into roman/poseidon-input-pack
reshmem Apr 1, 2024
448d33b
add LE encoding
reshmem Apr 1, 2024
404a5c5
cleanup
reshmem Apr 1, 2024
d81382b
Merge branch 'main' into roman/poseidon-input-pack
reshmem Apr 2, 2024
8258863
fixes after review
reshmem Apr 2, 2024
28fcfcf
Merge branch 'main' into roman/poseidon-input-pack
reshmem Apr 2, 2024
3831081
Merge branch 'main' into roman/poseidon-input-pack
reshmem Apr 2, 2024
700582b
Update runner/src/poseidon2.rs
reshmem Apr 2, 2024
6b41395
fix
reshmem Apr 3, 2024
374e2c3
Merge branch 'main' into roman/poseidon-input-pack
reshmem Apr 3, 2024
72b4422
Merge branch 'main' into roman/poseidon-input-pack
reshmem Apr 7, 2024
63c2123
Clippy
matthiasgoergens Apr 12, 2024
eb225d8
Better conditional compilation
matthiasgoergens Apr 12, 2024
45f8a63
pad_trace_with_default
matthiasgoergens Apr 12, 2024
e3e565e
Remove useless trace
matthiasgoergens Apr 12, 2024
9ed5ac2
Clean up
matthiasgoergens Apr 12, 2024
e73298f
Fix typo
matthiasgoergens Apr 12, 2024
eaaa138
CLean up
matthiasgoergens Apr 12, 2024
a705624
Clean up
matthiasgoergens Apr 12, 2024
c0e5f13
Rename
matthiasgoergens Apr 12, 2024
5701875
Further cleanup
matthiasgoergens Apr 12, 2024
c41654d
Clean up
matthiasgoergens Apr 12, 2024
93f5e56
Simpler
matthiasgoergens Apr 12, 2024
cc10dda
Cleaner
matthiasgoergens Apr 12, 2024
cd61733
Remove counter-productive 'debug' option
matthiasgoergens Apr 13, 2024
f823c8b
Merge branch 'matthias/remove-useless-debug' into roman/poseidon-inpu…
matthiasgoergens Apr 13, 2024
3932df1
Remove poseidon2-feature
matthiasgoergens Apr 13, 2024
aec4160
Debug helpers
matthiasgoergens Apr 13, 2024
aaa7346
Merge branch 'matthias/enable-poseidon-always-remove-feature' into ro…
matthiasgoergens Apr 13, 2024
9f04532
Minimise diff
matthiasgoergens Apr 13, 2024
9aa4ac0
Minimise diff
matthiasgoergens Apr 13, 2024
a29c569
Rename
matthiasgoergens Apr 13, 2024
35eb2ce
Clean up
matthiasgoergens Apr 13, 2024
9b7aeb7
Revert "Simpler"
matthiasgoergens Apr 13, 2024
354c567
Revert "Clean up"
matthiasgoergens Apr 13, 2024
bc26da4
Reverted
matthiasgoergens Apr 13, 2024
5f2f78f
Clean up
matthiasgoergens Apr 13, 2024
712a8ed
refactor
matthiasgoergens Apr 13, 2024
f4de7be
Restore
matthiasgoergens Apr 13, 2024
253183d
Fixed!
matthiasgoergens Apr 13, 2024
5fab346
Clean up
matthiasgoergens Apr 13, 2024
de40025
Clean up
matthiasgoergens Apr 13, 2024
4317767
Clippy
matthiasgoergens Apr 13, 2024
0c37937
Keep length in the type system
matthiasgoergens Apr 13, 2024
c53434c
Merge remote-tracking branch 'origin/main' into roman/poseidon-input-…
matthiasgoergens Apr 13, 2024
d9aa994
Merge branch 'main' into roman/poseidon-input-pack
reshmem Apr 14, 2024
2c07fb9
fix: issue with under-constraint byte-address
reshmem Apr 14, 2024
0ab95e3
fix: after review
reshmem Apr 14, 2024
ec39911
fix: comment ..
reshmem Apr 14, 2024
41c3e77
fix: failed example, refactored cyclic dep
reshmem Apr 15, 2024
72ec4af
taplo
reshmem Apr 15, 2024
6617711
Merge branch 'main' into roman/poseidon-input-pack
reshmem Apr 15, 2024
5680070
fix...
reshmem Apr 15, 2024
aacb641
Cargo.lock
reshmem Apr 16, 2024
f853513
Merge branch 'main' into roman/poseidon-input-pack
reshmem Apr 16, 2024
662b827
examples/Cargo.lock
reshmem Apr 16, 2024
2793151
sdk/Cargo.lock
reshmem Apr 16, 2024
c0d9671
clippy
reshmem Apr 16, 2024
09c8a56
Merge branch 'main' into roman/poseidon-input-pack
reshmem Apr 16, 2024
8f1cbfb
Merge branch 'main' into roman/poseidon-input-pack
reshmem Apr 18, 2024
0cf3377
fix after merge
reshmem Apr 18, 2024
ae3403a
taplo
reshmem Apr 18, 2024
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
Prev Previous commit
Next Next commit
WIP
  • Loading branch information
reshmem committed Mar 17, 2024
commit fede12cc7110018e6449723f319f54bb6edea002
1 change: 1 addition & 0 deletions circuits/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ mozak-runner = { path = "../runner", features = ["test"] }
proptest = "1.4"

[features]
default = ["enable_poseidon_starks"]
enable_poseidon_starks = []
enable_register_starks = []
test = []
Expand Down
8 changes: 7 additions & 1 deletion circuits/src/generation/memory.rs
Original file line number Diff line number Diff line change
Expand Up @@ -159,13 +159,19 @@ pub fn generate_memory_trace<F: RichField>(
transform_io(io_memory_public_rows),
)
.collect();

#[cfg(feature = "enable_poseidon_starks")]
merged_trace.extend(transform_poseidon2_sponge(poseidon2_sponge_rows));
let d = transform_poseidon2_sponge(poseidon2_sponge_rows).collect::<Vec<_>>();
println!("sponge-memory: {:?}", d);
#[cfg(feature = "enable_poseidon_starks")]
merged_trace.extend(transform_poseidon2_output_bytes(
poseidon2_output_bytes_rows,
));
let d = transform_poseidon2_output_bytes(poseidon2_output_bytes_rows).collect::<Vec<_>>();
println!("p-output-memory: {:?}", d);

let d = transform_memory_init::<F>(memory_init_rows).collect::<Vec<_>>();
println!("init-memory: {:?}", d);

merged_trace.sort_by_key(key);
let mut merged_trace: Vec<_> = merged_trace
Expand Down
7 changes: 7 additions & 0 deletions circuits/src/generation/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ pub mod memory_zeroinit;
pub mod memoryinit;
pub mod poseidon2;
pub mod poseidon2_output_bytes;
pub mod poseidon2_preimage_pack;
pub mod poseidon2_sponge;
pub mod program;
pub mod rangecheck;
Expand Down Expand Up @@ -59,6 +60,7 @@ use crate::generation::memoryinit::{
generate_elf_memory_init_trace, generate_mozak_memory_init_trace,
};
use crate::generation::poseidon2::generate_poseidon2_trace;
use crate::generation::poseidon2_preimage_pack::generate_poseidon2_preimage_pack_trace;
use crate::generation::program::generate_program_rom_trace;
use crate::stark::mozak_stark::{
all_starks, MozakStark, PublicInputs, TableKindArray, TableKindSetBuilder,
Expand Down Expand Up @@ -98,6 +100,9 @@ pub fn generate_traces<F: RichField + Extendable<D>, const D: usize>(
// This step generates the output only - it takes last sponge elements (with get-flag = true)
let poseidon2_output_bytes_rows = generate_poseidon2_output_bytes_trace(&poseiden2_sponge_rows);
#[allow(unused)]
let poseidon2_preimage_pack_rows =
generate_poseidon2_preimage_pack_trace(&poseiden2_sponge_rows);
#[allow(unused)]
// This is the computation step, all the heavy logic happens here. In other words, the poseidon
// hash
let poseidon2_rows = generate_poseidon2_trace(&record.executed);
Expand Down Expand Up @@ -150,6 +155,8 @@ pub fn generate_traces<F: RichField + Extendable<D>, const D: usize>(
poseidon2_sponge_stark: trace_rows_to_poly_values(poseiden2_sponge_rows),
#[cfg(feature = "enable_poseidon_starks")]
poseidon2_output_bytes_stark: trace_rows_to_poly_values(poseidon2_output_bytes_rows),
#[cfg(feature = "enable_poseidon_starks")]
poseidon2_preimage_pack: trace_rows_to_poly_values(poseidon2_preimage_pack_rows),
}
.build()
}
Expand Down
67 changes: 67 additions & 0 deletions circuits/src/generation/poseidon2_preimage_pack.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
use plonky2::hash::hash_types::RichField;

use super::MIN_TRACE_LENGTH;
use crate::poseidon2_preimage_pack::columns::Poseidon2PreimagePack;
use crate::poseidon2_sponge::columns::Poseidon2Sponge;

fn pad_trace<F: RichField>(
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's just pad_with_default?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes it is. Should I rename it ?

Copy link
Collaborator

@matthiasgoergens matthiasgoergens Apr 12, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No, you should use the existing pad_with_default instead of duplicating.

mut trace: Vec<Poseidon2PreimagePack<F>>,
) -> Vec<Poseidon2PreimagePack<F>> {
trace.resize(
trace.len().next_power_of_two().max(MIN_TRACE_LENGTH),
Poseidon2PreimagePack::default(),
);
trace
}

pub fn generate_poseidon2_preimage_pack_trace<F: RichField>(
poseidon2_sponge_rows: &[Poseidon2Sponge<F>],
) -> Vec<Poseidon2PreimagePack<F>> {
let trace: Vec<Poseidon2PreimagePack<F>> = poseidon2_sponge_rows
.iter()
.flat_map(Into::<Vec<Poseidon2PreimagePack<F>>>::into)
.collect();
let trace = pad_trace(trace);
log::trace!("trace {:?}", trace);
trace
}

#[cfg(test)]
mod tests {
use mozak_runner::vm::Row;
use plonky2::plonk::config::{GenericConfig, PoseidonGoldilocksConfig};

use crate::generation::poseidon2_sponge::generate_poseidon2_sponge_trace;
use crate::generation::MIN_TRACE_LENGTH;
use crate::test_utils::{create_poseidon2_test, Poseidon2Test};
const D: usize = 2;
type C = PoseidonGoldilocksConfig;
type F = <C as GenericConfig<D>>::F;
#[test]
fn generate_poseidon2_output_bytes_trace() {
let data = "😇 Mozak is knowledge arguments based technology".to_string();
let input_start_addr = 1024;
let output_start_addr = 2048;
let (_program, record) = create_poseidon2_test(&[Poseidon2Test {
data,
input_start_addr,
output_start_addr,
}]);

let step_rows = record.executed;

let sponge_trace = generate_poseidon2_sponge_trace(&step_rows);
let trace = super::generate_poseidon2_preimage_pack_trace(&sponge_trace);
// for one sponge construct we have one row with gen_output = 1.
// So we expect other padding data to make trace of len MIN_TRACE_LENGTH.
assert_eq!(trace.len(), MIN_TRACE_LENGTH);
}

#[test]
fn generate_poseidon2_trace_with_dummy() {
let step_rows: Vec<Row<F>> = vec![];
let sponge_trace = generate_poseidon2_sponge_trace(&step_rows);
let trace = super::generate_poseidon2_preimage_pack_trace(&sponge_trace);
assert_eq!(trace.len(), MIN_TRACE_LENGTH);
}
}
16 changes: 10 additions & 6 deletions circuits/src/generation/poseidon2_sponge.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ use itertools::Itertools;
use mozak_runner::vm::Row;
use plonky2::hash::hash_types::RichField;
use plonky2::hash::hashing::PlonkyPermutation;
use plonky2::hash::poseidon2::Poseidon2Permutation;
use plonky2::hash::poseidon2::{Poseidon2Permutation, WIDTH};

use crate::generation::MIN_TRACE_LENGTH;
use crate::poseidon2_sponge::columns::{Ops, Poseidon2Sponge};
Expand Down Expand Up @@ -40,6 +40,11 @@ fn unroll_sponge_data<F: RichField>(row: &Row<F>) -> Vec<Poseidon2Sponge<F>> {
.sponge_data
.get(i as usize)
.expect("unroll_count not consistent with number of permutations");
let padded_fes = Poseidon2Permutation::<F>::RATE - sponge_datum.padded_count;
let mut is_padded = [F::ZERO; WIDTH];
for i in 0..padded_fes {
is_padded[Poseidon2Permutation::<F>::RATE - i] = F::ONE;
}
unroll.push(Poseidon2Sponge {
clk: F::from_canonical_u64(row.state.clk),
ops,
Expand All @@ -49,6 +54,7 @@ fn unroll_sponge_data<F: RichField>(row: &Row<F>) -> Vec<Poseidon2Sponge<F>> {
preimage: sponge_datum.preimage,
output: sponge_datum.output,
gen_output: sponge_datum.gen_output,
is_padded,
});
input_addr += rate_size;
input_len -= rate_size;
Expand Down Expand Up @@ -76,7 +82,6 @@ pub fn generate_poseidon2_sponge_trace<F: RichField>(
#[cfg(test)]
mod test {
use mozak_runner::poseidon2::MozakPoseidon2;
use plonky2::field::goldilocks_field::GoldilocksField;
use plonky2::field::types::Field;
use plonky2::hash::hashing::PlonkyPermutation;
use plonky2::hash::poseidon2::Poseidon2Permutation;
Expand All @@ -92,7 +97,7 @@ mod test {
#[test]
fn generate_poseidon2_sponge_trace() {
let data = "😇 Mozak is knowledge arguments based technology".to_string();
let data_len_in_bytes = MozakPoseidon2::<GoldilocksField>::padding(data.as_bytes()).len();
let data_len_in_bytes = MozakPoseidon2::padding(data.as_bytes()).len();
let input_start_addr = 1024;
let output_start_addr = 2048;
let (_program, record) = create_poseidon2_test(&[Poseidon2Test {
Expand All @@ -105,9 +110,8 @@ mod test {
let trace = super::generate_poseidon2_sponge_trace(&step_rows);

let rate_size = Poseidon2Permutation::<F>::RATE;
let sponge_count = (data_len_in_bytes
/ MozakPoseidon2::<GoldilocksField>::DATA_CAPACITY_PER_FIELD_ELEMENT)
/ rate_size;
let sponge_count =
(data_len_in_bytes / MozakPoseidon2::DATA_CAPACITY_PER_FIELD_ELEMENT) / rate_size;
for (i, value) in trace.iter().enumerate().take(sponge_count) {
assert_eq!(
value.input_addr,
Expand Down
1 change: 1 addition & 0 deletions circuits/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ pub mod memory_zeroinit;
pub mod memoryinit;
pub mod poseidon2;
pub mod poseidon2_output_bytes;
pub mod poseidon2_preimage_pack;
pub mod poseidon2_sponge;
pub mod program;
pub mod rangecheck;
Expand Down
41 changes: 28 additions & 13 deletions circuits/src/memory/columns.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
use core::ops::Add;

use mozak_runner::poseidon2::MozakPoseidon2;
use plonky2::field::extension::Extendable;
use plonky2::field::types::Field;
use plonky2::hash::hash_types::RichField;
Expand Down Expand Up @@ -112,21 +113,35 @@ impl<F: RichField> From<&FullWordMemory<F>> for Vec<Memory<F>> {

impl<F: RichField> From<&Poseidon2Sponge<F>> for Vec<Memory<F>> {
fn from(value: &Poseidon2Sponge<F>) -> Self {
if (value.ops.is_permute + value.ops.is_init_permute).is_zero() {
vec![]
} else {
let rate = Poseidon2Permutation::<F>::RATE;
// each Field element in preimage represents a byte.
(0..rate)
.map(|i| Memory {
clk: value.clk,
addr: value.input_addr
+ F::from_canonical_u8(u8::try_from(i).expect("i > 255")),
is_load: F::ONE,
value: value.preimage[i],
..Default::default()
if (value.ops.is_permute + value.ops.is_init_permute).is_one() {
// each Field element in preimage represents packed data (packed bytes)
(0..Poseidon2Permutation::<F>::RATE).filter(|i| value.is_padded[*i].is_one())
.flat_map(|i| {
// base-address is an input-address + RATE * index-inside-preimage
let base_address = value.input_addr
+ F::from_canonical_u64(
u64::try_from(MozakPoseidon2::DATA_CAPACITY_PER_FIELD_ELEMENT).expect(
"MozakPoseidon2::DATA_CAPACITY_PER_FIELD_ELEMENT should be cast-able to u64",
),
) * F::from_canonical_u8(u8::try_from(i).expect("i > 255"));
// Throw away leading byte since "be"
let packed = &value.preimage[i].clone().to_canonical_u64().to_be_bytes()
[MozakPoseidon2::BYTES_PER_FIELD_ELEMENT
- MozakPoseidon2::DATA_CAPACITY_PER_FIELD_ELEMENT..];
(0..MozakPoseidon2::DATA_CAPACITY_PER_FIELD_ELEMENT)
.map(|j| Memory {
clk: value.clk,
addr: base_address
+ F::from_canonical_u8(u8::try_from(j).expect("j > 255")),
is_load: F::ONE,
value: F::from_canonical_u8(packed[j]),
..Default::default()
})
.collect::<Vec<_>>()
})
.collect()
} else {
vec![]
}
}
}
Expand Down
110 changes: 110 additions & 0 deletions circuits/src/poseidon2_preimage_pack/columns.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
use itertools::Itertools;
use mozak_runner::poseidon2::MozakPoseidon2;
use plonky2::field::types::Field;
use plonky2::hash::hash_types::RichField;

use crate::columns_view::{columns_view_impl, make_col_map, NumberOfColumns};
use crate::linear_combination::Column;
use crate::poseidon2::columns::STATE_SIZE;
use crate::poseidon2_sponge::columns::Poseidon2Sponge;

// FIXME: MozakPoseidon2::DATA_CAPACITY_PER_FIELD_ELEMENT;
pub const BYTES_COUNT: usize = MozakPoseidon2::DATA_CAPACITY_PER_FIELD_ELEMENT;

#[repr(C)]
#[derive(Clone, Copy, Eq, PartialEq, Debug, Default)]
pub struct Poseidon2PreimagePack<F> {
pub clk: F,
pub addr: F,
pub bytes: [F; MozakPoseidon2::DATA_CAPACITY_PER_FIELD_ELEMENT],
pub is_executed: F,
}

columns_view_impl!(Poseidon2PreimagePack);
make_col_map!(Poseidon2PreimagePack);

pub const NUM_POSEIDON2_PREIMAGE_PACK_COLS: usize = Poseidon2PreimagePack::<()>::NUMBER_OF_COLUMNS;

impl<F: RichField> From<&Poseidon2Sponge<F>> for Vec<Poseidon2PreimagePack<F>> {
fn from(value: &Poseidon2Sponge<F>) -> Self {
if (value.ops.is_init_permute + value.ops.is_permute).is_one() {
assert!(
MozakPoseidon2::FIELD_ELEMENTS_RATE < STATE_SIZE,
"Packing RATE should be less than STATE_SIZE"
);
// FIXME: 8 should be MozakPoseidon2::FE_RATE
let preimage: [F; MozakPoseidon2::FIELD_ELEMENTS_RATE] = value.preimage
[..MozakPoseidon2::FIELD_ELEMENTS_RATE]
.try_into()
.expect("Should succeed since preimage can't be empty");
let mut base_address = value.input_addr;
let mut index = 0;
// For each FE of preimage we have BYTES_COUNT bytes
let result = preimage
.iter()
.map(|fe| {
// Note: assumed `to_be_bytes`, otherwise another side of the array should be
// taken
let bytes: Vec<_> = fe.clone().to_canonical_u64().to_be_bytes()
[MozakPoseidon2::BYTES_PER_FIELD_ELEMENT
- MozakPoseidon2::DATA_CAPACITY_PER_FIELD_ELEMENT..]
.into_iter()
.map(|e| F::from_canonical_u8(*e))
.collect();
let addr = base_address;
let i = index;
index+=1;
base_address = base_address + F::from_canonical_u64( u64::try_from(MozakPoseidon2::DATA_CAPACITY_PER_FIELD_ELEMENT).expect("Cast from usize to u64 for MozakPoseidon2::BYTES_PER_FIELD_ELEMENT should succeed"));
Poseidon2PreimagePack {
clk: value.clk,
addr,
bytes: <[F; MozakPoseidon2::DATA_CAPACITY_PER_FIELD_ELEMENT]>::try_from(
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@matthiasgoergens - don't know how to make it less ugly

bytes,
)
.unwrap(),
is_executed: F::ONE - value.is_padded[i],
}
})
.collect_vec();
println!("poseidon-value: {:?}", value);
println!("preimage-result: {:?}", result);
return result;
}
vec![]
}
}

#[must_use]
pub fn data_for_poseidon2_sponge<F: Field>() -> Vec<Column<F>> {
let data = col_map().map(Column::from);
vec![
data.clk,
data.addr,
Column::<F>::reduce_with_powers(&data.bytes, F::from_canonical_u16(1 << 8)),
]
}

#[must_use]
pub fn filter_for_poseidon2_sponge<F: Field>() -> Column<F> {
col_map().map(Column::from).is_executed
}

#[must_use]
pub fn data_for_input_memory<F: Field>(index: u8) -> Vec<Column<F>> {
assert!(
usize::try_from(index).unwrap() < BYTES_COUNT,
"poseidon2-preimage data_for_input_memory: index can be 0..{:?}",
BYTES_COUNT
);
let data = col_map().map(Column::from);
vec![
data.clk,
Column::constant(F::ZERO), // is_store
Column::constant(F::ONE), // is_load
data.bytes[index as usize].clone(), // value
data.addr + F::from_canonical_u8(index), // address
]
}

#[must_use]
pub fn filter_for_input_memory<F: Field>() -> Column<F> { col_map().map(Column::from).is_executed }
2 changes: 2 additions & 0 deletions circuits/src/poseidon2_preimage_pack/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
pub mod columns;
pub mod stark;
Loading