circomspect_program_structure/abstract_syntax_tree/
expression_builders.rs

1use super::ast::*;
2use num_bigint::BigInt;
3use Expression::*;
4
5pub fn build_infix(
6    meta: Meta,
7    lhe: Expression,
8    infix_op: ExpressionInfixOpcode,
9    rhe: Expression,
10) -> Expression {
11    InfixOp { meta, infix_op, lhe: Box::new(lhe), rhe: Box::new(rhe) }
12}
13
14pub fn build_prefix(meta: Meta, prefix_op: ExpressionPrefixOpcode, rhe: Expression) -> Expression {
15    PrefixOp { meta, prefix_op, rhe: Box::new(rhe) }
16}
17
18pub fn build_inline_switch_op(
19    meta: Meta,
20    cond: Expression,
21    if_true: Expression,
22    if_false: Expression,
23) -> Expression {
24    InlineSwitchOp {
25        meta,
26        cond: Box::new(cond),
27        if_true: Box::new(if_true),
28        if_false: Box::new(if_false),
29    }
30}
31
32pub fn build_parallel_op(meta: Meta, rhe: Expression) -> Expression {
33    ParallelOp { meta, rhe: Box::new(rhe) }
34}
35
36pub fn build_variable(meta: Meta, name: String, access: Vec<Access>) -> Expression {
37    Variable { meta, name, access }
38}
39
40pub fn build_number(meta: Meta, value: BigInt) -> Expression {
41    Number(meta, value)
42}
43
44pub fn build_call(meta: Meta, id: String, args: Vec<Expression>) -> Expression {
45    Call { meta, id, args }
46}
47
48pub fn build_anonymous_component(
49    meta: Meta,
50    id: String,
51    params: Vec<Expression>,
52    signals: Vec<Expression>,
53    names: Option<Vec<(AssignOp, String)>>,
54    is_parallel: bool,
55) -> Expression {
56    AnonymousComponent { meta, id, params, signals, names, is_parallel }
57}
58
59pub fn build_array_in_line(meta: Meta, values: Vec<Expression>) -> Expression {
60    ArrayInLine { meta, values }
61}
62
63pub fn build_tuple(meta: Meta, values: Vec<Expression>) -> Expression {
64    Tuple { meta, values }
65}
66
67pub fn unzip_3(
68    vec: Vec<(String, AssignOp, Expression)>,
69) -> (Vec<(AssignOp, String)>, Vec<Expression>) {
70    let mut op_name = Vec::new();
71    let mut exprs = Vec::new();
72    for i in vec {
73        op_name.push((i.1, i.0));
74        exprs.push(i.2);
75    }
76    (op_name, exprs)
77}