1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
use crate::{
errors::ExpressionError,
program::ConstrainedProgram,
value::{ConstrainedCircuitMember, ConstrainedValue},
GroupType,
};
use leo_asg::{CircuitInitExpression, CircuitMemberBody, Span};
use snarkvm_models::{
curves::{Field, PrimeField},
gadgets::r1cs::ConstraintSystem,
};
impl<F: Field + PrimeField, G: GroupType<F>> ConstrainedProgram<F, G> {
pub fn enforce_circuit<CS: ConstraintSystem<F>>(
&mut self,
cs: &mut CS,
expr: &CircuitInitExpression,
span: &Span,
) -> Result<ConstrainedValue<F, G>, ExpressionError> {
let circuit = expr
.circuit
.body
.borrow()
.upgrade()
.expect("circuit init stale circuit ref");
let members = circuit.members.borrow();
let mut resolved_members = Vec::with_capacity(members.len());
for (name, inner) in expr.values.iter() {
let target = members
.get(&name.name)
.expect("illegal name in asg circuit init expression");
match target {
CircuitMemberBody::Variable(_type_) => {
let variable_value = self.enforce_expression(cs, inner)?;
resolved_members.push(ConstrainedCircuitMember(name.clone(), variable_value));
}
_ => return Err(ExpressionError::expected_circuit_member(name.to_string(), span.clone())),
}
}
let value = ConstrainedValue::CircuitExpression(circuit.clone(), resolved_members);
Ok(value)
}
}