circomspect_program_structure/abstract_syntax_tree/
expression_builders.rs1use 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}