-
Notifications
You must be signed in to change notification settings - Fork 595
/
Copy pathcircuit.rs
46 lines (39 loc) · 1.42 KB
/
circuit.rs
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
use cairo_lang_casm::builder::CasmBuilder;
use cairo_lang_casm::casm_build_extend;
use cairo_lang_sierra::extensions::circuit::CircuitConcreteLibfunc;
use super::{CompiledInvocation, CompiledInvocationBuilder, InvocationError};
use crate::invocations::add_input_variables;
/// Builds instructions for Sierra array operations.
pub fn build(
libfunc: &CircuitConcreteLibfunc,
builder: CompiledInvocationBuilder<'_>,
) -> Result<CompiledInvocation, InvocationError> {
match libfunc {
CircuitConcreteLibfunc::InitCircuitData(_) => build_array_append(builder),
}
}
/// Handles a Sierra statement for appending an element to an array.
fn build_array_append(
builder: CompiledInvocationBuilder<'_>,
) -> Result<CompiledInvocation, InvocationError> {
let [expr_rc96] = builder.try_get_refs()?;
let rc96 = expr_rc96.try_unpack_single()?;
// TOOD(ilya): get n_inputs and n_vals from the libfunc.
let n_inputs = 1;
let n_vals = 2;
let mut casm_builder = CasmBuilder::default();
add_input_variables! {casm_builder,
buffer(1) rc96;
};
casm_build_extend! {casm_builder,
const n_inputs = n_inputs;
let inputs_end = rc96 + n_inputs;
const n_vals = n_vals;
let vals_end = rc96 + n_vals;
};
Ok(builder.build_from_casm_builder(
casm_builder,
[("Fallthrough", &[&[vals_end], &[rc96, inputs_end]], None)],
Default::default(),
))
}