pub enum CircuitElem<F: Field, B: CircuitBuilder<Field = F>> {
Constant(F),
Wire {
builder: Weak<RefCell<B>>,
wire: B::Wire,
},
}Expand description
A field element that is either a known constant or a wire in a CircuitBuilder B.
The Wire variant holds a Weak reference to the shared builder; it must outlive any
operation performed on the element. Arithmetic over all-Constant operands folds at the F
level without touching a builder; any Wire operand routes the operation through B.
Variants§
Implementations§
Source§impl<F, B> CircuitElem<F, B>where
F: Field,
B: CircuitBuilder<Field = F>,
impl<F, B> CircuitElem<F, B>where
F: Field,
B: CircuitBuilder<Field = F>,
Sourcepub fn wire(builder: &Rc<RefCell<B>>, wire: B::Wire) -> Self
pub fn wire(builder: &Rc<RefCell<B>>, wire: B::Wire) -> Self
Construct a Self::Wire anchored to a shared builder via a Weak reference.
Sourcepub fn to_wire(&self, builder: &mut B) -> B::Wire
pub fn to_wire(&self, builder: &mut B) -> B::Wire
Lowers this element to a wire on builder, materializing a Constant via
CircuitBuilder::constant. A Wire’s backing builder is assumed to be builder; callers
mixing elements from different channels must check that themselves (as Self::combine
does).
Sourcepub fn combine<const IN: usize, const OUT: usize>(
elems: [&Self; IN],
f_op: impl Fn([F; IN]) -> [F; OUT],
builder_op: impl Fn(&mut B, [B::Wire; IN]) -> [B::Wire; OUT],
) -> [Self; OUT]
pub fn combine<const IN: usize, const OUT: usize>( elems: [&Self; IN], f_op: impl Fn([F; IN]) -> [F; OUT], builder_op: impl Fn(&mut B, [B::Wire; IN]) -> [B::Wire; OUT], ) -> [Self; OUT]
Combine elems under an operation. If every input is a Constant, fold at the F level
via f_op (no builder is touched). Otherwise convert constants to wires on the shared
builder and run builder_op over the wires.
Trait Implementations§
Source§impl<F: Field, B: CircuitBuilder<Field = F>> Add for CircuitElem<F, B>
impl<F: Field, B: CircuitBuilder<Field = F>> Add for CircuitElem<F, B>
Source§impl<F, B> Add for &CircuitElem<F, B>where
F: Field,
B: CircuitBuilder<Field = F>,
impl<F, B> Add for &CircuitElem<F, B>where
F: Field,
B: CircuitBuilder<Field = F>,
Source§impl<F, B> Add<&CircuitElem<F, B>> for CircuitElem<F, B>where
F: Field,
B: CircuitBuilder<Field = F>,
impl<F, B> Add<&CircuitElem<F, B>> for CircuitElem<F, B>where
F: Field,
B: CircuitBuilder<Field = F>,
Source§impl<F: Field, B: CircuitBuilder<Field = F>> AddAssign for CircuitElem<F, B>
impl<F: Field, B: CircuitBuilder<Field = F>> AddAssign for CircuitElem<F, B>
Source§fn add_assign(&mut self, rhs: Self)
fn add_assign(&mut self, rhs: Self)
+= operation. Read moreSource§impl<F: Field, B: CircuitBuilder<Field = F>> AddAssign<&CircuitElem<F, B>> for CircuitElem<F, B>
impl<F: Field, B: CircuitBuilder<Field = F>> AddAssign<&CircuitElem<F, B>> for CircuitElem<F, B>
Source§fn add_assign(&mut self, rhs: &Self)
fn add_assign(&mut self, rhs: &Self)
+= operation. Read moreSource§impl<F: Field, B: CircuitBuilder<Field = F>> Clone for CircuitElem<F, B>
impl<F: Field, B: CircuitBuilder<Field = F>> Clone for CircuitElem<F, B>
Source§impl<F: Field, B: CircuitBuilder<Field = F>> Debug for CircuitElem<F, B>
impl<F: Field, B: CircuitBuilder<Field = F>> Debug for CircuitElem<F, B>
Source§impl<F: Field, B: CircuitBuilder<Field = F>> FieldOps for CircuitElem<F, B>
impl<F: Field, B: CircuitBuilder<Field = F>> FieldOps for CircuitElem<F, B>
type Scalar = F
Source§fn square_transpose<FSub: Field>(elems: &mut [Self])where
Self::Scalar: ExtensionField<FSub>,
fn square_transpose<FSub: Field>(elems: &mut [Self])where
Self::Scalar: ExtensionField<FSub>,
Source§impl<F: Field, B: CircuitBuilder<Field = F>> From<F> for CircuitElem<F, B>
impl<F: Field, B: CircuitBuilder<Field = F>> From<F> for CircuitElem<F, B>
Source§impl<F: Field, B: CircuitBuilder<Field = F>> InvertOrZero for CircuitElem<F, B>
impl<F: Field, B: CircuitBuilder<Field = F>> InvertOrZero for CircuitElem<F, B>
Source§fn invert_or_zero(self) -> Self
fn invert_or_zero(self) -> Self
Not implemented: nothing the wrapper runs inverts a value that may be zero.
The verifier’s own inversions are all of random challenges, which it argues are non-zero,
so they go through InvertOrZero::invert below. Constraining the zero case as well would
cost extra constraints on every one of them, to admit an input no caller has.
This panics while the circuit is being built rather than at proving time, so a caller that does need it fails loudly and can implement it then.
Source§impl<F: Field, B: CircuitBuilder<Field = F>> Mul for CircuitElem<F, B>
impl<F: Field, B: CircuitBuilder<Field = F>> Mul for CircuitElem<F, B>
Source§impl<F, B> Mul for &CircuitElem<F, B>where
F: Field,
B: CircuitBuilder<Field = F>,
impl<F, B> Mul for &CircuitElem<F, B>where
F: Field,
B: CircuitBuilder<Field = F>,
Source§impl<F, B> Mul<&CircuitElem<F, B>> for CircuitElem<F, B>where
F: Field,
B: CircuitBuilder<Field = F>,
impl<F, B> Mul<&CircuitElem<F, B>> for CircuitElem<F, B>where
F: Field,
B: CircuitBuilder<Field = F>,
Source§impl<F: Field, B: CircuitBuilder<Field = F>> MulAssign for CircuitElem<F, B>
impl<F: Field, B: CircuitBuilder<Field = F>> MulAssign for CircuitElem<F, B>
Source§fn mul_assign(&mut self, rhs: Self)
fn mul_assign(&mut self, rhs: Self)
*= operation. Read moreSource§impl<F: Field, B: CircuitBuilder<Field = F>> MulAssign<&CircuitElem<F, B>> for CircuitElem<F, B>
impl<F: Field, B: CircuitBuilder<Field = F>> MulAssign<&CircuitElem<F, B>> for CircuitElem<F, B>
Source§fn mul_assign(&mut self, rhs: &Self)
fn mul_assign(&mut self, rhs: &Self)
*= operation. Read moreSource§impl<F: Field, B: CircuitBuilder<Field = F>> Neg for CircuitElem<F, B>
impl<F: Field, B: CircuitBuilder<Field = F>> Neg for CircuitElem<F, B>
Source§impl<F: Field, B: CircuitBuilder<Field = F>> Product for CircuitElem<F, B>
impl<F: Field, B: CircuitBuilder<Field = F>> Product for CircuitElem<F, B>
Source§impl<'a, F: Field, B: CircuitBuilder<Field = F>> Product<&'a CircuitElem<F, B>> for CircuitElem<F, B>
impl<'a, F: Field, B: CircuitBuilder<Field = F>> Product<&'a CircuitElem<F, B>> for CircuitElem<F, B>
Source§impl<F: Field, B: CircuitBuilder<Field = F>> Square for CircuitElem<F, B>
impl<F: Field, B: CircuitBuilder<Field = F>> Square for CircuitElem<F, B>
Source§impl<F: Field, B: CircuitBuilder<Field = F>> Sub for CircuitElem<F, B>
impl<F: Field, B: CircuitBuilder<Field = F>> Sub for CircuitElem<F, B>
Source§impl<F, B> Sub for &CircuitElem<F, B>where
F: Field,
B: CircuitBuilder<Field = F>,
impl<F, B> Sub for &CircuitElem<F, B>where
F: Field,
B: CircuitBuilder<Field = F>,
Source§impl<F, B> Sub<&CircuitElem<F, B>> for CircuitElem<F, B>where
F: Field,
B: CircuitBuilder<Field = F>,
impl<F, B> Sub<&CircuitElem<F, B>> for CircuitElem<F, B>where
F: Field,
B: CircuitBuilder<Field = F>,
Source§impl<F: Field, B: CircuitBuilder<Field = F>> SubAssign for CircuitElem<F, B>
impl<F: Field, B: CircuitBuilder<Field = F>> SubAssign for CircuitElem<F, B>
Source§fn sub_assign(&mut self, rhs: Self)
fn sub_assign(&mut self, rhs: Self)
-= operation. Read moreSource§impl<F: Field, B: CircuitBuilder<Field = F>> SubAssign<&CircuitElem<F, B>> for CircuitElem<F, B>
impl<F: Field, B: CircuitBuilder<Field = F>> SubAssign<&CircuitElem<F, B>> for CircuitElem<F, B>
Source§fn sub_assign(&mut self, rhs: &Self)
fn sub_assign(&mut self, rhs: &Self)
-= operation. Read moreSource§impl<F: Field, B: CircuitBuilder<Field = F>> Sum for CircuitElem<F, B>
impl<F: Field, B: CircuitBuilder<Field = F>> Sum for CircuitElem<F, B>
Source§impl<'a, F: Field, B: CircuitBuilder<Field = F>> Sum<&'a CircuitElem<F, B>> for CircuitElem<F, B>
impl<'a, F: Field, B: CircuitBuilder<Field = F>> Sum<&'a CircuitElem<F, B>> for CircuitElem<F, B>
Auto Trait Implementations§
impl<F, B> !RefUnwindSafe for CircuitElem<F, B>
impl<F, B> !Send for CircuitElem<F, B>
impl<F, B> !Sync for CircuitElem<F, B>
impl<F, B> !UnwindSafe for CircuitElem<F, B>
impl<F, B> Freeze for CircuitElem<F, B>
impl<F, B> Unpin for CircuitElem<F, B>
impl<F, B> UnsafeUnpin for CircuitElem<F, B>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more