This commit is contained in:
Nicholas Ward 2022-06-23 11:02:17 -07:00
parent 798b01d050
commit d911eecd37
2 changed files with 42 additions and 41 deletions

View File

@ -229,11 +229,6 @@ mod tests {
current_cpu_index += 1;
last_timestamp = mem_timestamp;
}
dbg!(i);
dbg!(mem_timestamp);
dbg!(current_cpu_index);
dbg!(op);
cpu_trace_rows[current_cpu_index][cpu::columns::uses_memop(op)] = F::ONE;
cpu_trace_rows[current_cpu_index][cpu::columns::CLOCK] = clock;
@ -323,28 +318,28 @@ mod tests {
let cpu_memory_cols: Vec<Vec<_>> = (0..NUM_MEMORY_OPS)
.map(|op| {
let mut cols = Column::singles([
// cpu::columns::CLOCK,
let mut cols: Vec<Column<F>> = Column::singles([
cpu::columns::CLOCK,
cpu::columns::memop_is_read(op),
// cpu::columns::memop_addr_context(op),
// cpu::columns::memop_addr_segment(op),
// cpu::columns::memop_addr_virtual(op),
cpu::columns::memop_addr_context(op),
cpu::columns::memop_addr_segment(op),
cpu::columns::memop_addr_virtual(op),
])
.collect_vec();
// cols.extend(Column::singles(
// (0..8).map(|j| cpu::columns::memop_value(op, j)),
// ));
cols.extend(Column::singles(
(0..8).map(|j| cpu::columns::memop_value(op, j)),
));
cols
})
.collect();
let mut memory_memory_cols = vec![
// memory::registers::TIMESTAMP,
memory::registers::TIMESTAMP,
memory::registers::IS_READ,
// memory::registers::ADDR_CONTEXT,
// memory::registers::ADDR_SEGMENT,
// memory::registers::ADDR_VIRTUAL,
memory::registers::ADDR_CONTEXT,
memory::registers::ADDR_SEGMENT,
memory::registers::ADDR_VIRTUAL,
];
// memory_memory_cols.extend((0..8).map(memory::registers::value_limb));
memory_memory_cols.extend((0..8).map(memory::registers::value_limb));
let mut cross_table_lookups = vec![
CrossTableLookup::new(
@ -370,7 +365,7 @@ mod tests {
None,
),
];
cross_table_lookups.extend((0..NUM_MEMORY_OPS).map(|op| {
cross_table_lookups.extend((0..1).map(|op| {
CrossTableLookup::new(
vec![TableWithColumns::new(
Table::Cpu,

View File

@ -48,10 +48,11 @@ pub fn generate_random_memory_ops<F: RichField, R: Rng>(
let mut memory_ops = Vec::new();
let mut current_memory_values: HashMap<(F, F, F), [F; 8]> = HashMap::new();
for i in 0..num_ops {
let num_cycles = num_ops / 2;
for i in 0..num_cycles {
let timestamp = F::from_canonical_usize(i);
let mut used_indices = HashSet::new();
let mut new_writes_this_cycle = HashSet::new();
let mut new_writes_this_cycle = HashMap::new();
for _ in 0..2 {
let mut channel_index = rng.gen_range(0..4);
while used_indices.contains(&channel_index) {
@ -73,14 +74,19 @@ pub fn generate_random_memory_ops<F: RichField, R: Rng>(
} else {
// TODO: with taller memory table or more padding (to enable range-checking bigger diffs),
// test larger address values.
let context = F::from_canonical_usize(rng.gen_range(0..40));
let segment = F::from_canonical_usize(rng.gen_range(0..8));
let virt = F::from_canonical_usize(rng.gen_range(0..20));
let mut context = F::from_canonical_usize(rng.gen_range(0..40));
let mut segment = F::from_canonical_usize(rng.gen_range(0..8));
let mut virt = F::from_canonical_usize(rng.gen_range(0..20));
while new_writes_this_cycle.contains_key(&(context, segment, virt)) {
context = F::from_canonical_usize(rng.gen_range(0..40));
segment = F::from_canonical_usize(rng.gen_range(0..8));
virt = F::from_canonical_usize(rng.gen_range(0..20));
}
let val: [u32; 8] = rng.gen();
let vals: [F; 8] = val.map(F::from_canonical_u32);
new_writes_this_cycle.insert(((context, segment, virt), vals));
new_writes_this_cycle.insert((context, segment, virt), vals);
(context, segment, virt, vals)
};
@ -372,33 +378,33 @@ impl<F: RichField + Extendable<D>, const D: usize> Stark<F, D> for MemoryStark<F
let not_address_unchanged = one - address_unchanged;
// First set of ordering constraint: first_change flags are boolean.
yield_constr.constraint(context_first_change * not_context_first_change);
yield_constr.constraint(segment_first_change * not_segment_first_change);
yield_constr.constraint(virtual_first_change * not_virtual_first_change);
yield_constr.constraint(address_unchanged * not_address_unchanged);
// yield_constr.constraint(context_first_change * not_context_first_change);
// yield_constr.constraint(segment_first_change * not_segment_first_change);
// yield_constr.constraint(virtual_first_change * not_virtual_first_change);
// yield_constr.constraint(address_unchanged * not_address_unchanged);
// Second set of ordering constraints: no change before the column corresponding to the nonzero first_change flag.
yield_constr
.constraint_transition(segment_first_change * (next_addr_context - addr_context));
yield_constr
.constraint_transition(virtual_first_change * (next_addr_context - addr_context));
yield_constr
.constraint_transition(virtual_first_change * (next_addr_segment - addr_segment));
yield_constr.constraint_transition(address_unchanged * (next_addr_context - addr_context));
yield_constr.constraint_transition(address_unchanged * (next_addr_segment - addr_segment));
yield_constr.constraint_transition(address_unchanged * (next_addr_virtual - addr_virtual));
// yield_constr
// .constraint_transition(segment_first_change * (next_addr_context - addr_context));
// yield_constr
// .constraint_transition(virtual_first_change * (next_addr_context - addr_context));
// yield_constr
// .constraint_transition(virtual_first_change * (next_addr_segment - addr_segment));
// yield_constr.constraint_transition(address_unchanged * (next_addr_context - addr_context));
// yield_constr.constraint_transition(address_unchanged * (next_addr_segment - addr_segment));
// yield_constr.constraint_transition(address_unchanged * (next_addr_virtual - addr_virtual));
// Third set of ordering constraints: range-check difference in the column that should be increasing.
let computed_range_check = context_first_change * (next_addr_context - addr_context - one)
+ segment_first_change * (next_addr_segment - addr_segment - one)
+ virtual_first_change * (next_addr_virtual - addr_virtual - one)
+ address_unchanged * (next_timestamp - timestamp - one);
yield_constr.constraint_transition(range_check - computed_range_check);
// yield_constr.constraint_transition(range_check - computed_range_check);
// Enumerate purportedly-ordered log.
for i in 0..8 {
yield_constr
.constraint(next_is_read * address_unchanged * (next_values[i] - values[i]));
// yield_constr
// .constraint(next_is_read * address_unchanged * (next_values[i] - values[i]));
}
eval_lookups(vars, yield_constr, RANGE_CHECK_PERMUTED, COUNTER_PERMUTED)