pub trait Layouter<F: Field> {
    type Root: Layouter<F>;

    // Required methods
    fn assign_region<A, AR, N, NR>(
        &mut self,
        name: N,
        assignment: A
    ) -> Result<AR, Error>
       where A: FnMut(Region<'_, F>) -> Result<AR, Error>,
             N: Fn() -> NR,
             NR: Into<String>;
    fn assign_table<A, N, NR>(
        &mut self,
        name: N,
        assignment: A
    ) -> Result<(), Error>
       where A: FnMut(Table<'_, F>) -> Result<(), Error>,
             N: Fn() -> NR,
             NR: Into<String>;
    fn constrain_instance(
        &mut self,
        cell: Cell,
        column: Column<Instance>,
        row: usize
    ) -> Result<(), Error>;
    fn get_root(&mut self) -> &mut Self::Root;
    fn push_namespace<NR, N>(&mut self, name_fn: N)
       where NR: Into<String>,
             N: FnOnce() -> NR;
    fn pop_namespace(&mut self, gadget_name: Option<String>);

    // Provided method
    fn namespace<NR, N>(
        &mut self,
        name_fn: N
    ) -> NamespacedLayouter<'_, F, Self::Root>
       where NR: Into<String>,
             N: FnOnce() -> NR { ... }
}
Expand description

A layout strategy within a circuit. The layouter is chip-agnostic and applies its strategy to the context and config it is given.

This abstracts over the circuit assignments, handling row indices etc.

Required Associated Types§

source

type Root: Layouter<F>

Represents the type of the “root” of this layouter, so that nested namespaces can minimize indirection.

Required Methods§

source

fn assign_region<A, AR, N, NR>( &mut self, name: N, assignment: A ) -> Result<AR, Error>where A: FnMut(Region<'_, F>) -> Result<AR, Error>, N: Fn() -> NR, NR: Into<String>,

Assign a region of gates to an absolute row number.

Inside the closure, the chip may freely use relative offsets; the Layouter will treat these assignments as a single “region” within the circuit. Outside this closure, the Layouter is allowed to optimise as it sees fit.

fn assign_region(&mut self, || "region name", |region| {
    let config = chip.config();
    region.assign_advice(config.a, offset, || { Some(value)});
});
source

fn assign_table<A, N, NR>( &mut self, name: N, assignment: A ) -> Result<(), Error>where A: FnMut(Table<'_, F>) -> Result<(), Error>, N: Fn() -> NR, NR: Into<String>,

Assign a table region to an absolute row number.

fn assign_table(&mut self, || "table name", |table| {
    let config = chip.config();
    table.assign_fixed(config.a, offset, || { Some(value)});
});
source

fn constrain_instance( &mut self, cell: Cell, column: Column<Instance>, row: usize ) -> Result<(), Error>

Constrains a Cell to equal an instance column’s row value at an absolute position.

source

fn get_root(&mut self) -> &mut Self::Root

Gets the “root” of this assignment, bypassing the namespacing.

Not intended for downstream consumption; use Layouter::namespace instead.

source

fn push_namespace<NR, N>(&mut self, name_fn: N)where NR: Into<String>, N: FnOnce() -> NR,

Creates a new (sub)namespace and enters into it.

Not intended for downstream consumption; use Layouter::namespace instead.

source

fn pop_namespace(&mut self, gadget_name: Option<String>)

Exits out of the existing namespace.

Not intended for downstream consumption; use Layouter::namespace instead.

Provided Methods§

source

fn namespace<NR, N>( &mut self, name_fn: N ) -> NamespacedLayouter<'_, F, Self::Root>where NR: Into<String>, N: FnOnce() -> NR,

Enters into a namespace.

Implementors§

source§

impl<'a, F: Field, L: Layouter<F> + 'a> Layouter<F> for NamespacedLayouter<'a, F, L>

§

type Root = <L as Layouter<F>>::Root

source§

impl<'p, 'a, F: Field, CS: Assignment<F> + 'a> Layouter<F> for V1Pass<'p, 'a, F, CS>

§

type Root = V1Pass<'p, 'a, F, CS>