mul::complete: Refactor complete::Config.

This is only used in chip::mul::Config. In a subsequent commit,
this will be configured from mul::Config instead of from
ecc::chip::Config.

This commit does not result in circuit changes.
This commit is contained in:
therealyingtong 2021-11-30 15:00:05 -05:00 committed by Jack Grigg
parent 22f57005a9
commit 931d61a863
3 changed files with 22 additions and 22 deletions

View File

@ -149,7 +149,7 @@ pub struct EccConfig {
/// Variable-base scalar multiplication (lo half)
mul_lo: mul::incomplete::Config<{ mul::INCOMPLETE_LO_LEN }>,
/// Selector used to enforce boolean decomposition in variable-base scalar mul
pub q_mul_decompose_var: Selector,
pub mul_complete: mul::complete::Config,
/// Selector used to enforce switching logic on LSB in variable-base scalar mul
pub q_mul_lsb: Selector,
/// Variable-base scalar multiplication (overflow check)
@ -228,9 +228,6 @@ impl EccChip {
// - advices[4]: lambda1
// - advices[9]: z
//
// mul::complete::Config:
// - advices[9]: z_complete
//
// TODO: Refactor away from `impl From<EccConfig> for _` so that sub-configs can
// equality-enable the columns they need to.
for column in &advices {
@ -261,6 +258,7 @@ impl EccChip {
let mul_lo = mul::incomplete::Config::configure(
meta, advices[6], advices[7], advices[0], advices[1], advices[8], advices[2],
);
let mul_complete = mul::complete::Config::configure(meta, advices[9], add);
let config = EccConfig {
advices,
@ -270,7 +268,7 @@ impl EccChip {
add,
mul_hi,
mul_lo,
q_mul_decompose_var: meta.selector(),
mul_complete,
q_mul_overflow: meta.selector(),
q_mul_lsb: meta.selector(),
q_mul_fixed_full: meta.selector(),

View File

@ -16,7 +16,8 @@ use halo2::{
use pasta_curves::pallas;
mod complete;
// TODO: Undo this pub(crate).
pub(crate) mod complete;
// TODO: Undo this pub(crate).
pub(crate) mod incomplete;
mod overflow;
@ -67,7 +68,7 @@ impl From<&EccConfig> for Config {
add_config: ecc_config.add,
hi_config: ecc_config.mul_hi,
lo_config: ecc_config.mul_lo,
complete_config: ecc_config.into(),
complete_config: ecc_config.mul_complete,
overflow_config: ecc_config.into(),
};
@ -111,7 +112,6 @@ impl From<&EccConfig> for Config {
impl Config {
pub(super) fn create_gate(&self, meta: &mut ConstraintSystem<pallas::Base>) {
self.complete_config.create_gate(meta);
self.overflow_config.create_gate(meta);
// If `lsb` is 0, (x, y) = (x_p, -y_p). If `lsb` is 1, (x, y) = (0,0).

View File

@ -1,4 +1,4 @@
use super::super::{add, copy, CellValue, EccConfig, EccPoint, Var};
use super::super::{add, copy, CellValue, EccPoint, Var};
use super::{COMPLETE_RANGE, X, Y, Z};
use crate::circuit::gadget::utilities::{bool_check, ternary};
@ -10,6 +10,7 @@ use halo2::{
use pasta_curves::{arithmetic::FieldExt, pallas};
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub struct Config {
// Selector used to constrain the cells used in complete addition.
q_mul_decompose_var: Selector,
@ -19,30 +20,31 @@ pub struct Config {
add_config: add::Config,
}
impl From<&EccConfig> for Config {
fn from(ecc_config: &EccConfig) -> Self {
impl Config {
/// TODO: Make this pub(super).
pub(crate) fn configure(
meta: &mut ConstraintSystem<pallas::Base>,
z_complete: Column<Advice>,
add_config: add::Config,
) -> Self {
meta.enable_equality(z_complete.into());
let config = Self {
q_mul_decompose_var: ecc_config.q_mul_decompose_var,
z_complete: ecc_config.advices[9],
add_config: ecc_config.add,
q_mul_decompose_var: meta.selector(),
z_complete,
add_config,
};
let add_config_advices = config.add_config.advice_columns();
assert!(
!add_config_advices.contains(&config.z_complete),
"z_complete cannot overlap with complete addition columns."
);
config.create_gate(meta);
config
}
}
impl Config {
/// Gate used to check scalar decomposition is correct.
/// This is used to check the bits used in complete addition, since the incomplete
/// addition gate (controlled by `q_mul`) already checks scalar decomposition for
/// the other bits.
pub(super) fn create_gate(&self, meta: &mut ConstraintSystem<pallas::Base>) {
fn create_gate(&self, meta: &mut ConstraintSystem<pallas::Base>) {
// | y_p | z_complete |
// --------------------
// | y_p | z_{i + 1} |