Skip to content

Commit 40dc754

Browse files
chore: MemoryAuxColsFactory functions to mutate trace rows in place (#1258)
* perf: MemoryAuxColsFactory mutate rows in place * clean
1 parent 3886067 commit 40dc754

File tree

5 files changed

+68
-7
lines changed

5 files changed

+68
-7
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/vm/src/arch/extensions.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ pub trait VmExtension<F: PrimeField32> {
9494
}
9595

9696
/// SystemPort combines system resources needed by most extensions
97-
#[derive(Clone)]
97+
#[derive(Clone, Copy)]
9898
pub struct SystemPort {
9999
pub execution_bus: ExecutionBus,
100100
pub program_bus: ProgramBus,

crates/vm/src/system/memory/controller/mod.rs

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -714,6 +714,65 @@ pub struct MemoryAuxColsFactory<T> {
714714

715715
// NOTE[jpw]: The `make_*_aux_cols` functions should be thread-safe so they can be used in parallelized trace generation.
716716
impl<F: PrimeField32> MemoryAuxColsFactory<F> {
717+
pub fn generate_read_aux(&self, read: &MemoryRecord<F>, buffer: &mut MemoryReadAuxCols<F>) {
718+
assert!(
719+
!read.address_space.is_zero(),
720+
"cannot make `MemoryReadAuxCols` for address space 0"
721+
);
722+
buffer.base.prev_timestamp = F::from_canonical_u32(read.prev_timestamp);
723+
self.generate_timestamp_lt(
724+
read.prev_timestamp,
725+
read.timestamp,
726+
&mut buffer.base.clk_lt_aux,
727+
);
728+
}
729+
730+
pub fn generate_read_or_immediate_aux(
731+
&self,
732+
read: &MemoryRecord<F>,
733+
buffer: &mut MemoryReadOrImmediateAuxCols<F>,
734+
) {
735+
IsZeroSubAir.generate_subrow(
736+
read.address_space,
737+
(&mut buffer.is_zero_aux, &mut buffer.is_immediate),
738+
);
739+
buffer.base.prev_timestamp = F::from_canonical_u32(read.prev_timestamp);
740+
self.generate_timestamp_lt(
741+
read.prev_timestamp,
742+
read.timestamp,
743+
&mut buffer.base.clk_lt_aux,
744+
);
745+
}
746+
747+
pub fn generate_write_aux<const N: usize>(
748+
&self,
749+
write: &MemoryRecord<F>,
750+
buffer: &mut MemoryWriteAuxCols<F, N>,
751+
) {
752+
let prev_data = write.prev_data.clone().unwrap();
753+
buffer.prev_data = prev_data.try_into().unwrap();
754+
buffer.base.prev_timestamp = F::from_canonical_u32(write.prev_timestamp);
755+
self.generate_timestamp_lt(
756+
write.prev_timestamp,
757+
write.timestamp,
758+
&mut buffer.base.clk_lt_aux,
759+
);
760+
}
761+
762+
fn generate_timestamp_lt(
763+
&self,
764+
prev_timestamp: u32,
765+
timestamp: u32,
766+
buffer: &mut LessThanAuxCols<F, AUX_LEN>,
767+
) {
768+
debug_assert!(prev_timestamp < timestamp);
769+
self.timestamp_lt_air.generate_subrow(
770+
(self.range_checker.as_ref(), prev_timestamp, timestamp),
771+
&mut buffer.lower_decomp,
772+
);
773+
}
774+
775+
// TODO[jpw]: delete these functions and use the ones that fill buffers above.
717776
pub fn make_read_aux_cols(&self, read: &MemoryRecord<F>) -> MemoryReadAuxCols<F> {
718777
assert!(
719778
!read.address_space.is_zero(),

crates/vm/src/system/memory/offline_checker/columns.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@ use crate::system::memory::offline_checker::bridge::AUX_LEN;
1414
#[derive(Clone, Copy, Debug, AlignedBorrow)]
1515
pub struct MemoryBaseAuxCols<T> {
1616
/// The previous timestamps in which the cells were accessed.
17-
pub(super) prev_timestamp: T,
17+
pub(crate) prev_timestamp: T,
1818
/// The auxiliary columns to perform the less than check.
19-
pub(super) clk_lt_aux: LessThanAuxCols<T, AUX_LEN>,
19+
pub(crate) clk_lt_aux: LessThanAuxCols<T, AUX_LEN>,
2020
}
2121

2222
#[repr(C)]
@@ -69,7 +69,7 @@ impl<const N: usize, F: FieldAlgebra> MemoryWriteAuxCols<F, N> {
6969
#[repr(C)]
7070
#[derive(Clone, Copy, Debug, AlignedBorrow)]
7171
pub struct MemoryReadAuxCols<T> {
72-
pub(super) base: MemoryBaseAuxCols<T>,
72+
pub(crate) base: MemoryBaseAuxCols<T>,
7373
}
7474

7575
impl<F: PrimeField32> MemoryReadAuxCols<F> {
@@ -99,9 +99,9 @@ impl<F: FieldAlgebra + Copy> MemoryReadAuxCols<F> {
9999
#[repr(C)]
100100
#[derive(Clone, Debug, AlignedBorrow)]
101101
pub struct MemoryReadOrImmediateAuxCols<T> {
102-
pub(super) base: MemoryBaseAuxCols<T>,
103-
pub(super) is_immediate: T,
104-
pub(super) is_zero_aux: T,
102+
pub(crate) base: MemoryBaseAuxCols<T>,
103+
pub(crate) is_immediate: T,
104+
pub(crate) is_zero_aux: T,
105105
}
106106

107107
impl<T> MemoryReadOrImmediateAuxCols<T> {

extensions/rv32im/circuit/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ num-bigint.workspace = true
2929
num-integer.workspace = true
3030
serde = { workspace = true, features = ["derive", "std"] }
3131
serde-big-array.workspace = true
32+
once_cell.workspace = true
3233

3334
[dev-dependencies]
3435
openvm-stark-sdk = { workspace = true }

0 commit comments

Comments
 (0)