diff --git a/evm/src/cpu/dup_swap.rs b/evm/src/cpu/dup_swap.rs index 2ab64352..78e5891a 100644 --- a/evm/src/cpu/dup_swap.rs +++ b/evm/src/cpu/dup_swap.rs @@ -335,6 +335,9 @@ pub(crate) fn eval_packed( eval_packed_dup(n, lv, nv, yield_constr); eval_packed_swap(n, lv, nv, yield_constr); + + // For both, disable the partial channel. + yield_constr.constraint(lv.op.dup_swap * lv.partial_channel.used); } /// Circuit version of `eval_packed`. @@ -354,4 +357,10 @@ pub(crate) fn eval_ext_circuit, const D: usize>( eval_ext_circuit_dup(builder, n, lv, nv, yield_constr); eval_ext_circuit_swap(builder, n, lv, nv, yield_constr); + + // For both, disable the partial channel. + { + let constr = builder.mul_extension(lv.op.dup_swap, lv.partial_channel.used); + yield_constr.constraint(builder, constr); + } } diff --git a/evm/src/cpu/jumps.rs b/evm/src/cpu/jumps.rs index f2285c0a..f2fd544c 100644 --- a/evm/src/cpu/jumps.rs +++ b/evm/src/cpu/jumps.rs @@ -142,6 +142,8 @@ pub(crate) fn eval_packed_jump_jumpi( for &channel in &lv.mem_channels[2..NUM_GP_CHANNELS - 1] { yield_constr.constraint(filter * channel.used); } + yield_constr.constraint(filter * lv.partial_channel.used); + // Channel 1 is unused by the `JUMP` instruction. yield_constr.constraint(is_jump * lv.mem_channels[1].used); @@ -324,6 +326,10 @@ pub(crate) fn eval_ext_circuit_jump_jumpi, const D: let constr = builder.mul_extension(filter, channel.used); yield_constr.constraint(builder, constr); } + { + let constr = builder.mul_extension(filter, lv.partial_channel.used); + yield_constr.constraint(builder, constr); + } // Channel 1 is unused by the `JUMP` instruction. { let constr = builder.mul_extension(is_jump, lv.mem_channels[1].used); diff --git a/evm/src/cpu/memio.rs b/evm/src/cpu/memio.rs index 6ea82089..304bb3de 100644 --- a/evm/src/cpu/memio.rs +++ b/evm/src/cpu/memio.rs @@ -56,6 +56,7 @@ fn eval_packed_load( for &channel in &lv.mem_channels[4..NUM_GP_CHANNELS] { yield_constr.constraint(filter * channel.used); } + yield_constr.constraint(filter * lv.partial_channel.used); // Stack constraints stack::eval_packed_one( @@ -120,6 +121,10 @@ fn eval_ext_circuit_load, const D: usize>( let constr = builder.mul_extension(filter, channel.used); yield_constr.constraint(builder, constr); } + { + let constr = builder.mul_extension(filter, lv.partial_channel.used); + yield_constr.constraint(builder, constr); + } // Stack constraints stack::eval_ext_circuit_one( diff --git a/evm/src/cpu/stack.rs b/evm/src/cpu/stack.rs index 71dc7a24..0497b228 100644 --- a/evm/src/cpu/stack.rs +++ b/evm/src/cpu/stack.rs @@ -357,6 +357,8 @@ pub(crate) fn eval_packed( for &channel in &lv.mem_channels[1..] { yield_constr.constraint(lv.op.not_pop * (lv.opcode_bits[0] - P::ONES) * channel.used); } + yield_constr + .constraint(lv.op.not_pop * (lv.opcode_bits[0] - P::ONES) * lv.partial_channel.used); // Constrain the new stack length for POP. yield_constr.constraint_transition( @@ -700,6 +702,10 @@ pub(crate) fn eval_ext_circuit, const D: usize>( let constr = builder.mul_extension(filter, channel.used); yield_constr.constraint(builder, constr); } + { + let constr = builder.mul_extension(filter, lv.partial_channel.used); + yield_constr.constraint(builder, constr); + } // Constrain the new stack length for POP. let diff = builder.sub_extension(nv.stack_len, lv.stack_len);