From f8d63e3a38bb02131a000dd23573750045330a39 Mon Sep 17 00:00:00 2001 From: schaeff Date: Tue, 23 Apr 2019 17:56:19 +0200 Subject: [PATCH 001/162] rename prog to module in absy --- zokrates_core/src/absy/mod.rs | 12 +++++----- zokrates_core/src/absy/node.rs | 2 +- zokrates_core/src/compile.rs | 24 +++++++++---------- zokrates_core/src/imports.rs | 6 ++--- zokrates_core/src/parser/mod.rs | 2 +- zokrates_core/src/parser/parse/mod.rs | 4 ++-- .../parser/parse/{program.rs => module.rs} | 6 ++--- zokrates_core/src/semantics.rs | 13 ++++++---- 8 files changed, 35 insertions(+), 34 deletions(-) rename zokrates_core/src/parser/parse/{program.rs => module.rs} (93%) diff --git a/zokrates_core/src/absy/mod.rs b/zokrates_core/src/absy/mod.rs index a60f7ab01..7c5a87dd4 100644 --- a/zokrates_core/src/absy/mod.rs +++ b/zokrates_core/src/absy/mod.rs @@ -20,14 +20,14 @@ use std::fmt; use zokrates_field::field::Field; #[derive(Clone, PartialEq)] -pub struct Prog { - /// Functions of the program +pub struct Module { + /// Functions of the module pub functions: Vec>, pub imports: Vec, pub imported_functions: Vec>, } -impl fmt::Display for Prog { +impl fmt::Display for Module { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { let mut res = vec![]; res.extend( @@ -52,11 +52,11 @@ impl fmt::Display for Prog { } } -impl fmt::Debug for Prog { +impl fmt::Debug for Module { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!( f, - "program(\n\timports:\n\t\t{}\n\tfunctions:\n\t\t{}{}\n)", + "module(\n\timports:\n\t\t{}\n\tfunctions:\n\t\t{}{}\n)", self.imports .iter() .map(|x| format!("{:?}", x)) @@ -78,7 +78,7 @@ impl fmt::Debug for Prog { #[derive(Clone, PartialEq)] pub struct Function { - /// Name of the program + /// Name of the module pub id: String, /// Arguments of the function pub arguments: Vec, diff --git a/zokrates_core/src/absy/node.rs b/zokrates_core/src/absy/node.rs index f8f46884a..80e7a47ed 100644 --- a/zokrates_core/src/absy/node.rs +++ b/zokrates_core/src/absy/node.rs @@ -50,7 +50,7 @@ impl NodeValue for ExpressionList {} impl NodeValue for Assignee {} impl NodeValue for Statement {} impl NodeValue for Function {} -impl NodeValue for Prog {} +impl NodeValue for Module {} impl NodeValue for Variable {} impl NodeValue for Parameter {} impl NodeValue for Import {} diff --git a/zokrates_core/src/compile.rs b/zokrates_core/src/compile.rs index 54a90d164..dac146034 100644 --- a/zokrates_core/src/compile.rs +++ b/zokrates_core/src/compile.rs @@ -3,13 +3,13 @@ //! @file compile.rs //! @author Thibaut Schaeffer //! @date 2018 -use crate::absy::Prog; +use crate::absy::Module; use crate::flat_absy::FlatProg; use crate::flatten::Flattener; use crate::imports::{self, Importer}; use crate::ir; use crate::optimizer::Optimize; -use crate::parser::{self, parse_program}; +use crate::parser::{self, parse_module}; use crate::semantics::{self, Checker}; use crate::static_analysis::Analyse; use std::fmt; @@ -137,7 +137,7 @@ pub fn compile_aux>( location: Option, resolve_option: Option, &String) -> Result<(S, String, String), E>>, ) -> Result, CompileErrors> { - let program_ast_without_imports: Prog = parse_program(reader) + let program_ast_without_imports: Module = parse_module(reader) .map_err(|e| CompileErrors::from(CompileErrorInner::from(e).with_context(&location)))?; let program_ast = Importer::new().apply_imports( @@ -147,16 +147,14 @@ pub fn compile_aux>( )?; // check semantics - let typed_ast = Checker::new() - .check_program(program_ast) - .map_err(|errors| { - CompileErrors( - errors - .into_iter() - .map(|e| CompileErrorInner::from(e).with_context(&location)) - .collect(), - ) - })?; + let typed_ast = Checker::new().check_module(program_ast).map_err(|errors| { + CompileErrors( + errors + .into_iter() + .map(|e| CompileErrorInner::from(e).with_context(&location)) + .collect(), + ) + })?; // analyse (unroll and constant propagation) let typed_ast = typed_ast.analyse(); diff --git a/zokrates_core/src/imports.rs b/zokrates_core/src/imports.rs index 7f7439362..8f3af54aa 100644 --- a/zokrates_core/src/imports.rs +++ b/zokrates_core/src/imports.rs @@ -129,10 +129,10 @@ impl Importer { pub fn apply_imports>( &self, - destination: Prog, + destination: Module, location: Option, resolve_option: Option, &String) -> Result<(S, String, String), E>>, - ) -> Result, CompileErrors> { + ) -> Result, CompileErrors> { let mut origins: Vec> = vec![]; for import in destination.imports.iter() { @@ -217,7 +217,7 @@ impl Importer { } } - Ok(Prog { + Ok(Module { imports: vec![], functions: destination.clone().functions, imported_functions: origins.into_iter().map(|o| o.flat_func).collect(), diff --git a/zokrates_core/src/parser/mod.rs b/zokrates_core/src/parser/mod.rs index cddad4788..6f64a7ca6 100644 --- a/zokrates_core/src/parser/mod.rs +++ b/zokrates_core/src/parser/mod.rs @@ -3,5 +3,5 @@ mod parse; mod tokenize; pub use crate::parser::error::Error; -pub use crate::parser::parse::parse_program; +pub use crate::parser::parse::parse_module; pub use crate::parser::tokenize::Position; diff --git a/zokrates_core/src/parser/parse/mod.rs b/zokrates_core/src/parser/parse/mod.rs index 50f2ef57b..52d031c77 100644 --- a/zokrates_core/src/parser/parse/mod.rs +++ b/zokrates_core/src/parser/parse/mod.rs @@ -2,7 +2,7 @@ mod expression; mod expression_list; mod function; mod import; -mod program; +mod module; mod statement; -pub use self::program::parse_program; +pub use self::module::parse_module; diff --git a/zokrates_core/src/parser/parse/program.rs b/zokrates_core/src/parser/parse/module.rs similarity index 93% rename from zokrates_core/src/parser/parse/program.rs rename to zokrates_core/src/parser/parse/module.rs index 16d634f26..22e6ccc13 100644 --- a/zokrates_core/src/parser/parse/program.rs +++ b/zokrates_core/src/parser/parse/module.rs @@ -8,9 +8,9 @@ use crate::parser::tokenize::{next_token, Position, Token}; use super::function::parse_function; use super::import::parse_import; -use crate::absy::Prog; +use crate::absy::Module; -pub fn parse_program(reader: &mut R) -> Result, Error> { +pub fn parse_module(reader: &mut R) -> Result, Error> { let mut current_line = 1; let mut lines = reader.lines(); let mut functions = Vec::new(); @@ -55,7 +55,7 @@ pub fn parse_program(reader: &mut R) -> Result, Er } } - Ok(Prog { + Ok(Module { functions, imports, imported_functions: vec![], diff --git a/zokrates_core/src/semantics.rs b/zokrates_core/src/semantics.rs index 957e4e0d2..33e0c2789 100644 --- a/zokrates_core/src/semantics.rs +++ b/zokrates_core/src/semantics.rs @@ -135,8 +135,11 @@ impl Checker { } } - pub fn check_program(&mut self, prog: Prog) -> Result, Vec> { - for func in &prog.imported_functions { + pub fn check_module( + &mut self, + module: Module, + ) -> Result, Vec> { + for func in &module.imported_functions { self.functions.insert(FunctionDeclaration { id: func.id.clone(), signature: func.signature.clone(), @@ -146,7 +149,7 @@ impl Checker { let mut errors = vec![]; let mut checked_functions = vec![]; - for func in prog.functions { + for func in module.functions { self.enter_scope(); let dec = FunctionDeclaration { @@ -177,8 +180,8 @@ impl Checker { Ok(TypedProg { functions: checked_functions, - imported_functions: prog.imported_functions, - imports: prog.imports.into_iter().map(|i| i.value).collect(), + imported_functions: module.imported_functions, + imports: module.imports.into_iter().map(|i| i.value).collect(), }) } From 5f83bc86e7e7c2157dfdebb117c77916f4f46938 Mon Sep 17 00:00:00 2001 From: schaeff Date: Wed, 8 May 2019 17:42:32 +0200 Subject: [PATCH 002/162] introduce FunctionSymbol and adapt local functions --- zokrates_core/src/absy/mod.rs | 39 +++++++++++++++++++++--- zokrates_core/src/absy/node.rs | 1 + zokrates_core/src/parser/parse/module.rs | 7 +++-- zokrates_core/src/semantics.rs | 26 ++++++++++------ 4 files changed, 57 insertions(+), 16 deletions(-) diff --git a/zokrates_core/src/absy/mod.rs b/zokrates_core/src/absy/mod.rs index 7c5a87dd4..3de8a3a2d 100644 --- a/zokrates_core/src/absy/mod.rs +++ b/zokrates_core/src/absy/mod.rs @@ -19,14 +19,45 @@ use crate::imports::ImportNode; use std::fmt; use zokrates_field::field::Field; +use std::rc::Rc; + +type Identifier = String; +type Alias = String; + #[derive(Clone, PartialEq)] pub struct Module { /// Functions of the module - pub functions: Vec>, + pub functions: Vec<(Identifier, FunctionSymbolNode)>, pub imports: Vec, pub imported_functions: Vec>, } +#[derive(Debug, Clone, PartialEq)] +pub enum FunctionSymbol { + Here(FunctionNode), + There(Option, Identifier, Rc>), +} + +impl FunctionSymbol { + pub fn signature(&self) -> Signature { + match self { + FunctionSymbol::Here(func_node) => func_node.value.signature.clone(), + _ => unimplemented!(), + } + } +} + +pub type FunctionSymbolNode = Node>; + +impl fmt::Display for FunctionSymbol { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match self { + FunctionSymbol::Here(fun_node) => write!(f, "{}", fun_node), + _ => unimplemented!(), + } + } +} + impl fmt::Display for Module { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { let mut res = vec![]; @@ -45,7 +76,7 @@ impl fmt::Display for Module { res.extend( self.functions .iter() - .map(|x| format!("{}", x)) + .map(|x| format!("{}", x.1)) .collect::>(), ); write!(f, "{}", res.join("\n")) @@ -78,8 +109,8 @@ impl fmt::Debug for Module { #[derive(Clone, PartialEq)] pub struct Function { - /// Name of the module - pub id: String, + /// Name of the function + pub id: Identifier, /// Arguments of the function pub arguments: Vec, /// Vector of statements that are executed when running the function diff --git a/zokrates_core/src/absy/node.rs b/zokrates_core/src/absy/node.rs index 80e7a47ed..38cb0c240 100644 --- a/zokrates_core/src/absy/node.rs +++ b/zokrates_core/src/absy/node.rs @@ -51,6 +51,7 @@ impl NodeValue for Assignee {} impl NodeValue for Statement {} impl NodeValue for Function {} impl NodeValue for Module {} +impl NodeValue for FunctionSymbol {} impl NodeValue for Variable {} impl NodeValue for Parameter {} impl NodeValue for Import {} diff --git a/zokrates_core/src/parser/parse/module.rs b/zokrates_core/src/parser/parse/module.rs index 22e6ccc13..5861afd18 100644 --- a/zokrates_core/src/parser/parse/module.rs +++ b/zokrates_core/src/parser/parse/module.rs @@ -8,7 +8,7 @@ use crate::parser::tokenize::{next_token, Position, Token}; use super::function::parse_function; use super::import::parse_import; -use crate::absy::Module; +use crate::absy::{FunctionSymbol, Module, NodeValue}; pub fn parse_module(reader: &mut R) -> Result, Error> { let mut current_line = 1; @@ -36,7 +36,10 @@ pub fn parse_module(reader: &mut R) -> Result, E }, (Token::Def, ref s1, ref p1) => match parse_function(&mut lines, s1, p1) { Ok((function, p2)) => { - functions.push(function); + functions.push(( + function.value.id.clone(), + FunctionSymbol::Here(function).at(0, 0, 0), + )); current_line = p2.line; // this is the line of the return statement current_line += 1; } diff --git a/zokrates_core/src/semantics.rs b/zokrates_core/src/semantics.rs index 33e0c2789..2a7890a68 100644 --- a/zokrates_core/src/semantics.rs +++ b/zokrates_core/src/semantics.rs @@ -149,22 +149,28 @@ impl Checker { let mut errors = vec![]; let mut checked_functions = vec![]; - for func in module.functions { + for (id, func) in module.functions { self.enter_scope(); let dec = FunctionDeclaration { - id: func.value.id.clone(), - signature: func.value.signature.clone(), + id, + signature: func.value.signature(), }; - match self.check_function(func) { - Ok(checked_function) => { - checked_functions.push(checked_function); - } - Err(e) => { - errors.extend(e); + match func.value { + FunctionSymbol::Here(func_node) => { + match self.check_function(func_node) { + Ok(checked_function) => { + checked_functions.push(checked_function); + } + Err(e) => { + errors.extend(e); + } + }; } - }; + _ => unimplemented!(), + } + self.functions.insert(dec); self.exit_scope(); } From c6219be41d7b489e2e0d5c75e84674204bb223db Mon Sep 17 00:00:00 2001 From: schaeff Date: Mon, 13 May 2019 20:59:54 +0200 Subject: [PATCH 003/162] process external functions in semantics --- zokrates_core/src/absy/mod.rs | 12 +-- zokrates_core/src/semantics.rs | 135 ++++++++++++++++++++++++++++----- 2 files changed, 116 insertions(+), 31 deletions(-) diff --git a/zokrates_core/src/absy/mod.rs b/zokrates_core/src/absy/mod.rs index 3de8a3a2d..49d6265a5 100644 --- a/zokrates_core/src/absy/mod.rs +++ b/zokrates_core/src/absy/mod.rs @@ -22,7 +22,6 @@ use zokrates_field::field::Field; use std::rc::Rc; type Identifier = String; -type Alias = String; #[derive(Clone, PartialEq)] pub struct Module { @@ -35,16 +34,7 @@ pub struct Module { #[derive(Debug, Clone, PartialEq)] pub enum FunctionSymbol { Here(FunctionNode), - There(Option, Identifier, Rc>), -} - -impl FunctionSymbol { - pub fn signature(&self) -> Signature { - match self { - FunctionSymbol::Here(func_node) => func_node.value.signature.clone(), - _ => unimplemented!(), - } - } + There(Identifier, Rc>), } pub type FunctionSymbolNode = Node>; diff --git a/zokrates_core/src/semantics.rs b/zokrates_core/src/semantics.rs index 2a7890a68..3905c0ffd 100644 --- a/zokrates_core/src/semantics.rs +++ b/zokrates_core/src/semantics.rs @@ -152,26 +152,20 @@ impl Checker { for (id, func) in module.functions { self.enter_scope(); - let dec = FunctionDeclaration { - id, - signature: func.value.signature(), - }; - - match func.value { - FunctionSymbol::Here(func_node) => { - match self.check_function(func_node) { - Ok(checked_function) => { - checked_functions.push(checked_function); - } - Err(e) => { - errors.extend(e); - } - }; + match self.check_function_symbol(func) { + Ok(checked_function) => { + self.functions + .extend(checked_function.iter().map(|f| FunctionDeclaration { + signature: f.signature.clone(), + id: id.clone(), + })); + checked_functions.extend(checked_function.into_iter()); + } + Err(e) => { + errors.extend(e); } - _ => unimplemented!(), } - self.functions.insert(dec); self.exit_scope(); } @@ -286,6 +280,36 @@ impl Checker { }) } + fn check_function_symbol( + &mut self, + funct_symbol_node: FunctionSymbolNode, + ) -> Result>, Vec> { + let pos = funct_symbol_node.pos(); + let funct_symbol = funct_symbol_node.value; + + match funct_symbol { + FunctionSymbol::Here(funct_node) => self.check_function(funct_node).map(|f| vec![f]), + FunctionSymbol::There(id, module) => { + // this is where we check that there are functions at the other end of the import + let candidates: Result, Vec<_>> = module + .functions + .iter() + .filter(|(i, _)| *i == id) + .map(|(_, f)| self.check_function_symbol(f.clone())) + .collect(); // TODO not clone + let candidates: Vec<_> = candidates?.into_iter().flat_map(|x| x).collect(); + + match candidates.len() { + 0 => Err(vec![Error { + pos: Some(pos), + message: format!("Function {} not found in module {}", id, "TODO"), + }]), + _ => Ok(candidates), + } + } + } + } + fn check_statement( &mut self, stat: &StatementNode, @@ -962,9 +986,80 @@ impl Checker { #[cfg(test)] mod tests { - // use super::*; - // use absy::parameter::Parameter; - // use zokrates_field::field::FieldPrime; + use super::*; + //use absy::parameter::Parameter; + use std::rc::Rc; + use zokrates_field::field::FieldPrime; + + mod symbols { + use super::*; + + #[test] + fn imported_symbol() { + // foo.code + // def main() -> (field): + // return 1 + + // bar.code + // from "./foo.code" import main + + // after semantic check, bar should have one function which returns one (imported from foo.rs) + + let foo: Module = Module { + functions: vec![( + String::from("main"), + FunctionSymbol::Here( + Function { + id: String::from("main"), + statements: vec![Statement::Return( + ExpressionList { + expressions: vec![ + Expression::Number(FieldPrime::from(1)).at(0, 0, 0) + ], + } + .at(0, 0, 0), + ) + .at(0, 0, 0)], + signature: Signature::new().outputs(vec![Type::FieldElement]), + arguments: vec![], + } + .at(0, 0, 0), + ) + .at(0, 0, 0), + )], + imported_functions: vec![], + imports: vec![], + }; + + let bar: Module = Module { + functions: vec![( + String::from("main"), + FunctionSymbol::There(String::from("main"), Rc::new(foo)).at(0, 0, 0), + )], + imported_functions: vec![], + imports: vec![], + }; + + let mut checker = Checker::new(); + + let checked_bar = checker.check_module(bar); + assert_eq!( + checked_bar, + Ok(TypedProg { + functions: vec![TypedFunction { + id: String::from("main"), + signature: Signature::new().outputs(vec![Type::FieldElement]), + arguments: vec![], + statements: vec![TypedStatement::Return(vec![ + FieldElementExpression::Number(FieldPrime::from(1)).into() + ])] + }], + imported_functions: vec![], + imports: vec![] + }) + ); + } + } // pub fn new_with_args( // scope: HashSet, From ba0a740b7318ee531f4be57591f06f7203e4a367 Mon Sep 17 00:00:00 2001 From: schaeff Date: Mon, 13 May 2019 23:09:02 +0200 Subject: [PATCH 004/162] use hashmap for typed ast functions. WIP --- zokrates_core/src/flatten/mod.rs | 2 +- zokrates_core/src/semantics.rs | 112 ++++-------------- .../src/static_analysis/dead_code.rs | 2 +- zokrates_core/src/static_analysis/inline.rs | 13 +- zokrates_core/src/typed_absy/folder.rs | 2 +- zokrates_core/src/typed_absy/mod.rs | 15 ++- 6 files changed, 44 insertions(+), 102 deletions(-) diff --git a/zokrates_core/src/flatten/mod.rs b/zokrates_core/src/flatten/mod.rs index 6813940fb..aff89998e 100644 --- a/zokrates_core/src/flatten/mod.rs +++ b/zokrates_core/src/flatten/mod.rs @@ -1285,7 +1285,7 @@ impl Flattener { functions_flattened.push(func); } - for func in prog.functions { + for func in prog.functions.into_iter().map(|(_, v)| v) { let flattened_func = self.flatten_function(&mut functions_flattened, func); functions_flattened.push(flattened_func); } diff --git a/zokrates_core/src/semantics.rs b/zokrates_core/src/semantics.rs index 3905c0ffd..dc25e9bf3 100644 --- a/zokrates_core/src/semantics.rs +++ b/zokrates_core/src/semantics.rs @@ -152,18 +152,24 @@ impl Checker { for (id, func) in module.functions { self.enter_scope(); - match self.check_function_symbol(func) { - Ok(checked_function) => { - self.functions - .extend(checked_function.iter().map(|f| FunctionDeclaration { - signature: f.signature.clone(), - id: id.clone(), - })); - checked_functions.extend(checked_function.into_iter()); - } - Err(e) => { - errors.extend(e); + match func.value.signature() { + Some(signature) => { + let dec = FunctionDeclaration { id, signature }; + + match self.check_function_symbol(func) { + Ok(checked_function) => { + checked_functions.extend(checked_function.into_iter()); + } + Err(e) => { + errors.extend(e); + } + } + + self.functions.insert(dec); } + None => unimplemented!( + "a function having no signature should probably add an error to the list" + ), } self.exit_scope(); @@ -284,12 +290,11 @@ impl Checker { &mut self, funct_symbol_node: FunctionSymbolNode, ) -> Result>, Vec> { - let pos = funct_symbol_node.pos(); let funct_symbol = funct_symbol_node.value; match funct_symbol { FunctionSymbol::Here(funct_node) => self.check_function(funct_node).map(|f| vec![f]), - FunctionSymbol::There(id, module) => { + FunctionSymbol::There(alias, id, module) => { // this is where we check that there are functions at the other end of the import let candidates: Result, Vec<_>> = module .functions @@ -297,11 +302,11 @@ impl Checker { .filter(|(i, _)| *i == id) .map(|(_, f)| self.check_function_symbol(f.clone())) .collect(); // TODO not clone - let candidates: Vec<_> = candidates?.into_iter().flat_map(|x| x).collect(); + let candidates = candidates?.into_iter().flat_map(|x| x).collect(); match candidates.len() { 0 => Err(vec![Error { - pos: Some(pos), + pos: Some(funct_symbol_node.pos()), message: format!("Function {} not found in module {}", id, "TODO"), }]), _ => Ok(candidates), @@ -986,80 +991,9 @@ impl Checker { #[cfg(test)] mod tests { - use super::*; - //use absy::parameter::Parameter; - use std::rc::Rc; - use zokrates_field::field::FieldPrime; - - mod symbols { - use super::*; - - #[test] - fn imported_symbol() { - // foo.code - // def main() -> (field): - // return 1 - - // bar.code - // from "./foo.code" import main - - // after semantic check, bar should have one function which returns one (imported from foo.rs) - - let foo: Module = Module { - functions: vec![( - String::from("main"), - FunctionSymbol::Here( - Function { - id: String::from("main"), - statements: vec![Statement::Return( - ExpressionList { - expressions: vec![ - Expression::Number(FieldPrime::from(1)).at(0, 0, 0) - ], - } - .at(0, 0, 0), - ) - .at(0, 0, 0)], - signature: Signature::new().outputs(vec![Type::FieldElement]), - arguments: vec![], - } - .at(0, 0, 0), - ) - .at(0, 0, 0), - )], - imported_functions: vec![], - imports: vec![], - }; - - let bar: Module = Module { - functions: vec![( - String::from("main"), - FunctionSymbol::There(String::from("main"), Rc::new(foo)).at(0, 0, 0), - )], - imported_functions: vec![], - imports: vec![], - }; - - let mut checker = Checker::new(); - - let checked_bar = checker.check_module(bar); - assert_eq!( - checked_bar, - Ok(TypedProg { - functions: vec![TypedFunction { - id: String::from("main"), - signature: Signature::new().outputs(vec![Type::FieldElement]), - arguments: vec![], - statements: vec![TypedStatement::Return(vec![ - FieldElementExpression::Number(FieldPrime::from(1)).into() - ])] - }], - imported_functions: vec![], - imports: vec![] - }) - ); - } - } + // use super::*; + // use absy::parameter::Parameter; + // use zokrates_field::field::FieldPrime; // pub fn new_with_args( // scope: HashSet, diff --git a/zokrates_core/src/static_analysis/dead_code.rs b/zokrates_core/src/static_analysis/dead_code.rs index a8c74e740..6e5455c30 100644 --- a/zokrates_core/src/static_analysis/dead_code.rs +++ b/zokrates_core/src/static_analysis/dead_code.rs @@ -30,7 +30,7 @@ impl Folder for DeadCode { functions: p .functions .into_iter() - .filter(|f| f.id == "main" || self.called.contains(&f.to_slug())) + .filter(|(key, f)| key.id == "main" || self.called.contains(&f.to_slug())) .collect(), ..p } diff --git a/zokrates_core/src/static_analysis/inline.rs b/zokrates_core/src/static_analysis/inline.rs index 11a63af13..89461cb15 100644 --- a/zokrates_core/src/static_analysis/inline.rs +++ b/zokrates_core/src/static_analysis/inline.rs @@ -6,7 +6,7 @@ use std::collections::HashMap; use zokrates_field::field::Field; pub struct Inliner { - functions: Vec>, + functions: HashMap>, statements_buffer: Vec>, context: Vec<(String, usize)>, call_count: HashMap, @@ -15,7 +15,7 @@ pub struct Inliner { impl Inliner { pub fn new() -> Self { Inliner { - functions: vec![], + functions: HashMap::new(), statements_buffer: vec![], context: vec![], call_count: HashMap::new(), @@ -132,11 +132,10 @@ impl Folder for Inliner { .outputs(types.clone()); // find the function - let function = self - .functions - .iter() - .find(|f| f.id == id && f.signature == passed_signature) - .cloned(); + let function = self.functions.get(&FunctionKey { + signature: passed_signature, + id, + }); match self.should_inline(&function, &exps) { true => { diff --git a/zokrates_core/src/typed_absy/folder.rs b/zokrates_core/src/typed_absy/folder.rs index 537d2a90a..acf401f6c 100644 --- a/zokrates_core/src/typed_absy/folder.rs +++ b/zokrates_core/src/typed_absy/folder.rs @@ -86,7 +86,7 @@ pub fn fold_program>(f: &mut F, p: TypedProg) -> Typed functions: p .functions .into_iter() - .map(|fun| f.fold_function(fun)) + .map(|(key, fun)| (key, f.fold_function(fun))) .collect(), ..p } diff --git a/zokrates_core/src/typed_absy/mod.rs b/zokrates_core/src/typed_absy/mod.rs index a967c9c16..131ddb579 100644 --- a/zokrates_core/src/typed_absy/mod.rs +++ b/zokrates_core/src/typed_absy/mod.rs @@ -12,6 +12,7 @@ mod variable; pub use crate::typed_absy::parameter::Parameter; pub use crate::typed_absy::variable::Variable; use crate::types::Signature; +use std::collections::HashMap; use crate::flat_absy::*; use crate::imports::Import; @@ -21,14 +22,22 @@ use zokrates_field::field::Field; pub use self::folder::Folder; -#[derive(Clone, PartialEq)] +type Identifier = String; + +#[derive(PartialEq)] pub struct TypedProg { /// Functions of the program - pub functions: Vec>, + pub functions: HashMap>, pub imports: Vec, pub imported_functions: Vec>, } +#[derive(PartialEq, Eq, Hash, Debug, Clone)] +pub struct FunctionKey { + pub id: Identifier, + pub signature: Signature, +} + impl fmt::Display for TypedProg { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { let mut res = vec![]; @@ -46,7 +55,7 @@ impl fmt::Display for TypedProg { ); res.extend( self.functions - .iter() + .values() .map(|x| format!("{}", x)) .collect::>(), ); From e50364063a784920048a3197010273b2848c955f Mon Sep 17 00:00:00 2001 From: schaeff Date: Tue, 14 May 2019 13:41:33 +0200 Subject: [PATCH 005/162] complete switch to hashmap --- zokrates_core/src/semantics.rs | 151 ++++++++++++++------ zokrates_core/src/static_analysis/inline.rs | 23 +-- 2 files changed, 124 insertions(+), 50 deletions(-) diff --git a/zokrates_core/src/semantics.rs b/zokrates_core/src/semantics.rs index dc25e9bf3..1c08322f0 100644 --- a/zokrates_core/src/semantics.rs +++ b/zokrates_core/src/semantics.rs @@ -9,8 +9,7 @@ use crate::absy::variable::Variable; use crate::absy::*; use crate::typed_absy::*; -use crate::types::Signature; -use std::collections::HashSet; +use std::collections::{HashMap, HashSet}; use std::fmt; use zokrates_field::field::Field; @@ -74,7 +73,7 @@ impl FunctionQuery { } } - fn match_func(&self, func: &FunctionDeclaration) -> bool { + fn match_func(&self, func: &FunctionKey) -> bool { self.id == func.id && self.inputs == func.signature.inputs && self.outputs.len() == func.signature.outputs.len() @@ -84,7 +83,7 @@ impl FunctionQuery { }) } - fn match_funcs(&self, funcs: &HashSet) -> Vec { + fn match_funcs(&self, funcs: &HashSet) -> Vec { funcs .iter() .filter(|func| self.match_func(func)) @@ -113,16 +112,10 @@ impl PartialEq for ScopedVariable { } impl Eq for ScopedVariable {} -#[derive(Clone, PartialEq, Eq, Hash, Debug)] -pub struct FunctionDeclaration { - id: String, - signature: Signature, -} - // Checker, checks the semantics of a program. pub struct Checker { scope: HashSet, - functions: HashSet, + functions: HashSet, level: usize, } @@ -140,36 +133,38 @@ impl Checker { module: Module, ) -> Result, Vec> { for func in &module.imported_functions { - self.functions.insert(FunctionDeclaration { + self.functions.insert(FunctionKey { id: func.id.clone(), signature: func.signature.clone(), }); } let mut errors = vec![]; - let mut checked_functions = vec![]; + let mut checked_functions = HashMap::new(); for (id, func) in module.functions { self.enter_scope(); - match func.value.signature() { - Some(signature) => { - let dec = FunctionDeclaration { id, signature }; - - match self.check_function_symbol(func) { - Ok(checked_function) => { - checked_functions.extend(checked_function.into_iter()); - } - Err(e) => { - errors.extend(e); - } - } - - self.functions.insert(dec); + match self.check_function_symbol(func) { + Ok(checked_function) => { + self.functions + .extend(checked_function.iter().map(|f| FunctionKey { + signature: f.signature.clone(), + id: id.clone(), + })); + checked_functions.extend(checked_function.into_iter().map(|f| { + ( + FunctionKey { + signature: f.signature.clone(), + id: id.clone(), + }, + f, + ) + })); + } + Err(e) => { + errors.extend(e); } - None => unimplemented!( - "a function having no signature should probably add an error to the list" - ), } self.exit_scope(); @@ -290,11 +285,12 @@ impl Checker { &mut self, funct_symbol_node: FunctionSymbolNode, ) -> Result>, Vec> { + let pos = funct_symbol_node.pos(); let funct_symbol = funct_symbol_node.value; match funct_symbol { FunctionSymbol::Here(funct_node) => self.check_function(funct_node).map(|f| vec![f]), - FunctionSymbol::There(alias, id, module) => { + FunctionSymbol::There(id, module) => { // this is where we check that there are functions at the other end of the import let candidates: Result, Vec<_>> = module .functions @@ -302,11 +298,11 @@ impl Checker { .filter(|(i, _)| *i == id) .map(|(_, f)| self.check_function_symbol(f.clone())) .collect(); // TODO not clone - let candidates = candidates?.into_iter().flat_map(|x| x).collect(); + let candidates: Vec<_> = candidates?.into_iter().flat_map(|x| x).collect(); match candidates.len() { 0 => Err(vec![Error { - pos: Some(funct_symbol_node.pos()), + pos: Some(pos), message: format!("Function {} not found in module {}", id, "TODO"), }]), _ => Ok(candidates), @@ -973,7 +969,7 @@ impl Checker { }) } - fn find_candidates(&self, query: &FunctionQuery) -> Vec { + fn find_candidates(&self, query: &FunctionQuery) -> Vec { query.match_funcs(&self.functions) } @@ -991,14 +987,85 @@ impl Checker { #[cfg(test)] mod tests { - // use super::*; - // use absy::parameter::Parameter; - // use zokrates_field::field::FieldPrime; + use super::*; + //use absy::parameter::Parameter; + use std::rc::Rc; + use zokrates_field::field::FieldPrime; + + mod symbols { + use super::*; + + #[test] + fn imported_symbol() { + // foo.code + // def main() -> (field): + // return 1 + + // bar.code + // from "./foo.code" import main + + // after semantic check, bar should have one function which returns one (imported from foo.rs) + + let foo: Module = Module { + functions: vec![( + String::from("main"), + FunctionSymbol::Here( + Function { + id: String::from("main"), + statements: vec![Statement::Return( + ExpressionList { + expressions: vec![ + Expression::Number(FieldPrime::from(1)).at(0, 0, 0) + ], + } + .at(0, 0, 0), + ) + .at(0, 0, 0)], + signature: Signature::new().outputs(vec![Type::FieldElement]), + arguments: vec![], + } + .at(0, 0, 0), + ) + .at(0, 0, 0), + )], + imported_functions: vec![], + imports: vec![], + }; + + let bar: Module = Module { + functions: vec![( + String::from("main"), + FunctionSymbol::There(String::from("main"), Rc::new(foo)).at(0, 0, 0), + )], + imported_functions: vec![], + imports: vec![], + }; + + let mut checker = Checker::new(); + + let checked_bar = checker.check_module(bar); + assert_eq!( + checked_bar, + Ok(TypedProg { + functions: vec![TypedFunction { + id: String::from("main"), + signature: Signature::new().outputs(vec![Type::FieldElement]), + arguments: vec![], + statements: vec![TypedStatement::Return(vec![ + FieldElementExpression::Number(FieldPrime::from(1)).into() + ])] + }], + imported_functions: vec![], + imports: vec![] + }) + ); + } + } // pub fn new_with_args( // scope: HashSet, // level: usize, - // functions: HashSet, + // functions: HashSet, // ) -> Checker { // Checker { // scope: scope, @@ -1301,7 +1368,7 @@ mod tests { // ), // ]; - // let foo = FunctionDeclaration { + // let foo = FunctionKey { // id: "foo".to_string(), // signature: Signature { // inputs: vec![], @@ -1345,7 +1412,7 @@ mod tests { // Expression::FunctionCall("foo".to_string(), vec![]), // )]; - // let foo = FunctionDeclaration { + // let foo = FunctionKey { // id: "foo".to_string(), // signature: Signature { // inputs: vec![], @@ -1588,7 +1655,7 @@ mod tests { // .into()]), // ]; - // let foo = FunctionDeclaration { + // let foo = FunctionKey { // id: "foo".to_string(), // signature: Signature { // inputs: vec![], @@ -1646,7 +1713,7 @@ mod tests { // }, // ]; - // let foo1 = FunctionDeclaration { + // let foo1 = FunctionKey { // id: "foo".to_string(), // signature: Signature { // inputs: vec![Type::FieldElement, Type::FieldElement], diff --git a/zokrates_core/src/static_analysis/inline.rs b/zokrates_core/src/static_analysis/inline.rs index 89461cb15..14b2caac1 100644 --- a/zokrates_core/src/static_analysis/inline.rs +++ b/zokrates_core/src/static_analysis/inline.rs @@ -132,10 +132,13 @@ impl Folder for Inliner { .outputs(types.clone()); // find the function - let function = self.functions.get(&FunctionKey { - signature: passed_signature, - id, - }); + let function = self + .functions + .get(&FunctionKey { + signature: passed_signature, + id: id.clone(), + }) + .cloned(); match self.should_inline(&function, &exps) { true => { @@ -194,8 +197,10 @@ impl Folder for Inliner { // find the function let function = self .functions - .iter() - .find(|f| f.id == id && f.signature == passed_signature) + .get(&FunctionKey { + signature: passed_signature, + id: id.clone(), + }) .cloned(); match self.should_inline(&function, &exps) { @@ -231,8 +236,10 @@ impl Folder for Inliner { // find the function let function = self .functions - .iter() - .find(|f| f.id == id && f.signature == passed_signature) + .get(&FunctionKey { + signature: passed_signature, + id: id.clone(), + }) .cloned(); match self.should_inline(&function, &exps) { From a5df1febff86fe4c2559ab135204597c74359a63 Mon Sep 17 00:00:00 2001 From: schaeff Date: Wed, 15 May 2019 11:12:11 +0200 Subject: [PATCH 006/162] change compile to not flatten, update semantic checker --- zokrates_core/src/absy/mod.rs | 2 +- zokrates_core/src/compile.rs | 40 ++++++++++---------- zokrates_core/src/flatten/mod.rs | 15 +++++++- zokrates_core/src/imports.rs | 18 ++++++--- zokrates_core/src/semantics.rs | 64 ++++++++++++++++++++------------ 5 files changed, 87 insertions(+), 52 deletions(-) diff --git a/zokrates_core/src/absy/mod.rs b/zokrates_core/src/absy/mod.rs index 49d6265a5..8884d8b9b 100644 --- a/zokrates_core/src/absy/mod.rs +++ b/zokrates_core/src/absy/mod.rs @@ -43,7 +43,7 @@ impl fmt::Display for FunctionSymbol { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { match self { FunctionSymbol::Here(fun_node) => write!(f, "{}", fun_node), - _ => unimplemented!(), + FunctionSymbol::There(_, _) => write!(f, "import TODO"), } } } diff --git a/zokrates_core/src/compile.rs b/zokrates_core/src/compile.rs index dac146034..b406d1a51 100644 --- a/zokrates_core/src/compile.rs +++ b/zokrates_core/src/compile.rs @@ -4,7 +4,6 @@ //! @author Thibaut Schaeffer //! @date 2018 use crate::absy::Module; -use crate::flat_absy::FlatProg; use crate::flatten::Flattener; use crate::imports::{self, Importer}; use crate::ir; @@ -128,26 +127,10 @@ pub fn compile>( location: Option, resolve_option: Option, &String) -> Result<(S, String, String), E>>, ) -> Result, CompileErrors> { - let compiled = compile_aux(reader, location, resolve_option)?; - Ok(ir::Prog::from(compiled).optimize()) -} - -pub fn compile_aux>( - reader: &mut R, - location: Option, - resolve_option: Option, &String) -> Result<(S, String, String), E>>, -) -> Result, CompileErrors> { - let program_ast_without_imports: Module = parse_module(reader) - .map_err(|e| CompileErrors::from(CompileErrorInner::from(e).with_context(&location)))?; - - let program_ast = Importer::new().apply_imports( - program_ast_without_imports, - location.clone(), - resolve_option, - )?; + let compiled = compile_aux(reader, location.clone(), resolve_option)?; // check semantics - let typed_ast = Checker::new().check_module(program_ast).map_err(|errors| { + let typed_ast = Checker::new().check_module(compiled).map_err(|errors| { CompileErrors( errors .into_iter() @@ -165,7 +148,24 @@ pub fn compile_aux>( // analyse (constant propagation after call resolution) let program_flattened = program_flattened.analyse(); - Ok(program_flattened) + Ok(ir::Prog::from(program_flattened).optimize()) +} + +pub fn compile_aux>( + reader: &mut R, + location: Option, + resolve_option: Option, &String) -> Result<(S, String, String), E>>, +) -> Result, CompileErrors> { + let program_ast_without_imports: Module = parse_module(reader) + .map_err(|e| CompileErrors::from(CompileErrorInner::from(e).with_context(&location)))?; + + let program_ast = Importer::new().apply_imports( + program_ast_without_imports, + location.clone(), + resolve_option, + )?; + + Ok(program_ast) } #[cfg(test)] diff --git a/zokrates_core/src/flatten/mod.rs b/zokrates_core/src/flatten/mod.rs index aff89998e..9d6918263 100644 --- a/zokrates_core/src/flatten/mod.rs +++ b/zokrates_core/src/flatten/mod.rs @@ -1334,7 +1334,7 @@ impl Flattener { functions_flattened .iter() .find(|f| f.id == id && f.signature == s) - .unwrap() + .expect(&format!("couldn't find {}", id)) } } @@ -1766,7 +1766,18 @@ mod tests { ]; flattener.flatten_program(TypedProg { - functions: functions, + functions: functions + .into_iter() + .map(|f| { + ( + FunctionKey { + id: f.id.clone(), + signature: f.signature.clone(), + }, + f, + ) + }) + .collect(), imported_functions: vec![], imports: vec![], }); diff --git a/zokrates_core/src/imports.rs b/zokrates_core/src/imports.rs index 8f3af54aa..362013fca 100644 --- a/zokrates_core/src/imports.rs +++ b/zokrates_core/src/imports.rs @@ -12,6 +12,7 @@ use crate::parser::Position; use std::fmt; use std::io; use std::io::BufRead; +use std::rc::Rc; use zokrates_field::field::Field; pub struct CompiledImport { @@ -134,6 +135,7 @@ impl Importer { resolve_option: Option, &String) -> Result<(S, String, String), E>>, ) -> Result, CompileErrors> { let mut origins: Vec> = vec![]; + let mut functions = vec![]; for import in destination.imports.iter() { let pos = import.pos(); @@ -192,11 +194,13 @@ impl Importer { Ok((mut reader, location, auto_alias)) => { let compiled = compile_aux(&mut reader, Some(location), resolve_option) .map_err(|e| e.with_context(Some(import.source.clone())))?; - let alias = match import.alias { - Some(ref alias) => alias.clone(), - None => auto_alias, - }; - origins.push(CompiledImport::new(compiled, alias)); + let alias = import.alias.clone().unwrap_or(auto_alias); + + functions.push(( + alias.clone(), + FunctionSymbol::There(String::from("main"), Rc::new(compiled)) + .at(0, 0, 0), + )); } Err(err) => { return Err(CompileErrorInner::ImportError( @@ -217,9 +221,11 @@ impl Importer { } } + functions.extend(destination.functions); + Ok(Module { imports: vec![], - functions: destination.clone().functions, + functions: functions, imported_functions: origins.into_iter().map(|o| o.flat_func).collect(), }) } diff --git a/zokrates_core/src/semantics.rs b/zokrates_core/src/semantics.rs index 1c08322f0..94da69c7d 100644 --- a/zokrates_core/src/semantics.rs +++ b/zokrates_core/src/semantics.rs @@ -170,6 +170,9 @@ impl Checker { self.exit_scope(); } + assert!(checked_functions.len() > 0); + assert!(self.functions.len() > 0); + match self.check_single_main() { Ok(()) => {} Err(e) => errors.push(e), @@ -291,21 +294,25 @@ impl Checker { match funct_symbol { FunctionSymbol::Here(funct_node) => self.check_function(funct_node).map(|f| vec![f]), FunctionSymbol::There(id, module) => { - // this is where we check that there are functions at the other end of the import - let candidates: Result, Vec<_>> = module - .functions - .iter() - .filter(|(i, _)| *i == id) - .map(|(_, f)| self.check_function_symbol(f.clone())) - .collect(); // TODO not clone - let candidates: Vec<_> = candidates?.into_iter().flat_map(|x| x).collect(); - - match candidates.len() { - 0 => Err(vec![Error { - pos: Some(pos), - message: format!("Function {} not found in module {}", id, "TODO"), - }]), - _ => Ok(candidates), + let mut checker = Checker::new(); + + match checker.check_module(module.as_ref().clone()) { + Ok(module) => { + let candidates: Vec<_> = module + .functions + .into_iter() + .filter(|(k, _)| k.id == id) + .map(|(_, v)| v) + .collect(); + match candidates.len() { + 0 => Err(vec![Error { + pos: Some(pos), + message: format!("Function {} not found in module {}", id, "TODO"), + }]), + _ => Ok(candidates), + } + } + Err(e) => Err(e), } } } @@ -703,6 +710,8 @@ impl Checker { // we use type inference to determine the type of the return, so we don't specify it let query = FunctionQuery::new(fun_id.to_string(), &arguments_types, &vec![None]); + assert!(self.functions.len() > 0); + let candidates = self.find_candidates(&query); match candidates.len() { @@ -994,6 +1003,7 @@ mod tests { mod symbols { use super::*; + use crate::types::Signature; #[test] fn imported_symbol() { @@ -1047,14 +1057,22 @@ mod tests { assert_eq!( checked_bar, Ok(TypedProg { - functions: vec![TypedFunction { - id: String::from("main"), - signature: Signature::new().outputs(vec![Type::FieldElement]), - arguments: vec![], - statements: vec![TypedStatement::Return(vec![ - FieldElementExpression::Number(FieldPrime::from(1)).into() - ])] - }], + functions: vec![( + FunctionKey { + id: String::from("main"), + signature: Signature::new().outputs(vec![Type::FieldElement]) + }, + TypedFunction { + id: String::from("main"), + signature: Signature::new().outputs(vec![Type::FieldElement]), + arguments: vec![], + statements: vec![TypedStatement::Return(vec![ + FieldElementExpression::Number(FieldPrime::from(1)).into() + ])] + } + )] + .into_iter() + .collect(), imported_functions: vec![], imports: vec![] }) From e978cf07f72977670ea297951b34aa99cff84850 Mon Sep 17 00:00:00 2001 From: schaeff Date: Wed, 15 May 2019 15:04:52 +0200 Subject: [PATCH 007/162] implement external functions in typed absy --- zokrates_core/src/flatten/mod.rs | 19 +- zokrates_core/src/ir/folder.rs | 6 +- zokrates_core/src/optimizer/redefinition.rs | 2 +- zokrates_core/src/optimizer/tautology.rs | 2 +- zokrates_core/src/semantics.rs | 39 +- .../src/static_analysis/dead_code.rs | 12 +- zokrates_core/src/static_analysis/inline.rs | 664 +++++++++--------- zokrates_core/src/static_analysis/mod.rs | 10 +- .../src/static_analysis/power_check.rs | 4 +- .../src/static_analysis/propagation.rs | 4 +- zokrates_core/src/static_analysis/unroll.rs | 4 +- zokrates_core/src/typed_absy/folder.rs | 24 +- zokrates_core/src/typed_absy/mod.rs | 86 ++- 13 files changed, 474 insertions(+), 402 deletions(-) diff --git a/zokrates_core/src/flatten/mod.rs b/zokrates_core/src/flatten/mod.rs index 9d6918263..61ba58b4b 100644 --- a/zokrates_core/src/flatten/mod.rs +++ b/zokrates_core/src/flatten/mod.rs @@ -24,7 +24,7 @@ pub struct Flattener { bijection: BiMap, } impl Flattener { - pub fn flatten(p: TypedProg) -> FlatProg { + pub fn flatten(p: TypedModule) -> FlatProg { Flattener::new().flatten_program(p) } @@ -1212,6 +1212,17 @@ impl Flattener { } } + fn flatten_function_symbol( + &mut self, + functions_flattened: &mut Vec>, + funct: TypedFunctionSymbol, + ) -> FlatFunction { + match funct { + TypedFunctionSymbol::Here(f) => self.flatten_function(functions_flattened, f), + _ => unimplemented!(), + } + } + /// Returns a flattened `TypedFunction` based on the given `funct`. /// /// # Arguments @@ -1276,7 +1287,7 @@ impl Flattener { /// # Arguments /// /// * `prog` - `Prog`ram that will be flattened. - fn flatten_program(&mut self, prog: TypedProg) -> FlatProg { + fn flatten_program(&mut self, prog: TypedModule) -> FlatProg { let mut functions_flattened = Vec::new(); self.load_corelib(&mut functions_flattened); @@ -1286,7 +1297,7 @@ impl Flattener { } for func in prog.functions.into_iter().map(|(_, v)| v) { - let flattened_func = self.flatten_function(&mut functions_flattened, func); + let flattened_func = self.flatten_function_symbol(&mut functions_flattened, func); functions_flattened.push(flattened_func); } @@ -1765,7 +1776,7 @@ mod tests { }, ]; - flattener.flatten_program(TypedProg { + flattener.flatten_program(TypedModule { functions: functions .into_iter() .map(|f| { diff --git a/zokrates_core/src/ir/folder.rs b/zokrates_core/src/ir/folder.rs index 5ae83f40c..fea45ab34 100644 --- a/zokrates_core/src/ir/folder.rs +++ b/zokrates_core/src/ir/folder.rs @@ -5,8 +5,8 @@ use crate::ir::*; use zokrates_field::field::Field; pub trait Folder: Sized { - fn fold_program(&mut self, p: Prog) -> Prog { - fold_program(self, p) + fn fold_module(&mut self, p: Prog) -> Prog { + fold_module(self, p) } fn fold_function(&mut self, f: Function) -> Function { @@ -38,7 +38,7 @@ pub trait Folder: Sized { } } -pub fn fold_program>(f: &mut F, p: Prog) -> Prog { +pub fn fold_module>(f: &mut F, p: Prog) -> Prog { Prog { main: f.fold_function(p.main), private: p.private, diff --git a/zokrates_core/src/optimizer/redefinition.rs b/zokrates_core/src/optimizer/redefinition.rs index fc0088c97..2d6fba2a3 100644 --- a/zokrates_core/src/optimizer/redefinition.rs +++ b/zokrates_core/src/optimizer/redefinition.rs @@ -30,7 +30,7 @@ impl RedefinitionOptimizer { } pub fn optimize(p: Prog) -> Prog { - RedefinitionOptimizer::new().fold_program(p) + RedefinitionOptimizer::new().fold_module(p) } } diff --git a/zokrates_core/src/optimizer/tautology.rs b/zokrates_core/src/optimizer/tautology.rs index b93cb5dbc..c650bc44f 100644 --- a/zokrates_core/src/optimizer/tautology.rs +++ b/zokrates_core/src/optimizer/tautology.rs @@ -18,7 +18,7 @@ impl TautologyOptimizer { } pub fn optimize(p: Prog) -> Prog { - TautologyOptimizer::new().fold_program(p) + TautologyOptimizer::new().fold_module(p) } } diff --git a/zokrates_core/src/semantics.rs b/zokrates_core/src/semantics.rs index 94da69c7d..c5b72c353 100644 --- a/zokrates_core/src/semantics.rs +++ b/zokrates_core/src/semantics.rs @@ -19,6 +19,8 @@ use crate::types::Type; use std::hash::{Hash, Hasher}; +use std::rc::Rc; + #[derive(PartialEq, Debug)] pub struct Error { pos: Option<(Position, Position)>, @@ -131,7 +133,7 @@ impl Checker { pub fn check_module( &mut self, module: Module, - ) -> Result, Vec> { + ) -> Result, Vec> { for func in &module.imported_functions { self.functions.insert(FunctionKey { id: func.id.clone(), @@ -146,16 +148,16 @@ impl Checker { self.enter_scope(); match self.check_function_symbol(func) { - Ok(checked_function) => { + Ok(checked_function_symbols) => { self.functions - .extend(checked_function.iter().map(|f| FunctionKey { - signature: f.signature.clone(), + .extend(checked_function_symbols.iter().map(|f| FunctionKey { + signature: f.signature().clone(), id: id.clone(), })); - checked_functions.extend(checked_function.into_iter().map(|f| { + checked_functions.extend(checked_function_symbols.into_iter().map(|f| { ( FunctionKey { - signature: f.signature.clone(), + signature: f.signature().clone(), id: id.clone(), }, f, @@ -182,7 +184,7 @@ impl Checker { return Err(errors); } - Ok(TypedProg { + Ok(TypedModule { functions: checked_functions, imported_functions: module.imported_functions, imports: module.imports.into_iter().map(|i| i.value).collect(), @@ -287,12 +289,14 @@ impl Checker { fn check_function_symbol( &mut self, funct_symbol_node: FunctionSymbolNode, - ) -> Result>, Vec> { + ) -> Result>, Vec> { let pos = funct_symbol_node.pos(); let funct_symbol = funct_symbol_node.value; match funct_symbol { - FunctionSymbol::Here(funct_node) => self.check_function(funct_node).map(|f| vec![f]), + FunctionSymbol::Here(funct_node) => self + .check_function(funct_node) + .map(|f| vec![TypedFunctionSymbol::Here(f)]), FunctionSymbol::There(id, module) => { let mut checker = Checker::new(); @@ -300,16 +304,25 @@ impl Checker { Ok(module) => { let candidates: Vec<_> = module .functions - .into_iter() + .iter() .filter(|(k, _)| k.id == id) - .map(|(_, v)| v) + .map(|(_, v)| FunctionKey { + id: id.clone(), + signature: v.signature().clone(), + }) .collect(); + + let reference = Rc::new(module); + match candidates.len() { 0 => Err(vec![Error { pos: Some(pos), message: format!("Function {} not found in module {}", id, "TODO"), }]), - _ => Ok(candidates), + _ => Ok(candidates + .into_iter() + .map(|f| TypedFunctionSymbol::There(f, reference.clone())) + .collect()), } } Err(e) => Err(e), @@ -1056,7 +1069,7 @@ mod tests { let checked_bar = checker.check_module(bar); assert_eq!( checked_bar, - Ok(TypedProg { + Ok(TypedModule { functions: vec![( FunctionKey { id: String::from("main"), diff --git a/zokrates_core/src/static_analysis/dead_code.rs b/zokrates_core/src/static_analysis/dead_code.rs index 6e5455c30..a5608255e 100644 --- a/zokrates_core/src/static_analysis/dead_code.rs +++ b/zokrates_core/src/static_analysis/dead_code.rs @@ -16,21 +16,21 @@ impl DeadCode { } } - pub fn clean(p: TypedProg) -> TypedProg { - DeadCode::new().fold_program(p) + pub fn clean(p: TypedModule) -> TypedModule { + DeadCode::new().fold_module(p) } } impl Folder for DeadCode { - fn fold_program(&mut self, p: TypedProg) -> TypedProg { - let p = fold_program(self, p); + fn fold_module(&mut self, p: TypedModule) -> TypedModule { + let p = fold_module(self, p); // only keep functions which are being called, or `main` - TypedProg { + TypedModule { functions: p .functions .into_iter() - .filter(|(key, f)| key.id == "main" || self.called.contains(&f.to_slug())) + .filter(|(key, f)| key.id == "main" || self.called.contains(&f.slug())) .collect(), ..p } diff --git a/zokrates_core/src/static_analysis/inline.rs b/zokrates_core/src/static_analysis/inline.rs index 14b2caac1..0ea7dc82f 100644 --- a/zokrates_core/src/static_analysis/inline.rs +++ b/zokrates_core/src/static_analysis/inline.rs @@ -1,332 +1,332 @@ -use crate::typed_absy::folder::*; -use crate::typed_absy::Folder; -use crate::typed_absy::*; -use crate::types::{Signature, Type}; -use std::collections::HashMap; -use zokrates_field::field::Field; - -pub struct Inliner { - functions: HashMap>, - statements_buffer: Vec>, - context: Vec<(String, usize)>, - call_count: HashMap, -} - -impl Inliner { - pub fn new() -> Self { - Inliner { - functions: HashMap::new(), - statements_buffer: vec![], - context: vec![], - call_count: HashMap::new(), - } - } - - fn should_inline( - &self, - function: &Option>, - arguments: &Vec>, - ) -> bool { - // we should define a heuristic here - // currently it doesn't seem like there's a tradeoff as everything gets inlined in flattening anyway (apart from compiling performance, as inlining - // in flattening should be faster and less memory intensive) - // however, using backends such as bellman, we could avoid flattening and "stream" the computation - // at proving time, the tradeoff becomes code size (not inlining keeps only one copy of each function) vs optimisation - // (inlining enables constant propagation through function calls, which cannot be achieved by our final optimiser in some cases) - // for now, we inline functions whose non-array parameters are constant, as this covers our main use case for inlining: propagation of - // constant array indices - match function { - Some(..) => { - // check whether non-array arguments are constant - arguments.iter().all(|e| match e { - TypedExpression::FieldElementArray(..) => true, - TypedExpression::FieldElement(FieldElementExpression::Number(..)) => true, - TypedExpression::Boolean(BooleanExpression::Value(..)) => true, - _ => false, - }) - } - None => false, - } - } - - // inline a call to `function` taking `expressions` as inputs - // this function mutates `self.call` by incrementing the counter for `function`, and mutates `self.context` - fn inline_call( - &mut self, - function: &TypedFunction, - expressions: Vec>, - ) -> Vec> { - self.call_count - .entry(function.to_slug()) - .and_modify(|i| *i += 1) - .or_insert(1); - self.context.push(( - function.to_slug(), - *self.call_count.get(&function.to_slug()).unwrap(), - )); - - // add definitions for the inputs - let mut inputs_bindings = function - .arguments - .iter() - .zip(expressions) - .map(|(a, e)| { - TypedStatement::Definition( - TypedAssignee::Identifier(self.fold_variable(a.id.clone())), - e, - ) - }) - .collect(); - self.statements_buffer.append(&mut inputs_bindings); - - // filter out the return statement and keep it aside - let (mut statements, ret): (Vec<_>, Vec<_>) = function - .statements - .clone() - .into_iter() - .flat_map(|s| self.fold_statement(s)) - .partition(|s| match s { - TypedStatement::Return(..) => false, - _ => true, - }); - - // add all statements to the buffer - self.statements_buffer.append(&mut statements); - - // remove this call from the context - self.context.pop(); - - match ret[0].clone() { - TypedStatement::Return(exprs) => exprs, - _ => panic!(""), - } - } - - pub fn inline(prog: TypedProg) -> TypedProg { - Inliner::new().fold_program(prog) - } -} - -impl Folder for Inliner { - // store the list of functions - fn fold_program(&mut self, p: TypedProg) -> TypedProg { - self.functions = p.functions.clone(); - fold_program(self, p) - } - - // add extra statements before the modified statement - fn fold_statement(&mut self, s: TypedStatement) -> Vec> { - let mut statements = match s { - TypedStatement::MultipleDefinition(variables, elist) => { - match elist { - TypedExpressionList::FunctionCall(id, exps, types) => { - let variables: Vec<_> = variables - .into_iter() - .map(|a| self.fold_variable(a)) - .collect(); - let exps: Vec<_> = - exps.into_iter().map(|e| self.fold_expression(e)).collect(); - - let passed_signature = Signature::new() - .inputs(exps.iter().map(|e| e.get_type()).collect()) - .outputs(types.clone()); - - // find the function - let function = self - .functions - .get(&FunctionKey { - signature: passed_signature, - id: id.clone(), - }) - .cloned(); - - match self.should_inline(&function, &exps) { - true => { - let ret = self.inline_call(&function.unwrap(), exps); - variables - .into_iter() - .zip(ret.into_iter()) - .map(|(v, e)| { - TypedStatement::Definition(TypedAssignee::Identifier(v), e) - }) - .collect() - } - false => vec![TypedStatement::MultipleDefinition( - variables, - TypedExpressionList::FunctionCall(id, exps, types), - )], - } - } - } - } - s => fold_statement(self, s), - }; - - // add the result of folding to the buffer - self.statements_buffer.append(&mut statements); - // return the whole buffer - self.statements_buffer.drain(..).collect() - } - - // prefix all names with the context - fn fold_name(&mut self, n: String) -> String { - match self.context.len() { - 0 => n, - _ => format!( - "{}_{}", - self.context - .iter() - .map(|(s, i)| format!("{}_{}", s, i)) - .collect::>() - .join("_"), - n - ), - } - } - - // inline calls which return a field element - fn fold_field_expression(&mut self, e: FieldElementExpression) -> FieldElementExpression { - match e { - FieldElementExpression::FunctionCall(id, exps) => { - let exps: Vec<_> = exps.into_iter().map(|e| self.fold_expression(e)).collect(); - - let passed_signature = Signature::new() - .inputs(exps.iter().map(|e| e.get_type()).collect()) - .outputs(vec![Type::FieldElement]); - - // find the function - let function = self - .functions - .get(&FunctionKey { - signature: passed_signature, - id: id.clone(), - }) - .cloned(); - - match self.should_inline(&function, &exps) { - true => { - let ret = self.inline_call(&function.unwrap(), exps); - // unwrap the result to return a field element - match ret[0].clone() { - TypedExpression::FieldElement(e) => e, - _ => panic!(""), - } - } - false => FieldElementExpression::FunctionCall(id, exps), - } - } - // default - e => fold_field_expression(self, e), - } - } - - // inline calls which return a field element array - fn fold_field_array_expression( - &mut self, - e: FieldElementArrayExpression, - ) -> FieldElementArrayExpression { - match e { - FieldElementArrayExpression::FunctionCall(size, id, exps) => { - let exps: Vec<_> = exps.into_iter().map(|e| self.fold_expression(e)).collect(); - - let passed_signature = Signature::new() - .inputs(exps.iter().map(|e| e.get_type()).collect()) - .outputs(vec![Type::FieldElementArray(size)]); - - // find the function - let function = self - .functions - .get(&FunctionKey { - signature: passed_signature, - id: id.clone(), - }) - .cloned(); - - match self.should_inline(&function, &exps) { - true => { - let ret = self.inline_call(&function.unwrap(), exps); - // unwrap the result to return a field element - match ret[0].clone() { - TypedExpression::FieldElementArray(e) => e, - _ => panic!(""), - } - } - false => FieldElementArrayExpression::FunctionCall(size, id, exps), - } - } - // default - e => fold_field_array_expression(self, e), - } - } -} - -#[cfg(test)] -mod tests { - use super::*; - use zokrates_field::field::FieldPrime; - - #[cfg(test)] - mod heuristics { - use super::*; - - #[test] - fn inline_constant_field() { - let f: TypedFunction = TypedFunction { - id: String::from("foo"), - arguments: vec![ - Parameter::private(Variable::field_element("a")), - Parameter::private(Variable::field_array("b", 3)), - ], - statements: vec![TypedStatement::Return(vec![ - FieldElementExpression::Select( - box FieldElementArrayExpression::Identifier(3, String::from("b")), - box FieldElementExpression::Identifier(String::from("a")), - ) - .into(), - ])], - signature: Signature::new() - .inputs(vec![Type::FieldElement, Type::FieldElementArray(3)]) - .outputs(vec![Type::FieldElement]), - }; - - let arguments = vec![ - FieldElementExpression::Number(FieldPrime::from(0)).into(), - FieldElementArrayExpression::Identifier(3, String::from("random")).into(), - ]; - - let i = Inliner::new(); - - assert!(i.should_inline(&Some(f), &arguments)); - } - - #[test] - fn no_inline_non_constant_field() { - let f: TypedFunction = TypedFunction { - id: String::from("foo"), - arguments: vec![ - Parameter::private(Variable::field_element("a")), - Parameter::private(Variable::field_array("b", 3)), - ], - statements: vec![TypedStatement::Return(vec![ - FieldElementExpression::Select( - box FieldElementArrayExpression::Identifier(3, String::from("b")), - box FieldElementExpression::Identifier(String::from("a")), - ) - .into(), - ])], - signature: Signature::new() - .inputs(vec![Type::FieldElement, Type::FieldElementArray(3)]) - .outputs(vec![Type::FieldElement]), - }; - - let arguments = vec![ - FieldElementExpression::Identifier(String::from("notconstant")).into(), - FieldElementArrayExpression::Identifier(3, String::from("random")).into(), - ]; - - let i = Inliner::new(); - - assert!(!i.should_inline(&Some(f), &arguments)); - } - } -} +// use crate::typed_absy::folder::*; +// use crate::typed_absy::Folder; +// use crate::typed_absy::*; +// use crate::types::{Signature, Type}; +// use std::collections::HashMap; +// use zokrates_field::field::Field; + +// pub struct Inliner { +// functions: HashMap>, +// statements_buffer: Vec>, +// context: Vec<(String, usize)>, +// call_count: HashMap, +// } + +// impl Inliner { +// pub fn new() -> Self { +// Inliner { +// functions: HashMap::new(), +// statements_buffer: vec![], +// context: vec![], +// call_count: HashMap::new(), +// } +// } + +// fn should_inline( +// &self, +// function: &Option>, +// arguments: &Vec>, +// ) -> bool { +// // we should define a heuristic here +// // currently it doesn't seem like there's a tradeoff as everything gets inlined in flattening anyway (apart from compiling performance, as inlining +// // in flattening should be faster and less memory intensive) +// // however, using backends such as bellman, we could avoid flattening and "stream" the computation +// // at proving time, the tradeoff becomes code size (not inlining keeps only one copy of each function) vs optimisation +// // (inlining enables constant propagation through function calls, which cannot be achieved by our final optimiser in some cases) +// // for now, we inline functions whose non-array parameters are constant, as this covers our main use case for inlining: propagation of +// // constant array indices +// match function { +// Some(..) => { +// // check whether non-array arguments are constant +// arguments.iter().all(|e| match e { +// TypedExpression::FieldElementArray(..) => true, +// TypedExpression::FieldElement(FieldElementExpression::Number(..)) => true, +// TypedExpression::Boolean(BooleanExpression::Value(..)) => true, +// _ => false, +// }) +// } +// None => false, +// } +// } + +// // inline a call to `function` taking `expressions` as inputs +// // this function mutates `self.call` by incrementing the counter for `function`, and mutates `self.context` +// fn inline_call( +// &mut self, +// function: &TypedFunctionSymbol, +// expressions: Vec>, +// ) -> Vec> { +// self.call_count +// .entry(function.slug()) +// .and_modify(|i| *i += 1) +// .or_insert(1); +// self.context.push(( +// function.slug(), +// *self.call_count.get(&function.slug()).unwrap(), +// )); + +// // add definitions for the inputs +// let mut inputs_bindings = function +// .arguments +// .iter() +// .zip(expressions) +// .map(|(a, e)| { +// TypedStatement::Definition( +// TypedAssignee::Identifier(self.fold_variable(a.id.clone())), +// e, +// ) +// }) +// .collect(); +// self.statements_buffer.append(&mut inputs_bindings); + +// // filter out the return statement and keep it aside +// let (mut statements, ret): (Vec<_>, Vec<_>) = function +// .statements +// .clone() +// .into_iter() +// .flat_map(|s| self.fold_statement(s)) +// .partition(|s| match s { +// TypedStatement::Return(..) => false, +// _ => true, +// }); + +// // add all statements to the buffer +// self.statements_buffer.append(&mut statements); + +// // remove this call from the context +// self.context.pop(); + +// match ret[0].clone() { +// TypedStatement::Return(exprs) => exprs, +// _ => panic!(""), +// } +// } + +// pub fn inline(prog: TypedModule) -> TypedModule { +// Inliner::new().fold_module(prog) +// } +// } + +// impl Folder for Inliner { +// // store the list of functions +// fn fold_module(&mut self, p: TypedModule) -> TypedModule { +// self.functions = p.functions.clone(); +// fold_module(self, p) +// } + +// // add extra statements before the modified statement +// fn fold_statement(&mut self, s: TypedStatement) -> Vec> { +// let mut statements = match s { +// TypedStatement::MultipleDefinition(variables, elist) => { +// match elist { +// TypedExpressionList::FunctionCall(id, exps, types) => { +// let variables: Vec<_> = variables +// .into_iter() +// .map(|a| self.fold_variable(a)) +// .collect(); +// let exps: Vec<_> = +// exps.into_iter().map(|e| self.fold_expression(e)).collect(); + +// let passed_signature = Signature::new() +// .inputs(exps.iter().map(|e| e.get_type()).collect()) +// .outputs(types.clone()); + +// // find the function +// let function = self +// .functions +// .get(&FunctionKey { +// signature: passed_signature, +// id: id.clone(), +// }) +// .cloned(); + +// match self.should_inline(&function, &exps) { +// true => { +// let ret = self.inline_call(&function.unwrap(), exps); +// variables +// .into_iter() +// .zip(ret.into_iter()) +// .map(|(v, e)| { +// TypedStatement::Definition(TypedAssignee::Identifier(v), e) +// }) +// .collect() +// } +// false => vec![TypedStatement::MultipleDefinition( +// variables, +// TypedExpressionList::FunctionCall(id, exps, types), +// )], +// } +// } +// } +// } +// s => fold_statement(self, s), +// }; + +// // add the result of folding to the buffer +// self.statements_buffer.append(&mut statements); +// // return the whole buffer +// self.statements_buffer.drain(..).collect() +// } + +// // prefix all names with the context +// fn fold_name(&mut self, n: String) -> String { +// match self.context.len() { +// 0 => n, +// _ => format!( +// "{}_{}", +// self.context +// .iter() +// .map(|(s, i)| format!("{}_{}", s, i)) +// .collect::>() +// .join("_"), +// n +// ), +// } +// } + +// // inline calls which return a field element +// fn fold_field_expression(&mut self, e: FieldElementExpression) -> FieldElementExpression { +// match e { +// FieldElementExpression::FunctionCall(id, exps) => { +// let exps: Vec<_> = exps.into_iter().map(|e| self.fold_expression(e)).collect(); + +// let passed_signature = Signature::new() +// .inputs(exps.iter().map(|e| e.get_type()).collect()) +// .outputs(vec![Type::FieldElement]); + +// // find the function +// let function = self +// .functions +// .get(&FunctionKey { +// signature: passed_signature, +// id: id.clone(), +// }) +// .cloned(); + +// match self.should_inline(&function, &exps) { +// true => { +// let ret = self.inline_call(&function.unwrap(), exps); +// // unwrap the result to return a field element +// match ret[0].clone() { +// TypedExpression::FieldElement(e) => e, +// _ => panic!(""), +// } +// } +// false => FieldElementExpression::FunctionCall(id, exps), +// } +// } +// // default +// e => fold_field_expression(self, e), +// } +// } + +// // inline calls which return a field element array +// fn fold_field_array_expression( +// &mut self, +// e: FieldElementArrayExpression, +// ) -> FieldElementArrayExpression { +// match e { +// FieldElementArrayExpression::FunctionCall(size, id, exps) => { +// let exps: Vec<_> = exps.into_iter().map(|e| self.fold_expression(e)).collect(); + +// let passed_signature = Signature::new() +// .inputs(exps.iter().map(|e| e.get_type()).collect()) +// .outputs(vec![Type::FieldElementArray(size)]); + +// // find the function +// let function = self +// .functions +// .get(&FunctionKey { +// signature: passed_signature, +// id: id.clone(), +// }) +// .cloned(); + +// match self.should_inline(&function, &exps) { +// true => { +// let ret = self.inline_call(&function.unwrap(), exps); +// // unwrap the result to return a field element +// match ret[0].clone() { +// TypedExpression::FieldElementArray(e) => e, +// _ => panic!(""), +// } +// } +// false => FieldElementArrayExpression::FunctionCall(size, id, exps), +// } +// } +// // default +// e => fold_field_array_expression(self, e), +// } +// } +// } + +// #[cfg(test)] +// mod tests { +// use super::*; +// use zokrates_field::field::FieldPrime; + +// #[cfg(test)] +// mod heuristics { +// use super::*; + +// #[test] +// fn inline_constant_field() { +// let f: TypedFunction = TypedFunction { +// id: String::from("foo"), +// arguments: vec![ +// Parameter::private(Variable::field_element("a")), +// Parameter::private(Variable::field_array("b", 3)), +// ], +// statements: vec![TypedStatement::Return(vec![ +// FieldElementExpression::Select( +// box FieldElementArrayExpression::Identifier(3, String::from("b")), +// box FieldElementExpression::Identifier(String::from("a")), +// ) +// .into(), +// ])], +// signature: Signature::new() +// .inputs(vec![Type::FieldElement, Type::FieldElementArray(3)]) +// .outputs(vec![Type::FieldElement]), +// }; + +// let arguments = vec![ +// FieldElementExpression::Number(FieldPrime::from(0)).into(), +// FieldElementArrayExpression::Identifier(3, String::from("random")).into(), +// ]; + +// let i = Inliner::new(); + +// assert!(i.should_inline(&Some(f), &arguments)); +// } + +// #[test] +// fn no_inline_non_constant_field() { +// let f: TypedFunction = TypedFunction { +// id: String::from("foo"), +// arguments: vec![ +// Parameter::private(Variable::field_element("a")), +// Parameter::private(Variable::field_array("b", 3)), +// ], +// statements: vec![TypedStatement::Return(vec![ +// FieldElementExpression::Select( +// box FieldElementArrayExpression::Identifier(3, String::from("b")), +// box FieldElementExpression::Identifier(String::from("a")), +// ) +// .into(), +// ])], +// signature: Signature::new() +// .inputs(vec![Type::FieldElement, Type::FieldElementArray(3)]) +// .outputs(vec![Type::FieldElement]), +// }; + +// let arguments = vec![ +// FieldElementExpression::Identifier(String::from("notconstant")).into(), +// FieldElementArrayExpression::Identifier(3, String::from("random")).into(), +// ]; + +// let i = Inliner::new(); + +// assert!(!i.should_inline(&Some(f), &arguments)); +// } +// } +// } diff --git a/zokrates_core/src/static_analysis/mod.rs b/zokrates_core/src/static_analysis/mod.rs index 9fe635efc..d6c931661 100644 --- a/zokrates_core/src/static_analysis/mod.rs +++ b/zokrates_core/src/static_analysis/mod.rs @@ -12,27 +12,29 @@ mod propagation; mod unroll; use self::dead_code::DeadCode; -use self::inline::Inliner; +//use self::inline::Inliner; use self::power_check::PowerChecker; use self::propagation::Propagator; use self::unroll::Unroller; use crate::flat_absy::FlatProg; -use crate::typed_absy::TypedProg; +use crate::typed_absy::TypedModule; use zokrates_field::field::Field; pub trait Analyse { fn analyse(self) -> Self; } -impl Analyse for TypedProg { +impl Analyse for TypedModule { fn analyse(self) -> Self { + println!("{:#?}", self); + let r = PowerChecker::check(self); // unroll let r = Unroller::unroll(r); //propagate a first time for constants to reach function calls let r = Propagator::propagate(r); // apply inlining strategy - let r = Inliner::inline(r); + //let r = Inliner::inline(r); // Propagate again let r = Propagator::propagate(r); // remove unused functions diff --git a/zokrates_core/src/static_analysis/power_check.rs b/zokrates_core/src/static_analysis/power_check.rs index 4b95e579f..a2089a0b2 100644 --- a/zokrates_core/src/static_analysis/power_check.rs +++ b/zokrates_core/src/static_analysis/power_check.rs @@ -10,8 +10,8 @@ impl PowerChecker { PowerChecker {} } - pub fn check(p: TypedProg) -> TypedProg { - PowerChecker::new().fold_program(p) + pub fn check(p: TypedModule) -> TypedModule { + PowerChecker::new().fold_module(p) } } diff --git a/zokrates_core/src/static_analysis/propagation.rs b/zokrates_core/src/static_analysis/propagation.rs index a17710a6a..da6c1e44e 100644 --- a/zokrates_core/src/static_analysis/propagation.rs +++ b/zokrates_core/src/static_analysis/propagation.rs @@ -20,8 +20,8 @@ impl Propagator { } } - pub fn propagate(p: TypedProg) -> TypedProg { - Propagator::new().fold_program(p) + pub fn propagate(p: TypedModule) -> TypedModule { + Propagator::new().fold_module(p) } } diff --git a/zokrates_core/src/static_analysis/unroll.rs b/zokrates_core/src/static_analysis/unroll.rs index 100df1979..8b1f874b6 100644 --- a/zokrates_core/src/static_analysis/unroll.rs +++ b/zokrates_core/src/static_analysis/unroll.rs @@ -39,8 +39,8 @@ impl Unroller { res } - pub fn unroll(p: TypedProg) -> TypedProg { - Unroller::new().fold_program(p) + pub fn unroll(p: TypedModule) -> TypedModule { + Unroller::new().fold_module(p) } } diff --git a/zokrates_core/src/typed_absy/folder.rs b/zokrates_core/src/typed_absy/folder.rs index acf401f6c..b8a6e844b 100644 --- a/zokrates_core/src/typed_absy/folder.rs +++ b/zokrates_core/src/typed_absy/folder.rs @@ -4,14 +4,18 @@ use crate::typed_absy::*; use zokrates_field::field::Field; pub trait Folder: Sized { - fn fold_program(&mut self, p: TypedProg) -> TypedProg { - fold_program(self, p) + fn fold_module(&mut self, p: TypedModule) -> TypedModule { + fold_module(self, p) } fn fold_function(&mut self, f: TypedFunction) -> TypedFunction { fold_function(self, f) } + fn fold_function_symbol(&mut self, s: TypedFunctionSymbol) -> TypedFunctionSymbol { + fold_function_symbol(self, s) + } + fn fold_parameter(&mut self, p: Parameter) -> Parameter { Parameter { id: self.fold_variable(p.id), @@ -81,12 +85,12 @@ pub trait Folder: Sized { } } -pub fn fold_program>(f: &mut F, p: TypedProg) -> TypedProg { - TypedProg { +pub fn fold_module>(f: &mut F, p: TypedModule) -> TypedModule { + TypedModule { functions: p .functions .into_iter() - .map(|(key, fun)| (key, f.fold_function(fun))) + .map(|(key, fun)| (key, f.fold_function_symbol(fun))) .collect(), ..p } @@ -272,3 +276,13 @@ pub fn fold_function>(f: &mut F, fun: TypedFunction) - ..fun } } + +pub fn fold_function_symbol>( + f: &mut F, + s: TypedFunctionSymbol, +) -> TypedFunctionSymbol { + match s { + TypedFunctionSymbol::Here(fun) => TypedFunctionSymbol::Here(f.fold_function(fun)), + there => there, // by default, do not fold modules recursively + } +} diff --git a/zokrates_core/src/typed_absy/mod.rs b/zokrates_core/src/typed_absy/mod.rs index 131ddb579..ff42f2c12 100644 --- a/zokrates_core/src/typed_absy/mod.rs +++ b/zokrates_core/src/typed_absy/mod.rs @@ -20,25 +20,57 @@ use crate::types::Type; use std::fmt; use zokrates_field::field::Field; +use std::rc::Rc; + pub use self::folder::Folder; type Identifier = String; -#[derive(PartialEq)] -pub struct TypedProg { +#[derive(PartialEq, Debug)] +pub struct TypedModule { /// Functions of the program - pub functions: HashMap>, + pub functions: HashMap>, pub imports: Vec, pub imported_functions: Vec>, } +#[derive(Debug, Clone, PartialEq)] +pub enum TypedFunctionSymbol { + Here(TypedFunction), + There(FunctionKey, Rc>), +} + +impl TypedFunctionSymbol { + pub fn signature(&self) -> Signature { + match self { + TypedFunctionSymbol::Here(f) => f.signature.clone(), + TypedFunctionSymbol::There(key, module) => { + module.functions.get(key).unwrap().signature() + } + } + } + + pub fn slug(&self) -> String { + match self { + TypedFunctionSymbol::Here(f) => f.to_slug(), + TypedFunctionSymbol::There(key, module) => module.functions.get(key).unwrap().slug(), + } + } +} + +impl fmt::Display for TypedFunctionSymbol { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + unimplemented!() + } +} + #[derive(PartialEq, Eq, Hash, Debug, Clone)] pub struct FunctionKey { pub id: Identifier, pub signature: Signature, } -impl fmt::Display for TypedProg { +impl fmt::Display for TypedModule { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { let mut res = vec![]; res.extend( @@ -63,29 +95,29 @@ impl fmt::Display for TypedProg { } } -impl fmt::Debug for TypedProg { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!( - f, - "program(\n\timports:\n\t\t{}\n\tfunctions:\n\t\t{}{}\n)", - self.imports - .iter() - .map(|x| format!("{:?}", x)) - .collect::>() - .join("\n\t\t"), - self.imported_functions - .iter() - .map(|x| format!("{}", x)) - .collect::>() - .join("\n\t\t"), - self.functions - .iter() - .map(|x| format!("{:?}", x)) - .collect::>() - .join("\n\t\t") - ) - } -} +// impl fmt::Debug for TypedModule { +// fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { +// write!( +// f, +// "program(\n\timports:\n\t\t{}\n\tfunctions:\n\t\t{}{}\n)", +// self.imports +// .iter() +// .map(|x| format!("{:?}", x)) +// .collect::>() +// .join("\n\t\t"), +// self.imported_functions +// .iter() +// .map(|x| format!("{}", x)) +// .collect::>() +// .join("\n\t\t"), +// self.functions +// .iter() +// .map(|x| format!("{:?}", x)) +// .collect::>() +// .join("\n\t\t") +// ) +// } +// } #[derive(Clone, PartialEq)] pub struct TypedFunction { From 624b11335242632bb5c137b6d4c260e95fee28b4 Mon Sep 17 00:00:00 2001 From: schaeff Date: Fri, 17 May 2019 20:57:33 +0200 Subject: [PATCH 008/162] implement module map instead of rc --- zokrates_cli/examples/imports/foo.code | 2 +- zokrates_cli/examples/imports/import.code | 5 +- zokrates_core/src/absy/mod.rs | 13 +- zokrates_core/src/compile.rs | 33 +- zokrates_core/src/flatten/mod.rs | 2153 +++++++++-------- zokrates_core/src/imports.rs | 18 +- zokrates_core/src/semantics.rs | 1969 +++++++-------- .../src/static_analysis/dead_code.rs | 32 +- zokrates_core/src/static_analysis/inline.rs | 276 +-- zokrates_core/src/static_analysis/mod.rs | 12 +- .../src/static_analysis/power_check.rs | 4 +- .../src/static_analysis/propagation.rs | 4 +- zokrates_core/src/static_analysis/unroll.rs | 4 +- zokrates_core/src/typed_absy/folder.rs | 19 +- zokrates_core/src/typed_absy/mod.rs | 58 +- 15 files changed, 2408 insertions(+), 2194 deletions(-) diff --git a/zokrates_cli/examples/imports/foo.code b/zokrates_cli/examples/imports/foo.code index 9b2256b41..111178456 100644 --- a/zokrates_cli/examples/imports/foo.code +++ b/zokrates_cli/examples/imports/foo.code @@ -1,4 +1,4 @@ -import "./baz.code" +import "./baz.code" as baz def main() -> (field): return baz() \ No newline at end of file diff --git a/zokrates_cli/examples/imports/import.code b/zokrates_cli/examples/imports/import.code index 6f708d242..9329a5ca3 100644 --- a/zokrates_cli/examples/imports/import.code +++ b/zokrates_cli/examples/imports/import.code @@ -1,5 +1,4 @@ -import "./foo.code" -import "./bar.code" +import "./foo.code" as foo def main() -> (field): - return foo() + bar() \ No newline at end of file + return foo() \ No newline at end of file diff --git a/zokrates_core/src/absy/mod.rs b/zokrates_core/src/absy/mod.rs index 8884d8b9b..3e8a1a2c6 100644 --- a/zokrates_core/src/absy/mod.rs +++ b/zokrates_core/src/absy/mod.rs @@ -19,10 +19,19 @@ use crate::imports::ImportNode; use std::fmt; use zokrates_field::field::Field; -use std::rc::Rc; +use std::collections::HashMap; type Identifier = String; +pub type ModuleId = String; + +pub type Modules = HashMap>; + +pub struct Program { + pub modules: HashMap>, + pub main: Module, +} + #[derive(Clone, PartialEq)] pub struct Module { /// Functions of the module @@ -34,7 +43,7 @@ pub struct Module { #[derive(Debug, Clone, PartialEq)] pub enum FunctionSymbol { Here(FunctionNode), - There(Identifier, Rc>), + There(Identifier, ModuleId), } pub type FunctionSymbolNode = Node>; diff --git a/zokrates_core/src/compile.rs b/zokrates_core/src/compile.rs index b406d1a51..735568b09 100644 --- a/zokrates_core/src/compile.rs +++ b/zokrates_core/src/compile.rs @@ -3,7 +3,7 @@ //! @file compile.rs //! @author Thibaut Schaeffer //! @date 2018 -use crate::absy::Module; +use crate::absy::{Module, ModuleId, Program}; use crate::flatten::Flattener; use crate::imports::{self, Importer}; use crate::ir; @@ -11,6 +11,7 @@ use crate::optimizer::Optimize; use crate::parser::{self, parse_module}; use crate::semantics::{self, Checker}; use crate::static_analysis::Analyse; +use std::collections::HashMap; use std::fmt; use std::io; use std::io::BufRead; @@ -127,10 +128,10 @@ pub fn compile>( location: Option, resolve_option: Option, &String) -> Result<(S, String, String), E>>, ) -> Result, CompileErrors> { - let compiled = compile_aux(reader, location.clone(), resolve_option)?; + let compiled = compile_program(reader, location.clone(), resolve_option)?; // check semantics - let typed_ast = Checker::new().check_module(compiled).map_err(|errors| { + let typed_ast = Checker::new().check_program(compiled).map_err(|errors| { CompileErrors( errors .into_iter() @@ -151,21 +152,33 @@ pub fn compile>( Ok(ir::Prog::from(program_flattened).optimize()) } -pub fn compile_aux>( +pub fn compile_program>( reader: &mut R, location: Option, resolve_option: Option, &String) -> Result<(S, String, String), E>>, +) -> Result, CompileErrors> { + let mut modules = HashMap::new(); + + let main = compile_module(reader, location, resolve_option, &mut modules)?; + + Ok(Program { main, modules }) +} + +pub fn compile_module>( + reader: &mut R, + location: Option, + resolve_option: Option, &String) -> Result<(S, String, String), E>>, + modules: &mut HashMap>, ) -> Result, CompileErrors> { - let program_ast_without_imports: Module = parse_module(reader) + let module_without_imports: Module = parse_module(reader) .map_err(|e| CompileErrors::from(CompileErrorInner::from(e).with_context(&location)))?; - let program_ast = Importer::new().apply_imports( - program_ast_without_imports, + Importer::new().apply_imports( + module_without_imports, location.clone(), resolve_option, - )?; - - Ok(program_ast) + modules, + ) } #[cfg(test)] diff --git a/zokrates_core/src/flatten/mod.rs b/zokrates_core/src/flatten/mod.rs index 61ba58b4b..5ea5b32e2 100644 --- a/zokrates_core/src/flatten/mod.rs +++ b/zokrates_core/src/flatten/mod.rs @@ -17,14 +17,16 @@ use zokrates_field::field::Field; /// Flattener, computes flattened program. #[derive(Debug)] -pub struct Flattener { +pub struct Flattener { /// Index of the next introduced variable while processing the program. next_var_idx: usize, /// bijection: BiMap, + /// + modules: TypedModules, } -impl Flattener { - pub fn flatten(p: TypedModule) -> FlatProg { +impl Flattener { + pub fn flatten(p: TypedProgram) -> FlatProg { Flattener::new().flatten_program(p) } @@ -34,15 +36,25 @@ impl Flattener { /// /// * `bits` - Number of bits needed to represent the maximum value. - fn new() -> Flattener { + fn new() -> Flattener { Flattener { next_var_idx: 0, bijection: BiMap::new(), + modules: HashMap::new(), } } + fn with_modules(modules: TypedModules) -> Flattener { + let f = Flattener::new(); + Flattener { modules, ..f } + } + /// Loads the code library - fn load_corelib(&mut self, functions_flattened: &mut Vec>) -> () { + fn load_corelib( + &mut self, + symbols: &HashMap>, + functions_flattened: &mut Vec>, + ) -> () { // Load type casting functions functions_flattened.push(cast(&Type::Boolean, &Type::FieldElement)); @@ -76,7 +88,12 @@ impl Flattener { TypedStatement::Definition( TypedAssignee::Identifier(Variable::field_element("condition_as_field")), FieldElementExpression::FunctionCall( - "_bool_to_field".to_string(), + FunctionKey { + id: "_bool_to_field".to_string(), + signature: Signature::new() + .inputs(vec![Type::Boolean]) + .outputs(vec![Type::FieldElement]), + }, vec![BooleanExpression::Identifier("condition".to_string()).into()], ) .into(), @@ -103,7 +120,7 @@ impl Flattener { .outputs(vec![Type::FieldElement]), }; - let ief = self.flatten_function(functions_flattened, ie); + let ief = self.flatten_function(symbols, functions_flattened, ie); functions_flattened.push(ief); } @@ -118,8 +135,10 @@ impl Flattener { /// /// * `flatten_boolean_expressions` always returns a linear expression, /// * in order to preserve composability. - fn flatten_boolean_expression( + fn flatten_boolean_expression( &mut self, + symbols: &HashMap>, + functions_flattened: &Vec>, statements_flattened: &mut Vec>, expression: BooleanExpression, @@ -136,10 +155,18 @@ impl Flattener { // We know from semantic checking that lhs and rhs have the same type // What the expression will flatten to depends on that type - let lhs_flattened = - self.flatten_field_expression(functions_flattened, statements_flattened, lhs); - let rhs_flattened = - self.flatten_field_expression(functions_flattened, statements_flattened, rhs); + let lhs_flattened = self.flatten_field_expression( + symbols, + functions_flattened, + statements_flattened, + lhs, + ); + let rhs_flattened = self.flatten_field_expression( + symbols, + functions_flattened, + statements_flattened, + rhs, + ); // lhs let lhs_id = self.use_sym(); @@ -302,6 +329,7 @@ impl Flattener { let name_m = self.use_sym(); let x = self.flatten_field_expression( + symbols, functions_flattened, statements_flattened, FieldElementExpression::Sub(box lhs, box rhs), @@ -331,11 +359,13 @@ impl Flattener { } BooleanExpression::Le(box lhs, box rhs) => { let lt = self.flatten_boolean_expression( + symbols, functions_flattened, statements_flattened, BooleanExpression::Lt(box lhs.clone(), box rhs.clone()), ); let eq = self.flatten_boolean_expression( + symbols, functions_flattened, statements_flattened, BooleanExpression::Eq(box lhs.clone(), box rhs.clone()), @@ -343,22 +373,26 @@ impl Flattener { FlatExpression::Add(box eq, box lt) } BooleanExpression::Gt(lhs, rhs) => self.flatten_boolean_expression( + symbols, functions_flattened, statements_flattened, BooleanExpression::Lt(rhs, lhs), ), BooleanExpression::Ge(lhs, rhs) => self.flatten_boolean_expression( + symbols, functions_flattened, statements_flattened, BooleanExpression::Le(rhs, lhs), ), BooleanExpression::Or(box lhs, box rhs) => { let x = box self.flatten_boolean_expression( + symbols, functions_flattened, statements_flattened, lhs, ); let y = box self.flatten_boolean_expression( + symbols, functions_flattened, statements_flattened, rhs, @@ -375,10 +409,18 @@ impl Flattener { ) } BooleanExpression::And(box lhs, box rhs) => { - let x = - self.flatten_boolean_expression(functions_flattened, statements_flattened, lhs); - let y = - self.flatten_boolean_expression(functions_flattened, statements_flattened, rhs); + let x = self.flatten_boolean_expression( + symbols, + functions_flattened, + statements_flattened, + lhs, + ); + let y = self.flatten_boolean_expression( + symbols, + functions_flattened, + statements_flattened, + rhs, + ); let name_x_and_y = self.use_sym(); assert!(x.is_linear() && y.is_linear()); @@ -390,8 +432,12 @@ impl Flattener { FlatExpression::Identifier(name_x_and_y) } BooleanExpression::Not(box exp) => { - let x = - self.flatten_boolean_expression(functions_flattened, statements_flattened, exp); + let x = self.flatten_boolean_expression( + symbols, + functions_flattened, + statements_flattened, + exp, + ); FlatExpression::Sub(box FlatExpression::Number(T::one()), box x) } BooleanExpression::Value(b) => FlatExpression::Number(match b { @@ -401,8 +447,9 @@ impl Flattener { } } - fn flatten_function_call( + fn flatten_function_call( &mut self, + symbols: &TypedFunctionSymbols, functions_flattened: &Vec>, statements_flattened: &mut Vec>, id: &String, @@ -414,7 +461,7 @@ impl Flattener { .outputs(return_types); let funct = self - .get_function(passed_signature, &functions_flattened, id) + .get_function(passed_signature, &symbols, &functions_flattened, id) .clone(); let mut replacement_map = HashMap::new(); @@ -425,6 +472,7 @@ impl Flattener { .into_iter() .map(|param_expr| { self.flatten_expression( + symbols, functions_flattened, statements_flattened, param_expr.clone(), @@ -505,27 +553,39 @@ impl Flattener { } } - fn flatten_expression( + fn flatten_expression( &mut self, + symbols: &HashMap>, + functions_flattened: &Vec>, statements_flattened: &mut Vec>, expr: TypedExpression, ) -> Vec> { match expr { - TypedExpression::FieldElement(e) => { - vec![self.flatten_field_expression(functions_flattened, statements_flattened, e)] - } - TypedExpression::Boolean(e) => { - vec![self.flatten_boolean_expression(functions_flattened, statements_flattened, e)] - } - TypedExpression::FieldElementArray(e) => { - self.flatten_field_array_expression(functions_flattened, statements_flattened, e) - } + TypedExpression::FieldElement(e) => vec![self.flatten_field_expression( + symbols, + functions_flattened, + statements_flattened, + e, + )], + TypedExpression::Boolean(e) => vec![self.flatten_boolean_expression( + symbols, + functions_flattened, + statements_flattened, + e, + )], + TypedExpression::FieldElementArray(e) => self.flatten_field_array_expression( + symbols, + functions_flattened, + statements_flattened, + e, + ), } } - fn flatten_field_expression( + fn flatten_field_expression( &mut self, + symbols: &HashMap>, functions_flattened: &Vec>, statements_flattened: &mut Vec>, expr: FieldElementExpression, @@ -536,10 +596,18 @@ impl Flattener { FlatExpression::Identifier(self.bijection.get_by_left(&x).unwrap().clone()) } FieldElementExpression::Add(box left, box right) => { - let left_flattened = - self.flatten_field_expression(functions_flattened, statements_flattened, left); - let right_flattened = - self.flatten_field_expression(functions_flattened, statements_flattened, right); + let left_flattened = self.flatten_field_expression( + symbols, + functions_flattened, + statements_flattened, + left, + ); + let right_flattened = self.flatten_field_expression( + symbols, + functions_flattened, + statements_flattened, + right, + ); let new_left = if left_flattened.is_linear() { left_flattened } else { @@ -557,10 +625,18 @@ impl Flattener { FlatExpression::Add(box new_left, box new_right) } FieldElementExpression::Sub(box left, box right) => { - let left_flattened = - self.flatten_field_expression(functions_flattened, statements_flattened, left); - let right_flattened = - self.flatten_field_expression(functions_flattened, statements_flattened, right); + let left_flattened = self.flatten_field_expression( + symbols, + functions_flattened, + statements_flattened, + left, + ); + let right_flattened = self.flatten_field_expression( + symbols, + functions_flattened, + statements_flattened, + right, + ); let new_left = if left_flattened.is_linear() { left_flattened @@ -580,10 +656,18 @@ impl Flattener { FlatExpression::Sub(box new_left, box new_right) } FieldElementExpression::Mult(box left, box right) => { - let left_flattened = - self.flatten_field_expression(functions_flattened, statements_flattened, left); - let right_flattened = - self.flatten_field_expression(functions_flattened, statements_flattened, right); + let left_flattened = self.flatten_field_expression( + symbols, + functions_flattened, + statements_flattened, + left, + ); + let right_flattened = self.flatten_field_expression( + symbols, + functions_flattened, + statements_flattened, + right, + ); let new_left = if left_flattened.is_linear() { left_flattened } else { @@ -601,10 +685,18 @@ impl Flattener { FlatExpression::Mult(box new_left, box new_right) } FieldElementExpression::Div(box left, box right) => { - let left_flattened = - self.flatten_field_expression(functions_flattened, statements_flattened, left); - let right_flattened = - self.flatten_field_expression(functions_flattened, statements_flattened, right); + let left_flattened = self.flatten_field_expression( + symbols, + functions_flattened, + statements_flattened, + left, + ); + let right_flattened = self.flatten_field_expression( + symbols, + functions_flattened, + statements_flattened, + right, + ); let new_left: FlatExpression = { let id = self.use_sym(); statements_flattened.push(FlatStatement::Definition(id, left_flattened)); @@ -652,6 +744,7 @@ impl Flattener { FieldElementExpression::Number(ref e) => { // flatten the base expression let base_flattened = self.flatten_field_expression( + symbols, functions_flattened, statements_flattened, base.clone(), @@ -675,6 +768,7 @@ impl Flattener { e => { // flatten(base ** (n-1)) let tmp_expression = self.flatten_field_expression( + symbols, functions_flattened, statements_flattened, FieldElementExpression::Pow( @@ -700,6 +794,7 @@ impl Flattener { } FieldElementExpression::IfElse(box condition, box consequent, box alternative) => self .flatten_function_call( + symbols, functions_flattened, statements_flattened, &"_if_else_field".to_string(), @@ -710,9 +805,10 @@ impl Flattener { .clone(), FieldElementExpression::FunctionCall(ref id, ref param_expressions) => { let exprs_flattened = self.flatten_function_call( + symbols, functions_flattened, statements_flattened, - id, + &id.id, vec![Type::FieldElement], param_expressions, ); @@ -732,6 +828,7 @@ impl Flattener { FieldElementArrayExpression::Value(size, expressions) => { assert!(n < T::from(size)); self.flatten_field_expression( + symbols, functions_flattened, statements_flattened, expressions[n.to_dec_string().parse::().unwrap()].clone(), @@ -747,6 +844,7 @@ impl Flattener { ) => { // [if cond then [a, b] else [c, d]][1] == if cond then [a, b][1] else [c, d][1] self.flatten_field_expression( + symbols, functions_flattened, statements_flattened, FieldElementExpression::IfElse( @@ -789,6 +887,7 @@ impl Flattener { ); self.flatten_statement( + symbols, functions_flattened, statements_flattened, range_check_statement, @@ -842,6 +941,7 @@ impl Flattener { }); self.flatten_field_expression( + symbols, functions_flattened, statements_flattened, lookup, @@ -852,8 +952,10 @@ impl Flattener { } } - fn flatten_field_array_expression( + fn flatten_field_array_expression( &mut self, + symbols: &HashMap>, + functions_flattened: &Vec>, statements_flattened: &mut Vec>, expr: FieldElementArrayExpression, @@ -872,15 +974,21 @@ impl Flattener { values .into_iter() .map(|v| { - self.flatten_field_expression(functions_flattened, statements_flattened, v) + self.flatten_field_expression( + symbols, + functions_flattened, + statements_flattened, + v, + ) }) .collect() } - FieldElementArrayExpression::FunctionCall(size, ref id, ref param_expressions) => { + FieldElementArrayExpression::FunctionCall(size, ref key, ref param_expressions) => { let exprs_flattened = self.flatten_function_call( + symbols, functions_flattened, statements_flattened, - id, + &key.id, vec![Type::FieldElementArray(size)], param_expressions, ); @@ -899,6 +1007,7 @@ impl Flattener { (0..size) .map(|i| { self.flatten_field_expression( + symbols, functions_flattened, statements_flattened, FieldElementExpression::IfElse( @@ -919,8 +1028,9 @@ impl Flattener { } } - fn flatten_statement( + fn flatten_statement( &mut self, + symbols: &HashMap>, functions_flattened: &Vec>, statements_flattened: &mut Vec>, stat: TypedStatement, @@ -930,7 +1040,12 @@ impl Flattener { let flat_expressions = exprs .into_iter() .map(|expr| { - self.flatten_expression(functions_flattened, statements_flattened, expr) + self.flatten_expression( + symbols, + functions_flattened, + statements_flattened, + expr, + ) }) .flat_map(|x| x) .collect::>(); @@ -948,6 +1063,7 @@ impl Flattener { // assign them to the n primitive types for expr let rhs = self.flatten_expression( + symbols, functions_flattened, statements_flattened, expr.clone(), @@ -1014,6 +1130,7 @@ impl Flattener { ); self.flatten_statement( + symbols, functions_flattened, statements_flattened, range_check_statement, @@ -1032,6 +1149,7 @@ impl Flattener { ); let rhs_flattened = self.flatten_field_expression( + symbols, functions_flattened, statements_flattened, rhs, @@ -1070,11 +1188,13 @@ impl Flattener { (TypedExpression::FieldElement(e1), TypedExpression::FieldElement(e2)) => { let (lhs, rhs) = ( self.flatten_field_expression( + symbols, functions_flattened, statements_flattened, e1, ), self.flatten_field_expression( + symbols, functions_flattened, statements_flattened, e2, @@ -1093,11 +1213,13 @@ impl Flattener { (TypedExpression::Boolean(e1), TypedExpression::Boolean(e2)) => { let (lhs, rhs) = ( self.flatten_boolean_expression( + symbols, functions_flattened, statements_flattened, e1, ), self.flatten_boolean_expression( + symbols, functions_flattened, statements_flattened, e2, @@ -1119,11 +1241,13 @@ impl Flattener { ) => { let (lhs, rhs) = ( self.flatten_field_array_expression( + symbols, functions_flattened, statements_flattened, e1, ), self.flatten_field_array_expression( + symbols, functions_flattened, statements_flattened, e2, @@ -1148,19 +1272,7 @@ impl Flattener { ), } } - TypedStatement::For(var, start, end, statements) => { - let mut current = start; - while current < end { - statements_flattened.push(FlatStatement::Definition( - self.use_variable(&var.id), - FlatExpression::Number(current.clone()), - )); - for s in statements.clone() { - self.flatten_statement(functions_flattened, statements_flattened, s); - } - current = T::one() + ¤t; - } - } + TypedStatement::For(..) => unreachable!("static analyser should have unrolled"), TypedStatement::MultipleDefinition(vars, rhs) => { // flatten the right side to p = sum(var_i.type.primitive_count) expressions // define p new variables to the right side expressions @@ -1168,11 +1280,12 @@ impl Flattener { let var_types = vars.iter().map(|v| v.get_type()).collect(); match rhs { - TypedExpressionList::FunctionCall(fun_id, exprs, _) => { + TypedExpressionList::FunctionCall(key, exprs, _) => { let rhs_flattened = self.flatten_function_call( + symbols, functions_flattened, statements_flattened, - &fun_id, + &key.id, var_types, &exprs, ); @@ -1212,14 +1325,22 @@ impl Flattener { } } - fn flatten_function_symbol( + fn flatten_function_symbol( &mut self, - functions_flattened: &mut Vec>, + symbols: &HashMap>, + functions_flattened: &Vec>, funct: TypedFunctionSymbol, ) -> FlatFunction { match funct { - TypedFunctionSymbol::Here(f) => self.flatten_function(functions_flattened, f), - _ => unimplemented!(), + TypedFunctionSymbol::Here(f) => self.flatten_function(symbols, functions_flattened, f), + TypedFunctionSymbol::There(key, module_id) => { + let module = self.modules.get(&module_id).unwrap(); + Flattener::with_modules(self.modules.clone()).flatten_function_symbol( + &module.functions, + &vec![], + module.functions.get(&key).unwrap().clone(), + ) + } } } @@ -1229,9 +1350,10 @@ impl Flattener { /// /// * `functions_flattened` - Vector where new flattened functions can be added. /// * `funct` - `TypedFunction` that will be flattened. - fn flatten_function( + fn flatten_function( &mut self, - functions_flattened: &mut Vec>, + symbols: &HashMap>, + functions_flattened: &Vec>, funct: TypedFunction, ) -> FlatFunction { self.bijection = BiMap::new(); @@ -1271,7 +1393,12 @@ impl Flattener { // flatten statements in functions and apply substitution for stat in funct.statements { - self.flatten_statement(functions_flattened, &mut statements_flattened, stat); + self.flatten_statement( + symbols, + functions_flattened, + &mut statements_flattened, + stat, + ); } FlatFunction { @@ -1287,22 +1414,32 @@ impl Flattener { /// # Arguments /// /// * `prog` - `Prog`ram that will be flattened. - fn flatten_program(&mut self, prog: TypedModule) -> FlatProg { + fn flatten_program(&mut self, prog: TypedProgram) -> FlatProg { let mut functions_flattened = Vec::new(); - self.load_corelib(&mut functions_flattened); + let main_module = prog.main; - for func in prog.imported_functions { + self.modules = prog.modules; + + let symbols = main_module.functions.clone(); + + self.load_corelib(&symbols, &mut functions_flattened); + + for func in main_module.imported_functions { functions_flattened.push(func); } - for func in prog.functions.into_iter().map(|(_, v)| v) { - let flattened_func = self.flatten_function_symbol(&mut functions_flattened, func); - functions_flattened.push(flattened_func); - } + let main = main_module + .functions + .into_iter() + .find(|(k, _)| k.id == "main") + .unwrap() + .1; + + let main_flattened = self.flatten_function_symbol(&symbols, &mut functions_flattened, main); FlatProg { - functions: functions_flattened, + functions: vec![main_flattened], } } @@ -1336,930 +1473,940 @@ impl Flattener { self.bijection.get_by_left(name).unwrap().clone() } - fn get_function<'a, T: Field>( - &self, + fn get_function<'a>( + &mut self, s: Signature, + symbols: &'a HashMap>, functions_flattened: &'a Vec>, id: &str, - ) -> &'a FlatFunction { - functions_flattened - .iter() - .find(|f| f.id == id && f.signature == s) - .expect(&format!("couldn't find {}", id)) - } -} - -#[cfg(test)] -mod tests { - use super::*; - use crate::types::Signature; - use crate::types::Type; - use zokrates_field::field::FieldPrime; - - #[test] - fn multiple_definition() { - // def foo() - // return 1, 2 - // def main() - // a, b = foo() - - let mut flattener = Flattener::new(); - let mut functions_flattened = vec![FlatFunction { - id: "foo".to_string(), - arguments: vec![], - statements: vec![FlatStatement::Return(FlatExpressionList { - expressions: vec![ - FlatExpression::Number(FieldPrime::from(1)), - FlatExpression::Number(FieldPrime::from(2)), - ], - })], - signature: Signature::new() - .inputs(vec![]) - .outputs(vec![Type::FieldElement, Type::FieldElement]), - }]; - let mut statements_flattened = vec![]; - let statement = TypedStatement::MultipleDefinition( - vec![ - Variable::field_element("a".to_string()), - Variable::field_element("b".to_string()), - ], - TypedExpressionList::FunctionCall( - "foo".to_string(), - vec![], - vec![Type::FieldElement, Type::FieldElement], - ), - ); - - flattener.flatten_statement( - &mut functions_flattened, - &mut statements_flattened, - statement, - ); - - let a = FlatVariable::new(0); - - assert_eq!( - statements_flattened[0], - FlatStatement::Definition(a, FlatExpression::Number(FieldPrime::from(1))) - ); - } - - #[test] - fn multiple_definition2() { - // def dup(x) - // return x, x - // def main() - // a, b = dup(2) - - let a = FlatVariable::new(0); - - let mut flattener = Flattener::new(); - let mut functions_flattened = vec![FlatFunction { - id: "dup".to_string(), - arguments: vec![FlatParameter { - id: a, - private: true, - }], - statements: vec![FlatStatement::Return(FlatExpressionList { - expressions: vec![FlatExpression::Identifier(a), FlatExpression::Identifier(a)], - })], - signature: Signature::new() - .inputs(vec![Type::FieldElement]) - .outputs(vec![Type::FieldElement, Type::FieldElement]), - }]; - let statement = TypedStatement::MultipleDefinition( - vec![ - Variable::field_element("a".to_string()), - Variable::field_element("b".to_string()), - ], - TypedExpressionList::FunctionCall( - "dup".to_string(), - vec![TypedExpression::FieldElement( - FieldElementExpression::Number(FieldPrime::from(2)), - )], - vec![Type::FieldElement, Type::FieldElement], - ), - ); - - let fun = TypedFunction { - id: String::from("main"), - arguments: vec![], - statements: vec![statement], - signature: Signature { - inputs: vec![], - outputs: vec![], - }, - }; - - let f = flattener.flatten_function(&mut functions_flattened, fun); - - let a = FlatVariable::new(0); - - assert_eq!( - f.statements[0], - FlatStatement::Definition(a, FlatExpression::Number(FieldPrime::from(2))) - ); - } - - #[test] - fn simple_definition() { - // def foo() - // return 1 - // def main() - // a = foo() - - let mut flattener = Flattener::new(); - let mut functions_flattened = vec![FlatFunction { - id: "foo".to_string(), - arguments: vec![], - statements: vec![FlatStatement::Return(FlatExpressionList { - expressions: vec![FlatExpression::Number(FieldPrime::from(1))], - })], - signature: Signature::new() - .inputs(vec![]) - .outputs(vec![Type::FieldElement]), - }]; - let mut statements_flattened = vec![]; - let statement = TypedStatement::Definition( - TypedAssignee::Identifier(Variable::field_element("a")), - TypedExpression::FieldElement(FieldElementExpression::FunctionCall( - "foo".to_string(), - vec![], - )), - ); - - flattener.flatten_statement( - &mut functions_flattened, - &mut statements_flattened, - statement, - ); - - let a = FlatVariable::new(0); - - assert_eq!( - statements_flattened[0], - FlatStatement::Definition(a, FlatExpression::Number(FieldPrime::from(1))) - ); - } - - #[test] - fn redefine_argument() { - // def foo(a) - // a = a + 1 - // return 1 - - // should flatten to no redefinition - // def foo(a) - // a_0 = a + 1 - // return 1 - - let mut flattener = Flattener::new(); - let mut functions_flattened = vec![]; - - let funct = TypedFunction { - id: "foo".to_string(), - signature: Signature::new() - .inputs(vec![Type::FieldElement]) - .outputs(vec![Type::FieldElement]), - arguments: vec![Parameter { - id: Variable::field_element("a"), - private: true, - }], - statements: vec![ - TypedStatement::Definition( - TypedAssignee::Identifier(Variable::field_element("a")), - FieldElementExpression::Add( - box FieldElementExpression::Identifier("a".to_string()), - box FieldElementExpression::Number(FieldPrime::from(1)), - ) - .into(), - ), - TypedStatement::Return(vec![ - FieldElementExpression::Number(FieldPrime::from(1)).into() - ]), - ], - }; - - let flat_funct = flattener.flatten_function(&mut functions_flattened, funct); - - let a = FlatVariable::new(0); - let a_0 = FlatVariable::new(1); - - assert_eq!( - flat_funct.statements[0], - FlatStatement::Definition( - a_0, - FlatExpression::Add( - box FlatExpression::Identifier(a), - box FlatExpression::Number(FieldPrime::from(1)) - ) - ) - ); - } - - #[test] - fn call_with_def() { - // def foo(): - // a = 3 - // return a - - // def main(): - // return foo() - - let foo = TypedFunction { - id: String::from("foo"), - arguments: vec![], - statements: vec![ - TypedStatement::Definition( - TypedAssignee::Identifier(Variable::field_element("a")), - FieldElementExpression::Number(FieldPrime::from(3)).into(), - ), - TypedStatement::Return(vec![ - FieldElementExpression::Identifier(String::from("a")).into() - ]), - ], - signature: Signature { - inputs: vec![], - outputs: vec![Type::FieldElement], - }, - }; - - let main = TypedFunction { - id: String::from("main"), - arguments: vec![], - statements: vec![TypedStatement::Return(vec![ - FieldElementExpression::FunctionCall(String::from("foo"), vec![]).into(), - ])], - signature: Signature { - inputs: vec![], - outputs: vec![Type::FieldElement], - }, - }; - - let mut flattener = Flattener::new(); - - let foo_flattened = flattener.flatten_function(&mut vec![], foo); - - let expected = FlatFunction { - id: String::from("main"), - arguments: vec![], - statements: vec![ - FlatStatement::Definition( - FlatVariable::new(0), - FlatExpression::Number(FieldPrime::from(3)), - ), - FlatStatement::Return(FlatExpressionList { - expressions: vec![FlatExpression::Identifier(FlatVariable::new(0))], - }), - ], - signature: Signature::new().outputs(vec![Type::FieldElement]), - }; - - let main_flattened = flattener.flatten_function(&mut vec![foo_flattened], main); - - assert_eq!(main_flattened, expected); - } - - #[test] - fn powers() { - // def main(): - // field a = 7 - // field b = a**4 - // return b - - // def main(): - // _0 = 7 - // _1 = (_0 * _0) - // _2 = (_1 * _0) - // _3 = (_2 * _0) - // return _3 - - let function = TypedFunction { - id: String::from("main"), - arguments: vec![], - statements: vec![ - TypedStatement::Definition( - TypedAssignee::Identifier(Variable::field_element("a")), - FieldElementExpression::Number(FieldPrime::from(7)).into(), - ), - TypedStatement::Definition( - TypedAssignee::Identifier(Variable::field_element("b")), - FieldElementExpression::Pow( - box FieldElementExpression::Identifier(String::from("a")), - box FieldElementExpression::Number(FieldPrime::from(4)), - ) - .into(), - ), - TypedStatement::Return(vec![ - FieldElementExpression::Identifier(String::from("b")).into() - ]), - ], - signature: Signature { - inputs: vec![], - outputs: vec![Type::FieldElement], - }, - }; - - let mut flattener = Flattener::new(); - - let expected = FlatFunction { - id: String::from("main"), - arguments: vec![], - statements: vec![ - FlatStatement::Definition( - FlatVariable::new(0), - FlatExpression::Number(FieldPrime::from(7)), - ), - FlatStatement::Definition( - FlatVariable::new(1), - FlatExpression::Mult( - box FlatExpression::Identifier(FlatVariable::new(0)), - box FlatExpression::Identifier(FlatVariable::new(0)), - ), - ), - FlatStatement::Definition( - FlatVariable::new(2), - FlatExpression::Mult( - box FlatExpression::Identifier(FlatVariable::new(1)), - box FlatExpression::Identifier(FlatVariable::new(0)), - ), - ), - FlatStatement::Definition( - FlatVariable::new(3), - FlatExpression::Mult( - box FlatExpression::Identifier(FlatVariable::new(2)), - box FlatExpression::Identifier(FlatVariable::new(0)), - ), - ), - FlatStatement::Return(FlatExpressionList { - expressions: vec![FlatExpression::Identifier(FlatVariable::new(3))], - }), - ], - signature: Signature::new().outputs(vec![Type::FieldElement]), + ) -> FlatFunction { + let key = FunctionKey { + id: id.to_string(), + signature: s.clone(), }; - let flattened = flattener.flatten_function(&mut vec![], function); - - assert_eq!(flattened, expected); - } - - #[test] - fn overload() { - // def foo() - // return 1 - // def foo() - // return 1, 2 - // def main() - // a = foo() - // b, c = foo() - // return 1 - // - // should not panic - // - - let mut flattener = Flattener::new(); - let functions = vec![ - TypedFunction { - id: "foo".to_string(), - arguments: vec![], - statements: vec![TypedStatement::Return(vec![TypedExpression::FieldElement( - FieldElementExpression::Number(FieldPrime::from(1)), - )])], - signature: Signature::new() - .inputs(vec![]) - .outputs(vec![Type::FieldElement]), - }, - TypedFunction { - id: "foo".to_string(), - arguments: vec![], - statements: vec![TypedStatement::Return(vec![ - TypedExpression::FieldElement(FieldElementExpression::Number( - FieldPrime::from(1), - )), - TypedExpression::FieldElement(FieldElementExpression::Number( - FieldPrime::from(2), - )), - ])], - signature: Signature::new() - .inputs(vec![]) - .outputs(vec![Type::FieldElement, Type::FieldElement]), - }, - TypedFunction { - id: "main".to_string(), - arguments: vec![], - statements: vec![ - TypedStatement::Definition( - TypedAssignee::Identifier(Variable::field_element("a")), - TypedExpression::FieldElement(FieldElementExpression::FunctionCall( - "foo".to_string(), - vec![], - )), - ), - TypedStatement::MultipleDefinition( - vec![ - Variable::field_element("b".to_string()), - Variable::field_element("c".to_string()), - ], - TypedExpressionList::FunctionCall( - "foo".to_string(), - vec![], - vec![Type::FieldElement, Type::FieldElement], - ), - ), - TypedStatement::Return(vec![TypedExpression::FieldElement( - FieldElementExpression::Number(FieldPrime::from(1)), - )]), - ], - signature: Signature::new() - .inputs(vec![]) - .outputs(vec![Type::FieldElement]), - }, - ]; - - flattener.flatten_program(TypedModule { - functions: functions - .into_iter() - .map(|f| { - ( - FunctionKey { - id: f.id.clone(), - signature: f.signature.clone(), - }, - f, - ) - }) - .collect(), - imported_functions: vec![], - imports: vec![], - }); - - // shouldn't panic - } - - #[test] - fn if_else() { - let mut flattener = Flattener::new(); - let expression = FieldElementExpression::IfElse( - box BooleanExpression::Eq( - box FieldElementExpression::Number(FieldPrime::from(32)), - box FieldElementExpression::Number(FieldPrime::from(4)), - ), - box FieldElementExpression::Number(FieldPrime::from(12)), - box FieldElementExpression::Number(FieldPrime::from(51)), - ); - - let mut functions_flattened = vec![]; - flattener.load_corelib(&mut functions_flattened); - - flattener.flatten_field_expression(&functions_flattened, &mut vec![], expression); - } - - #[test] - fn geq_leq() { - let mut flattener = Flattener::new(); - let expression_le = BooleanExpression::Le( - box FieldElementExpression::Number(FieldPrime::from(32)), - box FieldElementExpression::Number(FieldPrime::from(4)), - ); - - let expression_ge = BooleanExpression::Ge( - box FieldElementExpression::Number(FieldPrime::from(32)), - box FieldElementExpression::Number(FieldPrime::from(4)), - ); - - flattener.flatten_boolean_expression(&mut vec![], &mut vec![], expression_le); - - flattener.flatten_boolean_expression(&mut vec![], &mut vec![], expression_ge); - } - - #[test] - fn bool_and() { - let expression = FieldElementExpression::IfElse( - box BooleanExpression::And( - box BooleanExpression::Eq( - box FieldElementExpression::Number(FieldPrime::from(4)), - box FieldElementExpression::Number(FieldPrime::from(4)), - ), - box BooleanExpression::Lt( - box FieldElementExpression::Number(FieldPrime::from(4)), - box FieldElementExpression::Number(FieldPrime::from(20)), - ), - ), - box FieldElementExpression::Number(FieldPrime::from(12)), - box FieldElementExpression::Number(FieldPrime::from(51)), - ); - - let mut flattener = Flattener::new(); - let mut functions_flattened = vec![]; - flattener.load_corelib(&mut functions_flattened); - flattener.flatten_field_expression(&functions_flattened, &mut vec![], expression); - } - - #[test] - fn div() { - // a = 5 / b / b - let mut flattener = Flattener::new(); - let mut functions_flattened = vec![]; - let mut statements_flattened = vec![]; - - let definition = TypedStatement::Definition( - TypedAssignee::Identifier(Variable::field_element("b")), - FieldElementExpression::Number(FieldPrime::from(42)).into(), - ); - - let statement = TypedStatement::Definition( - TypedAssignee::Identifier(Variable::field_element("a")), - FieldElementExpression::Div( - box FieldElementExpression::Div( - box FieldElementExpression::Number(FieldPrime::from(5)), - box FieldElementExpression::Identifier(String::from("b")), - ), - box FieldElementExpression::Identifier(String::from("b")), - ) - .into(), - ); - - flattener.flatten_statement( - &mut functions_flattened, - &mut statements_flattened, - definition, - ); - - flattener.flatten_statement( - &mut functions_flattened, - &mut statements_flattened, - statement, - ); - - // define b - let b = FlatVariable::new(0); - // define new wires for members of Div - let five = FlatVariable::new(1); - let b0 = FlatVariable::new(2); - // Define inverse of denominator to prevent div by 0 - let invb0 = FlatVariable::new(3); - // Define inverse - let sym_0 = FlatVariable::new(4); - // Define result, which is first member to next Div - let sym_1 = FlatVariable::new(5); - // Define second member - let b1 = FlatVariable::new(6); - // Define inverse of denominator to prevent div by 0 - let invb1 = FlatVariable::new(7); - // Define inverse - let sym_2 = FlatVariable::new(8); - // Define left hand side - let a = FlatVariable::new(9); - - assert_eq!( - statements_flattened, - vec![ - FlatStatement::Definition(b, FlatExpression::Number(FieldPrime::from(42))), - // inputs to first div (5/b) - FlatStatement::Definition(five, FlatExpression::Number(FieldPrime::from(5))), - FlatStatement::Definition(b0, b.into()), - // check div by 0 - FlatStatement::Directive(DirectiveStatement::new( - vec![invb0], - Helper::Rust(RustHelper::Div), - vec![FlatExpression::Number(FieldPrime::from(1)), b0.into()] - )), - FlatStatement::Condition( - FlatExpression::Number(FieldPrime::from(1)), - FlatExpression::Mult(box invb0.into(), box b0.into()), - ), - // execute div - FlatStatement::Directive(DirectiveStatement::new( - vec![sym_0], - Helper::Rust(RustHelper::Div), - vec![five, b0] - )), - FlatStatement::Condition( - five.into(), - FlatExpression::Mult(box b0.into(), box sym_0.into()), - ), - // inputs to second div (res/b) - FlatStatement::Definition(sym_1, sym_0.into()), - FlatStatement::Definition(b1, b.into()), - // check div by 0 - FlatStatement::Directive(DirectiveStatement::new( - vec![invb1], - Helper::Rust(RustHelper::Div), - vec![FlatExpression::Number(FieldPrime::from(1)), b1.into()] - )), - FlatStatement::Condition( - FlatExpression::Number(FieldPrime::from(1)), - FlatExpression::Mult(box invb1.into(), box b1.into()), - ), - // execute div - FlatStatement::Directive(DirectiveStatement::new( - vec![sym_2], - Helper::Rust(RustHelper::Div), - vec![sym_1, b1] - )), - FlatStatement::Condition( - sym_1.into(), - FlatExpression::Mult(box b1.into(), box sym_2.into()), - ), - // result - FlatStatement::Definition(a, sym_2.into()), - ] - ); - } - - #[test] - fn field_array() { - // foo = [ , , ] - - let mut flattener = Flattener::new(); - let mut functions_flattened = vec![]; - let mut statements_flattened = vec![]; - let statement = TypedStatement::Definition( - TypedAssignee::Identifier(Variable::field_array("foo", 3)), - FieldElementArrayExpression::Value( - 3, - vec![ - FieldElementExpression::Number(FieldPrime::from(1)), - FieldElementExpression::Number(FieldPrime::from(2)), - FieldElementExpression::Number(FieldPrime::from(3)), - ], - ) - .into(), - ); - let expression = FieldElementArrayExpression::Identifier(3, String::from("foo")); - - flattener.flatten_statement( - &mut functions_flattened, - &mut statements_flattened, - statement, - ); - - let expressions = flattener.flatten_field_array_expression( - &mut functions_flattened, - &mut statements_flattened, - expression, - ); - - assert_eq!( - expressions, - vec![ - FlatExpression::Identifier(FlatVariable::new(0)), - FlatExpression::Identifier(FlatVariable::new(1)), - FlatExpression::Identifier(FlatVariable::new(2)), - ] - ); - } - - #[test] - fn array_definition() { - // field[3] foo = [1, 2, 3] - - let mut flattener = Flattener::new(); - let mut functions_flattened = vec![]; - let mut statements_flattened = vec![]; - let statement = TypedStatement::Definition( - TypedAssignee::Identifier(Variable::field_array("foo", 3)), - FieldElementArrayExpression::Value( - 3, - vec![ - FieldElementExpression::Number(FieldPrime::from(1)), - FieldElementExpression::Number(FieldPrime::from(2)), - FieldElementExpression::Number(FieldPrime::from(3)), - ], - ) - .into(), - ); - - flattener.flatten_statement( - &mut functions_flattened, - &mut statements_flattened, - statement, - ); - - assert_eq!( - statements_flattened, - vec![ - FlatStatement::Definition( - FlatVariable::new(0), - FlatExpression::Number(FieldPrime::from(1)) - ), - FlatStatement::Definition( - FlatVariable::new(1), - FlatExpression::Number(FieldPrime::from(2)) - ), - FlatStatement::Definition( - FlatVariable::new(2), - FlatExpression::Number(FieldPrime::from(3)) - ), - ] - ); - } - - #[test] - fn array_selection() { - // field[3] foo = [1, 2, 3] - // foo[1] - - let mut flattener = Flattener::new(); - let mut functions_flattened = vec![]; - let mut statements_flattened = vec![]; - let statement = TypedStatement::Definition( - TypedAssignee::Identifier(Variable::field_array("foo", 3)), - FieldElementArrayExpression::Value( - 3, - vec![ - FieldElementExpression::Number(FieldPrime::from(1)), - FieldElementExpression::Number(FieldPrime::from(2)), - FieldElementExpression::Number(FieldPrime::from(3)), - ], - ) - .into(), - ); - - let expression = FieldElementExpression::Select( - box FieldElementArrayExpression::Identifier(3, String::from("foo")), - box FieldElementExpression::Number(FieldPrime::from(1)), - ); - - flattener.flatten_statement::( - &mut functions_flattened, - &mut statements_flattened, - statement, - ); - - let flat_expression = flattener.flatten_field_expression::( - &mut functions_flattened, - &mut statements_flattened, - expression, - ); - - assert_eq!( - flat_expression, - FlatExpression::Identifier(FlatVariable::new(1)), - ); - } - - #[test] - fn array_sum() { - // field[3] foo = [1, 2, 3] - // bar = foo[0] + foo[1] + foo[2] - // we don't optimise detecting constants, this will be done in an optimiser pass - - let mut flattener = Flattener::new(); - let mut functions_flattened = vec![]; - let mut statements_flattened = vec![]; - let def = TypedStatement::Definition( - TypedAssignee::Identifier(Variable::field_array("foo", 3)), - FieldElementArrayExpression::Value( - 3, - vec![ - FieldElementExpression::Number(FieldPrime::from(1)), - FieldElementExpression::Number(FieldPrime::from(2)), - FieldElementExpression::Number(FieldPrime::from(3)), - ], - ) - .into(), - ); - - let sum = TypedStatement::Definition( - TypedAssignee::Identifier(Variable::field_element("bar")), - FieldElementExpression::Add( - box FieldElementExpression::Add( - box FieldElementExpression::Select( - box FieldElementArrayExpression::Identifier(3, String::from("foo")), - box FieldElementExpression::Number(FieldPrime::from(0)), - ), - box FieldElementExpression::Select( - box FieldElementArrayExpression::Identifier(3, String::from("foo")), - box FieldElementExpression::Number(FieldPrime::from(1)), - ), - ), - box FieldElementExpression::Select( - box FieldElementArrayExpression::Identifier(3, String::from("foo")), - box FieldElementExpression::Number(FieldPrime::from(2)), - ), - ) - .into(), - ); - - flattener.flatten_statement::( - &mut functions_flattened, - &mut statements_flattened, - def, - ); - - flattener.flatten_statement::( - &mut functions_flattened, - &mut statements_flattened, - sum, - ); - - assert_eq!( - statements_flattened[3], - FlatStatement::Definition( - FlatVariable::new(3), - FlatExpression::Add( - box FlatExpression::Add( - box FlatExpression::Identifier(FlatVariable::new(0)), - box FlatExpression::Identifier(FlatVariable::new(1)), - ), - box FlatExpression::Identifier(FlatVariable::new(2)), - ) - ) - ); - } - - #[test] - fn array_if() { - // if 1 == 1 then [1] else [3] fi - - let with_arrays = { - let mut flattener = Flattener::new(); - let mut functions_flattened = vec![]; - flattener.load_corelib(&mut functions_flattened); - let mut statements_flattened = vec![]; - - let e = FieldElementArrayExpression::IfElse( - box BooleanExpression::Eq( - box FieldElementExpression::Number(FieldPrime::from(1)), - box FieldElementExpression::Number(FieldPrime::from(1)), - ), - box FieldElementArrayExpression::Value( - 1, - vec![FieldElementExpression::Number(FieldPrime::from(1))], - ), - box FieldElementArrayExpression::Value( - 1, - vec![FieldElementExpression::Number(FieldPrime::from(3))], - ), - ); - - ( - flattener.flatten_field_array_expression( - &mut functions_flattened, - &mut statements_flattened, - e, - )[0] + match symbols.get(&key) { + Some(f) => self.flatten_function_symbol(symbols, functions_flattened, f.clone()), + None => functions_flattened + .iter() + .find(|f| f.id == id && f.signature == s) + .expect(&format!("couldn't find {}", id)) .clone(), - statements_flattened, - ) - }; - - let without_arrays = { - let mut flattener = Flattener::new(); - let mut functions_flattened = vec![]; - flattener.load_corelib(&mut functions_flattened); - let mut statements_flattened = vec![]; - - // if 1 == 1 then 1 else 3 fi - let e = FieldElementExpression::IfElse( - box BooleanExpression::Eq( - box FieldElementExpression::Number(FieldPrime::from(1)), - box FieldElementExpression::Number(FieldPrime::from(1)), - ), - box FieldElementExpression::Number(FieldPrime::from(1)), - box FieldElementExpression::Number(FieldPrime::from(3)), - ); - - ( - flattener.flatten_field_expression( - &mut functions_flattened, - &mut statements_flattened, - e, - ), - statements_flattened, - ) - }; - - assert_eq!(with_arrays, without_arrays); - } - - #[test] - fn next_variable() { - let mut flattener = Flattener::new(); - assert_eq!( - FlatVariable::new(0), - flattener.use_variable(&String::from("a")) - ); - assert_eq!( - flattener.get_latest_var_substitution(&String::from("a")), - FlatVariable::new(0) - ); - assert_eq!( - FlatVariable::new(1), - flattener.use_variable(&String::from("a")) - ); - assert_eq!( - flattener.get_latest_var_substitution(&String::from("a")), - FlatVariable::new(1) - ); - assert_eq!( - FlatVariable::new(2), - flattener.use_variable(&String::from("a")) - ); - assert_eq!( - flattener.get_latest_var_substitution(&String::from("a")), - FlatVariable::new(2) - ); + } } } + +// #[cfg(test)] +// mod tests { +// use super::*; +// use crate::types::Signature; +// use crate::types::Type; +// use zokrates_field::field::FieldPrime; + +// #[test] +// fn multiple_definition() { +// // def foo() +// // return 1, 2 +// // def main() +// // a, b = foo() + +// let mut flattener = Flattener::new(); +// let mut functions_flattened = vec![FlatFunction { +// id: "foo".to_string(), +// arguments: vec![], +// statements: vec![FlatStatement::Return(FlatExpressionList { +// expressions: vec![ +// FlatExpression::Number(FieldPrime::from(1)), +// FlatExpression::Number(FieldPrime::from(2)), +// ], +// })], +// signature: Signature::new() +// .inputs(vec![]) +// .outputs(vec![Type::FieldElement, Type::FieldElement]), +// }]; +// let mut statements_flattened = vec![]; +// let statement = TypedStatement::MultipleDefinition( +// vec![ +// Variable::field_element("a".to_string()), +// Variable::field_element("b".to_string()), +// ], +// TypedExpressionList::FunctionCall( +// "foo".to_string(), +// vec![], +// vec![Type::FieldElement, Type::FieldElement], +// ), +// ); + +// flattener.flatten_statement( +// &mut functions_flattened, +// &mut statements_flattened, +// statement, +// ); + +// let a = FlatVariable::new(0); + +// assert_eq!( +// statements_flattened[0], +// FlatStatement::Definition(a, FlatExpression::Number(FieldPrime::from(1))) +// ); +// } + +// #[test] +// fn multiple_definition2() { +// // def dup(x) +// // return x, x +// // def main() +// // a, b = dup(2) + +// let a = FlatVariable::new(0); + +// let mut flattener = Flattener::new(); +// let mut functions_flattened = vec![FlatFunction { +// id: "dup".to_string(), +// arguments: vec![FlatParameter { +// id: a, +// private: true, +// }], +// statements: vec![FlatStatement::Return(FlatExpressionList { +// expressions: vec![FlatExpression::Identifier(a), FlatExpression::Identifier(a)], +// })], +// signature: Signature::new() +// .inputs(vec![Type::FieldElement]) +// .outputs(vec![Type::FieldElement, Type::FieldElement]), +// }]; +// let statement = TypedStatement::MultipleDefinition( +// vec![ +// Variable::field_element("a".to_string()), +// Variable::field_element("b".to_string()), +// ], +// TypedExpressionList::FunctionCall( +// "dup".to_string(), +// vec![TypedExpression::FieldElement( +// FieldElementExpression::Number(FieldPrime::from(2)), +// )], +// vec![Type::FieldElement, Type::FieldElement], +// ), +// ); + +// let fun = TypedFunction { +// id: String::from("main"), +// arguments: vec![], +// statements: vec![statement], +// signature: Signature { +// inputs: vec![], +// outputs: vec![], +// }, +// }; + +// let f = flattener.flatten_function(&mut functions_flattened, fun); + +// let a = FlatVariable::new(0); + +// assert_eq!( +// f.statements[0], +// FlatStatement::Definition(a, FlatExpression::Number(FieldPrime::from(2))) +// ); +// } + +// #[test] +// fn simple_definition() { +// // def foo() +// // return 1 +// // def main() +// // a = foo() + +// let mut flattener = Flattener::new(); +// let mut functions_flattened = vec![FlatFunction { +// id: "foo".to_string(), +// arguments: vec![], +// statements: vec![FlatStatement::Return(FlatExpressionList { +// expressions: vec![FlatExpression::Number(FieldPrime::from(1))], +// })], +// signature: Signature::new() +// .inputs(vec![]) +// .outputs(vec![Type::FieldElement]), +// }]; +// let mut statements_flattened = vec![]; +// let statement = TypedStatement::Definition( +// TypedAssignee::Identifier(Variable::field_element("a")), +// TypedExpression::FieldElement(FieldElementExpression::FunctionCall( +// "foo".to_string(), +// vec![], +// )), +// ); + +// flattener.flatten_statement( +// &mut functions_flattened, +// &mut statements_flattened, +// statement, +// ); + +// let a = FlatVariable::new(0); + +// assert_eq!( +// statements_flattened[0], +// FlatStatement::Definition(a, FlatExpression::Number(FieldPrime::from(1))) +// ); +// } + +// #[test] +// fn redefine_argument() { +// // def foo(a) +// // a = a + 1 +// // return 1 + +// // should flatten to no redefinition +// // def foo(a) +// // a_0 = a + 1 +// // return 1 + +// let mut flattener = Flattener::new(); +// let mut functions_flattened = vec![]; + +// let funct = TypedFunction { +// id: "foo".to_string(), +// signature: Signature::new() +// .inputs(vec![Type::FieldElement]) +// .outputs(vec![Type::FieldElement]), +// arguments: vec![Parameter { +// id: Variable::field_element("a"), +// private: true, +// }], +// statements: vec![ +// TypedStatement::Definition( +// TypedAssignee::Identifier(Variable::field_element("a")), +// FieldElementExpression::Add( +// box FieldElementExpression::Identifier("a".to_string()), +// box FieldElementExpression::Number(FieldPrime::from(1)), +// ) +// .into(), +// ), +// TypedStatement::Return(vec![ +// FieldElementExpression::Number(FieldPrime::from(1)).into() +// ]), +// ], +// }; + +// let flat_funct = flattener.flatten_function(&mut functions_flattened, funct); + +// let a = FlatVariable::new(0); +// let a_0 = FlatVariable::new(1); + +// assert_eq!( +// flat_funct.statements[0], +// FlatStatement::Definition( +// a_0, +// FlatExpression::Add( +// box FlatExpression::Identifier(a), +// box FlatExpression::Number(FieldPrime::from(1)) +// ) +// ) +// ); +// } + +// #[test] +// fn call_with_def() { +// // def foo(): +// // a = 3 +// // return a + +// // def main(): +// // return foo() + +// let foo = TypedFunction { +// id: String::from("foo"), +// arguments: vec![], +// statements: vec![ +// TypedStatement::Definition( +// TypedAssignee::Identifier(Variable::field_element("a")), +// FieldElementExpression::Number(FieldPrime::from(3)).into(), +// ), +// TypedStatement::Return(vec![ +// FieldElementExpression::Identifier(String::from("a")).into() +// ]), +// ], +// signature: Signature { +// inputs: vec![], +// outputs: vec![Type::FieldElement], +// }, +// }; + +// let main = TypedFunction { +// id: String::from("main"), +// arguments: vec![], +// statements: vec![TypedStatement::Return(vec![ +// FieldElementExpression::FunctionCall(String::from("foo"), vec![]).into(), +// ])], +// signature: Signature { +// inputs: vec![], +// outputs: vec![Type::FieldElement], +// }, +// }; + +// let mut flattener = Flattener::new(); + +// let foo_flattened = flattener.flatten_function(&mut vec![], foo); + +// let expected = FlatFunction { +// id: String::from("main"), +// arguments: vec![], +// statements: vec![ +// FlatStatement::Definition( +// FlatVariable::new(0), +// FlatExpression::Number(FieldPrime::from(3)), +// ), +// FlatStatement::Return(FlatExpressionList { +// expressions: vec![FlatExpression::Identifier(FlatVariable::new(0))], +// }), +// ], +// signature: Signature::new().outputs(vec![Type::FieldElement]), +// }; + +// let main_flattened = flattener.flatten_function(&mut vec![foo_flattened], main); + +// assert_eq!(main_flattened, expected); +// } + +// #[test] +// fn powers() { +// // def main(): +// // field a = 7 +// // field b = a**4 +// // return b + +// // def main(): +// // _0 = 7 +// // _1 = (_0 * _0) +// // _2 = (_1 * _0) +// // _3 = (_2 * _0) +// // return _3 + +// let function = TypedFunction { +// id: String::from("main"), +// arguments: vec![], +// statements: vec![ +// TypedStatement::Definition( +// TypedAssignee::Identifier(Variable::field_element("a")), +// FieldElementExpression::Number(FieldPrime::from(7)).into(), +// ), +// TypedStatement::Definition( +// TypedAssignee::Identifier(Variable::field_element("b")), +// FieldElementExpression::Pow( +// box FieldElementExpression::Identifier(String::from("a")), +// box FieldElementExpression::Number(FieldPrime::from(4)), +// ) +// .into(), +// ), +// TypedStatement::Return(vec![ +// FieldElementExpression::Identifier(String::from("b")).into() +// ]), +// ], +// signature: Signature { +// inputs: vec![], +// outputs: vec![Type::FieldElement], +// }, +// }; + +// let mut flattener = Flattener::new(); + +// let expected = FlatFunction { +// id: String::from("main"), +// arguments: vec![], +// statements: vec![ +// FlatStatement::Definition( +// FlatVariable::new(0), +// FlatExpression::Number(FieldPrime::from(7)), +// ), +// FlatStatement::Definition( +// FlatVariable::new(1), +// FlatExpression::Mult( +// box FlatExpression::Identifier(FlatVariable::new(0)), +// box FlatExpression::Identifier(FlatVariable::new(0)), +// ), +// ), +// FlatStatement::Definition( +// FlatVariable::new(2), +// FlatExpression::Mult( +// box FlatExpression::Identifier(FlatVariable::new(1)), +// box FlatExpression::Identifier(FlatVariable::new(0)), +// ), +// ), +// FlatStatement::Definition( +// FlatVariable::new(3), +// FlatExpression::Mult( +// box FlatExpression::Identifier(FlatVariable::new(2)), +// box FlatExpression::Identifier(FlatVariable::new(0)), +// ), +// ), +// FlatStatement::Return(FlatExpressionList { +// expressions: vec![FlatExpression::Identifier(FlatVariable::new(3))], +// }), +// ], +// signature: Signature::new().outputs(vec![Type::FieldElement]), +// }; + +// let flattened = flattener.flatten_function(&mut vec![], function); + +// assert_eq!(flattened, expected); +// } + +// #[test] +// fn overload() { +// // def foo() +// // return 1 +// // def foo() +// // return 1, 2 +// // def main() +// // a = foo() +// // b, c = foo() +// // return 1 +// // +// // should not panic +// // + +// let mut flattener = Flattener::new(); +// let functions = vec![ +// TypedFunction { +// id: "foo".to_string(), +// arguments: vec![], +// statements: vec![TypedStatement::Return(vec![TypedExpression::FieldElement( +// FieldElementExpression::Number(FieldPrime::from(1)), +// )])], +// signature: Signature::new() +// .inputs(vec![]) +// .outputs(vec![Type::FieldElement]), +// }, +// TypedFunction { +// id: "foo".to_string(), +// arguments: vec![], +// statements: vec![TypedStatement::Return(vec![ +// TypedExpression::FieldElement(FieldElementExpression::Number( +// FieldPrime::from(1), +// )), +// TypedExpression::FieldElement(FieldElementExpression::Number( +// FieldPrime::from(2), +// )), +// ])], +// signature: Signature::new() +// .inputs(vec![]) +// .outputs(vec![Type::FieldElement, Type::FieldElement]), +// }, +// TypedFunction { +// id: "main".to_string(), +// arguments: vec![], +// statements: vec![ +// TypedStatement::Definition( +// TypedAssignee::Identifier(Variable::field_element("a")), +// TypedExpression::FieldElement(FieldElementExpression::FunctionCall( +// "foo".to_string(), +// vec![], +// )), +// ), +// TypedStatement::MultipleDefinition( +// vec![ +// Variable::field_element("b".to_string()), +// Variable::field_element("c".to_string()), +// ], +// TypedExpressionList::FunctionCall( +// "foo".to_string(), +// vec![], +// vec![Type::FieldElement, Type::FieldElement], +// ), +// ), +// TypedStatement::Return(vec![TypedExpression::FieldElement( +// FieldElementExpression::Number(FieldPrime::from(1)), +// )]), +// ], +// signature: Signature::new() +// .inputs(vec![]) +// .outputs(vec![Type::FieldElement]), +// }, +// ]; + +// flattener.flatten_program(TypedModule { +// functions: functions +// .into_iter() +// .map(|f| { +// ( +// FunctionKey { +// id: f.id.clone(), +// signature: f.signature.clone(), +// }, +// f, +// ) +// }) +// .collect(), +// imported_functions: vec![], +// imports: vec![], +// }); + +// // shouldn't panic +// } + +// #[test] +// fn if_else() { +// let mut flattener = Flattener::new(); +// let expression = FieldElementExpression::IfElse( +// box BooleanExpression::Eq( +// box FieldElementExpression::Number(FieldPrime::from(32)), +// box FieldElementExpression::Number(FieldPrime::from(4)), +// ), +// box FieldElementExpression::Number(FieldPrime::from(12)), +// box FieldElementExpression::Number(FieldPrime::from(51)), +// ); + +// let mut functions_flattened = vec![]; +// flattener.load_corelib(&mut functions_flattened); + +// flattener.flatten_field_expression(&functions_flattened, &mut vec![], expression); +// } + +// #[test] +// fn geq_leq() { +// let mut flattener = Flattener::new(); +// let expression_le = BooleanExpression::Le( +// box FieldElementExpression::Number(FieldPrime::from(32)), +// box FieldElementExpression::Number(FieldPrime::from(4)), +// ); + +// let expression_ge = BooleanExpression::Ge( +// box FieldElementExpression::Number(FieldPrime::from(32)), +// box FieldElementExpression::Number(FieldPrime::from(4)), +// ); + +// flattener.flatten_boolean_expression(&mut vec![], &mut vec![], expression_le); + +// flattener.flatten_boolean_expression(&mut vec![], &mut vec![], expression_ge); +// } + +// #[test] +// fn bool_and() { +// let expression = FieldElementExpression::IfElse( +// box BooleanExpression::And( +// box BooleanExpression::Eq( +// box FieldElementExpression::Number(FieldPrime::from(4)), +// box FieldElementExpression::Number(FieldPrime::from(4)), +// ), +// box BooleanExpression::Lt( +// box FieldElementExpression::Number(FieldPrime::from(4)), +// box FieldElementExpression::Number(FieldPrime::from(20)), +// ), +// ), +// box FieldElementExpression::Number(FieldPrime::from(12)), +// box FieldElementExpression::Number(FieldPrime::from(51)), +// ); + +// let mut flattener = Flattener::new(); +// let mut functions_flattened = vec![]; +// flattener.load_corelib(&mut functions_flattened); +// flattener.flatten_field_expression(&functions_flattened, &mut vec![], expression); +// } + +// #[test] +// fn div() { +// // a = 5 / b / b +// let mut flattener = Flattener::new(); +// let mut functions_flattened = vec![]; +// let mut statements_flattened = vec![]; + +// let definition = TypedStatement::Definition( +// TypedAssignee::Identifier(Variable::field_element("b")), +// FieldElementExpression::Number(FieldPrime::from(42)).into(), +// ); + +// let statement = TypedStatement::Definition( +// TypedAssignee::Identifier(Variable::field_element("a")), +// FieldElementExpression::Div( +// box FieldElementExpression::Div( +// box FieldElementExpression::Number(FieldPrime::from(5)), +// box FieldElementExpression::Identifier(String::from("b")), +// ), +// box FieldElementExpression::Identifier(String::from("b")), +// ) +// .into(), +// ); + +// flattener.flatten_statement( +// &mut functions_flattened, +// &mut statements_flattened, +// definition, +// ); + +// flattener.flatten_statement( +// &mut functions_flattened, +// &mut statements_flattened, +// statement, +// ); + +// // define b +// let b = FlatVariable::new(0); +// // define new wires for members of Div +// let five = FlatVariable::new(1); +// let b0 = FlatVariable::new(2); +// // Define inverse of denominator to prevent div by 0 +// let invb0 = FlatVariable::new(3); +// // Define inverse +// let sym_0 = FlatVariable::new(4); +// // Define result, which is first member to next Div +// let sym_1 = FlatVariable::new(5); +// // Define second member +// let b1 = FlatVariable::new(6); +// // Define inverse of denominator to prevent div by 0 +// let invb1 = FlatVariable::new(7); +// // Define inverse +// let sym_2 = FlatVariable::new(8); +// // Define left hand side +// let a = FlatVariable::new(9); + +// assert_eq!( +// statements_flattened, +// vec![ +// FlatStatement::Definition(b, FlatExpression::Number(FieldPrime::from(42))), +// // inputs to first div (5/b) +// FlatStatement::Definition(five, FlatExpression::Number(FieldPrime::from(5))), +// FlatStatement::Definition(b0, b.into()), +// // check div by 0 +// FlatStatement::Directive(DirectiveStatement::new( +// vec![invb0], +// Helper::Rust(RustHelper::Div), +// vec![FlatExpression::Number(FieldPrime::from(1)), b0.into()] +// )), +// FlatStatement::Condition( +// FlatExpression::Number(FieldPrime::from(1)), +// FlatExpression::Mult(box invb0.into(), box b0.into()), +// ), +// // execute div +// FlatStatement::Directive(DirectiveStatement::new( +// vec![sym_0], +// Helper::Rust(RustHelper::Div), +// vec![five, b0] +// )), +// FlatStatement::Condition( +// five.into(), +// FlatExpression::Mult(box b0.into(), box sym_0.into()), +// ), +// // inputs to second div (res/b) +// FlatStatement::Definition(sym_1, sym_0.into()), +// FlatStatement::Definition(b1, b.into()), +// // check div by 0 +// FlatStatement::Directive(DirectiveStatement::new( +// vec![invb1], +// Helper::Rust(RustHelper::Div), +// vec![FlatExpression::Number(FieldPrime::from(1)), b1.into()] +// )), +// FlatStatement::Condition( +// FlatExpression::Number(FieldPrime::from(1)), +// FlatExpression::Mult(box invb1.into(), box b1.into()), +// ), +// // execute div +// FlatStatement::Directive(DirectiveStatement::new( +// vec![sym_2], +// Helper::Rust(RustHelper::Div), +// vec![sym_1, b1] +// )), +// FlatStatement::Condition( +// sym_1.into(), +// FlatExpression::Mult(box b1.into(), box sym_2.into()), +// ), +// // result +// FlatStatement::Definition(a, sym_2.into()), +// ] +// ); +// } + +// #[test] +// fn field_array() { +// // foo = [ , , ] + +// let mut flattener = Flattener::new(); +// let mut functions_flattened = vec![]; +// let mut statements_flattened = vec![]; +// let statement = TypedStatement::Definition( +// TypedAssignee::Identifier(Variable::field_array("foo", 3)), +// FieldElementArrayExpression::Value( +// 3, +// vec![ +// FieldElementExpression::Number(FieldPrime::from(1)), +// FieldElementExpression::Number(FieldPrime::from(2)), +// FieldElementExpression::Number(FieldPrime::from(3)), +// ], +// ) +// .into(), +// ); +// let expression = FieldElementArrayExpression::Identifier(3, String::from("foo")); + +// flattener.flatten_statement( +// &mut functions_flattened, +// &mut statements_flattened, +// statement, +// ); + +// let expressions = flattener.flatten_field_array_expression( +// &mut functions_flattened, +// &mut statements_flattened, +// expression, +// ); + +// assert_eq!( +// expressions, +// vec![ +// FlatExpression::Identifier(FlatVariable::new(0)), +// FlatExpression::Identifier(FlatVariable::new(1)), +// FlatExpression::Identifier(FlatVariable::new(2)), +// ] +// ); +// } + +// #[test] +// fn array_definition() { +// // field[3] foo = [1, 2, 3] + +// let mut flattener = Flattener::new(); +// let mut functions_flattened = vec![]; +// let mut statements_flattened = vec![]; +// let statement = TypedStatement::Definition( +// TypedAssignee::Identifier(Variable::field_array("foo", 3)), +// FieldElementArrayExpression::Value( +// 3, +// vec![ +// FieldElementExpression::Number(FieldPrime::from(1)), +// FieldElementExpression::Number(FieldPrime::from(2)), +// FieldElementExpression::Number(FieldPrime::from(3)), +// ], +// ) +// .into(), +// ); + +// flattener.flatten_statement( +// &mut functions_flattened, +// &mut statements_flattened, +// statement, +// ); + +// assert_eq!( +// statements_flattened, +// vec![ +// FlatStatement::Definition( +// FlatVariable::new(0), +// FlatExpression::Number(FieldPrime::from(1)) +// ), +// FlatStatement::Definition( +// FlatVariable::new(1), +// FlatExpression::Number(FieldPrime::from(2)) +// ), +// FlatStatement::Definition( +// FlatVariable::new(2), +// FlatExpression::Number(FieldPrime::from(3)) +// ), +// ] +// ); +// } + +// #[test] +// fn array_selection() { +// // field[3] foo = [1, 2, 3] +// // foo[1] + +// let mut flattener = Flattener::new(); +// let mut functions_flattened = vec![]; +// let mut statements_flattened = vec![]; +// let statement = TypedStatement::Definition( +// TypedAssignee::Identifier(Variable::field_array("foo", 3)), +// FieldElementArrayExpression::Value( +// 3, +// vec![ +// FieldElementExpression::Number(FieldPrime::from(1)), +// FieldElementExpression::Number(FieldPrime::from(2)), +// FieldElementExpression::Number(FieldPrime::from(3)), +// ], +// ) +// .into(), +// ); + +// let expression = FieldElementExpression::Select( +// box FieldElementArrayExpression::Identifier(3, String::from("foo")), +// box FieldElementExpression::Number(FieldPrime::from(1)), +// ); + +// flattener.flatten_statement::( +// &mut functions_flattened, +// &mut statements_flattened, +// statement, +// ); + +// let flat_expression = flattener.flatten_field_expression::( +// &mut functions_flattened, +// &mut statements_flattened, +// expression, +// ); + +// assert_eq!( +// flat_expression, +// FlatExpression::Identifier(FlatVariable::new(1)), +// ); +// } + +// #[test] +// fn array_sum() { +// // field[3] foo = [1, 2, 3] +// // bar = foo[0] + foo[1] + foo[2] +// // we don't optimise detecting constants, this will be done in an optimiser pass + +// let mut flattener = Flattener::new(); +// let mut functions_flattened = vec![]; +// let mut statements_flattened = vec![]; +// let def = TypedStatement::Definition( +// TypedAssignee::Identifier(Variable::field_array("foo", 3)), +// FieldElementArrayExpression::Value( +// 3, +// vec![ +// FieldElementExpression::Number(FieldPrime::from(1)), +// FieldElementExpression::Number(FieldPrime::from(2)), +// FieldElementExpression::Number(FieldPrime::from(3)), +// ], +// ) +// .into(), +// ); + +// let sum = TypedStatement::Definition( +// TypedAssignee::Identifier(Variable::field_element("bar")), +// FieldElementExpression::Add( +// box FieldElementExpression::Add( +// box FieldElementExpression::Select( +// box FieldElementArrayExpression::Identifier(3, String::from("foo")), +// box FieldElementExpression::Number(FieldPrime::from(0)), +// ), +// box FieldElementExpression::Select( +// box FieldElementArrayExpression::Identifier(3, String::from("foo")), +// box FieldElementExpression::Number(FieldPrime::from(1)), +// ), +// ), +// box FieldElementExpression::Select( +// box FieldElementArrayExpression::Identifier(3, String::from("foo")), +// box FieldElementExpression::Number(FieldPrime::from(2)), +// ), +// ) +// .into(), +// ); + +// flattener.flatten_statement::( +// &mut functions_flattened, +// &mut statements_flattened, +// def, +// ); + +// flattener.flatten_statement::( +// &mut functions_flattened, +// &mut statements_flattened, +// sum, +// ); + +// assert_eq!( +// statements_flattened[3], +// FlatStatement::Definition( +// FlatVariable::new(3), +// FlatExpression::Add( +// box FlatExpression::Add( +// box FlatExpression::Identifier(FlatVariable::new(0)), +// box FlatExpression::Identifier(FlatVariable::new(1)), +// ), +// box FlatExpression::Identifier(FlatVariable::new(2)), +// ) +// ) +// ); +// } + +// #[test] +// fn array_if() { +// // if 1 == 1 then [1] else [3] fi + +// let with_arrays = { +// let mut flattener = Flattener::new(); +// let mut functions_flattened = vec![]; +// flattener.load_corelib(&mut functions_flattened); +// let mut statements_flattened = vec![]; + +// let e = FieldElementArrayExpression::IfElse( +// box BooleanExpression::Eq( +// box FieldElementExpression::Number(FieldPrime::from(1)), +// box FieldElementExpression::Number(FieldPrime::from(1)), +// ), +// box FieldElementArrayExpression::Value( +// 1, +// vec![FieldElementExpression::Number(FieldPrime::from(1))], +// ), +// box FieldElementArrayExpression::Value( +// 1, +// vec![FieldElementExpression::Number(FieldPrime::from(3))], +// ), +// ); + +// ( +// flattener.flatten_field_array_expression( +// &mut functions_flattened, +// &mut statements_flattened, +// e, +// )[0] +// .clone(), +// statements_flattened, +// ) +// }; + +// let without_arrays = { +// let mut flattener = Flattener::new(); +// let mut functions_flattened = vec![]; +// flattener.load_corelib(&mut functions_flattened); +// let mut statements_flattened = vec![]; + +// // if 1 == 1 then 1 else 3 fi +// let e = FieldElementExpression::IfElse( +// box BooleanExpression::Eq( +// box FieldElementExpression::Number(FieldPrime::from(1)), +// box FieldElementExpression::Number(FieldPrime::from(1)), +// ), +// box FieldElementExpression::Number(FieldPrime::from(1)), +// box FieldElementExpression::Number(FieldPrime::from(3)), +// ); + +// ( +// flattener.flatten_field_expression( +// &mut functions_flattened, +// &mut statements_flattened, +// e, +// ), +// statements_flattened, +// ) +// }; + +// assert_eq!(with_arrays, without_arrays); +// } + +// #[test] +// fn next_variable() { +// let mut flattener = Flattener::new(); +// assert_eq!( +// FlatVariable::new(0), +// flattener.use_variable(&String::from("a")) +// ); +// assert_eq!( +// flattener.get_latest_var_substitution(&String::from("a")), +// FlatVariable::new(0) +// ); +// assert_eq!( +// FlatVariable::new(1), +// flattener.use_variable(&String::from("a")) +// ); +// assert_eq!( +// flattener.get_latest_var_substitution(&String::from("a")), +// FlatVariable::new(1) +// ); +// assert_eq!( +// FlatVariable::new(2), +// flattener.use_variable(&String::from("a")) +// ); +// assert_eq!( +// flattener.get_latest_var_substitution(&String::from("a")), +// FlatVariable::new(2) +// ); +// } +// } diff --git a/zokrates_core/src/imports.rs b/zokrates_core/src/imports.rs index 362013fca..ed51891d2 100644 --- a/zokrates_core/src/imports.rs +++ b/zokrates_core/src/imports.rs @@ -5,14 +5,14 @@ //! @date 2018 use crate::absy::*; -use crate::compile::compile_aux; +use crate::compile::compile_module; use crate::compile::{CompileErrorInner, CompileErrors}; use crate::flat_absy::*; use crate::parser::Position; +use std::collections::HashMap; use std::fmt; use std::io; use std::io::BufRead; -use std::rc::Rc; use zokrates_field::field::Field; pub struct CompiledImport { @@ -133,6 +133,7 @@ impl Importer { destination: Module, location: Option, resolve_option: Option, &String) -> Result<(S, String, String), E>>, + modules: &mut HashMap>, ) -> Result, CompileErrors> { let mut origins: Vec> = vec![]; let mut functions = vec![]; @@ -192,13 +193,20 @@ impl Importer { match resolve_option { Some(resolve) => match resolve(&location, &import.source) { Ok((mut reader, location, auto_alias)) => { - let compiled = compile_aux(&mut reader, Some(location), resolve_option) - .map_err(|e| e.with_context(Some(import.source.clone())))?; + let compiled = compile_module( + &mut reader, + Some(location), + resolve_option, + modules, + ) + .map_err(|e| e.with_context(Some(import.source.clone())))?; let alias = import.alias.clone().unwrap_or(auto_alias); + modules.insert(import.source.clone(), compiled); + functions.push(( alias.clone(), - FunctionSymbol::There(String::from("main"), Rc::new(compiled)) + FunctionSymbol::There(String::from("main"), import.source.clone()) .at(0, 0, 0), )); } diff --git a/zokrates_core/src/semantics.rs b/zokrates_core/src/semantics.rs index c5b72c353..37d897712 100644 --- a/zokrates_core/src/semantics.rs +++ b/zokrates_core/src/semantics.rs @@ -130,9 +130,27 @@ impl Checker { } } - pub fn check_module( + pub fn check_program( + &mut self, + program: Program, + ) -> Result, Vec> { + let mut modules = program.modules; + + let mut typed_modules = HashMap::new(); + + let main = self.check_module(program.main, &mut modules, &mut typed_modules)?; + + Ok(TypedProgram { + main, + modules: typed_modules, + }) + } + + fn check_module( &mut self, module: Module, + modules: &mut Modules, + typed_modules: &mut TypedModules, ) -> Result, Vec> { for func in &module.imported_functions { self.functions.insert(FunctionKey { @@ -147,17 +165,17 @@ impl Checker { for (id, func) in module.functions { self.enter_scope(); - match self.check_function_symbol(func) { + match self.check_function_symbol(func, modules, typed_modules) { Ok(checked_function_symbols) => { self.functions .extend(checked_function_symbols.iter().map(|f| FunctionKey { - signature: f.signature().clone(), + signature: f.signature(&typed_modules).clone(), id: id.clone(), })); checked_functions.extend(checked_function_symbols.into_iter().map(|f| { ( FunctionKey { - signature: f.signature().clone(), + signature: f.signature(&typed_modules).clone(), id: id.clone(), }, f, @@ -289,43 +307,74 @@ impl Checker { fn check_function_symbol( &mut self, funct_symbol_node: FunctionSymbolNode, + modules: &mut Modules, + typed_modules: &mut TypedModules, ) -> Result>, Vec> { let pos = funct_symbol_node.pos(); let funct_symbol = funct_symbol_node.value; + let mut errors = vec![]; + match funct_symbol { FunctionSymbol::Here(funct_node) => self .check_function(funct_node) .map(|f| vec![TypedFunctionSymbol::Here(f)]), - FunctionSymbol::There(id, module) => { - let mut checker = Checker::new(); - - match checker.check_module(module.as_ref().clone()) { - Ok(module) => { - let candidates: Vec<_> = module - .functions - .iter() - .filter(|(k, _)| k.id == id) - .map(|(_, v)| FunctionKey { - id: id.clone(), - signature: v.signature().clone(), - }) - .collect(); + FunctionSymbol::There(id, module_id) => { + // check if the module was already checked + let to_insert = match typed_modules.get(&module_id).clone() { + // if it was, do nothing + Some(_) => None, + // if it was not, check it + None => { + match Checker::new().check_module( + modules.remove(&module_id.clone()).unwrap(), + modules, + typed_modules, + ) { + Ok(typed_module) => Some(typed_module), + Err(e) => { + errors.extend(e); + None + } + } + } + }; - let reference = Rc::new(module); + // return if any errors occured + if errors.len() > 0 { + return Err(errors); + } - match candidates.len() { - 0 => Err(vec![Error { - pos: Some(pos), - message: format!("Function {} not found in module {}", id, "TODO"), - }]), - _ => Ok(candidates - .into_iter() - .map(|f| TypedFunctionSymbol::There(f, reference.clone())) - .collect()), - } + // insert into typed_modules if we checked anything + match to_insert { + Some(typed_module) => { + typed_modules.insert(module_id.clone(), typed_module); } - Err(e) => Err(e), + None => {} + }; + + // find candidates in the checked module + let candidates: Vec<_> = typed_modules + .get(&module_id) + .unwrap() + .functions + .iter() + .filter(|(k, _)| k.id == id) + .map(|(_, v)| FunctionKey { + id: id.clone(), + signature: v.signature(&typed_modules).clone(), + }) + .collect(); + + match candidates.len() { + 0 => Err(vec![Error { + pos: Some(pos), + message: format!("Function {} not found in module {}", id, "TODO"), + }]), + _ => Ok(candidates + .into_iter() + .map(|f| TypedFunctionSymbol::There(f, module_id.clone())) + .collect()), } } } @@ -497,7 +546,7 @@ impl Checker { self.insert_scope(var); } - Ok(TypedStatement::MultipleDefinition(lhs.map(|v| v.into()).collect(), TypedExpressionList::FunctionCall(f.id.clone(), arguments_checked, f.signature.outputs.clone()))) + Ok(TypedStatement::MultipleDefinition(lhs.map(|v| v.into()).collect(), TypedExpressionList::FunctionCall(FunctionKey {id: f.id.clone(), signature: f.signature.clone()}, arguments_checked, f.signature.outputs.clone()))) }, 0 => Err(Error { pos: Some(stat.pos()), message: format!("Function definition for function {} with signature {} not found.", fun_id, query) }), @@ -735,14 +784,20 @@ impl Checker { match f.signature.outputs.len() { 1 => match f.signature.outputs[0] { Type::FieldElement => Ok(FieldElementExpression::FunctionCall( - f.id.clone(), + FunctionKey { + id: f.id.clone(), + signature: f.signature.clone(), + }, arguments_checked, ) .into()), Type::FieldElementArray(size) => { Ok(FieldElementArrayExpression::FunctionCall( size, - f.id.clone(), + FunctionKey { + id: f.id.clone(), + signature: f.signature.clone(), + }, arguments_checked, ) .into()) @@ -1007,927 +1062,927 @@ impl Checker { } } -#[cfg(test)] -mod tests { - use super::*; - //use absy::parameter::Parameter; - use std::rc::Rc; - use zokrates_field::field::FieldPrime; - - mod symbols { - use super::*; - use crate::types::Signature; - - #[test] - fn imported_symbol() { - // foo.code - // def main() -> (field): - // return 1 - - // bar.code - // from "./foo.code" import main - - // after semantic check, bar should have one function which returns one (imported from foo.rs) - - let foo: Module = Module { - functions: vec![( - String::from("main"), - FunctionSymbol::Here( - Function { - id: String::from("main"), - statements: vec![Statement::Return( - ExpressionList { - expressions: vec![ - Expression::Number(FieldPrime::from(1)).at(0, 0, 0) - ], - } - .at(0, 0, 0), - ) - .at(0, 0, 0)], - signature: Signature::new().outputs(vec![Type::FieldElement]), - arguments: vec![], - } - .at(0, 0, 0), - ) - .at(0, 0, 0), - )], - imported_functions: vec![], - imports: vec![], - }; - - let bar: Module = Module { - functions: vec![( - String::from("main"), - FunctionSymbol::There(String::from("main"), Rc::new(foo)).at(0, 0, 0), - )], - imported_functions: vec![], - imports: vec![], - }; - - let mut checker = Checker::new(); - - let checked_bar = checker.check_module(bar); - assert_eq!( - checked_bar, - Ok(TypedModule { - functions: vec![( - FunctionKey { - id: String::from("main"), - signature: Signature::new().outputs(vec![Type::FieldElement]) - }, - TypedFunction { - id: String::from("main"), - signature: Signature::new().outputs(vec![Type::FieldElement]), - arguments: vec![], - statements: vec![TypedStatement::Return(vec![ - FieldElementExpression::Number(FieldPrime::from(1)).into() - ])] - } - )] - .into_iter() - .collect(), - imported_functions: vec![], - imports: vec![] - }) - ); - } - } - - // pub fn new_with_args( - // scope: HashSet, - // level: usize, - // functions: HashSet, - // ) -> Checker { - // Checker { - // scope: scope, - // functions: functions, - // level: level, - // } - // } - - // #[test] - // fn undefined_variable_in_statement() { - // // a = b - // // b undefined - // let statement: Statement = Statement::Definition( - // Assignee::Identifier(String::from("a")), - // Expression::Identifier(String::from("b")), - // ); - // let mut checker = Checker::new(); - // assert_eq!( - // checker.check_statement(&statement, &vec![]), - // Err(Error { - // message: "b is undefined".to_string() - // }) - // ); - // } - - // #[test] - // fn defined_variable_in_statement() { - // // a = b - // // b defined - // let statement: Statement = Statement::Definition( - // Assignee::Identifier(String::from("a")), - // Expression::Identifier(String::from("b")), - // ); - - // let mut scope = HashSet::new(); - // scope.insert(ScopedVariable { - // id: Variable::field_element("a"), - // level: 0, - // }); - // scope.insert(ScopedVariable { - // id: Variable::field_element("b"), - // level: 0, - // }); - // let mut checker = new_with_args(scope, 1, HashSet::new()); - // assert_eq!( - // checker.check_statement(&statement, &vec![]), - // Ok(TypedStatement::Definition( - // TypedAssignee::Identifier(Variable::field_element("a")), - // FieldElementExpression::Identifier(String::from("b")).into() - // )) - // ); - // } - - // #[test] - // fn declared_in_other_function() { - // // def foo(): - // // field a = 1 - // // def bar(): - // // return a - // // should fail - // let foo_args = Vec::::new(); - // let mut foo_statements = Vec::>::new(); - // foo_statements.push(Statement::Declaration(Variable::field_element("a"))); - // foo_statements.push(Statement::Definition( - // Assignee::Identifier(String::from("a")), - // Expression::Number(FieldPrime::from(1)), - // )); - // let foo = Function { - // id: "foo".to_string(), - // arguments: foo_args, - // statements: foo_statements, - // signature: Signature { - // inputs: vec![], - // outputs: vec![Type::FieldElement], - // }, - // }; - - // let bar_args = Vec::::new(); - // let mut bar_statements = Vec::>::new(); - // bar_statements.push(Statement::Return(ExpressionList { - // expressions: vec![Expression::Identifier(String::from("a"))], - // })); - // let bar = Function { - // id: "bar".to_string(), - // arguments: bar_args, - // statements: bar_statements, - // signature: Signature { - // inputs: vec![], - // outputs: vec![Type::FieldElement], - // }, - // }; - - // let mut funcs = Vec::>::new(); - // funcs.push(foo); - // funcs.push(bar); - // let prog = Prog { - // functions: funcs, - // imports: vec![], - // imported_functions: vec![], - // }; - - // let mut checker = Checker::new(); - // assert_eq!( - // checker.check_program(prog), - // Err(Error { - // message: "a is undefined".to_string() - // }) - // ); - // } - - // #[test] - // fn declared_in_two_scopes() { - // // def foo(): - // // a = 1 - // // def bar(): - // // a = 2 - // // return a - // // def main(): - // // return 1 - // // should pass - // let foo_args = vec![]; - // let foo_statements = vec![ - // Statement::Declaration(Variable::field_element("a")), - // Statement::Definition( - // Assignee::Identifier(String::from("a")), - // Expression::Number(FieldPrime::from(1)), - // ), - // ]; - - // let foo = Function { - // id: "foo".to_string(), - // arguments: foo_args, - // statements: foo_statements, - // signature: Signature { - // inputs: vec![], - // outputs: vec![Type::FieldElement], - // }, - // }; - - // let bar_args = Vec::::new(); - // let bar_statements = vec![ - // Statement::Declaration(Variable::field_element("a")), - // Statement::Definition( - // Assignee::Identifier(String::from("a")), - // Expression::Number(FieldPrime::from(2)), - // ), - // Statement::Return(ExpressionList { - // expressions: vec![Expression::Identifier(String::from("a"))], - // }), - // ]; - // let bar = Function { - // id: "bar".to_string(), - // arguments: bar_args, - // statements: bar_statements, - // signature: Signature { - // inputs: vec![], - // outputs: vec![Type::FieldElement], - // }, - // }; - - // let main_args = vec![]; - // let main_statements = vec![Statement::Return(ExpressionList { - // expressions: vec![Expression::Number(FieldPrime::from(1))], - // })]; - - // let main = Function { - // id: "main".to_string(), - // arguments: main_args, - // statements: main_statements, - // signature: Signature { - // inputs: vec![], - // outputs: vec![Type::FieldElement], - // }, - // }; - - // let mut funcs = Vec::>::new(); - // funcs.push(foo); - // funcs.push(bar); - // funcs.push(main); - // let prog = Prog { - // functions: funcs, - // imports: vec![], - // imported_functions: vec![], - // }; - - // let mut checker = Checker::new(); - // assert!(checker.check_program(prog).is_ok()); - // } - - // #[test] - // fn for_index_after_end() { - // // def foo(): - // // for field i in 0..10 do - // // endfor - // // return i - // // should fail - // let mut foo_statements = Vec::>::new(); - // foo_statements.push(Statement::For( - // Variable::field_element("i"), - // FieldPrime::from(0), - // FieldPrime::from(10), - // Vec::>::new(), - // )); - // foo_statements.push(Statement::Return(ExpressionList { - // expressions: vec![Expression::Identifier(String::from("i"))], - // })); - // let foo = Function { - // id: "foo".to_string(), - // arguments: Vec::::new(), - // statements: foo_statements, - // signature: Signature { - // inputs: vec![], - // outputs: vec![Type::FieldElement], - // }, - // }; - - // let mut checker = Checker::new(); - // assert_eq!( - // checker.check_function(&foo), - // Err(Error { - // message: "i is undefined".to_string() - // }) - // ); - // } - - // #[test] - // fn for_index_in_for() { - // // def foo(): - // // for i in 0..10 do - // // a = i - // // endfor - // // should pass - // let mut foo_statements = Vec::>::new(); - // let mut for_statements = Vec::>::new(); - // for_statements.push(Statement::Declaration(Variable::field_element("a"))); - // for_statements.push(Statement::Definition( - // Assignee::Identifier(String::from("a")), - // Expression::Identifier(String::from("i")), - // )); - // foo_statements.push(Statement::For( - // Variable::field_element("i"), - // FieldPrime::from(0), - // FieldPrime::from(10), - // for_statements, - // )); - - // let mut foo_statements_checked = Vec::>::new(); - // let mut for_statements_checked = Vec::>::new(); - - // for_statements_checked.push(TypedStatement::Declaration(Variable::field_element("a"))); - - // for_statements_checked.push(TypedStatement::Definition( - // TypedAssignee::Identifier(Variable::field_element("a")), - // FieldElementExpression::Identifier(String::from("i")).into(), - // )); - - // foo_statements_checked.push(TypedStatement::For( - // Variable::field_element("i"), - // FieldPrime::from(0), - // FieldPrime::from(10), - // for_statements_checked, - // )); - - // let foo = Function { - // id: "foo".to_string(), - // arguments: Vec::::new(), - // statements: foo_statements, - // signature: Signature { - // inputs: vec![], - // outputs: vec![Type::FieldElement], - // }, - // }; - - // let foo_checked = TypedFunction { - // id: "foo".to_string(), - // arguments: Vec::::new(), - // statements: foo_statements_checked, - // signature: Signature { - // inputs: vec![], - // outputs: vec![Type::FieldElement], - // }, - // }; - - // let mut checker = Checker::new(); - // assert_eq!(checker.check_function(&foo), Ok(foo_checked)); - // } - - // #[test] - // fn arity_mismatch() { - // // def foo(): - // // return 1, 2 - // // def bar(): - // // field c = foo() - // // should fail - // let bar_statements: Vec> = vec![ - // Statement::Declaration(Variable::field_element("a")), - // Statement::MultipleDefinition( - // vec![Assignee::Identifier(String::from("a"))], - // Expression::FunctionCall("foo".to_string(), vec![]), - // ), - // ]; - - // let foo = FunctionKey { - // id: "foo".to_string(), - // signature: Signature { - // inputs: vec![], - // outputs: vec![Type::FieldElement, Type::FieldElement], - // }, - // }; - - // let mut functions = HashSet::new(); - // functions.insert(foo); - - // let bar = Function { - // id: "bar".to_string(), - // arguments: vec![], - // statements: bar_statements, - // signature: Signature { - // inputs: vec![], - // outputs: vec![Type::FieldElement], - // }, - // }; - - // let mut checker = new_with_args(HashSet::new(), 0, functions); - // assert_eq!( - // checker.check_function(&bar), - // Err(Error { - // message: - // "Function definition for function foo with signature () -> (field) not found." - // .to_string() - // }) - // ); - // } - - // #[test] - // fn multi_return_outside_multidef() { - // // def foo(): - // // return 1, 2 - // // def bar(): - // // 4 == foo() - // // should fail - // let bar_statements: Vec> = vec![Statement::Condition( - // Expression::Number(FieldPrime::from(2)), - // Expression::FunctionCall("foo".to_string(), vec![]), - // )]; - - // let foo = FunctionKey { - // id: "foo".to_string(), - // signature: Signature { - // inputs: vec![], - // outputs: vec![Type::FieldElement, Type::FieldElement], - // }, - // }; - - // let mut functions = HashSet::new(); - // functions.insert(foo); - - // let bar = Function { - // id: "bar".to_string(), - // arguments: vec![], - // statements: bar_statements, - // signature: Signature { - // inputs: vec![], - // outputs: vec![Type::FieldElement], - // }, - // }; - - // let mut checker = new_with_args(HashSet::new(), 0, functions); - // assert_eq!( - // checker.check_function(&bar), - // Err(Error { - // message: "Function definition for function foo with signature () -> (_) not found." - // .to_string() - // }) - // ); - // } - - // #[test] - // fn function_undefined_in_multidef() { - // // def bar(): - // // field a = foo() - // // should fail - // let bar_statements: Vec> = vec![ - // Statement::Declaration(Variable::field_element("a")), - // Statement::MultipleDefinition( - // vec![Assignee::Identifier(String::from("a"))], - // Expression::FunctionCall("foo".to_string(), vec![]), - // ), - // ]; - - // let bar = Function { - // id: "bar".to_string(), - // arguments: vec![], - // statements: bar_statements, - // signature: Signature { - // inputs: vec![], - // outputs: vec![Type::FieldElement], - // }, - // }; - - // let mut checker = new_with_args(HashSet::new(), 0, HashSet::new()); - // assert_eq!( - // checker.check_function(&bar), - // Err(Error { - // message: - // "Function definition for function foo with signature () -> (field) not found." - // .to_string() - // }) - // ); - // } - - // #[test] - // fn undefined_variable_in_multireturn_call() { - // // def foo(x): - // // return 1, 2 - // // def main(): - // // a, b = foo(x) - // // return 1 - // // should fail - - // let foo_statements: Vec> = vec![Statement::Return(ExpressionList { - // expressions: vec![ - // Expression::Number(FieldPrime::from(1)), - // Expression::Number(FieldPrime::from(2)), - // ], - // })]; - - // let foo = Function { - // id: "foo".to_string(), - // arguments: vec![Parameter { - // id: Variable::field_element("x"), - // private: false, - // }], - // statements: foo_statements, - // signature: Signature { - // inputs: vec![Type::FieldElement], - // outputs: vec![Type::FieldElement, Type::FieldElement], - // }, - // }; - - // let main_statements: Vec> = vec![ - // Statement::Declaration(Variable::field_element("a")), - // Statement::Declaration(Variable::field_element("b")), - // Statement::MultipleDefinition( - // vec![ - // Assignee::Identifier(String::from("a")), - // Assignee::Identifier(String::from("b")), - // ], - // Expression::FunctionCall( - // "foo".to_string(), - // vec![Expression::Identifier("x".to_string())], - // ), - // ), - // Statement::Return(ExpressionList { - // expressions: vec![Expression::Number(FieldPrime::from(1))], - // }), - // ]; - - // let main = Function { - // id: "main".to_string(), - // arguments: vec![], - // statements: main_statements, - // signature: Signature { - // inputs: vec![], - // outputs: vec![Type::FieldElement, Type::FieldElement], - // }, - // }; - - // let program = Prog { - // functions: vec![foo, main], - // imports: vec![], - // imported_functions: vec![], - // }; - - // let mut checker = new_with_args(HashSet::new(), 0, HashSet::new()); - // assert_eq!( - // checker.check_program(program), - // Err(Error { - // message: "x is undefined".to_string() - // }) - // ); - // } - - // #[test] - // fn function_undefined() { - // // def bar(): - // // 1 == foo() - // // should fail - // let bar_statements: Vec> = vec![Statement::Condition( - // Expression::Number(FieldPrime::from(1)), - // Expression::FunctionCall("foo".to_string(), vec![]), - // )]; - - // let bar = Function { - // id: "bar".to_string(), - // arguments: vec![], - // statements: bar_statements, - // signature: Signature { - // inputs: vec![], - // outputs: vec![Type::FieldElement], - // }, - // }; - - // let mut checker = new_with_args(HashSet::new(), 0, HashSet::new()); - // assert_eq!( - // checker.check_function(&bar), - // Err(Error { - // message: "Function definition for function foo with signature () -> (_) not found." - // .to_string() - // }) - // ); - // } - - // #[test] - // fn return_undefined() { - // // def bar(): - // // return a, b - // // should fail - // let bar_statements: Vec> = vec![Statement::Return(ExpressionList { - // expressions: vec![ - // Expression::Identifier("a".to_string()), - // Expression::Identifier("b".to_string()), - // ], - // })]; - - // let bar = Function { - // id: "bar".to_string(), - // arguments: vec![], - // statements: bar_statements, - // signature: Signature { - // inputs: vec![], - // outputs: vec![Type::FieldElement, Type::FieldElement], - // }, - // }; - - // let mut checker = new_with_args(HashSet::new(), 0, HashSet::new()); - // assert_eq!( - // checker.check_function(&bar), - // Err(Error { - // message: "a is undefined".to_string() - // }) - // ); - // } - - // #[test] - // fn multi_def() { - // // def foo(): - // // return 1, 2 - // // def bar(): - // // field a, field b = foo() - // // return a + b - // // - // // should pass - // let bar_statements: Vec> = vec![ - // Statement::Declaration(Variable::field_element("a")), - // Statement::Declaration(Variable::field_element("b")), - // Statement::MultipleDefinition( - // vec![ - // Assignee::Identifier(String::from("a")), - // Assignee::Identifier(String::from("b")), - // ], - // Expression::FunctionCall("foo".to_string(), vec![]), - // ), - // Statement::Return(ExpressionList { - // expressions: vec![Expression::Add( - // box Expression::Identifier("a".to_string()), - // box Expression::Identifier("b".to_string()), - // )], - // }), - // ]; - - // let bar_statements_checked: Vec> = vec![ - // TypedStatement::Declaration(Variable::field_element("a")), - // TypedStatement::Declaration(Variable::field_element("b")), - // TypedStatement::MultipleDefinition( - // vec![Variable::field_element("a"), Variable::field_element("b")], - // TypedExpressionList::FunctionCall( - // "foo".to_string(), - // vec![], - // vec![Type::FieldElement, Type::FieldElement], - // ), - // ), - // TypedStatement::Return(vec![FieldElementExpression::Add( - // box FieldElementExpression::Identifier("a".to_string()), - // box FieldElementExpression::Identifier("b".to_string()), - // ) - // .into()]), - // ]; - - // let foo = FunctionKey { - // id: "foo".to_string(), - // signature: Signature { - // inputs: vec![], - // outputs: vec![Type::FieldElement, Type::FieldElement], - // }, - // }; - - // let mut functions = HashSet::new(); - // functions.insert(foo); - - // let bar = Function { - // id: "bar".to_string(), - // arguments: vec![], - // statements: bar_statements, - // signature: Signature { - // inputs: vec![], - // outputs: vec![Type::FieldElement], - // }, - // }; - - // let bar_checked = TypedFunction { - // id: "bar".to_string(), - // arguments: vec![], - // statements: bar_statements_checked, - // signature: Signature { - // inputs: vec![], - // outputs: vec![Type::FieldElement], - // }, - // }; - - // let mut checker = new_with_args(HashSet::new(), 0, functions); - // assert_eq!(checker.check_function(&bar), Ok(bar_checked)); - // } - - // #[test] - // fn duplicate_function_declaration() { - // // def foo(a, b): - // // return 1 - // // def foo(c, d): - // // return 2 - // // - // // should fail - // let foo2_statements: Vec> = vec![Statement::Return(ExpressionList { - // expressions: vec![Expression::Number(FieldPrime::from(1))], - // })]; - - // let foo2_arguments = vec![ - // Parameter { - // id: Variable::field_element("a"), - // private: true, - // }, - // Parameter { - // id: Variable::field_element("b"), - // private: true, - // }, - // ]; - - // let foo1 = FunctionKey { - // id: "foo".to_string(), - // signature: Signature { - // inputs: vec![Type::FieldElement, Type::FieldElement], - // outputs: vec![Type::FieldElement], - // }, - // }; - - // let mut functions = HashSet::new(); - // functions.insert(foo1); - - // let foo2 = Function { - // id: "foo".to_string(), - // arguments: foo2_arguments, - // statements: foo2_statements, - // signature: Signature { - // inputs: vec![Type::FieldElement, Type::FieldElement], - // outputs: vec![Type::FieldElement], - // }, - // }; - - // let mut checker = new_with_args(HashSet::new(), 0, functions); - // assert_eq!( - // checker.check_function(&foo2), - // Err(Error { - // message: - // "Duplicate definition for function foo with signature (field, field) -> (field)" - // .to_string() - // }) - // ); - // } - - // #[test] - // fn duplicate_main_function() { - // // def main(a): - // // return 1 - // // def main(): - // // return 1 - // // - // // should fail - // let main1_statements: Vec> = - // vec![Statement::Return(ExpressionList { - // expressions: vec![Expression::Number(FieldPrime::from(1))], - // })]; - - // let main1_arguments = vec![Parameter { - // id: Variable::field_element("a"), - // private: false, - // }]; - - // let main2_statements: Vec> = - // vec![Statement::Return(ExpressionList { - // expressions: vec![Expression::Number(FieldPrime::from(1))], - // })]; - - // let main2_arguments = vec![]; - - // let main1 = Function { - // id: "main".to_string(), - // arguments: main1_arguments, - // statements: main1_statements, - // signature: Signature { - // inputs: vec![Type::FieldElement], - // outputs: vec![Type::FieldElement], - // }, - // }; - - // let main2 = Function { - // id: "main".to_string(), - // arguments: main2_arguments, - // statements: main2_statements, - // signature: Signature { - // inputs: vec![], - // outputs: vec![Type::FieldElement], - // }, - // }; - - // let prog = Prog { - // functions: vec![main1, main2], - // imports: vec![], - // imported_functions: vec![], - // }; - - // let mut checker = Checker::new(); - // assert_eq!( - // checker.check_program(prog), - // Err(Error { - // message: "Only one main function allowed, found 2".to_string() - // }) - // ); - // } - - // #[test] - // fn shadowing_with_same_type() { - // // field a - // // field a - // // - // // should fail - - // let mut checker = Checker::new(); - // let _: Result, Error> = checker.check_statement( - // &Statement::Declaration(Variable::field_element("a")), - // &vec![], - // ); - // let s2_checked: Result, Error> = checker.check_statement( - // &Statement::Declaration(Variable::field_element("a")), - // &vec![], - // ); - // assert_eq!( - // s2_checked, - // Err(Error { - // message: "Duplicate declaration for variable named a".to_string() - // }) - // ); - // } - - // #[test] - // fn shadowing_with_different_type() { - // // field a - // // bool a - // // - // // should fail - - // let mut checker = Checker::new(); - // let _: Result, Error> = checker.check_statement( - // &Statement::Declaration(Variable::field_element("a")), - // &vec![], - // ); - // let s2_checked: Result, Error> = - // checker.check_statement(&Statement::Declaration(Variable::boolean("a")), &vec![]); - // assert_eq!( - // s2_checked, - // Err(Error { - // message: "Duplicate declaration for variable named a".to_string() - // }) - // ); - // } - - // mod assignee { - // use super::*; - - // #[test] - // fn identifier() { - // // a = 42 - // let a = Assignee::Identifier::(String::from("a")); - - // let mut checker: Checker = Checker::new(); - // checker - // .check_statement::( - // &Statement::Declaration(Variable::field_element("a")), - // &vec![], - // ) - // .unwrap(); - - // assert_eq!( - // checker.check_assignee(&a), - // Ok(TypedAssignee::Identifier(Variable::field_element("a"))) - // ); - // } - - // #[test] - // fn array_element() { - // // field[33] a - // // a[2] = 42 - // let a = Assignee::ArrayElement( - // box Assignee::Identifier(String::from("a")), - // box Expression::Number(FieldPrime::from(2)), - // ); - - // let mut checker: Checker = Checker::new(); - // checker - // .check_statement::( - // &Statement::Declaration(Variable::field_array("a", 33)), - // &vec![], - // ) - // .unwrap(); - - // assert_eq!( - // checker.check_assignee(&a), - // Ok(TypedAssignee::ArrayElement( - // box TypedAssignee::Identifier(Variable::field_array("a", 33)), - // box FieldElementExpression::Number(FieldPrime::from(2)).into() - // )) - // ); - // } - // } -} +// #[cfg(test)] +// mod tests { +// use super::*; +// //use absy::parameter::Parameter; +// use std::rc::Rc; +// use zokrates_field::field::FieldPrime; + +// mod symbols { +// use super::*; +// use crate::types::Signature; + +// #[test] +// fn imported_symbol() { +// // foo.code +// // def main() -> (field): +// // return 1 + +// // bar.code +// // from "./foo.code" import main + +// // after semantic check, bar should have one function which returns one (imported from foo.rs) + +// let foo: Module = Module { +// functions: vec![( +// String::from("main"), +// FunctionSymbol::Here( +// Function { +// id: String::from("main"), +// statements: vec![Statement::Return( +// ExpressionList { +// expressions: vec![ +// Expression::Number(FieldPrime::from(1)).at(0, 0, 0) +// ], +// } +// .at(0, 0, 0), +// ) +// .at(0, 0, 0)], +// signature: Signature::new().outputs(vec![Type::FieldElement]), +// arguments: vec![], +// } +// .at(0, 0, 0), +// ) +// .at(0, 0, 0), +// )], +// imported_functions: vec![], +// imports: vec![], +// }; + +// let bar: Module = Module { +// functions: vec![( +// String::from("main"), +// FunctionSymbol::There(String::from("main"), Rc::new(foo)).at(0, 0, 0), +// )], +// imported_functions: vec![], +// imports: vec![], +// }; + +// let mut checker = Checker::new(); + +// let checked_bar = checker.check_module(bar); +// assert_eq!( +// checked_bar, +// Ok(TypedModule { +// functions: vec![( +// FunctionKey { +// id: String::from("main"), +// signature: Signature::new().outputs(vec![Type::FieldElement]) +// }, +// TypedFunction { +// id: String::from("main"), +// signature: Signature::new().outputs(vec![Type::FieldElement]), +// arguments: vec![], +// statements: vec![TypedStatement::Return(vec![ +// FieldElementExpression::Number(FieldPrime::from(1)).into() +// ])] +// } +// )] +// .into_iter() +// .collect(), +// imported_functions: vec![], +// imports: vec![] +// }) +// ); +// } +// } + +// // pub fn new_with_args( +// // scope: HashSet, +// // level: usize, +// // functions: HashSet, +// // ) -> Checker { +// // Checker { +// // scope: scope, +// // functions: functions, +// // level: level, +// // } +// // } + +// // #[test] +// // fn undefined_variable_in_statement() { +// // // a = b +// // // b undefined +// // let statement: Statement = Statement::Definition( +// // Assignee::Identifier(String::from("a")), +// // Expression::Identifier(String::from("b")), +// // ); +// // let mut checker = Checker::new(); +// // assert_eq!( +// // checker.check_statement(&statement, &vec![]), +// // Err(Error { +// // message: "b is undefined".to_string() +// // }) +// // ); +// // } + +// // #[test] +// // fn defined_variable_in_statement() { +// // // a = b +// // // b defined +// // let statement: Statement = Statement::Definition( +// // Assignee::Identifier(String::from("a")), +// // Expression::Identifier(String::from("b")), +// // ); + +// // let mut scope = HashSet::new(); +// // scope.insert(ScopedVariable { +// // id: Variable::field_element("a"), +// // level: 0, +// // }); +// // scope.insert(ScopedVariable { +// // id: Variable::field_element("b"), +// // level: 0, +// // }); +// // let mut checker = new_with_args(scope, 1, HashSet::new()); +// // assert_eq!( +// // checker.check_statement(&statement, &vec![]), +// // Ok(TypedStatement::Definition( +// // TypedAssignee::Identifier(Variable::field_element("a")), +// // FieldElementExpression::Identifier(String::from("b")).into() +// // )) +// // ); +// // } + +// // #[test] +// // fn declared_in_other_function() { +// // // def foo(): +// // // field a = 1 +// // // def bar(): +// // // return a +// // // should fail +// // let foo_args = Vec::::new(); +// // let mut foo_statements = Vec::>::new(); +// // foo_statements.push(Statement::Declaration(Variable::field_element("a"))); +// // foo_statements.push(Statement::Definition( +// // Assignee::Identifier(String::from("a")), +// // Expression::Number(FieldPrime::from(1)), +// // )); +// // let foo = Function { +// // id: "foo".to_string(), +// // arguments: foo_args, +// // statements: foo_statements, +// // signature: Signature { +// // inputs: vec![], +// // outputs: vec![Type::FieldElement], +// // }, +// // }; + +// // let bar_args = Vec::::new(); +// // let mut bar_statements = Vec::>::new(); +// // bar_statements.push(Statement::Return(ExpressionList { +// // expressions: vec![Expression::Identifier(String::from("a"))], +// // })); +// // let bar = Function { +// // id: "bar".to_string(), +// // arguments: bar_args, +// // statements: bar_statements, +// // signature: Signature { +// // inputs: vec![], +// // outputs: vec![Type::FieldElement], +// // }, +// // }; + +// // let mut funcs = Vec::>::new(); +// // funcs.push(foo); +// // funcs.push(bar); +// // let prog = Prog { +// // functions: funcs, +// // imports: vec![], +// // imported_functions: vec![], +// // }; + +// // let mut checker = Checker::new(); +// // assert_eq!( +// // checker.check_program(prog), +// // Err(Error { +// // message: "a is undefined".to_string() +// // }) +// // ); +// // } + +// // #[test] +// // fn declared_in_two_scopes() { +// // // def foo(): +// // // a = 1 +// // // def bar(): +// // // a = 2 +// // // return a +// // // def main(): +// // // return 1 +// // // should pass +// // let foo_args = vec![]; +// // let foo_statements = vec![ +// // Statement::Declaration(Variable::field_element("a")), +// // Statement::Definition( +// // Assignee::Identifier(String::from("a")), +// // Expression::Number(FieldPrime::from(1)), +// // ), +// // ]; + +// // let foo = Function { +// // id: "foo".to_string(), +// // arguments: foo_args, +// // statements: foo_statements, +// // signature: Signature { +// // inputs: vec![], +// // outputs: vec![Type::FieldElement], +// // }, +// // }; + +// // let bar_args = Vec::::new(); +// // let bar_statements = vec![ +// // Statement::Declaration(Variable::field_element("a")), +// // Statement::Definition( +// // Assignee::Identifier(String::from("a")), +// // Expression::Number(FieldPrime::from(2)), +// // ), +// // Statement::Return(ExpressionList { +// // expressions: vec![Expression::Identifier(String::from("a"))], +// // }), +// // ]; +// // let bar = Function { +// // id: "bar".to_string(), +// // arguments: bar_args, +// // statements: bar_statements, +// // signature: Signature { +// // inputs: vec![], +// // outputs: vec![Type::FieldElement], +// // }, +// // }; + +// // let main_args = vec![]; +// // let main_statements = vec![Statement::Return(ExpressionList { +// // expressions: vec![Expression::Number(FieldPrime::from(1))], +// // })]; + +// // let main = Function { +// // id: "main".to_string(), +// // arguments: main_args, +// // statements: main_statements, +// // signature: Signature { +// // inputs: vec![], +// // outputs: vec![Type::FieldElement], +// // }, +// // }; + +// // let mut funcs = Vec::>::new(); +// // funcs.push(foo); +// // funcs.push(bar); +// // funcs.push(main); +// // let prog = Prog { +// // functions: funcs, +// // imports: vec![], +// // imported_functions: vec![], +// // }; + +// // let mut checker = Checker::new(); +// // assert!(checker.check_program(prog).is_ok()); +// // } + +// // #[test] +// // fn for_index_after_end() { +// // // def foo(): +// // // for field i in 0..10 do +// // // endfor +// // // return i +// // // should fail +// // let mut foo_statements = Vec::>::new(); +// // foo_statements.push(Statement::For( +// // Variable::field_element("i"), +// // FieldPrime::from(0), +// // FieldPrime::from(10), +// // Vec::>::new(), +// // )); +// // foo_statements.push(Statement::Return(ExpressionList { +// // expressions: vec![Expression::Identifier(String::from("i"))], +// // })); +// // let foo = Function { +// // id: "foo".to_string(), +// // arguments: Vec::::new(), +// // statements: foo_statements, +// // signature: Signature { +// // inputs: vec![], +// // outputs: vec![Type::FieldElement], +// // }, +// // }; + +// // let mut checker = Checker::new(); +// // assert_eq!( +// // checker.check_function(&foo), +// // Err(Error { +// // message: "i is undefined".to_string() +// // }) +// // ); +// // } + +// // #[test] +// // fn for_index_in_for() { +// // // def foo(): +// // // for i in 0..10 do +// // // a = i +// // // endfor +// // // should pass +// // let mut foo_statements = Vec::>::new(); +// // let mut for_statements = Vec::>::new(); +// // for_statements.push(Statement::Declaration(Variable::field_element("a"))); +// // for_statements.push(Statement::Definition( +// // Assignee::Identifier(String::from("a")), +// // Expression::Identifier(String::from("i")), +// // )); +// // foo_statements.push(Statement::For( +// // Variable::field_element("i"), +// // FieldPrime::from(0), +// // FieldPrime::from(10), +// // for_statements, +// // )); + +// // let mut foo_statements_checked = Vec::>::new(); +// // let mut for_statements_checked = Vec::>::new(); + +// // for_statements_checked.push(TypedStatement::Declaration(Variable::field_element("a"))); + +// // for_statements_checked.push(TypedStatement::Definition( +// // TypedAssignee::Identifier(Variable::field_element("a")), +// // FieldElementExpression::Identifier(String::from("i")).into(), +// // )); + +// // foo_statements_checked.push(TypedStatement::For( +// // Variable::field_element("i"), +// // FieldPrime::from(0), +// // FieldPrime::from(10), +// // for_statements_checked, +// // )); + +// // let foo = Function { +// // id: "foo".to_string(), +// // arguments: Vec::::new(), +// // statements: foo_statements, +// // signature: Signature { +// // inputs: vec![], +// // outputs: vec![Type::FieldElement], +// // }, +// // }; + +// // let foo_checked = TypedFunction { +// // id: "foo".to_string(), +// // arguments: Vec::::new(), +// // statements: foo_statements_checked, +// // signature: Signature { +// // inputs: vec![], +// // outputs: vec![Type::FieldElement], +// // }, +// // }; + +// // let mut checker = Checker::new(); +// // assert_eq!(checker.check_function(&foo), Ok(foo_checked)); +// // } + +// // #[test] +// // fn arity_mismatch() { +// // // def foo(): +// // // return 1, 2 +// // // def bar(): +// // // field c = foo() +// // // should fail +// // let bar_statements: Vec> = vec![ +// // Statement::Declaration(Variable::field_element("a")), +// // Statement::MultipleDefinition( +// // vec![Assignee::Identifier(String::from("a"))], +// // Expression::FunctionCall("foo".to_string(), vec![]), +// // ), +// // ]; + +// // let foo = FunctionKey { +// // id: "foo".to_string(), +// // signature: Signature { +// // inputs: vec![], +// // outputs: vec![Type::FieldElement, Type::FieldElement], +// // }, +// // }; + +// // let mut functions = HashSet::new(); +// // functions.insert(foo); + +// // let bar = Function { +// // id: "bar".to_string(), +// // arguments: vec![], +// // statements: bar_statements, +// // signature: Signature { +// // inputs: vec![], +// // outputs: vec![Type::FieldElement], +// // }, +// // }; + +// // let mut checker = new_with_args(HashSet::new(), 0, functions); +// // assert_eq!( +// // checker.check_function(&bar), +// // Err(Error { +// // message: +// // "Function definition for function foo with signature () -> (field) not found." +// // .to_string() +// // }) +// // ); +// // } + +// // #[test] +// // fn multi_return_outside_multidef() { +// // // def foo(): +// // // return 1, 2 +// // // def bar(): +// // // 4 == foo() +// // // should fail +// // let bar_statements: Vec> = vec![Statement::Condition( +// // Expression::Number(FieldPrime::from(2)), +// // Expression::FunctionCall("foo".to_string(), vec![]), +// // )]; + +// // let foo = FunctionKey { +// // id: "foo".to_string(), +// // signature: Signature { +// // inputs: vec![], +// // outputs: vec![Type::FieldElement, Type::FieldElement], +// // }, +// // }; + +// // let mut functions = HashSet::new(); +// // functions.insert(foo); + +// // let bar = Function { +// // id: "bar".to_string(), +// // arguments: vec![], +// // statements: bar_statements, +// // signature: Signature { +// // inputs: vec![], +// // outputs: vec![Type::FieldElement], +// // }, +// // }; + +// // let mut checker = new_with_args(HashSet::new(), 0, functions); +// // assert_eq!( +// // checker.check_function(&bar), +// // Err(Error { +// // message: "Function definition for function foo with signature () -> (_) not found." +// // .to_string() +// // }) +// // ); +// // } + +// // #[test] +// // fn function_undefined_in_multidef() { +// // // def bar(): +// // // field a = foo() +// // // should fail +// // let bar_statements: Vec> = vec![ +// // Statement::Declaration(Variable::field_element("a")), +// // Statement::MultipleDefinition( +// // vec![Assignee::Identifier(String::from("a"))], +// // Expression::FunctionCall("foo".to_string(), vec![]), +// // ), +// // ]; + +// // let bar = Function { +// // id: "bar".to_string(), +// // arguments: vec![], +// // statements: bar_statements, +// // signature: Signature { +// // inputs: vec![], +// // outputs: vec![Type::FieldElement], +// // }, +// // }; + +// // let mut checker = new_with_args(HashSet::new(), 0, HashSet::new()); +// // assert_eq!( +// // checker.check_function(&bar), +// // Err(Error { +// // message: +// // "Function definition for function foo with signature () -> (field) not found." +// // .to_string() +// // }) +// // ); +// // } + +// // #[test] +// // fn undefined_variable_in_multireturn_call() { +// // // def foo(x): +// // // return 1, 2 +// // // def main(): +// // // a, b = foo(x) +// // // return 1 +// // // should fail + +// // let foo_statements: Vec> = vec![Statement::Return(ExpressionList { +// // expressions: vec![ +// // Expression::Number(FieldPrime::from(1)), +// // Expression::Number(FieldPrime::from(2)), +// // ], +// // })]; + +// // let foo = Function { +// // id: "foo".to_string(), +// // arguments: vec![Parameter { +// // id: Variable::field_element("x"), +// // private: false, +// // }], +// // statements: foo_statements, +// // signature: Signature { +// // inputs: vec![Type::FieldElement], +// // outputs: vec![Type::FieldElement, Type::FieldElement], +// // }, +// // }; + +// // let main_statements: Vec> = vec![ +// // Statement::Declaration(Variable::field_element("a")), +// // Statement::Declaration(Variable::field_element("b")), +// // Statement::MultipleDefinition( +// // vec![ +// // Assignee::Identifier(String::from("a")), +// // Assignee::Identifier(String::from("b")), +// // ], +// // Expression::FunctionCall( +// // "foo".to_string(), +// // vec![Expression::Identifier("x".to_string())], +// // ), +// // ), +// // Statement::Return(ExpressionList { +// // expressions: vec![Expression::Number(FieldPrime::from(1))], +// // }), +// // ]; + +// // let main = Function { +// // id: "main".to_string(), +// // arguments: vec![], +// // statements: main_statements, +// // signature: Signature { +// // inputs: vec![], +// // outputs: vec![Type::FieldElement, Type::FieldElement], +// // }, +// // }; + +// // let program = Prog { +// // functions: vec![foo, main], +// // imports: vec![], +// // imported_functions: vec![], +// // }; + +// // let mut checker = new_with_args(HashSet::new(), 0, HashSet::new()); +// // assert_eq!( +// // checker.check_program(program), +// // Err(Error { +// // message: "x is undefined".to_string() +// // }) +// // ); +// // } + +// // #[test] +// // fn function_undefined() { +// // // def bar(): +// // // 1 == foo() +// // // should fail +// // let bar_statements: Vec> = vec![Statement::Condition( +// // Expression::Number(FieldPrime::from(1)), +// // Expression::FunctionCall("foo".to_string(), vec![]), +// // )]; + +// // let bar = Function { +// // id: "bar".to_string(), +// // arguments: vec![], +// // statements: bar_statements, +// // signature: Signature { +// // inputs: vec![], +// // outputs: vec![Type::FieldElement], +// // }, +// // }; + +// // let mut checker = new_with_args(HashSet::new(), 0, HashSet::new()); +// // assert_eq!( +// // checker.check_function(&bar), +// // Err(Error { +// // message: "Function definition for function foo with signature () -> (_) not found." +// // .to_string() +// // }) +// // ); +// // } + +// // #[test] +// // fn return_undefined() { +// // // def bar(): +// // // return a, b +// // // should fail +// // let bar_statements: Vec> = vec![Statement::Return(ExpressionList { +// // expressions: vec![ +// // Expression::Identifier("a".to_string()), +// // Expression::Identifier("b".to_string()), +// // ], +// // })]; + +// // let bar = Function { +// // id: "bar".to_string(), +// // arguments: vec![], +// // statements: bar_statements, +// // signature: Signature { +// // inputs: vec![], +// // outputs: vec![Type::FieldElement, Type::FieldElement], +// // }, +// // }; + +// // let mut checker = new_with_args(HashSet::new(), 0, HashSet::new()); +// // assert_eq!( +// // checker.check_function(&bar), +// // Err(Error { +// // message: "a is undefined".to_string() +// // }) +// // ); +// // } + +// // #[test] +// // fn multi_def() { +// // // def foo(): +// // // return 1, 2 +// // // def bar(): +// // // field a, field b = foo() +// // // return a + b +// // // +// // // should pass +// // let bar_statements: Vec> = vec![ +// // Statement::Declaration(Variable::field_element("a")), +// // Statement::Declaration(Variable::field_element("b")), +// // Statement::MultipleDefinition( +// // vec![ +// // Assignee::Identifier(String::from("a")), +// // Assignee::Identifier(String::from("b")), +// // ], +// // Expression::FunctionCall("foo".to_string(), vec![]), +// // ), +// // Statement::Return(ExpressionList { +// // expressions: vec![Expression::Add( +// // box Expression::Identifier("a".to_string()), +// // box Expression::Identifier("b".to_string()), +// // )], +// // }), +// // ]; + +// // let bar_statements_checked: Vec> = vec![ +// // TypedStatement::Declaration(Variable::field_element("a")), +// // TypedStatement::Declaration(Variable::field_element("b")), +// // TypedStatement::MultipleDefinition( +// // vec![Variable::field_element("a"), Variable::field_element("b")], +// // TypedExpressionList::FunctionCall( +// // "foo".to_string(), +// // vec![], +// // vec![Type::FieldElement, Type::FieldElement], +// // ), +// // ), +// // TypedStatement::Return(vec![FieldElementExpression::Add( +// // box FieldElementExpression::Identifier("a".to_string()), +// // box FieldElementExpression::Identifier("b".to_string()), +// // ) +// // .into()]), +// // ]; + +// // let foo = FunctionKey { +// // id: "foo".to_string(), +// // signature: Signature { +// // inputs: vec![], +// // outputs: vec![Type::FieldElement, Type::FieldElement], +// // }, +// // }; + +// // let mut functions = HashSet::new(); +// // functions.insert(foo); + +// // let bar = Function { +// // id: "bar".to_string(), +// // arguments: vec![], +// // statements: bar_statements, +// // signature: Signature { +// // inputs: vec![], +// // outputs: vec![Type::FieldElement], +// // }, +// // }; + +// // let bar_checked = TypedFunction { +// // id: "bar".to_string(), +// // arguments: vec![], +// // statements: bar_statements_checked, +// // signature: Signature { +// // inputs: vec![], +// // outputs: vec![Type::FieldElement], +// // }, +// // }; + +// // let mut checker = new_with_args(HashSet::new(), 0, functions); +// // assert_eq!(checker.check_function(&bar), Ok(bar_checked)); +// // } + +// // #[test] +// // fn duplicate_function_declaration() { +// // // def foo(a, b): +// // // return 1 +// // // def foo(c, d): +// // // return 2 +// // // +// // // should fail +// // let foo2_statements: Vec> = vec![Statement::Return(ExpressionList { +// // expressions: vec![Expression::Number(FieldPrime::from(1))], +// // })]; + +// // let foo2_arguments = vec![ +// // Parameter { +// // id: Variable::field_element("a"), +// // private: true, +// // }, +// // Parameter { +// // id: Variable::field_element("b"), +// // private: true, +// // }, +// // ]; + +// // let foo1 = FunctionKey { +// // id: "foo".to_string(), +// // signature: Signature { +// // inputs: vec![Type::FieldElement, Type::FieldElement], +// // outputs: vec![Type::FieldElement], +// // }, +// // }; + +// // let mut functions = HashSet::new(); +// // functions.insert(foo1); + +// // let foo2 = Function { +// // id: "foo".to_string(), +// // arguments: foo2_arguments, +// // statements: foo2_statements, +// // signature: Signature { +// // inputs: vec![Type::FieldElement, Type::FieldElement], +// // outputs: vec![Type::FieldElement], +// // }, +// // }; + +// // let mut checker = new_with_args(HashSet::new(), 0, functions); +// // assert_eq!( +// // checker.check_function(&foo2), +// // Err(Error { +// // message: +// // "Duplicate definition for function foo with signature (field, field) -> (field)" +// // .to_string() +// // }) +// // ); +// // } + +// // #[test] +// // fn duplicate_main_function() { +// // // def main(a): +// // // return 1 +// // // def main(): +// // // return 1 +// // // +// // // should fail +// // let main1_statements: Vec> = +// // vec![Statement::Return(ExpressionList { +// // expressions: vec![Expression::Number(FieldPrime::from(1))], +// // })]; + +// // let main1_arguments = vec![Parameter { +// // id: Variable::field_element("a"), +// // private: false, +// // }]; + +// // let main2_statements: Vec> = +// // vec![Statement::Return(ExpressionList { +// // expressions: vec![Expression::Number(FieldPrime::from(1))], +// // })]; + +// // let main2_arguments = vec![]; + +// // let main1 = Function { +// // id: "main".to_string(), +// // arguments: main1_arguments, +// // statements: main1_statements, +// // signature: Signature { +// // inputs: vec![Type::FieldElement], +// // outputs: vec![Type::FieldElement], +// // }, +// // }; + +// // let main2 = Function { +// // id: "main".to_string(), +// // arguments: main2_arguments, +// // statements: main2_statements, +// // signature: Signature { +// // inputs: vec![], +// // outputs: vec![Type::FieldElement], +// // }, +// // }; + +// // let prog = Prog { +// // functions: vec![main1, main2], +// // imports: vec![], +// // imported_functions: vec![], +// // }; + +// // let mut checker = Checker::new(); +// // assert_eq!( +// // checker.check_program(prog), +// // Err(Error { +// // message: "Only one main function allowed, found 2".to_string() +// // }) +// // ); +// // } + +// // #[test] +// // fn shadowing_with_same_type() { +// // // field a +// // // field a +// // // +// // // should fail + +// // let mut checker = Checker::new(); +// // let _: Result, Error> = checker.check_statement( +// // &Statement::Declaration(Variable::field_element("a")), +// // &vec![], +// // ); +// // let s2_checked: Result, Error> = checker.check_statement( +// // &Statement::Declaration(Variable::field_element("a")), +// // &vec![], +// // ); +// // assert_eq!( +// // s2_checked, +// // Err(Error { +// // message: "Duplicate declaration for variable named a".to_string() +// // }) +// // ); +// // } + +// // #[test] +// // fn shadowing_with_different_type() { +// // // field a +// // // bool a +// // // +// // // should fail + +// // let mut checker = Checker::new(); +// // let _: Result, Error> = checker.check_statement( +// // &Statement::Declaration(Variable::field_element("a")), +// // &vec![], +// // ); +// // let s2_checked: Result, Error> = +// // checker.check_statement(&Statement::Declaration(Variable::boolean("a")), &vec![]); +// // assert_eq!( +// // s2_checked, +// // Err(Error { +// // message: "Duplicate declaration for variable named a".to_string() +// // }) +// // ); +// // } + +// // mod assignee { +// // use super::*; + +// // #[test] +// // fn identifier() { +// // // a = 42 +// // let a = Assignee::Identifier::(String::from("a")); + +// // let mut checker: Checker = Checker::new(); +// // checker +// // .check_statement::( +// // &Statement::Declaration(Variable::field_element("a")), +// // &vec![], +// // ) +// // .unwrap(); + +// // assert_eq!( +// // checker.check_assignee(&a), +// // Ok(TypedAssignee::Identifier(Variable::field_element("a"))) +// // ); +// // } + +// // #[test] +// // fn array_element() { +// // // field[33] a +// // // a[2] = 42 +// // let a = Assignee::ArrayElement( +// // box Assignee::Identifier(String::from("a")), +// // box Expression::Number(FieldPrime::from(2)), +// // ); + +// // let mut checker: Checker = Checker::new(); +// // checker +// // .check_statement::( +// // &Statement::Declaration(Variable::field_array("a", 33)), +// // &vec![], +// // ) +// // .unwrap(); + +// // assert_eq!( +// // checker.check_assignee(&a), +// // Ok(TypedAssignee::ArrayElement( +// // box TypedAssignee::Identifier(Variable::field_array("a", 33)), +// // box FieldElementExpression::Number(FieldPrime::from(2)).into() +// // )) +// // ); +// // } +// // } +// } diff --git a/zokrates_core/src/static_analysis/dead_code.rs b/zokrates_core/src/static_analysis/dead_code.rs index a5608255e..c6d40540b 100644 --- a/zokrates_core/src/static_analysis/dead_code.rs +++ b/zokrates_core/src/static_analysis/dead_code.rs @@ -26,21 +26,23 @@ impl Folder for DeadCode { let p = fold_module(self, p); // only keep functions which are being called, or `main` - TypedModule { - functions: p - .functions - .into_iter() - .filter(|(key, f)| key.id == "main" || self.called.contains(&f.slug())) - .collect(), - ..p - } + unimplemented!() + + // TypedModule { + // functions: p + // .functions + // .into_iter() + // .filter(|(key, f)| key.id == "main" || self.called.contains(&f.slug())) + // .collect(), + // ..p + // } } // add extra statements before the modified statement fn fold_statement(&mut self, s: TypedStatement) -> Vec> { match s { TypedStatement::MultipleDefinition(variables, elist) => match elist { - TypedExpressionList::FunctionCall(id, exps, types) => { + TypedExpressionList::FunctionCall(key, exps, types) => { let exps: Vec<_> = exps.into_iter().map(|e| self.fold_expression(e)).collect(); let signature = Signature::new() @@ -48,10 +50,10 @@ impl Folder for DeadCode { .outputs(types.clone()); self.called - .insert(format!("{}_{}", id, signature.to_slug())); + .insert(format!("{}_{}", key.id, signature.to_slug())); vec![TypedStatement::MultipleDefinition( variables, - TypedExpressionList::FunctionCall(id, exps, types), + TypedExpressionList::FunctionCall(key, exps, types), )] } }, @@ -69,7 +71,7 @@ impl Folder for DeadCode { .outputs(vec![Type::FieldElement]); self.called - .insert(format!("{}_{}", id, signature.to_slug())); + .insert(format!("{}_{}", id.id, signature.to_slug())); FieldElementExpression::FunctionCall(id, exps) } e => fold_field_expression(self, e), @@ -81,7 +83,7 @@ impl Folder for DeadCode { e: FieldElementArrayExpression, ) -> FieldElementArrayExpression { match e { - FieldElementArrayExpression::FunctionCall(size, id, exps) => { + FieldElementArrayExpression::FunctionCall(size, key, exps) => { let exps: Vec<_> = exps.into_iter().map(|e| self.fold_expression(e)).collect(); let signature = Signature::new() @@ -89,8 +91,8 @@ impl Folder for DeadCode { .outputs(vec![Type::FieldElementArray(size)]); self.called - .insert(format!("{}_{}", id, signature.to_slug())); - FieldElementArrayExpression::FunctionCall(size, id, exps) + .insert(format!("{}_{}", key.id, signature.to_slug())); + FieldElementArrayExpression::FunctionCall(size, key, exps) } e => fold_field_array_expression(self, e), } diff --git a/zokrates_core/src/static_analysis/inline.rs b/zokrates_core/src/static_analysis/inline.rs index 0ea7dc82f..02ffa72e7 100644 --- a/zokrates_core/src/static_analysis/inline.rs +++ b/zokrates_core/src/static_analysis/inline.rs @@ -5,17 +5,20 @@ // use std::collections::HashMap; // use zokrates_field::field::Field; +// #[derive(Debug)] // pub struct Inliner { -// functions: HashMap>, +// functions: TypedFunctionSymbols, +// modules: TypedModules, // statements_buffer: Vec>, // context: Vec<(String, usize)>, // call_count: HashMap, // } // impl Inliner { -// pub fn new() -> Self { +// fn new() -> Self { // Inliner { // functions: HashMap::new(), +// modules: HashMap::new(), // statements_buffer: vec![], // context: vec![], // call_count: HashMap::new(), @@ -35,137 +38,107 @@ // // (inlining enables constant propagation through function calls, which cannot be achieved by our final optimiser in some cases) // // for now, we inline functions whose non-array parameters are constant, as this covers our main use case for inlining: propagation of // // constant array indices -// match function { -// Some(..) => { -// // check whether non-array arguments are constant -// arguments.iter().all(|e| match e { -// TypedExpression::FieldElementArray(..) => true, -// TypedExpression::FieldElement(FieldElementExpression::Number(..)) => true, -// TypedExpression::Boolean(BooleanExpression::Value(..)) => true, -// _ => false, -// }) -// } -// None => false, -// } +// // match function { +// // Some(..) => { +// // // check whether non-array arguments are constant +// // arguments.iter().all(|e| match e { +// // TypedExpression::FieldElementArray(..) => true, +// // TypedExpression::FieldElement(FieldElementExpression::Number(..)) => true, +// // TypedExpression::Boolean(BooleanExpression::Value(..)) => true, +// // _ => false, +// // }) +// // } +// // None => false, +// // } +// true // } // // inline a call to `function` taking `expressions` as inputs // // this function mutates `self.call` by incrementing the counter for `function`, and mutates `self.context` // fn inline_call( // &mut self, -// function: &TypedFunctionSymbol, +// symbol: &TypedFunctionSymbol, // expressions: Vec>, // ) -> Vec> { -// self.call_count -// .entry(function.slug()) -// .and_modify(|i| *i += 1) -// .or_insert(1); -// self.context.push(( -// function.slug(), -// *self.call_count.get(&function.slug()).unwrap(), -// )); - -// // add definitions for the inputs -// let mut inputs_bindings = function -// .arguments -// .iter() -// .zip(expressions) -// .map(|(a, e)| { -// TypedStatement::Definition( -// TypedAssignee::Identifier(self.fold_variable(a.id.clone())), -// e, -// ) -// }) -// .collect(); -// self.statements_buffer.append(&mut inputs_bindings); - -// // filter out the return statement and keep it aside -// let (mut statements, ret): (Vec<_>, Vec<_>) = function -// .statements -// .clone() -// .into_iter() -// .flat_map(|s| self.fold_statement(s)) -// .partition(|s| match s { -// TypedStatement::Return(..) => false, -// _ => true, -// }); - -// // add all statements to the buffer -// self.statements_buffer.append(&mut statements); - -// // remove this call from the context -// self.context.pop(); - -// match ret[0].clone() { -// TypedStatement::Return(exprs) => exprs, -// _ => panic!(""), +// match symbol { +// TypedFunctionSymbol::Here(function) => { +// self.call_count +// .entry(function.to_slug()) +// .and_modify(|i| *i += 1) +// .or_insert(1); +// self.context.push(( +// function.to_slug(), +// *self.call_count.get(&function.to_slug()).unwrap(), +// )); + +// // add definitions for the inputs +// let mut inputs_bindings = function +// .arguments +// .iter() +// .zip(expressions) +// .map(|(a, e)| { +// TypedStatement::Definition( +// TypedAssignee::Identifier(self.fold_variable(a.id.clone())), +// e, +// ) +// }) +// .collect(); +// self.statements_buffer.append(&mut inputs_bindings); + +// // filter out the return statement and keep it aside +// let (mut statements, ret): (Vec<_>, Vec<_>) = function +// .statements +// .clone() +// .into_iter() +// .flat_map(|s| self.fold_statement(s)) +// .partition(|s| match s { +// TypedStatement::Return(..) => false, +// _ => true, +// }); + +// // add all statements to the buffer +// self.statements_buffer.append(&mut statements); + +// // remove this call from the context +// self.context.pop(); + +// match ret[0].clone() { +// TypedStatement::Return(exprs) => exprs, +// _ => panic!(""), +// } +// } +// _ => unimplemented!(), // } // } -// pub fn inline(prog: TypedModule) -> TypedModule { -// Inliner::new().fold_module(prog) +// pub fn inline(prog: TypedProgram) -> TypedProgram { +// Inliner::new().fold_program(prog) // } // } // impl Folder for Inliner { -// // store the list of functions -// fn fold_module(&mut self, p: TypedModule) -> TypedModule { -// self.functions = p.functions.clone(); -// fold_module(self, p) +// fn fold_program(&mut self, p: TypedProgram) -> TypedProgram { +// self.modules = p.modules; +// let main = p.main; +// self.functions = main.functions.clone(); +// TypedProgram { +// main: TypedModule { +// imported_functions: vec![], +// imports: vec![], +// functions: main +// .functions +// .into_iter() +// .filter(|(k, v)| k.id == "main") +// .take(1) +// .map(|(k, v)| (k, self.fold_function_symbol(v))) +// .collect(), +// }, +// modules: HashMap::new(), +// } // } -// // add extra statements before the modified statement -// fn fold_statement(&mut self, s: TypedStatement) -> Vec> { -// let mut statements = match s { -// TypedStatement::MultipleDefinition(variables, elist) => { -// match elist { -// TypedExpressionList::FunctionCall(id, exps, types) => { -// let variables: Vec<_> = variables -// .into_iter() -// .map(|a| self.fold_variable(a)) -// .collect(); -// let exps: Vec<_> = -// exps.into_iter().map(|e| self.fold_expression(e)).collect(); - -// let passed_signature = Signature::new() -// .inputs(exps.iter().map(|e| e.get_type()).collect()) -// .outputs(types.clone()); - -// // find the function -// let function = self -// .functions -// .get(&FunctionKey { -// signature: passed_signature, -// id: id.clone(), -// }) -// .cloned(); - -// match self.should_inline(&function, &exps) { -// true => { -// let ret = self.inline_call(&function.unwrap(), exps); -// variables -// .into_iter() -// .zip(ret.into_iter()) -// .map(|(v, e)| { -// TypedStatement::Definition(TypedAssignee::Identifier(v), e) -// }) -// .collect() -// } -// false => vec![TypedStatement::MultipleDefinition( -// variables, -// TypedExpressionList::FunctionCall(id, exps, types), -// )], -// } -// } -// } -// } -// s => fold_statement(self, s), -// }; - -// // add the result of folding to the buffer -// self.statements_buffer.append(&mut statements); -// // return the whole buffer -// self.statements_buffer.drain(..).collect() +// fn fold_module(&mut self, m: TypedModule) -> TypedModule { +// unreachable!("we don't want to inline modules, only functions!") // } // // prefix all names with the context @@ -184,78 +157,53 @@ // } // } -// // inline calls which return a field element -// fn fold_field_expression(&mut self, e: FieldElementExpression) -> FieldElementExpression { -// match e { -// FieldElementExpression::FunctionCall(id, exps) => { -// let exps: Vec<_> = exps.into_iter().map(|e| self.fold_expression(e)).collect(); - -// let passed_signature = Signature::new() -// .inputs(exps.iter().map(|e| e.get_type()).collect()) -// .outputs(vec![Type::FieldElement]); +// fn fold_function_symbol(&mut self, s: TypedFunctionSymbol) -> TypedFunctionSymbol { +// match s { +// TypedFunctionSymbol::Here(function) => TypedFunctionSymbol::Here(self.fold_function(function)), +// TypedFunctionSymbol::There(function_id, module_id) => { +// let mut inliner = Inliner::new(); +// let module = self.modules.get(&module_id).unwrap(); +// let function_symbol = module.functions.get(&function_id).unwrap().clone(); -// // find the function -// let function = self -// .functions -// .get(&FunctionKey { -// signature: passed_signature, -// id: id.clone(), -// }) -// .cloned(); +// inliner.modules = self.modules.clone(); +// inliner.functions = module.functions.clone(); -// match self.should_inline(&function, &exps) { -// true => { -// let ret = self.inline_call(&function.unwrap(), exps); -// // unwrap the result to return a field element -// match ret[0].clone() { -// TypedExpression::FieldElement(e) => e, -// _ => panic!(""), -// } -// } -// false => FieldElementExpression::FunctionCall(id, exps), -// } -// } -// // default -// e => fold_field_expression(self, e), +// inliner.fold_function_symbol(function_symbol) +// }, // } // } -// // inline calls which return a field element array -// fn fold_field_array_expression( -// &mut self, -// e: FieldElementArrayExpression, -// ) -> FieldElementArrayExpression { +// // inline calls which return a field element +// fn fold_field_expression(&mut self, e: FieldElementExpression) -> FieldElementExpression { +// println!("{:#?}", self); + // match e { -// FieldElementArrayExpression::FunctionCall(size, id, exps) => { +// FieldElementExpression::FunctionCall(key, exps) => { // let exps: Vec<_> = exps.into_iter().map(|e| self.fold_expression(e)).collect(); // let passed_signature = Signature::new() // .inputs(exps.iter().map(|e| e.get_type()).collect()) -// .outputs(vec![Type::FieldElementArray(size)]); +// .outputs(vec![Type::FieldElement]); + +// println!("{:?} {:?}", key, self.functions); // // find the function -// let function = self -// .functions -// .get(&FunctionKey { -// signature: passed_signature, -// id: id.clone(), -// }) -// .cloned(); +// let function = self.functions.get(&key).cloned(); // match self.should_inline(&function, &exps) { // true => { // let ret = self.inline_call(&function.unwrap(), exps); // // unwrap the result to return a field element // match ret[0].clone() { -// TypedExpression::FieldElementArray(e) => e, +// TypedExpression::FieldElement(e) => e, // _ => panic!(""), // } // } -// false => FieldElementArrayExpression::FunctionCall(size, id, exps), +// false => FieldElementExpression::FunctionCall(key, exps), // } // } // // default -// e => fold_field_array_expression(self, e), +// e => fold_field_expression(self, e), // } // } // } diff --git a/zokrates_core/src/static_analysis/mod.rs b/zokrates_core/src/static_analysis/mod.rs index d6c931661..9ce1151cd 100644 --- a/zokrates_core/src/static_analysis/mod.rs +++ b/zokrates_core/src/static_analysis/mod.rs @@ -17,28 +17,26 @@ use self::power_check::PowerChecker; use self::propagation::Propagator; use self::unroll::Unroller; use crate::flat_absy::FlatProg; -use crate::typed_absy::TypedModule; +use crate::typed_absy::TypedProgram; use zokrates_field::field::Field; pub trait Analyse { fn analyse(self) -> Self; } -impl Analyse for TypedModule { +impl Analyse for TypedProgram { fn analyse(self) -> Self { - println!("{:#?}", self); - let r = PowerChecker::check(self); // unroll let r = Unroller::unroll(r); //propagate a first time for constants to reach function calls let r = Propagator::propagate(r); // apply inlining strategy - //let r = Inliner::inline(r); + // let r = Inliner::inline(r); // Propagate again let r = Propagator::propagate(r); - // remove unused functions - let r = DeadCode::clean(r); + // // remove unused functions + // let r = DeadCode::clean(r); r } } diff --git a/zokrates_core/src/static_analysis/power_check.rs b/zokrates_core/src/static_analysis/power_check.rs index a2089a0b2..500bd6e14 100644 --- a/zokrates_core/src/static_analysis/power_check.rs +++ b/zokrates_core/src/static_analysis/power_check.rs @@ -10,8 +10,8 @@ impl PowerChecker { PowerChecker {} } - pub fn check(p: TypedModule) -> TypedModule { - PowerChecker::new().fold_module(p) + pub fn check(p: TypedProgram) -> TypedProgram { + PowerChecker::new().fold_program(p) } } diff --git a/zokrates_core/src/static_analysis/propagation.rs b/zokrates_core/src/static_analysis/propagation.rs index da6c1e44e..7e9790fb5 100644 --- a/zokrates_core/src/static_analysis/propagation.rs +++ b/zokrates_core/src/static_analysis/propagation.rs @@ -20,8 +20,8 @@ impl Propagator { } } - pub fn propagate(p: TypedModule) -> TypedModule { - Propagator::new().fold_module(p) + pub fn propagate(p: TypedProgram) -> TypedProgram { + Propagator::new().fold_program(p) } } diff --git a/zokrates_core/src/static_analysis/unroll.rs b/zokrates_core/src/static_analysis/unroll.rs index 8b1f874b6..e34d4c80c 100644 --- a/zokrates_core/src/static_analysis/unroll.rs +++ b/zokrates_core/src/static_analysis/unroll.rs @@ -39,8 +39,8 @@ impl Unroller { res } - pub fn unroll(p: TypedModule) -> TypedModule { - Unroller::new().fold_module(p) + pub fn unroll(p: TypedProgram) -> TypedProgram { + Unroller::new().fold_program(p) } } diff --git a/zokrates_core/src/typed_absy/folder.rs b/zokrates_core/src/typed_absy/folder.rs index b8a6e844b..44443cc74 100644 --- a/zokrates_core/src/typed_absy/folder.rs +++ b/zokrates_core/src/typed_absy/folder.rs @@ -4,6 +4,10 @@ use crate::typed_absy::*; use zokrates_field::field::Field; pub trait Folder: Sized { + fn fold_program(&mut self, p: TypedProgram) -> TypedProgram { + fold_program(self, p) + } + fn fold_module(&mut self, p: TypedModule) -> TypedModule { fold_module(self, p) } @@ -200,9 +204,9 @@ pub fn fold_field_expression>( let alt = f.fold_field_expression(alt); FieldElementExpression::IfElse(box cond, box cons, box alt) } - FieldElementExpression::FunctionCall(id, exps) => { + FieldElementExpression::FunctionCall(key, exps) => { let exps = exps.into_iter().map(|e| f.fold_expression(e)).collect(); - FieldElementExpression::FunctionCall(id, exps) + FieldElementExpression::FunctionCall(key, exps) } FieldElementExpression::Select(box array, box index) => { let array = f.fold_field_array_expression(array); @@ -286,3 +290,14 @@ pub fn fold_function_symbol>( there => there, // by default, do not fold modules recursively } } + +pub fn fold_program>(f: &mut F, p: TypedProgram) -> TypedProgram { + TypedProgram { + modules: p + .modules + .into_iter() + .map(|(module_id, module)| (module_id, f.fold_module(module))) + .collect(), + main: f.fold_module(p.main), + } +} diff --git a/zokrates_core/src/typed_absy/mod.rs b/zokrates_core/src/typed_absy/mod.rs index ff42f2c12..4b847f444 100644 --- a/zokrates_core/src/typed_absy/mod.rs +++ b/zokrates_core/src/typed_absy/mod.rs @@ -20,16 +20,26 @@ use crate::types::Type; use std::fmt; use zokrates_field::field::Field; -use std::rc::Rc; - pub use self::folder::Folder; type Identifier = String; +pub type TypedModuleId = String; + +pub type TypedModules = HashMap>; + +pub type TypedFunctionSymbols = HashMap>; + #[derive(PartialEq, Debug)] +pub struct TypedProgram { + pub modules: TypedModules, + pub main: TypedModule, +} + +#[derive(PartialEq, Debug, Clone)] pub struct TypedModule { /// Functions of the program - pub functions: HashMap>, + pub functions: TypedFunctionSymbols, pub imports: Vec, pub imported_functions: Vec>, } @@ -37,23 +47,33 @@ pub struct TypedModule { #[derive(Debug, Clone, PartialEq)] pub enum TypedFunctionSymbol { Here(TypedFunction), - There(FunctionKey, Rc>), + There(FunctionKey, TypedModuleId), } impl TypedFunctionSymbol { - pub fn signature(&self) -> Signature { + pub fn signature(&self, modules: &TypedModules) -> Signature { match self { TypedFunctionSymbol::Here(f) => f.signature.clone(), - TypedFunctionSymbol::There(key, module) => { - module.functions.get(key).unwrap().signature() - } + TypedFunctionSymbol::There(key, module_id) => modules + .get(module_id) + .unwrap() + .functions + .get(key) + .unwrap() + .signature(&modules), } } - pub fn slug(&self) -> String { + pub fn slug(&self, modules: &TypedModules) -> String { match self { TypedFunctionSymbol::Here(f) => f.to_slug(), - TypedFunctionSymbol::There(key, module) => module.functions.get(key).unwrap().slug(), + TypedFunctionSymbol::There(key, module) => modules + .get(module) + .unwrap() + .functions + .get(key) + .unwrap() + .slug(&modules), } } } @@ -365,7 +385,7 @@ pub trait MultiTyped { #[derive(Clone, PartialEq)] pub enum TypedExpressionList { - FunctionCall(String, Vec>, Vec), + FunctionCall(FunctionKey, Vec>, Vec), } impl MultiTyped for TypedExpressionList { @@ -405,7 +425,7 @@ pub enum FieldElementExpression { Box>, Box>, ), - FunctionCall(String, Vec>), + FunctionCall(FunctionKey, Vec>), Select( Box>, Box>, @@ -446,7 +466,7 @@ pub enum BooleanExpression { pub enum FieldElementArrayExpression { Identifier(usize, String), Value(usize, Vec>), - FunctionCall(usize, String, Vec>), + FunctionCall(usize, FunctionKey, Vec>), IfElse( Box>, Box>, @@ -482,8 +502,8 @@ impl fmt::Display for FieldElementExpression { condition, consequent, alternative ) } - FieldElementExpression::FunctionCall(ref i, ref p) => { - r#try!(write!(f, "{}(", i,)); + FieldElementExpression::FunctionCall(ref k, ref p) => { + r#try!(write!(f, "{}(", k.id,)); for (i, param) in p.iter().enumerate() { r#try!(write!(f, "{}", param)); if i < p.len() - 1 { @@ -527,8 +547,8 @@ impl fmt::Display for FieldElementArrayExpression { .collect::>() .join(", ") ), - FieldElementArrayExpression::FunctionCall(_, ref i, ref p) => { - r#try!(write!(f, "{}(", i,)); + FieldElementArrayExpression::FunctionCall(_, ref key, ref p) => { + r#try!(write!(f, "{}(", key.id,)); for (i, param) in p.iter().enumerate() { r#try!(write!(f, "{}", param)); if i < p.len() - 1 { @@ -609,8 +629,8 @@ impl fmt::Debug for FieldElementArrayExpression { impl fmt::Display for TypedExpressionList { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { match *self { - TypedExpressionList::FunctionCall(ref i, ref p, _) => { - r#try!(write!(f, "{}(", i,)); + TypedExpressionList::FunctionCall(ref key, ref p, _) => { + r#try!(write!(f, "{}(", key.id,)); for (i, param) in p.iter().enumerate() { r#try!(write!(f, "{}", param)); if i < p.len() - 1 { From f663ddfb8e98f401dbc1bd3f9a5b533aa92a9769 Mon Sep 17 00:00:00 2001 From: schaeff Date: Mon, 20 May 2019 15:49:37 +0200 Subject: [PATCH 009/162] adapt semantics tests --- zokrates_core/src/absy/node.rs | 6 +- zokrates_core/src/absy/variable.rs | 54 +- zokrates_core/src/flatten/mod.rs | 14 +- zokrates_core/src/parser/tokenize/position.rs | 5 + zokrates_core/src/semantics.rs | 1997 +++++++++-------- zokrates_core/src/static_analysis/unroll.rs | 13 +- zokrates_core/src/typed_absy/mod.rs | 8 +- zokrates_core/src/typed_absy/variable.rs | 58 +- zokrates_core/src/types/mod.rs | 74 + 9 files changed, 1156 insertions(+), 1073 deletions(-) diff --git a/zokrates_core/src/absy/node.rs b/zokrates_core/src/absy/node.rs index 38cb0c240..d1bd4a481 100644 --- a/zokrates_core/src/absy/node.rs +++ b/zokrates_core/src/absy/node.rs @@ -31,9 +31,13 @@ pub trait NodeValue: fmt::Display + Sized + PartialEq { let start = Position { col, line }; Node::new(start, start.col(delta), self) } + + #[cfg(test)] + fn mock(self) -> Node { + Node::new(Position::mock(), Position::mock(), self) + } } -#[cfg(test)] impl From for Node { fn from(v: V) -> Node { let mock_position = Position { col: 42, line: 42 }; diff --git a/zokrates_core/src/absy/variable.rs b/zokrates_core/src/absy/variable.rs index 7f16d4075..34f20f5f0 100644 --- a/zokrates_core/src/absy/variable.rs +++ b/zokrates_core/src/absy/variable.rs @@ -1,57 +1,5 @@ use crate::absy::Node; -use crate::types::Type; -use std::fmt; -#[derive(Serialize, Deserialize, Clone, PartialEq, Hash, Eq)] -pub struct Variable { - pub id: String, - pub _type: Type, -} +pub use crate::types::Variable; pub type VariableNode = Node; - -impl Variable { - pub fn new>(id: S, t: Type) -> Variable { - Variable { - id: id.into(), - _type: t, - } - } - - pub fn field_element>(id: S) -> Variable { - Variable { - id: id.into(), - _type: Type::FieldElement, - } - } - - pub fn boolean>(id: S) -> Variable { - Variable { - id: id.into(), - _type: Type::Boolean, - } - } - - pub fn field_array>(id: S, size: usize) -> Variable { - Variable { - id: id.into(), - _type: Type::FieldElementArray(size), - } - } - - pub fn get_type(&self) -> Type { - self._type.clone() - } -} - -impl fmt::Display for Variable { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "{} {}", self._type, self.id,) - } -} - -impl fmt::Debug for Variable { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "Variable(type: {:?}, id: {:?})", self._type, self.id,) - } -} diff --git a/zokrates_core/src/flatten/mod.rs b/zokrates_core/src/flatten/mod.rs index 5ea5b32e2..38aa92bee 100644 --- a/zokrates_core/src/flatten/mod.rs +++ b/zokrates_core/src/flatten/mod.rs @@ -9,8 +9,8 @@ use crate::flat_absy::*; use crate::helpers::{DirectiveStatement, Helper, RustHelper}; use crate::typed_absy::*; use crate::types::conversions::cast; -use crate::types::Signature; use crate::types::Type; +use crate::types::{FunctionKey, Signature}; use bimap::BiMap; use std::collections::HashMap; use zokrates_field::field::Field; @@ -88,12 +88,11 @@ impl Flattener { TypedStatement::Definition( TypedAssignee::Identifier(Variable::field_element("condition_as_field")), FieldElementExpression::FunctionCall( - FunctionKey { - id: "_bool_to_field".to_string(), - signature: Signature::new() + FunctionKey::with_id("_bool_to_field").signature( + Signature::new() .inputs(vec![Type::Boolean]) .outputs(vec![Type::FieldElement]), - }, + ), vec![BooleanExpression::Identifier("condition".to_string()).into()], ) .into(), @@ -1480,10 +1479,7 @@ impl Flattener { functions_flattened: &'a Vec>, id: &str, ) -> FlatFunction { - let key = FunctionKey { - id: id.to_string(), - signature: s.clone(), - }; + let key = FunctionKey::with_id(id).signature(s.clone()); match symbols.get(&key) { Some(f) => self.flatten_function_symbol(symbols, functions_flattened, f.clone()), diff --git a/zokrates_core/src/parser/tokenize/position.rs b/zokrates_core/src/parser/tokenize/position.rs index b2ba8a91a..0b5a04f2d 100644 --- a/zokrates_core/src/parser/tokenize/position.rs +++ b/zokrates_core/src/parser/tokenize/position.rs @@ -14,6 +14,11 @@ impl Position { col: (self.col as isize + delta) as usize, } } + + #[cfg(test)] + pub fn mock() -> Self { + Position { line: 42, col: 42 } + } } impl fmt::Display for Position { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { diff --git a/zokrates_core/src/semantics.rs b/zokrates_core/src/semantics.rs index 37d897712..7885a6231 100644 --- a/zokrates_core/src/semantics.rs +++ b/zokrates_core/src/semantics.rs @@ -15,12 +15,10 @@ use zokrates_field::field::Field; use crate::parser::Position; -use crate::types::Type; +use crate::types::{FunctionKey, Type}; use std::hash::{Hash, Hasher}; -use std::rc::Rc; - #[derive(PartialEq, Debug)] pub struct Error { pos: Option<(Position, Position)>, @@ -135,13 +133,14 @@ impl Checker { program: Program, ) -> Result, Vec> { let mut modules = program.modules; - let mut typed_modules = HashMap::new(); - let main = self.check_module(program.main, &mut modules, &mut typed_modules)?; + let main_module = self.check_module(program.main, &mut modules, &mut typed_modules)?; + + Checker::check_single_main(&main_module).map_err(|e| vec![e])?; Ok(TypedProgram { - main, + main: main_module, modules: typed_modules, }) } @@ -190,14 +189,6 @@ impl Checker { self.exit_scope(); } - assert!(checked_functions.len() > 0); - assert!(self.functions.len() > 0); - - match self.check_single_main() { - Ok(()) => {} - Err(e) => errors.push(e), - }; - if errors.len() > 0 { return Err(errors); } @@ -209,8 +200,13 @@ impl Checker { }) } - fn check_single_main(&mut self) -> Result<(), Error> { - match self.functions.iter().filter(|fun| fun.id == "main").count() { + fn check_single_main(module: &TypedModule) -> Result<(), Error> { + match module + .functions + .iter() + .filter(|(key, _)| key.id == "main") + .count() + { 1 => Ok(()), 0 => Err(Error { pos: None, @@ -620,8 +616,7 @@ impl Checker { }, None => Err(Error { pos: Some(expr.pos()), - - message: format!("Identifier is undefined"), + message: format!("Identifier is undefined: {}", name), }), } } @@ -772,8 +767,6 @@ impl Checker { // we use type inference to determine the type of the return, so we don't specify it let query = FunctionQuery::new(fun_id.to_string(), &arguments_types, &vec![None]); - assert!(self.functions.len() > 0); - let candidates = self.find_candidates(&query); match candidates.len() { @@ -1062,927 +1055,1043 @@ impl Checker { } } -// #[cfg(test)] -// mod tests { -// use super::*; -// //use absy::parameter::Parameter; -// use std::rc::Rc; -// use zokrates_field::field::FieldPrime; - -// mod symbols { -// use super::*; -// use crate::types::Signature; - -// #[test] -// fn imported_symbol() { -// // foo.code -// // def main() -> (field): -// // return 1 - -// // bar.code -// // from "./foo.code" import main - -// // after semantic check, bar should have one function which returns one (imported from foo.rs) - -// let foo: Module = Module { -// functions: vec![( -// String::from("main"), -// FunctionSymbol::Here( -// Function { -// id: String::from("main"), -// statements: vec![Statement::Return( -// ExpressionList { -// expressions: vec![ -// Expression::Number(FieldPrime::from(1)).at(0, 0, 0) -// ], -// } -// .at(0, 0, 0), -// ) -// .at(0, 0, 0)], -// signature: Signature::new().outputs(vec![Type::FieldElement]), -// arguments: vec![], -// } -// .at(0, 0, 0), -// ) -// .at(0, 0, 0), -// )], -// imported_functions: vec![], -// imports: vec![], -// }; - -// let bar: Module = Module { -// functions: vec![( -// String::from("main"), -// FunctionSymbol::There(String::from("main"), Rc::new(foo)).at(0, 0, 0), -// )], -// imported_functions: vec![], -// imports: vec![], -// }; - -// let mut checker = Checker::new(); - -// let checked_bar = checker.check_module(bar); -// assert_eq!( -// checked_bar, -// Ok(TypedModule { -// functions: vec![( -// FunctionKey { -// id: String::from("main"), -// signature: Signature::new().outputs(vec![Type::FieldElement]) -// }, -// TypedFunction { -// id: String::from("main"), -// signature: Signature::new().outputs(vec![Type::FieldElement]), -// arguments: vec![], -// statements: vec![TypedStatement::Return(vec![ -// FieldElementExpression::Number(FieldPrime::from(1)).into() -// ])] -// } -// )] -// .into_iter() -// .collect(), -// imported_functions: vec![], -// imports: vec![] -// }) -// ); -// } -// } - -// // pub fn new_with_args( -// // scope: HashSet, -// // level: usize, -// // functions: HashSet, -// // ) -> Checker { -// // Checker { -// // scope: scope, -// // functions: functions, -// // level: level, -// // } -// // } - -// // #[test] -// // fn undefined_variable_in_statement() { -// // // a = b -// // // b undefined -// // let statement: Statement = Statement::Definition( -// // Assignee::Identifier(String::from("a")), -// // Expression::Identifier(String::from("b")), -// // ); -// // let mut checker = Checker::new(); -// // assert_eq!( -// // checker.check_statement(&statement, &vec![]), -// // Err(Error { -// // message: "b is undefined".to_string() -// // }) -// // ); -// // } - -// // #[test] -// // fn defined_variable_in_statement() { -// // // a = b -// // // b defined -// // let statement: Statement = Statement::Definition( -// // Assignee::Identifier(String::from("a")), -// // Expression::Identifier(String::from("b")), -// // ); - -// // let mut scope = HashSet::new(); -// // scope.insert(ScopedVariable { -// // id: Variable::field_element("a"), -// // level: 0, -// // }); -// // scope.insert(ScopedVariable { -// // id: Variable::field_element("b"), -// // level: 0, -// // }); -// // let mut checker = new_with_args(scope, 1, HashSet::new()); -// // assert_eq!( -// // checker.check_statement(&statement, &vec![]), -// // Ok(TypedStatement::Definition( -// // TypedAssignee::Identifier(Variable::field_element("a")), -// // FieldElementExpression::Identifier(String::from("b")).into() -// // )) -// // ); -// // } - -// // #[test] -// // fn declared_in_other_function() { -// // // def foo(): -// // // field a = 1 -// // // def bar(): -// // // return a -// // // should fail -// // let foo_args = Vec::::new(); -// // let mut foo_statements = Vec::>::new(); -// // foo_statements.push(Statement::Declaration(Variable::field_element("a"))); -// // foo_statements.push(Statement::Definition( -// // Assignee::Identifier(String::from("a")), -// // Expression::Number(FieldPrime::from(1)), -// // )); -// // let foo = Function { -// // id: "foo".to_string(), -// // arguments: foo_args, -// // statements: foo_statements, -// // signature: Signature { -// // inputs: vec![], -// // outputs: vec![Type::FieldElement], -// // }, -// // }; - -// // let bar_args = Vec::::new(); -// // let mut bar_statements = Vec::>::new(); -// // bar_statements.push(Statement::Return(ExpressionList { -// // expressions: vec![Expression::Identifier(String::from("a"))], -// // })); -// // let bar = Function { -// // id: "bar".to_string(), -// // arguments: bar_args, -// // statements: bar_statements, -// // signature: Signature { -// // inputs: vec![], -// // outputs: vec![Type::FieldElement], -// // }, -// // }; - -// // let mut funcs = Vec::>::new(); -// // funcs.push(foo); -// // funcs.push(bar); -// // let prog = Prog { -// // functions: funcs, -// // imports: vec![], -// // imported_functions: vec![], -// // }; - -// // let mut checker = Checker::new(); -// // assert_eq!( -// // checker.check_program(prog), -// // Err(Error { -// // message: "a is undefined".to_string() -// // }) -// // ); -// // } - -// // #[test] -// // fn declared_in_two_scopes() { -// // // def foo(): -// // // a = 1 -// // // def bar(): -// // // a = 2 -// // // return a -// // // def main(): -// // // return 1 -// // // should pass -// // let foo_args = vec![]; -// // let foo_statements = vec![ -// // Statement::Declaration(Variable::field_element("a")), -// // Statement::Definition( -// // Assignee::Identifier(String::from("a")), -// // Expression::Number(FieldPrime::from(1)), -// // ), -// // ]; - -// // let foo = Function { -// // id: "foo".to_string(), -// // arguments: foo_args, -// // statements: foo_statements, -// // signature: Signature { -// // inputs: vec![], -// // outputs: vec![Type::FieldElement], -// // }, -// // }; - -// // let bar_args = Vec::::new(); -// // let bar_statements = vec![ -// // Statement::Declaration(Variable::field_element("a")), -// // Statement::Definition( -// // Assignee::Identifier(String::from("a")), -// // Expression::Number(FieldPrime::from(2)), -// // ), -// // Statement::Return(ExpressionList { -// // expressions: vec![Expression::Identifier(String::from("a"))], -// // }), -// // ]; -// // let bar = Function { -// // id: "bar".to_string(), -// // arguments: bar_args, -// // statements: bar_statements, -// // signature: Signature { -// // inputs: vec![], -// // outputs: vec![Type::FieldElement], -// // }, -// // }; - -// // let main_args = vec![]; -// // let main_statements = vec![Statement::Return(ExpressionList { -// // expressions: vec![Expression::Number(FieldPrime::from(1))], -// // })]; - -// // let main = Function { -// // id: "main".to_string(), -// // arguments: main_args, -// // statements: main_statements, -// // signature: Signature { -// // inputs: vec![], -// // outputs: vec![Type::FieldElement], -// // }, -// // }; - -// // let mut funcs = Vec::>::new(); -// // funcs.push(foo); -// // funcs.push(bar); -// // funcs.push(main); -// // let prog = Prog { -// // functions: funcs, -// // imports: vec![], -// // imported_functions: vec![], -// // }; - -// // let mut checker = Checker::new(); -// // assert!(checker.check_program(prog).is_ok()); -// // } - -// // #[test] -// // fn for_index_after_end() { -// // // def foo(): -// // // for field i in 0..10 do -// // // endfor -// // // return i -// // // should fail -// // let mut foo_statements = Vec::>::new(); -// // foo_statements.push(Statement::For( -// // Variable::field_element("i"), -// // FieldPrime::from(0), -// // FieldPrime::from(10), -// // Vec::>::new(), -// // )); -// // foo_statements.push(Statement::Return(ExpressionList { -// // expressions: vec![Expression::Identifier(String::from("i"))], -// // })); -// // let foo = Function { -// // id: "foo".to_string(), -// // arguments: Vec::::new(), -// // statements: foo_statements, -// // signature: Signature { -// // inputs: vec![], -// // outputs: vec![Type::FieldElement], -// // }, -// // }; - -// // let mut checker = Checker::new(); -// // assert_eq!( -// // checker.check_function(&foo), -// // Err(Error { -// // message: "i is undefined".to_string() -// // }) -// // ); -// // } - -// // #[test] -// // fn for_index_in_for() { -// // // def foo(): -// // // for i in 0..10 do -// // // a = i -// // // endfor -// // // should pass -// // let mut foo_statements = Vec::>::new(); -// // let mut for_statements = Vec::>::new(); -// // for_statements.push(Statement::Declaration(Variable::field_element("a"))); -// // for_statements.push(Statement::Definition( -// // Assignee::Identifier(String::from("a")), -// // Expression::Identifier(String::from("i")), -// // )); -// // foo_statements.push(Statement::For( -// // Variable::field_element("i"), -// // FieldPrime::from(0), -// // FieldPrime::from(10), -// // for_statements, -// // )); - -// // let mut foo_statements_checked = Vec::>::new(); -// // let mut for_statements_checked = Vec::>::new(); - -// // for_statements_checked.push(TypedStatement::Declaration(Variable::field_element("a"))); - -// // for_statements_checked.push(TypedStatement::Definition( -// // TypedAssignee::Identifier(Variable::field_element("a")), -// // FieldElementExpression::Identifier(String::from("i")).into(), -// // )); - -// // foo_statements_checked.push(TypedStatement::For( -// // Variable::field_element("i"), -// // FieldPrime::from(0), -// // FieldPrime::from(10), -// // for_statements_checked, -// // )); - -// // let foo = Function { -// // id: "foo".to_string(), -// // arguments: Vec::::new(), -// // statements: foo_statements, -// // signature: Signature { -// // inputs: vec![], -// // outputs: vec![Type::FieldElement], -// // }, -// // }; - -// // let foo_checked = TypedFunction { -// // id: "foo".to_string(), -// // arguments: Vec::::new(), -// // statements: foo_statements_checked, -// // signature: Signature { -// // inputs: vec![], -// // outputs: vec![Type::FieldElement], -// // }, -// // }; - -// // let mut checker = Checker::new(); -// // assert_eq!(checker.check_function(&foo), Ok(foo_checked)); -// // } - -// // #[test] -// // fn arity_mismatch() { -// // // def foo(): -// // // return 1, 2 -// // // def bar(): -// // // field c = foo() -// // // should fail -// // let bar_statements: Vec> = vec![ -// // Statement::Declaration(Variable::field_element("a")), -// // Statement::MultipleDefinition( -// // vec![Assignee::Identifier(String::from("a"))], -// // Expression::FunctionCall("foo".to_string(), vec![]), -// // ), -// // ]; - -// // let foo = FunctionKey { -// // id: "foo".to_string(), -// // signature: Signature { -// // inputs: vec![], -// // outputs: vec![Type::FieldElement, Type::FieldElement], -// // }, -// // }; - -// // let mut functions = HashSet::new(); -// // functions.insert(foo); - -// // let bar = Function { -// // id: "bar".to_string(), -// // arguments: vec![], -// // statements: bar_statements, -// // signature: Signature { -// // inputs: vec![], -// // outputs: vec![Type::FieldElement], -// // }, -// // }; - -// // let mut checker = new_with_args(HashSet::new(), 0, functions); -// // assert_eq!( -// // checker.check_function(&bar), -// // Err(Error { -// // message: -// // "Function definition for function foo with signature () -> (field) not found." -// // .to_string() -// // }) -// // ); -// // } - -// // #[test] -// // fn multi_return_outside_multidef() { -// // // def foo(): -// // // return 1, 2 -// // // def bar(): -// // // 4 == foo() -// // // should fail -// // let bar_statements: Vec> = vec![Statement::Condition( -// // Expression::Number(FieldPrime::from(2)), -// // Expression::FunctionCall("foo".to_string(), vec![]), -// // )]; - -// // let foo = FunctionKey { -// // id: "foo".to_string(), -// // signature: Signature { -// // inputs: vec![], -// // outputs: vec![Type::FieldElement, Type::FieldElement], -// // }, -// // }; - -// // let mut functions = HashSet::new(); -// // functions.insert(foo); - -// // let bar = Function { -// // id: "bar".to_string(), -// // arguments: vec![], -// // statements: bar_statements, -// // signature: Signature { -// // inputs: vec![], -// // outputs: vec![Type::FieldElement], -// // }, -// // }; - -// // let mut checker = new_with_args(HashSet::new(), 0, functions); -// // assert_eq!( -// // checker.check_function(&bar), -// // Err(Error { -// // message: "Function definition for function foo with signature () -> (_) not found." -// // .to_string() -// // }) -// // ); -// // } - -// // #[test] -// // fn function_undefined_in_multidef() { -// // // def bar(): -// // // field a = foo() -// // // should fail -// // let bar_statements: Vec> = vec![ -// // Statement::Declaration(Variable::field_element("a")), -// // Statement::MultipleDefinition( -// // vec![Assignee::Identifier(String::from("a"))], -// // Expression::FunctionCall("foo".to_string(), vec![]), -// // ), -// // ]; - -// // let bar = Function { -// // id: "bar".to_string(), -// // arguments: vec![], -// // statements: bar_statements, -// // signature: Signature { -// // inputs: vec![], -// // outputs: vec![Type::FieldElement], -// // }, -// // }; - -// // let mut checker = new_with_args(HashSet::new(), 0, HashSet::new()); -// // assert_eq!( -// // checker.check_function(&bar), -// // Err(Error { -// // message: -// // "Function definition for function foo with signature () -> (field) not found." -// // .to_string() -// // }) -// // ); -// // } - -// // #[test] -// // fn undefined_variable_in_multireturn_call() { -// // // def foo(x): -// // // return 1, 2 -// // // def main(): -// // // a, b = foo(x) -// // // return 1 -// // // should fail - -// // let foo_statements: Vec> = vec![Statement::Return(ExpressionList { -// // expressions: vec![ -// // Expression::Number(FieldPrime::from(1)), -// // Expression::Number(FieldPrime::from(2)), -// // ], -// // })]; - -// // let foo = Function { -// // id: "foo".to_string(), -// // arguments: vec![Parameter { -// // id: Variable::field_element("x"), -// // private: false, -// // }], -// // statements: foo_statements, -// // signature: Signature { -// // inputs: vec![Type::FieldElement], -// // outputs: vec![Type::FieldElement, Type::FieldElement], -// // }, -// // }; - -// // let main_statements: Vec> = vec![ -// // Statement::Declaration(Variable::field_element("a")), -// // Statement::Declaration(Variable::field_element("b")), -// // Statement::MultipleDefinition( -// // vec![ -// // Assignee::Identifier(String::from("a")), -// // Assignee::Identifier(String::from("b")), -// // ], -// // Expression::FunctionCall( -// // "foo".to_string(), -// // vec![Expression::Identifier("x".to_string())], -// // ), -// // ), -// // Statement::Return(ExpressionList { -// // expressions: vec![Expression::Number(FieldPrime::from(1))], -// // }), -// // ]; - -// // let main = Function { -// // id: "main".to_string(), -// // arguments: vec![], -// // statements: main_statements, -// // signature: Signature { -// // inputs: vec![], -// // outputs: vec![Type::FieldElement, Type::FieldElement], -// // }, -// // }; - -// // let program = Prog { -// // functions: vec![foo, main], -// // imports: vec![], -// // imported_functions: vec![], -// // }; - -// // let mut checker = new_with_args(HashSet::new(), 0, HashSet::new()); -// // assert_eq!( -// // checker.check_program(program), -// // Err(Error { -// // message: "x is undefined".to_string() -// // }) -// // ); -// // } - -// // #[test] -// // fn function_undefined() { -// // // def bar(): -// // // 1 == foo() -// // // should fail -// // let bar_statements: Vec> = vec![Statement::Condition( -// // Expression::Number(FieldPrime::from(1)), -// // Expression::FunctionCall("foo".to_string(), vec![]), -// // )]; - -// // let bar = Function { -// // id: "bar".to_string(), -// // arguments: vec![], -// // statements: bar_statements, -// // signature: Signature { -// // inputs: vec![], -// // outputs: vec![Type::FieldElement], -// // }, -// // }; - -// // let mut checker = new_with_args(HashSet::new(), 0, HashSet::new()); -// // assert_eq!( -// // checker.check_function(&bar), -// // Err(Error { -// // message: "Function definition for function foo with signature () -> (_) not found." -// // .to_string() -// // }) -// // ); -// // } - -// // #[test] -// // fn return_undefined() { -// // // def bar(): -// // // return a, b -// // // should fail -// // let bar_statements: Vec> = vec![Statement::Return(ExpressionList { -// // expressions: vec![ -// // Expression::Identifier("a".to_string()), -// // Expression::Identifier("b".to_string()), -// // ], -// // })]; - -// // let bar = Function { -// // id: "bar".to_string(), -// // arguments: vec![], -// // statements: bar_statements, -// // signature: Signature { -// // inputs: vec![], -// // outputs: vec![Type::FieldElement, Type::FieldElement], -// // }, -// // }; - -// // let mut checker = new_with_args(HashSet::new(), 0, HashSet::new()); -// // assert_eq!( -// // checker.check_function(&bar), -// // Err(Error { -// // message: "a is undefined".to_string() -// // }) -// // ); -// // } - -// // #[test] -// // fn multi_def() { -// // // def foo(): -// // // return 1, 2 -// // // def bar(): -// // // field a, field b = foo() -// // // return a + b -// // // -// // // should pass -// // let bar_statements: Vec> = vec![ -// // Statement::Declaration(Variable::field_element("a")), -// // Statement::Declaration(Variable::field_element("b")), -// // Statement::MultipleDefinition( -// // vec![ -// // Assignee::Identifier(String::from("a")), -// // Assignee::Identifier(String::from("b")), -// // ], -// // Expression::FunctionCall("foo".to_string(), vec![]), -// // ), -// // Statement::Return(ExpressionList { -// // expressions: vec![Expression::Add( -// // box Expression::Identifier("a".to_string()), -// // box Expression::Identifier("b".to_string()), -// // )], -// // }), -// // ]; - -// // let bar_statements_checked: Vec> = vec![ -// // TypedStatement::Declaration(Variable::field_element("a")), -// // TypedStatement::Declaration(Variable::field_element("b")), -// // TypedStatement::MultipleDefinition( -// // vec![Variable::field_element("a"), Variable::field_element("b")], -// // TypedExpressionList::FunctionCall( -// // "foo".to_string(), -// // vec![], -// // vec![Type::FieldElement, Type::FieldElement], -// // ), -// // ), -// // TypedStatement::Return(vec![FieldElementExpression::Add( -// // box FieldElementExpression::Identifier("a".to_string()), -// // box FieldElementExpression::Identifier("b".to_string()), -// // ) -// // .into()]), -// // ]; - -// // let foo = FunctionKey { -// // id: "foo".to_string(), -// // signature: Signature { -// // inputs: vec![], -// // outputs: vec![Type::FieldElement, Type::FieldElement], -// // }, -// // }; - -// // let mut functions = HashSet::new(); -// // functions.insert(foo); - -// // let bar = Function { -// // id: "bar".to_string(), -// // arguments: vec![], -// // statements: bar_statements, -// // signature: Signature { -// // inputs: vec![], -// // outputs: vec![Type::FieldElement], -// // }, -// // }; - -// // let bar_checked = TypedFunction { -// // id: "bar".to_string(), -// // arguments: vec![], -// // statements: bar_statements_checked, -// // signature: Signature { -// // inputs: vec![], -// // outputs: vec![Type::FieldElement], -// // }, -// // }; - -// // let mut checker = new_with_args(HashSet::new(), 0, functions); -// // assert_eq!(checker.check_function(&bar), Ok(bar_checked)); -// // } - -// // #[test] -// // fn duplicate_function_declaration() { -// // // def foo(a, b): -// // // return 1 -// // // def foo(c, d): -// // // return 2 -// // // -// // // should fail -// // let foo2_statements: Vec> = vec![Statement::Return(ExpressionList { -// // expressions: vec![Expression::Number(FieldPrime::from(1))], -// // })]; - -// // let foo2_arguments = vec![ -// // Parameter { -// // id: Variable::field_element("a"), -// // private: true, -// // }, -// // Parameter { -// // id: Variable::field_element("b"), -// // private: true, -// // }, -// // ]; - -// // let foo1 = FunctionKey { -// // id: "foo".to_string(), -// // signature: Signature { -// // inputs: vec![Type::FieldElement, Type::FieldElement], -// // outputs: vec![Type::FieldElement], -// // }, -// // }; - -// // let mut functions = HashSet::new(); -// // functions.insert(foo1); - -// // let foo2 = Function { -// // id: "foo".to_string(), -// // arguments: foo2_arguments, -// // statements: foo2_statements, -// // signature: Signature { -// // inputs: vec![Type::FieldElement, Type::FieldElement], -// // outputs: vec![Type::FieldElement], -// // }, -// // }; - -// // let mut checker = new_with_args(HashSet::new(), 0, functions); -// // assert_eq!( -// // checker.check_function(&foo2), -// // Err(Error { -// // message: -// // "Duplicate definition for function foo with signature (field, field) -> (field)" -// // .to_string() -// // }) -// // ); -// // } - -// // #[test] -// // fn duplicate_main_function() { -// // // def main(a): -// // // return 1 -// // // def main(): -// // // return 1 -// // // -// // // should fail -// // let main1_statements: Vec> = -// // vec![Statement::Return(ExpressionList { -// // expressions: vec![Expression::Number(FieldPrime::from(1))], -// // })]; - -// // let main1_arguments = vec![Parameter { -// // id: Variable::field_element("a"), -// // private: false, -// // }]; - -// // let main2_statements: Vec> = -// // vec![Statement::Return(ExpressionList { -// // expressions: vec![Expression::Number(FieldPrime::from(1))], -// // })]; - -// // let main2_arguments = vec![]; - -// // let main1 = Function { -// // id: "main".to_string(), -// // arguments: main1_arguments, -// // statements: main1_statements, -// // signature: Signature { -// // inputs: vec![Type::FieldElement], -// // outputs: vec![Type::FieldElement], -// // }, -// // }; - -// // let main2 = Function { -// // id: "main".to_string(), -// // arguments: main2_arguments, -// // statements: main2_statements, -// // signature: Signature { -// // inputs: vec![], -// // outputs: vec![Type::FieldElement], -// // }, -// // }; - -// // let prog = Prog { -// // functions: vec![main1, main2], -// // imports: vec![], -// // imported_functions: vec![], -// // }; - -// // let mut checker = Checker::new(); -// // assert_eq!( -// // checker.check_program(prog), -// // Err(Error { -// // message: "Only one main function allowed, found 2".to_string() -// // }) -// // ); -// // } - -// // #[test] -// // fn shadowing_with_same_type() { -// // // field a -// // // field a -// // // -// // // should fail - -// // let mut checker = Checker::new(); -// // let _: Result, Error> = checker.check_statement( -// // &Statement::Declaration(Variable::field_element("a")), -// // &vec![], -// // ); -// // let s2_checked: Result, Error> = checker.check_statement( -// // &Statement::Declaration(Variable::field_element("a")), -// // &vec![], -// // ); -// // assert_eq!( -// // s2_checked, -// // Err(Error { -// // message: "Duplicate declaration for variable named a".to_string() -// // }) -// // ); -// // } - -// // #[test] -// // fn shadowing_with_different_type() { -// // // field a -// // // bool a -// // // -// // // should fail - -// // let mut checker = Checker::new(); -// // let _: Result, Error> = checker.check_statement( -// // &Statement::Declaration(Variable::field_element("a")), -// // &vec![], -// // ); -// // let s2_checked: Result, Error> = -// // checker.check_statement(&Statement::Declaration(Variable::boolean("a")), &vec![]); -// // assert_eq!( -// // s2_checked, -// // Err(Error { -// // message: "Duplicate declaration for variable named a".to_string() -// // }) -// // ); -// // } - -// // mod assignee { -// // use super::*; - -// // #[test] -// // fn identifier() { -// // // a = 42 -// // let a = Assignee::Identifier::(String::from("a")); - -// // let mut checker: Checker = Checker::new(); -// // checker -// // .check_statement::( -// // &Statement::Declaration(Variable::field_element("a")), -// // &vec![], -// // ) -// // .unwrap(); - -// // assert_eq!( -// // checker.check_assignee(&a), -// // Ok(TypedAssignee::Identifier(Variable::field_element("a"))) -// // ); -// // } - -// // #[test] -// // fn array_element() { -// // // field[33] a -// // // a[2] = 42 -// // let a = Assignee::ArrayElement( -// // box Assignee::Identifier(String::from("a")), -// // box Expression::Number(FieldPrime::from(2)), -// // ); - -// // let mut checker: Checker = Checker::new(); -// // checker -// // .check_statement::( -// // &Statement::Declaration(Variable::field_array("a", 33)), -// // &vec![], -// // ) -// // .unwrap(); - -// // assert_eq!( -// // checker.check_assignee(&a), -// // Ok(TypedAssignee::ArrayElement( -// // box TypedAssignee::Identifier(Variable::field_array("a", 33)), -// // box FieldElementExpression::Number(FieldPrime::from(2)).into() -// // )) -// // ); -// // } -// // } -// } +#[cfg(test)] +mod tests { + use super::*; + use types::Signature; + //use absy::parameter::Parameter; + use zokrates_field::field::FieldPrime; + + mod symbols { + use super::*; + use crate::types::Signature; + + #[test] + fn imported_symbol() { + // foo.code + // def main() -> (field): + // return 1 + + // bar.code + // from "./foo.code" import main + + // after semantic check, `bar` should import a checked function + + let foo: Module = Module { + functions: vec![( + String::from("main"), + FunctionSymbol::Here( + Function { + id: String::from("main"), + statements: vec![Statement::Return( + ExpressionList { + expressions: vec![ + Expression::Number(FieldPrime::from(1)).at(0, 0, 0) + ], + } + .at(0, 0, 0), + ) + .at(0, 0, 0)], + signature: Signature::new().outputs(vec![Type::FieldElement]), + arguments: vec![], + } + .at(0, 0, 0), + ) + .at(0, 0, 0), + )], + imported_functions: vec![], + imports: vec![], + }; + + let bar: Module = Module { + functions: vec![( + String::from("main"), + FunctionSymbol::There(String::from("main"), String::from("foo")).at(0, 0, 0), + )], + imported_functions: vec![], + imports: vec![], + }; + + let mut modules = vec![(String::from("foo"), foo)].into_iter().collect(); + let mut typed_modules = HashMap::new(); + + let mut checker = Checker::new(); + + let checked_bar = checker.check_module(bar, &mut modules, &mut typed_modules); + assert_eq!( + checked_bar, + Ok(TypedModule { + functions: vec![( + FunctionKey::with_id("main") + .signature(Signature::new().outputs(vec![Type::FieldElement])), + TypedFunctionSymbol::There( + FunctionKey::with_id("main") + .signature(Signature::new().outputs(vec![Type::FieldElement])), + String::from("foo") + ) + )] + .into_iter() + .collect(), + imported_functions: vec![], + imports: vec![] + }) + ); + } + } + + pub fn new_with_args( + scope: HashSet, + level: usize, + functions: HashSet, + ) -> Checker { + Checker { + scope: scope, + functions: functions, + level: level, + } + } + + #[test] + fn undefined_variable_in_statement() { + // a = b + // b undefined + let statement: StatementNode = Statement::Definition( + Assignee::Identifier(String::from("a")).mock(), + Expression::Identifier(String::from("b")).mock(), + ) + .mock(); + + let mut checker = Checker::new(); + assert_eq!( + checker.check_statement(&statement, &vec![]), + Err(Error { + pos: Some((Position::mock(), Position::mock())), + message: "Identifier is undefined: b".to_string() + }) + ); + } + + #[test] + fn defined_variable_in_statement() { + // a = b + // b defined + let statement: StatementNode = Statement::Definition( + Assignee::Identifier(String::from("a")).mock(), + Expression::Identifier(String::from("b")).mock(), + ) + .mock(); + + let mut scope = HashSet::new(); + scope.insert(ScopedVariable { + id: Variable::field_element("a"), + level: 0, + }); + scope.insert(ScopedVariable { + id: Variable::field_element("b"), + level: 0, + }); + let mut checker = new_with_args(scope, 1, HashSet::new()); + assert_eq!( + checker.check_statement(&statement, &vec![]), + Ok(TypedStatement::Definition( + TypedAssignee::Identifier(Variable::field_element("a")), + FieldElementExpression::Identifier(String::from("b")).into() + )) + ); + } + + #[test] + fn declared_in_other_function() { + // def foo(): + // field a = 1 + // def bar(): + // return a + // should fail + let foo_args = vec![]; + let foo_statements = vec![ + Statement::Declaration(Variable::field_element("a").mock()).mock(), + Statement::Definition( + Assignee::Identifier(String::from("a")).mock(), + Expression::Number(FieldPrime::from(1)).mock(), + ) + .mock(), + ]; + let foo = Function { + id: "foo".to_string(), + arguments: foo_args, + statements: foo_statements, + signature: Signature { + inputs: vec![], + outputs: vec![Type::FieldElement], + }, + } + .mock(); + + let bar_args = vec![]; + let bar_statements = vec![Statement::Return( + ExpressionList { + expressions: vec![Expression::Identifier(String::from("a")).mock()], + } + .mock(), + ) + .mock()]; + + let bar = Function { + id: "bar".to_string(), + arguments: bar_args, + statements: bar_statements, + signature: Signature { + inputs: vec![], + outputs: vec![Type::FieldElement], + }, + } + .mock(); + + let funcs = vec![ + (String::from("foo"), FunctionSymbol::Here(foo).mock()), + (String::from("bar"), FunctionSymbol::Here(bar).mock()), + ]; + let module = Module { + functions: funcs, + imports: vec![], + imported_functions: vec![], + }; + + let mut checker = Checker::new(); + assert_eq!( + checker.check_module(module, &mut HashMap::new(), &mut HashMap::new()), + Err(vec![Error { + pos: Some((Position::mock(), Position::mock())), + message: "Identifier is undefined: a".to_string() + }]) + ); + } + + #[test] + fn declared_in_two_scopes() { + // def foo(): + // a = 1 + // def bar(): + // a = 2 + // return a + // def main(): + // return 1 + // should pass + let foo_args = vec![]; + let foo_statements = vec![ + Statement::Declaration(Variable::field_element("a").mock()).mock(), + Statement::Definition( + Assignee::Identifier(String::from("a")).mock(), + Expression::Number(FieldPrime::from(1)).mock(), + ) + .mock(), + ]; + + let foo = Function { + id: "foo".to_string(), + arguments: foo_args, + statements: foo_statements, + signature: Signature { + inputs: vec![], + outputs: vec![Type::FieldElement], + }, + } + .mock(); + + let bar_args = vec![]; + let bar_statements = vec![ + Statement::Declaration(Variable::field_element("a").mock()).mock(), + Statement::Definition( + Assignee::Identifier(String::from("a")).mock(), + Expression::Number(FieldPrime::from(2)).mock(), + ) + .mock(), + Statement::Return( + ExpressionList { + expressions: vec![Expression::Identifier(String::from("a")).mock()], + } + .mock(), + ) + .mock(), + ]; + let bar = Function { + id: "bar".to_string(), + arguments: bar_args, + statements: bar_statements, + signature: Signature { + inputs: vec![], + outputs: vec![Type::FieldElement], + }, + } + .mock(); + + let main_args = vec![]; + let main_statements = vec![Statement::Return( + ExpressionList { + expressions: vec![Expression::Number(FieldPrime::from(1)).mock()], + } + .mock(), + ) + .mock()]; + + let main = Function { + id: "main".to_string(), + arguments: main_args, + statements: main_statements, + signature: Signature { + inputs: vec![], + outputs: vec![Type::FieldElement], + }, + } + .mock(); + + let funcs = vec![ + (String::from("foo"), FunctionSymbol::Here(foo).mock()), + (String::from("bar"), FunctionSymbol::Here(bar).mock()), + (String::from("main"), FunctionSymbol::Here(main).mock()), + ]; + let module = Module { + functions: funcs, + imports: vec![], + imported_functions: vec![], + }; + + let mut checker = Checker::new(); + assert!(checker + .check_module(module, &mut HashMap::new(), &mut HashMap::new()) + .is_ok()); + } + + #[test] + fn for_index_after_end() { + // def foo(): + // for field i in 0..10 do + // endfor + // return i + // should fail + let foo_statements = vec![ + Statement::For( + Variable::field_element("i").mock(), + FieldPrime::from(0), + FieldPrime::from(10), + vec![], + ) + .mock(), + Statement::Return( + ExpressionList { + expressions: vec![Expression::Identifier(String::from("i")).mock()], + } + .mock(), + ) + .mock(), + ]; + let foo = Function { + id: "foo".to_string(), + arguments: vec![], + statements: foo_statements, + signature: Signature { + inputs: vec![], + outputs: vec![Type::FieldElement], + }, + } + .mock(); + + let mut checker = Checker::new(); + assert_eq!( + checker.check_function(foo), + Err(vec![Error { + pos: Some((Position::mock(), Position::mock())), + message: "Identifier is undefined: i".to_string() + }]) + ); + } + + #[test] + fn for_index_in_for() { + // def foo(): + // for i in 0..10 do + // a = i + // endfor + // should pass + + let for_statements = vec![ + Statement::Declaration(Variable::field_element("a").mock()).mock(), + Statement::Definition( + Assignee::Identifier(String::from("a")).mock(), + Expression::Identifier(String::from("i")).mock(), + ) + .mock(), + ]; + + let foo_statements = vec![Statement::For( + Variable::field_element("i").mock(), + FieldPrime::from(0), + FieldPrime::from(10), + for_statements, + ) + .mock()]; + + let for_statements_checked = vec![ + TypedStatement::Declaration(Variable::field_element("a")), + TypedStatement::Definition( + TypedAssignee::Identifier(Variable::field_element("a")), + FieldElementExpression::Identifier(String::from("i")).into(), + ), + ]; + + let foo_statements_checked = vec![TypedStatement::For( + Variable::field_element("i"), + FieldPrime::from(0), + FieldPrime::from(10), + for_statements_checked, + )]; + + let foo = Function { + id: "foo".to_string(), + arguments: vec![], + statements: foo_statements, + signature: Signature { + inputs: vec![], + outputs: vec![Type::FieldElement], + }, + } + .mock(); + + let foo_checked = TypedFunction { + id: "foo".to_string(), + arguments: Vec::::new(), + statements: foo_statements_checked, + signature: Signature { + inputs: vec![], + outputs: vec![Type::FieldElement], + }, + }; + + let mut checker = Checker::new(); + assert_eq!(checker.check_function(foo), Ok(foo_checked)); + } + + #[test] + fn arity_mismatch() { + // def foo(): + // return 1, 2 + // def bar(): + // field a = foo() + // should fail + let bar_statements: Vec> = vec![ + Statement::Declaration(Variable::field_element("a").mock()).mock(), + Statement::MultipleDefinition( + vec![Assignee::Identifier(String::from("a")).mock()], + Expression::FunctionCall("foo".to_string(), vec![]).mock(), + ) + .mock(), + ]; + + let foo = FunctionKey { + id: "foo".to_string(), + signature: Signature { + inputs: vec![], + outputs: vec![Type::FieldElement, Type::FieldElement], + }, + }; + + let functions = vec![foo].into_iter().collect(); + + let bar = Function { + id: "bar".to_string(), + arguments: vec![], + statements: bar_statements, + signature: Signature { + inputs: vec![], + outputs: vec![Type::FieldElement], + }, + } + .mock(); + + let mut checker = new_with_args(HashSet::new(), 0, functions); + assert_eq!( + checker.check_function(bar), + Err(vec![Error { + pos: Some((Position::mock(), Position::mock())), + message: + "Function definition for function foo with signature () -> (field) not found." + .to_string() + }]) + ); + } + + #[test] + fn multi_return_outside_multidef() { + // def foo(): + // return 1, 2 + // def bar(): + // 2 == foo() + // should fail + let bar_statements: Vec> = vec![Statement::Condition( + Expression::Number(FieldPrime::from(2)).mock(), + Expression::FunctionCall("foo".to_string(), vec![]).mock(), + ) + .mock()]; + + let foo = FunctionKey { + id: "foo".to_string(), + signature: Signature { + inputs: vec![], + outputs: vec![Type::FieldElement, Type::FieldElement], + }, + }; + + let functions = vec![foo].into_iter().collect(); + + let bar = Function { + id: "bar".to_string(), + arguments: vec![], + statements: bar_statements, + signature: Signature { + inputs: vec![], + outputs: vec![Type::FieldElement], + }, + } + .mock(); + + let mut checker = new_with_args(HashSet::new(), 0, functions); + assert_eq!( + checker.check_function(bar), + Err(vec![Error { + pos: Some((Position::mock(), Position::mock())), + message: "Function definition for function foo with signature () -> (_) not found." + .to_string() + }]) + ); + } + + #[test] + fn function_undefined_in_multidef() { + // def bar(): + // field a = foo() + // should fail + let bar_statements: Vec> = vec![ + Statement::Declaration(Variable::field_element("a").mock()).mock(), + Statement::MultipleDefinition( + vec![Assignee::Identifier(String::from("a")).mock()], + Expression::FunctionCall("foo".to_string(), vec![]).mock(), + ) + .mock(), + ]; + + let bar = Function { + id: "bar".to_string(), + arguments: vec![], + statements: bar_statements, + signature: Signature { + inputs: vec![], + outputs: vec![Type::FieldElement], + }, + } + .mock(); + + let mut checker = new_with_args(HashSet::new(), 0, HashSet::new()); + assert_eq!( + checker.check_function(bar), + Err(vec![Error { + pos: Some((Position::mock(), Position::mock())), + + message: + "Function definition for function foo with signature () -> (field) not found." + .to_string() + }]) + ); + } + + #[test] + fn undefined_variable_in_multireturn_call() { + // def foo(x): + // return 1, 2 + // def main(): + // a, b = foo(x) + // return 1 + // should fail + + let foo_statements: Vec> = vec![Statement::Return( + ExpressionList { + expressions: vec![ + Expression::Number(FieldPrime::from(1)).mock(), + Expression::Number(FieldPrime::from(2)).mock(), + ], + } + .mock(), + ) + .mock()]; + + let foo = Function { + id: "foo".to_string(), + arguments: vec![crate::absy::Parameter { + id: Variable::field_element("x").mock(), + private: false, + } + .mock()], + statements: foo_statements, + signature: Signature { + inputs: vec![Type::FieldElement], + outputs: vec![Type::FieldElement, Type::FieldElement], + }, + } + .mock(); + + let main_statements: Vec> = vec![ + Statement::Declaration(Variable::field_element("a").mock()).mock(), + Statement::Declaration(Variable::field_element("b").mock()).mock(), + Statement::MultipleDefinition( + vec![ + Assignee::Identifier(String::from("a")).mock(), + Assignee::Identifier(String::from("b")).mock(), + ], + Expression::FunctionCall( + "foo".to_string(), + vec![Expression::Identifier("x".to_string()).mock()], + ) + .mock(), + ) + .mock(), + Statement::Return( + ExpressionList { + expressions: vec![Expression::Number(FieldPrime::from(1)).mock()], + } + .mock(), + ) + .mock(), + ]; + + let main = Function { + id: "main".to_string(), + arguments: vec![], + statements: main_statements, + signature: Signature { + inputs: vec![], + outputs: vec![Type::FieldElement], + }, + } + .mock(); + + let module = Module { + functions: vec![ + (String::from("foo"), FunctionSymbol::Here(foo).mock()), + (String::from("main"), FunctionSymbol::Here(main).mock()), + ], + imports: vec![], + imported_functions: vec![], + }; + + let mut checker = new_with_args(HashSet::new(), 0, HashSet::new()); + assert_eq!( + checker.check_module(module, &mut HashMap::new(), &mut HashMap::new()), + Err(vec![Error { + pos: Some((Position::mock(), Position::mock())), + message: "Identifier is undefined: x".to_string() + }]) + ); + } + + #[test] + fn function_undefined() { + // def bar(): + // 1 == foo() + // should fail + let bar_statements: Vec> = vec![Statement::Condition( + Expression::Number(FieldPrime::from(1)).mock(), + Expression::FunctionCall("foo".to_string(), vec![]).mock(), + ) + .mock()]; + + let bar = Function { + id: "bar".to_string(), + arguments: vec![], + statements: bar_statements, + signature: Signature { + inputs: vec![], + outputs: vec![Type::FieldElement], + }, + } + .mock(); + + let mut checker = new_with_args(HashSet::new(), 0, HashSet::new()); + assert_eq!( + checker.check_function(bar), + Err(vec![Error { + pos: Some((Position::mock(), Position::mock())), + + message: "Function definition for function foo with signature () -> (_) not found." + .to_string() + }]) + ); + } + + #[test] + fn return_undefined() { + // def bar(): + // return a, b + // should fail + let bar_statements: Vec> = vec![Statement::Return( + ExpressionList { + expressions: vec![ + Expression::Identifier("a".to_string()).mock(), + Expression::Identifier("b".to_string()).mock(), + ], + } + .mock(), + ) + .mock()]; + + let bar = Function { + id: "bar".to_string(), + arguments: vec![], + statements: bar_statements, + signature: Signature { + inputs: vec![], + outputs: vec![Type::FieldElement, Type::FieldElement], + }, + } + .mock(); + + let mut checker = new_with_args(HashSet::new(), 0, HashSet::new()); + assert_eq!( + checker.check_function(bar), + Err(vec![Error { + pos: Some((Position::mock(), Position::mock())), + message: "Identifier is undefined: a".to_string() + }]) + ); + } + + #[test] + fn multi_def() { + // def foo(): + // return 1, 2 + // def bar(): + // field a, field b = foo() + // return a + b + // + // should pass + let bar_statements: Vec> = vec![ + Statement::Declaration(Variable::field_element("a").mock()).mock(), + Statement::Declaration(Variable::field_element("b").mock()).mock(), + Statement::MultipleDefinition( + vec![ + Assignee::Identifier(String::from("a")).mock(), + Assignee::Identifier(String::from("b")).mock(), + ], + Expression::FunctionCall("foo".to_string(), vec![]).mock(), + ) + .mock(), + Statement::Return( + ExpressionList { + expressions: vec![Expression::Add( + box Expression::Identifier("a".to_string()).mock(), + box Expression::Identifier("b".to_string()).mock(), + ) + .mock()], + } + .mock(), + ) + .mock(), + ]; + + let bar_statements_checked: Vec> = vec![ + TypedStatement::Declaration(Variable::field_element("a")), + TypedStatement::Declaration(Variable::field_element("b")), + TypedStatement::MultipleDefinition( + vec![Variable::field_element("a"), Variable::field_element("b")], + TypedExpressionList::FunctionCall( + FunctionKey::with_id("foo").signature( + Signature::new().outputs(vec![Type::FieldElement, Type::FieldElement]), + ), + vec![], + vec![Type::FieldElement, Type::FieldElement], + ), + ), + TypedStatement::Return(vec![FieldElementExpression::Add( + box FieldElementExpression::Identifier("a".to_string()), + box FieldElementExpression::Identifier("b".to_string()), + ) + .into()]), + ]; + + let foo = FunctionKey { + id: "foo".to_string(), + signature: Signature { + inputs: vec![], + outputs: vec![Type::FieldElement, Type::FieldElement], + }, + }; + + let mut functions = HashSet::new(); + functions.insert(foo); + + let bar = Function { + id: "bar".to_string(), + arguments: vec![], + statements: bar_statements, + signature: Signature { + inputs: vec![], + outputs: vec![Type::FieldElement], + }, + } + .mock(); + + let bar_checked = TypedFunction { + id: "bar".to_string(), + arguments: vec![], + statements: bar_statements_checked, + signature: Signature { + inputs: vec![], + outputs: vec![Type::FieldElement], + }, + }; + + let mut checker = new_with_args(HashSet::new(), 0, functions); + assert_eq!(checker.check_function(bar), Ok(bar_checked)); + } + + #[test] + fn duplicate_function_declaration() { + // def foo(a, b): + // return 1 + // def foo(c, d): + // return 2 + // + // should fail + let foo2_statements: Vec> = vec![Statement::Return( + ExpressionList { + expressions: vec![Expression::Number(FieldPrime::from(1)).mock()], + } + .mock(), + ) + .mock()]; + + let foo2_arguments = vec![ + crate::absy::Parameter { + id: Variable::field_element("a").mock(), + private: true, + } + .mock(), + crate::absy::Parameter { + id: Variable::field_element("b").mock(), + private: true, + } + .mock(), + ]; + + let foo1 = FunctionKey { + id: "foo".to_string(), + signature: Signature { + inputs: vec![Type::FieldElement, Type::FieldElement], + outputs: vec![Type::FieldElement], + }, + }; + + let functions = vec![foo1].into_iter().collect(); + + let foo2 = Function { + id: "foo".to_string(), + arguments: foo2_arguments, + statements: foo2_statements, + signature: Signature { + inputs: vec![Type::FieldElement, Type::FieldElement], + outputs: vec![Type::FieldElement], + }, + } + .mock(); + + let mut checker = new_with_args(HashSet::new(), 0, functions); + assert_eq!( + checker.check_function(foo2), + Err(vec![Error { + pos: Some((Position::mock(), Position::mock())), + + message: + "Duplicate definition for function foo with signature (field, field) -> (field)" + .to_string() + }]) + ); + } + + #[test] + fn duplicate_main_function() { + // def main(a): + // return 1 + // def main(): + // return 1 + // + // should fail + let main1_statements: Vec> = vec![Statement::Return( + ExpressionList { + expressions: vec![Expression::Number(FieldPrime::from(1)).mock()], + } + .mock(), + ) + .mock()]; + + let main1_arguments = vec![crate::absy::Parameter { + id: Variable::field_element("a").mock(), + private: false, + } + .mock()]; + + let main2_statements: Vec> = vec![Statement::Return( + ExpressionList { + expressions: vec![Expression::Number(FieldPrime::from(1)).mock()], + } + .mock(), + ) + .mock()]; + + let main2_arguments = vec![]; + + let main1 = Function { + id: "main".to_string(), + arguments: main1_arguments, + statements: main1_statements, + signature: Signature { + inputs: vec![Type::FieldElement], + outputs: vec![Type::FieldElement], + }, + } + .mock(); + + let main2 = Function { + id: "main".to_string(), + arguments: main2_arguments, + statements: main2_statements, + signature: Signature { + inputs: vec![], + outputs: vec![Type::FieldElement], + }, + } + .mock(); + + let functions = vec![ + (String::from("main"), FunctionSymbol::Here(main1).mock()), + (String::from("main"), FunctionSymbol::Here(main2).mock()), + ]; + + let main_module = Module { + functions: functions, + imports: vec![], + imported_functions: vec![], + }; + + let program = Program { + modules: HashMap::new(), + main: main_module, + }; + + let mut checker = Checker::new(); + assert_eq!( + checker.check_program(program), + Err(vec![Error { + pos: None, + message: "Only one main function allowed, found 2".to_string() + }]) + ); + } + + #[test] + fn shadowing_with_same_type() { + // field a + // field a + // + // should fail + + let mut checker = Checker::new(); + let _: Result, Error> = checker.check_statement( + &Statement::Declaration(Variable::field_element("a").mock()).mock(), + &vec![], + ); + let s2_checked: Result, Error> = checker.check_statement( + &Statement::Declaration(Variable::field_element("a").mock()).mock(), + &vec![], + ); + assert_eq!( + s2_checked, + Err(Error { + pos: Some((Position::mock(), Position::mock())), + message: "Duplicate declaration for variable named a".to_string() + }) + ); + } + + #[test] + fn shadowing_with_different_type() { + // field a + // bool a + // + // should fail + + let mut checker = Checker::new(); + let _: Result, Error> = checker.check_statement( + &Statement::Declaration(Variable::field_element("a").mock()).mock(), + &vec![], + ); + let s2_checked: Result, Error> = checker.check_statement( + &Statement::Declaration(Variable::boolean("a").mock()).mock(), + &vec![], + ); + assert_eq!( + s2_checked, + Err(Error { + pos: Some((Position::mock(), Position::mock())), + message: "Duplicate declaration for variable named a".to_string() + }) + ); + } + + mod assignee { + use super::*; + + #[test] + fn identifier() { + // a = 42 + let a = Assignee::Identifier::(String::from("a")).mock(); + + let mut checker: Checker = Checker::new(); + checker + .check_statement::( + &Statement::Declaration(Variable::field_element("a").mock()).mock(), + &vec![], + ) + .unwrap(); + + assert_eq!( + checker.check_assignee(&a), + Ok(TypedAssignee::Identifier(Variable::field_element("a"))) + ); + } + + #[test] + fn array_element() { + // field[33] a + // a[2] = 42 + let a = Assignee::ArrayElement( + box Assignee::Identifier(String::from("a")).mock(), + box Expression::Number(FieldPrime::from(2)).mock(), + ) + .mock(); + + let mut checker: Checker = Checker::new(); + checker + .check_statement::( + &Statement::Declaration(Variable::field_array("a", 33).mock()).mock(), + &vec![], + ) + .unwrap(); + + assert_eq!( + checker.check_assignee(&a), + Ok(TypedAssignee::ArrayElement( + box TypedAssignee::Identifier(Variable::field_array("a", 33)), + box FieldElementExpression::Number(FieldPrime::from(2)).into() + )) + ); + } + } +} diff --git a/zokrates_core/src/static_analysis/unroll.rs b/zokrates_core/src/static_analysis/unroll.rs index e34d4c80c..93b92c299 100644 --- a/zokrates_core/src/static_analysis/unroll.rs +++ b/zokrates_core/src/static_analysis/unroll.rs @@ -178,6 +178,7 @@ mod tests { #[cfg(test)] mod statement { use super::*; + use crate::types::{FunctionKey, Signature}; #[test] fn for_loop() { @@ -369,7 +370,11 @@ mod tests { let s: TypedStatement = TypedStatement::MultipleDefinition( vec![Variable::field_element("a")], TypedExpressionList::FunctionCall( - String::from("foo"), + FunctionKey::with_id("foo").signature( + Signature::new() + .inputs(vec![Type::FieldElement]) + .outputs(vec![Type::FieldElement]), + ), vec![FieldElementExpression::Identifier(String::from("a")).into()], vec![Type::FieldElement], ), @@ -379,7 +384,11 @@ mod tests { vec![TypedStatement::MultipleDefinition( vec![Variable::field_element("a_1")], TypedExpressionList::FunctionCall( - String::from("foo"), + FunctionKey::with_id("foo").signature( + Signature::new() + .inputs(vec![Type::FieldElement]) + .outputs(vec![Type::FieldElement]) + ), vec![FieldElementExpression::Identifier(String::from("a_0")).into()], vec![Type::FieldElement], ) diff --git a/zokrates_core/src/typed_absy/mod.rs b/zokrates_core/src/typed_absy/mod.rs index 4b847f444..79559c3c0 100644 --- a/zokrates_core/src/typed_absy/mod.rs +++ b/zokrates_core/src/typed_absy/mod.rs @@ -11,7 +11,7 @@ mod variable; pub use crate::typed_absy::parameter::Parameter; pub use crate::typed_absy::variable::Variable; -use crate::types::Signature; +use crate::types::{FunctionKey, Signature}; use std::collections::HashMap; use crate::flat_absy::*; @@ -84,12 +84,6 @@ impl fmt::Display for TypedFunctionSymbol { } } -#[derive(PartialEq, Eq, Hash, Debug, Clone)] -pub struct FunctionKey { - pub id: Identifier, - pub signature: Signature, -} - impl fmt::Display for TypedModule { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { let mut res = vec![]; diff --git a/zokrates_core/src/typed_absy/variable.rs b/zokrates_core/src/typed_absy/variable.rs index 659b3b0d2..42f59f679 100644 --- a/zokrates_core/src/typed_absy/variable.rs +++ b/zokrates_core/src/typed_absy/variable.rs @@ -1,57 +1 @@ -use crate::absy; -use crate::types::Type; -use std::fmt; - -#[derive(Serialize, Deserialize, Clone, PartialEq, Hash, Eq)] -pub struct Variable { - pub id: String, - pub _type: Type, -} - -impl Variable { - pub fn field_element>(id: S) -> Variable { - Variable { - id: id.into(), - _type: Type::FieldElement, - } - } - - pub fn boolean>(id: S) -> Variable { - Variable { - id: id.into(), - _type: Type::Boolean, - } - } - - pub fn field_array>(id: S, size: usize) -> Variable { - Variable { - id: id.into(), - _type: Type::FieldElementArray(size), - } - } - - pub fn get_type(&self) -> Type { - self._type.clone() - } -} - -impl fmt::Display for Variable { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "{} {}", self._type, self.id,) - } -} - -impl fmt::Debug for Variable { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "Variable(type: {:?}, id: {:?})", self._type, self.id,) - } -} - -impl From for Variable { - fn from(v: absy::Variable) -> Variable { - Variable { - id: v.id, - _type: v._type, - } - } -} +pub use types::Variable; diff --git a/zokrates_core/src/types/mod.rs b/zokrates_core/src/types/mod.rs index 38617748d..66a2998ff 100644 --- a/zokrates_core/src/types/mod.rs +++ b/zokrates_core/src/types/mod.rs @@ -50,6 +50,80 @@ impl Type { } } +#[derive(Serialize, Deserialize, Clone, PartialEq, Hash, Eq)] +pub struct Variable { + pub id: Identifier, + pub _type: Type, +} + +impl Variable { + pub fn new>(id: S, t: Type) -> Variable { + Variable { + id: id.into(), + _type: t, + } + } + + pub fn field_element>(id: S) -> Variable { + Variable { + id: id.into(), + _type: Type::FieldElement, + } + } + + pub fn boolean>(id: S) -> Variable { + Variable { + id: id.into(), + _type: Type::Boolean, + } + } + + pub fn field_array>(id: S, size: usize) -> Variable { + Variable { + id: id.into(), + _type: Type::FieldElementArray(size), + } + } + + pub fn get_type(&self) -> Type { + self._type.clone() + } +} + +impl fmt::Display for Variable { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "{} {}", self._type, self.id,) + } +} + +impl fmt::Debug for Variable { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "Variable(type: {:?}, id: {:?})", self._type, self.id,) + } +} + +type Identifier = String; + +#[derive(PartialEq, Eq, Hash, Debug, Clone)] +pub struct FunctionKey { + pub id: Identifier, + pub signature: Signature, +} + +impl FunctionKey { + pub fn with_id>(id: S) -> Self { + FunctionKey { + id: id.into(), + signature: Signature::new(), + } + } + + pub fn signature(mut self, signature: Signature) -> Self { + self.signature = signature; + self + } +} + #[cfg(test)] mod tests { use super::*; From fe54a62d27004b2dad87ba7e8da00956514c2ba7 Mon Sep 17 00:00:00 2001 From: schaeff Date: Mon, 20 May 2019 16:18:21 +0200 Subject: [PATCH 010/162] remove dead code optimizer and inliner as they explore the call graph not the dependency graph, implement display for typed prog --- .../src/static_analysis/dead_code.rs | 100 ------- zokrates_core/src/static_analysis/inline.rs | 280 ------------------ zokrates_core/src/static_analysis/mod.rs | 13 +- zokrates_core/src/typed_absy/mod.rs | 102 ++++--- 4 files changed, 56 insertions(+), 439 deletions(-) delete mode 100644 zokrates_core/src/static_analysis/dead_code.rs delete mode 100644 zokrates_core/src/static_analysis/inline.rs diff --git a/zokrates_core/src/static_analysis/dead_code.rs b/zokrates_core/src/static_analysis/dead_code.rs deleted file mode 100644 index c6d40540b..000000000 --- a/zokrates_core/src/static_analysis/dead_code.rs +++ /dev/null @@ -1,100 +0,0 @@ -use crate::typed_absy::folder::*; -use crate::typed_absy::Folder; -use crate::typed_absy::*; -use crate::types::{Signature, Type}; -use std::collections::HashSet; -use zokrates_field::field::Field; - -pub struct DeadCode { - called: HashSet, -} - -impl DeadCode { - fn new() -> Self { - DeadCode { - called: HashSet::new(), - } - } - - pub fn clean(p: TypedModule) -> TypedModule { - DeadCode::new().fold_module(p) - } -} - -impl Folder for DeadCode { - fn fold_module(&mut self, p: TypedModule) -> TypedModule { - let p = fold_module(self, p); - // only keep functions which are being called, or `main` - - unimplemented!() - - // TypedModule { - // functions: p - // .functions - // .into_iter() - // .filter(|(key, f)| key.id == "main" || self.called.contains(&f.slug())) - // .collect(), - // ..p - // } - } - - // add extra statements before the modified statement - fn fold_statement(&mut self, s: TypedStatement) -> Vec> { - match s { - TypedStatement::MultipleDefinition(variables, elist) => match elist { - TypedExpressionList::FunctionCall(key, exps, types) => { - let exps: Vec<_> = exps.into_iter().map(|e| self.fold_expression(e)).collect(); - - let signature = Signature::new() - .inputs(exps.iter().map(|e| e.get_type()).collect()) - .outputs(types.clone()); - - self.called - .insert(format!("{}_{}", key.id, signature.to_slug())); - vec![TypedStatement::MultipleDefinition( - variables, - TypedExpressionList::FunctionCall(key, exps, types), - )] - } - }, - s => fold_statement(self, s), - } - } - - fn fold_field_expression(&mut self, e: FieldElementExpression) -> FieldElementExpression { - match e { - FieldElementExpression::FunctionCall(id, exps) => { - let exps: Vec<_> = exps.into_iter().map(|e| self.fold_expression(e)).collect(); - - let signature = Signature::new() - .inputs(exps.iter().map(|e| e.get_type()).collect()) - .outputs(vec![Type::FieldElement]); - - self.called - .insert(format!("{}_{}", id.id, signature.to_slug())); - FieldElementExpression::FunctionCall(id, exps) - } - e => fold_field_expression(self, e), - } - } - - fn fold_field_array_expression( - &mut self, - e: FieldElementArrayExpression, - ) -> FieldElementArrayExpression { - match e { - FieldElementArrayExpression::FunctionCall(size, key, exps) => { - let exps: Vec<_> = exps.into_iter().map(|e| self.fold_expression(e)).collect(); - - let signature = Signature::new() - .inputs(exps.iter().map(|e| e.get_type()).collect()) - .outputs(vec![Type::FieldElementArray(size)]); - - self.called - .insert(format!("{}_{}", key.id, signature.to_slug())); - FieldElementArrayExpression::FunctionCall(size, key, exps) - } - e => fold_field_array_expression(self, e), - } - } -} diff --git a/zokrates_core/src/static_analysis/inline.rs b/zokrates_core/src/static_analysis/inline.rs deleted file mode 100644 index 02ffa72e7..000000000 --- a/zokrates_core/src/static_analysis/inline.rs +++ /dev/null @@ -1,280 +0,0 @@ -// use crate::typed_absy::folder::*; -// use crate::typed_absy::Folder; -// use crate::typed_absy::*; -// use crate::types::{Signature, Type}; -// use std::collections::HashMap; -// use zokrates_field::field::Field; - -// #[derive(Debug)] -// pub struct Inliner { -// functions: TypedFunctionSymbols, -// modules: TypedModules, -// statements_buffer: Vec>, -// context: Vec<(String, usize)>, -// call_count: HashMap, -// } - -// impl Inliner { -// fn new() -> Self { -// Inliner { -// functions: HashMap::new(), -// modules: HashMap::new(), -// statements_buffer: vec![], -// context: vec![], -// call_count: HashMap::new(), -// } -// } - -// fn should_inline( -// &self, -// function: &Option>, -// arguments: &Vec>, -// ) -> bool { -// // we should define a heuristic here -// // currently it doesn't seem like there's a tradeoff as everything gets inlined in flattening anyway (apart from compiling performance, as inlining -// // in flattening should be faster and less memory intensive) -// // however, using backends such as bellman, we could avoid flattening and "stream" the computation -// // at proving time, the tradeoff becomes code size (not inlining keeps only one copy of each function) vs optimisation -// // (inlining enables constant propagation through function calls, which cannot be achieved by our final optimiser in some cases) -// // for now, we inline functions whose non-array parameters are constant, as this covers our main use case for inlining: propagation of -// // constant array indices -// // match function { -// // Some(..) => { -// // // check whether non-array arguments are constant -// // arguments.iter().all(|e| match e { -// // TypedExpression::FieldElementArray(..) => true, -// // TypedExpression::FieldElement(FieldElementExpression::Number(..)) => true, -// // TypedExpression::Boolean(BooleanExpression::Value(..)) => true, -// // _ => false, -// // }) -// // } -// // None => false, -// // } -// true -// } - -// // inline a call to `function` taking `expressions` as inputs -// // this function mutates `self.call` by incrementing the counter for `function`, and mutates `self.context` -// fn inline_call( -// &mut self, -// symbol: &TypedFunctionSymbol, -// expressions: Vec>, -// ) -> Vec> { -// match symbol { -// TypedFunctionSymbol::Here(function) => { -// self.call_count -// .entry(function.to_slug()) -// .and_modify(|i| *i += 1) -// .or_insert(1); -// self.context.push(( -// function.to_slug(), -// *self.call_count.get(&function.to_slug()).unwrap(), -// )); - -// // add definitions for the inputs -// let mut inputs_bindings = function -// .arguments -// .iter() -// .zip(expressions) -// .map(|(a, e)| { -// TypedStatement::Definition( -// TypedAssignee::Identifier(self.fold_variable(a.id.clone())), -// e, -// ) -// }) -// .collect(); -// self.statements_buffer.append(&mut inputs_bindings); - -// // filter out the return statement and keep it aside -// let (mut statements, ret): (Vec<_>, Vec<_>) = function -// .statements -// .clone() -// .into_iter() -// .flat_map(|s| self.fold_statement(s)) -// .partition(|s| match s { -// TypedStatement::Return(..) => false, -// _ => true, -// }); - -// // add all statements to the buffer -// self.statements_buffer.append(&mut statements); - -// // remove this call from the context -// self.context.pop(); - -// match ret[0].clone() { -// TypedStatement::Return(exprs) => exprs, -// _ => panic!(""), -// } -// } -// _ => unimplemented!(), -// } -// } - -// pub fn inline(prog: TypedProgram) -> TypedProgram { -// Inliner::new().fold_program(prog) -// } -// } - -// impl Folder for Inliner { -// fn fold_program(&mut self, p: TypedProgram) -> TypedProgram { -// self.modules = p.modules; -// let main = p.main; -// self.functions = main.functions.clone(); -// TypedProgram { -// main: TypedModule { -// imported_functions: vec![], -// imports: vec![], -// functions: main -// .functions -// .into_iter() -// .filter(|(k, v)| k.id == "main") -// .take(1) -// .map(|(k, v)| (k, self.fold_function_symbol(v))) -// .collect(), -// }, -// modules: HashMap::new(), -// } -// } - -// fn fold_module(&mut self, m: TypedModule) -> TypedModule { -// unreachable!("we don't want to inline modules, only functions!") -// } - -// // prefix all names with the context -// fn fold_name(&mut self, n: String) -> String { -// match self.context.len() { -// 0 => n, -// _ => format!( -// "{}_{}", -// self.context -// .iter() -// .map(|(s, i)| format!("{}_{}", s, i)) -// .collect::>() -// .join("_"), -// n -// ), -// } -// } - -// fn fold_function_symbol(&mut self, s: TypedFunctionSymbol) -> TypedFunctionSymbol { -// match s { -// TypedFunctionSymbol::Here(function) => TypedFunctionSymbol::Here(self.fold_function(function)), -// TypedFunctionSymbol::There(function_id, module_id) => { -// let mut inliner = Inliner::new(); -// let module = self.modules.get(&module_id).unwrap(); -// let function_symbol = module.functions.get(&function_id).unwrap().clone(); - -// inliner.modules = self.modules.clone(); -// inliner.functions = module.functions.clone(); - -// inliner.fold_function_symbol(function_symbol) -// }, -// } -// } - -// // inline calls which return a field element -// fn fold_field_expression(&mut self, e: FieldElementExpression) -> FieldElementExpression { -// println!("{:#?}", self); - -// match e { -// FieldElementExpression::FunctionCall(key, exps) => { -// let exps: Vec<_> = exps.into_iter().map(|e| self.fold_expression(e)).collect(); - -// let passed_signature = Signature::new() -// .inputs(exps.iter().map(|e| e.get_type()).collect()) -// .outputs(vec![Type::FieldElement]); - -// println!("{:?} {:?}", key, self.functions); - -// // find the function -// let function = self.functions.get(&key).cloned(); - -// match self.should_inline(&function, &exps) { -// true => { -// let ret = self.inline_call(&function.unwrap(), exps); -// // unwrap the result to return a field element -// match ret[0].clone() { -// TypedExpression::FieldElement(e) => e, -// _ => panic!(""), -// } -// } -// false => FieldElementExpression::FunctionCall(key, exps), -// } -// } -// // default -// e => fold_field_expression(self, e), -// } -// } -// } - -// #[cfg(test)] -// mod tests { -// use super::*; -// use zokrates_field::field::FieldPrime; - -// #[cfg(test)] -// mod heuristics { -// use super::*; - -// #[test] -// fn inline_constant_field() { -// let f: TypedFunction = TypedFunction { -// id: String::from("foo"), -// arguments: vec![ -// Parameter::private(Variable::field_element("a")), -// Parameter::private(Variable::field_array("b", 3)), -// ], -// statements: vec![TypedStatement::Return(vec![ -// FieldElementExpression::Select( -// box FieldElementArrayExpression::Identifier(3, String::from("b")), -// box FieldElementExpression::Identifier(String::from("a")), -// ) -// .into(), -// ])], -// signature: Signature::new() -// .inputs(vec![Type::FieldElement, Type::FieldElementArray(3)]) -// .outputs(vec![Type::FieldElement]), -// }; - -// let arguments = vec![ -// FieldElementExpression::Number(FieldPrime::from(0)).into(), -// FieldElementArrayExpression::Identifier(3, String::from("random")).into(), -// ]; - -// let i = Inliner::new(); - -// assert!(i.should_inline(&Some(f), &arguments)); -// } - -// #[test] -// fn no_inline_non_constant_field() { -// let f: TypedFunction = TypedFunction { -// id: String::from("foo"), -// arguments: vec![ -// Parameter::private(Variable::field_element("a")), -// Parameter::private(Variable::field_array("b", 3)), -// ], -// statements: vec![TypedStatement::Return(vec![ -// FieldElementExpression::Select( -// box FieldElementArrayExpression::Identifier(3, String::from("b")), -// box FieldElementExpression::Identifier(String::from("a")), -// ) -// .into(), -// ])], -// signature: Signature::new() -// .inputs(vec![Type::FieldElement, Type::FieldElementArray(3)]) -// .outputs(vec![Type::FieldElement]), -// }; - -// let arguments = vec![ -// FieldElementExpression::Identifier(String::from("notconstant")).into(), -// FieldElementArrayExpression::Identifier(3, String::from("random")).into(), -// ]; - -// let i = Inliner::new(); - -// assert!(!i.should_inline(&Some(f), &arguments)); -// } -// } -// } diff --git a/zokrates_core/src/static_analysis/mod.rs b/zokrates_core/src/static_analysis/mod.rs index 9ce1151cd..bf741e13f 100644 --- a/zokrates_core/src/static_analysis/mod.rs +++ b/zokrates_core/src/static_analysis/mod.rs @@ -4,15 +4,11 @@ //! @author Thibaut Schaeffer //! @date 2018 -mod dead_code; mod flat_propagation; -mod inline; mod power_check; mod propagation; mod unroll; -use self::dead_code::DeadCode; -//use self::inline::Inliner; use self::power_check::PowerChecker; use self::propagation::Propagator; use self::unroll::Unroller; @@ -26,17 +22,12 @@ pub trait Analyse { impl Analyse for TypedProgram { fn analyse(self) -> Self { + println!("{}", self); let r = PowerChecker::check(self); // unroll let r = Unroller::unroll(r); - //propagate a first time for constants to reach function calls + //propagate let r = Propagator::propagate(r); - // apply inlining strategy - // let r = Inliner::inline(r); - // Propagate again - let r = Propagator::propagate(r); - // // remove unused functions - // let r = DeadCode::clean(r); r } } diff --git a/zokrates_core/src/typed_absy/mod.rs b/zokrates_core/src/typed_absy/mod.rs index 79559c3c0..5b716c40f 100644 --- a/zokrates_core/src/typed_absy/mod.rs +++ b/zokrates_core/src/typed_absy/mod.rs @@ -36,7 +36,25 @@ pub struct TypedProgram { pub main: TypedModule, } -#[derive(PartialEq, Debug, Clone)] +impl fmt::Display for TypedProgram { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + writeln!(f, "| main: |")?; + writeln!(f, "{}", "-".repeat(100))?; + writeln!(f, "{}", self.main)?; + writeln!(f, "{}", "-".repeat(100))?; + writeln!(f, "")?; + for (module_id, module) in &self.modules { + writeln!(f, "| {}: |", module_id)?; + writeln!(f, "{}", "-".repeat(100))?; + writeln!(f, "{}", module)?; + writeln!(f, "{}", "-".repeat(100))?; + writeln!(f, "")?; + } + write!(f, "") + } +} + +#[derive(PartialEq, Clone)] pub struct TypedModule { /// Functions of the program pub functions: TypedFunctionSymbols, @@ -63,24 +81,18 @@ impl TypedFunctionSymbol { .signature(&modules), } } - - pub fn slug(&self, modules: &TypedModules) -> String { - match self { - TypedFunctionSymbol::Here(f) => f.to_slug(), - TypedFunctionSymbol::There(key, module) => modules - .get(module) - .unwrap() - .functions - .get(key) - .unwrap() - .slug(&modules), - } - } } impl fmt::Display for TypedFunctionSymbol { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - unimplemented!() + match self { + TypedFunctionSymbol::Here(fun) => write!(f, "{}", fun), + TypedFunctionSymbol::There(key, module_id) => write!( + f, + "import {} from {} // with signature {}", + key.id, module_id, key.signature + ), + } } } @@ -109,34 +121,34 @@ impl fmt::Display for TypedModule { } } -// impl fmt::Debug for TypedModule { -// fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { -// write!( -// f, -// "program(\n\timports:\n\t\t{}\n\tfunctions:\n\t\t{}{}\n)", -// self.imports -// .iter() -// .map(|x| format!("{:?}", x)) -// .collect::>() -// .join("\n\t\t"), -// self.imported_functions -// .iter() -// .map(|x| format!("{}", x)) -// .collect::>() -// .join("\n\t\t"), -// self.functions -// .iter() -// .map(|x| format!("{:?}", x)) -// .collect::>() -// .join("\n\t\t") -// ) -// } -// } +impl fmt::Debug for TypedModule { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!( + f, + "program(\n\timports:\n\t\t{}\n\tfunctions:\n\t\t{}{}\n)", + self.imports + .iter() + .map(|x| format!("{:?}", x)) + .collect::>() + .join("\n\t\t"), + self.imported_functions + .iter() + .map(|x| format!("{}", x)) + .collect::>() + .join("\n\t\t"), + self.functions + .iter() + .map(|x| format!("{:?}", x)) + .collect::>() + .join("\n\t\t") + ) + } +} #[derive(Clone, PartialEq)] pub struct TypedFunction { /// Name of the program - pub id: String, + pub id: Identifier, /// Arguments of the function pub arguments: Vec, /// Vector of statements that are executed when running the function @@ -393,7 +405,7 @@ impl MultiTyped for TypedExpressionList { #[derive(Clone, PartialEq, Hash, Eq)] pub enum FieldElementExpression { Number(T), - Identifier(String), + Identifier(Identifier), Add( Box>, Box>, @@ -428,7 +440,7 @@ pub enum FieldElementExpression { #[derive(Clone, PartialEq, Hash, Eq)] pub enum BooleanExpression { - Identifier(String), + Identifier(Identifier), Value(bool), Lt( Box>, @@ -458,7 +470,7 @@ pub enum BooleanExpression { // for now we store the array size in the variants #[derive(Clone, PartialEq, Hash, Eq)] pub enum FieldElementArrayExpression { - Identifier(usize, String), + Identifier(usize, Identifier), Value(usize, Vec>), FunctionCall(usize, FunctionKey, Vec>), IfElse( @@ -648,9 +660,3 @@ impl fmt::Debug for TypedExpressionList { } } } - -impl TypedFunction { - pub fn to_slug(&self) -> String { - format!("{}_{}", self.id, self.signature.to_slug()) - } -} From 36f5797ec252df21c0e1b3f44b58ab167ce9716f Mon Sep 17 00:00:00 2001 From: schaeff Date: Mon, 20 May 2019 16:22:51 +0200 Subject: [PATCH 011/162] reset examples --- zokrates_cli/examples/imports/foo.code | 2 +- zokrates_cli/examples/imports/import.code | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/zokrates_cli/examples/imports/foo.code b/zokrates_cli/examples/imports/foo.code index 111178456..9b2256b41 100644 --- a/zokrates_cli/examples/imports/foo.code +++ b/zokrates_cli/examples/imports/foo.code @@ -1,4 +1,4 @@ -import "./baz.code" as baz +import "./baz.code" def main() -> (field): return baz() \ No newline at end of file diff --git a/zokrates_cli/examples/imports/import.code b/zokrates_cli/examples/imports/import.code index 9329a5ca3..6f708d242 100644 --- a/zokrates_cli/examples/imports/import.code +++ b/zokrates_cli/examples/imports/import.code @@ -1,4 +1,5 @@ -import "./foo.code" as foo +import "./foo.code" +import "./bar.code" def main() -> (field): - return foo() \ No newline at end of file + return foo() + bar() \ No newline at end of file From 48b0a0f4cf93a07533afa88333141d89227d8d06 Mon Sep 17 00:00:00 2001 From: schaeff Date: Mon, 20 May 2019 16:25:50 +0200 Subject: [PATCH 012/162] implement display for FunctionSymbol --- zokrates_core/src/absy/mod.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/zokrates_core/src/absy/mod.rs b/zokrates_core/src/absy/mod.rs index 3e8a1a2c6..b5e41269c 100644 --- a/zokrates_core/src/absy/mod.rs +++ b/zokrates_core/src/absy/mod.rs @@ -52,7 +52,11 @@ impl fmt::Display for FunctionSymbol { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { match self { FunctionSymbol::Here(fun_node) => write!(f, "{}", fun_node), - FunctionSymbol::There(_, _) => write!(f, "import TODO"), + FunctionSymbol::There(id, module_id) => write!( + f, + "import {} from {}", + id, module_id + ), } } } From 5fa5bd7b781b37b9137645b7da7b096c2d43d7a3 Mon Sep 17 00:00:00 2001 From: schaeff Date: Mon, 20 May 2019 18:17:57 +0200 Subject: [PATCH 013/162] introduce FunctionDeclaration to help with function symbol checking --- zokrates_core/src/absy/mod.rs | 43 ++- zokrates_core/src/absy/node.rs | 1 + zokrates_core/src/flat_absy/mod.rs | 91 +------ zokrates_core/src/flatten/mod.rs | 15 +- zokrates_core/src/imports.rs | 28 +- zokrates_core/src/ir/from_flat.rs | 10 +- zokrates_core/src/parser/parse/function.rs | 7 +- zokrates_core/src/parser/parse/module.rs | 17 +- zokrates_core/src/semantics.rs | 250 +++++++++++------- zokrates_core/src/standard.rs | 1 - .../src/static_analysis/flat_propagation.rs | 9 +- zokrates_core/src/typed_absy/mod.rs | 8 +- zokrates_core/src/types/conversions.rs | 10 +- 13 files changed, 232 insertions(+), 258 deletions(-) diff --git a/zokrates_core/src/absy/mod.rs b/zokrates_core/src/absy/mod.rs index b5e41269c..b7d404154 100644 --- a/zokrates_core/src/absy/mod.rs +++ b/zokrates_core/src/absy/mod.rs @@ -21,21 +21,44 @@ use zokrates_field::field::Field; use std::collections::HashMap; -type Identifier = String; +pub type Identifier = String; pub type ModuleId = String; pub type Modules = HashMap>; +pub type FunctionDeclarations = Vec>; + pub struct Program { pub modules: HashMap>, pub main: Module, } +#[derive(PartialEq, Debug, Clone)] +pub struct FunctionDeclaration { + pub id: Identifier, + pub symbol: FunctionSymbolNode, +} + +impl fmt::Display for FunctionDeclaration { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match self.symbol.value { + FunctionSymbol::Here(ref fun) => write!(f, "def {}{}", self.id, fun), + FunctionSymbol::There(ref function_id, ref module_id) => write!( + f, + "import {} from {} as {}", + function_id, module_id, self.id + ), + } + } +} + +type FunctionDeclarationNode = Node>; + #[derive(Clone, PartialEq)] pub struct Module { /// Functions of the module - pub functions: Vec<(Identifier, FunctionSymbolNode)>, + pub functions: FunctionDeclarations, pub imports: Vec, pub imported_functions: Vec>, } @@ -52,11 +75,7 @@ impl fmt::Display for FunctionSymbol { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { match self { FunctionSymbol::Here(fun_node) => write!(f, "{}", fun_node), - FunctionSymbol::There(id, module_id) => write!( - f, - "import {} from {}", - id, module_id - ), + FunctionSymbol::There(id, module_id) => write!(f, "import {} from {}", id, module_id), } } } @@ -79,7 +98,7 @@ impl fmt::Display for Module { res.extend( self.functions .iter() - .map(|x| format!("{}", x.1)) + .map(|x| format!("{}", x)) .collect::>(), ); write!(f, "{}", res.join("\n")) @@ -112,8 +131,6 @@ impl fmt::Debug for Module { #[derive(Clone, PartialEq)] pub struct Function { - /// Name of the function - pub id: Identifier, /// Arguments of the function pub arguments: Vec, /// Vector of statements that are executed when running the function @@ -128,8 +145,7 @@ impl fmt::Display for Function { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!( f, - "def {}({}):\n{}", - self.id, + "({}):\n{}", self.arguments .iter() .map(|x| format!("{}", x)) @@ -148,8 +164,7 @@ impl fmt::Debug for Function { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!( f, - "Function(id: {:?}, arguments: {:?}, ...):\n{}", - self.id, + "Function(arguments: {:?}, ...):\n{}", self.arguments, self.statements .iter() diff --git a/zokrates_core/src/absy/node.rs b/zokrates_core/src/absy/node.rs index d1bd4a481..3a2f7d1e0 100644 --- a/zokrates_core/src/absy/node.rs +++ b/zokrates_core/src/absy/node.rs @@ -53,6 +53,7 @@ impl NodeValue for Expression {} impl NodeValue for ExpressionList {} impl NodeValue for Assignee {} impl NodeValue for Statement {} +impl NodeValue for FunctionDeclaration {} impl NodeValue for Function {} impl NodeValue for Module {} impl NodeValue for FunctionSymbol {} diff --git a/zokrates_core/src/flat_absy/mod.rs b/zokrates_core/src/flat_absy/mod.rs index 80506ef6a..86fa0c866 100644 --- a/zokrates_core/src/flat_absy/mod.rs +++ b/zokrates_core/src/flat_absy/mod.rs @@ -11,7 +11,7 @@ pub mod flat_variable; pub use self::flat_parameter::FlatParameter; pub use self::flat_variable::FlatVariable; -use crate::helpers::{DirectiveStatement, Executable}; +use crate::helpers::DirectiveStatement; use crate::types::Signature; use std::collections::{BTreeMap, HashMap}; use std::fmt; @@ -20,50 +20,23 @@ use zokrates_field::field::Field; #[derive(Clone)] pub struct FlatProg { /// FlatFunctions of the program - pub functions: Vec>, -} - -impl FlatProg { - // only main flattened function is relevant here, as all other functions are unrolled into it - #[allow(dead_code)] // I don't want to remove this - pub fn get_witness(&self, inputs: Vec) -> Result, Error> { - let main = self.functions.iter().find(|x| x.id == "main").unwrap(); - main.get_witness(inputs) - } + pub main: FlatFunction, } impl fmt::Display for FlatProg { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!( - f, - "{}", - self.functions - .iter() - .map(|x| format!("{}", x)) - .collect::>() - .join("\n") - ) + write!(f, "{}", self.main) } } impl fmt::Debug for FlatProg { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!( - f, - "flat_program(functions: {}\t)", - self.functions - .iter() - .map(|x| format!("\t{:?}", x)) - .collect::>() - .join("\n") - ) + write!(f, "flat_program(main: {}\t)", self.main) } } #[derive(Clone, PartialEq)] pub struct FlatFunction { - /// Name of the program - pub id: String, /// Arguments of the function pub arguments: Vec, /// Vector of statements that are executed when running the function @@ -72,62 +45,11 @@ pub struct FlatFunction { pub signature: Signature, } -impl FlatFunction { - pub fn get_witness(&self, inputs: Vec) -> Result, Error> { - assert!(self.arguments.len() == inputs.len()); - assert!(self.id == "main"); - let mut witness = BTreeMap::new(); - witness.insert(FlatVariable::one(), T::one()); - for (i, arg) in self.arguments.iter().enumerate() { - witness.insert(arg.id, inputs[i].clone()); - } - for statement in &self.statements { - match *statement { - FlatStatement::Return(ref list) => { - for (i, val) in list.expressions.iter().enumerate() { - let s = val.solve(&mut witness); - witness.insert(FlatVariable::public(i), s); - } - } - FlatStatement::Definition(ref id, ref expr) => { - let s = expr.solve(&mut witness); - witness.insert(id.clone(), s); - } - FlatStatement::Condition(ref lhs, ref rhs) => { - if lhs.solve(&mut witness) != rhs.solve(&mut witness) { - return Err(Error { - message: format!( - "Condition not satisfied: {} should equal {}", - lhs, rhs - ), - }); - } - } - FlatStatement::Directive(ref d) => { - let input_values: Vec = - d.inputs.iter().map(|i| i.solve(&mut witness)).collect(); - match d.helper.execute(&input_values) { - Ok(res) => { - for (i, o) in d.outputs.iter().enumerate() { - witness.insert(o.clone(), res[i].clone()); - } - continue; - } - Err(message) => return Err(Error { message: message }), - }; - } - } - } - Ok(witness) - } -} - impl fmt::Display for FlatFunction { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!( f, - "def {}({}):\n{}", - self.id, + "def main({}):\n{}", self.arguments .iter() .map(|x| format!("{}", x)) @@ -146,8 +68,7 @@ impl fmt::Debug for FlatFunction { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!( f, - "FlatFunction(id: {:?}, arguments: {:?}, signature: {:?}):\n{}", - self.id, + "FlatFunction(arguments: {:?}, signature: {:?}):\n{}", self.arguments, self.signature, self.statements diff --git a/zokrates_core/src/flatten/mod.rs b/zokrates_core/src/flatten/mod.rs index 38aa92bee..ac2bd05d2 100644 --- a/zokrates_core/src/flatten/mod.rs +++ b/zokrates_core/src/flatten/mod.rs @@ -60,7 +60,6 @@ impl Flattener { // Load IfElse helper let ie = TypedFunction { - id: "_if_else_field".to_string(), arguments: vec![ Parameter { id: Variable { @@ -1401,7 +1400,6 @@ impl Flattener { } FlatFunction { - id: funct.id.clone(), arguments: arguments_flattened, statements: statements_flattened, signature: funct.signature, @@ -1438,7 +1436,7 @@ impl Flattener { let main_flattened = self.flatten_function_symbol(&symbols, &mut functions_flattened, main); FlatProg { - functions: vec![main_flattened], + main: main_flattened, } } @@ -1483,11 +1481,12 @@ impl Flattener { match symbols.get(&key) { Some(f) => self.flatten_function_symbol(symbols, functions_flattened, f.clone()), - None => functions_flattened - .iter() - .find(|f| f.id == id && f.signature == s) - .expect(&format!("couldn't find {}", id)) - .clone(), + None => unimplemented!("need to refactor storage of low level functions") + // functions_flattened + // .iter() + // .find(|f| f.id == id && f.signature == s) + // .expect(&format!("couldn't find {}", id)) + // .clone(), } } } diff --git a/zokrates_core/src/imports.rs b/zokrates_core/src/imports.rs index ed51891d2..e1bbd833b 100644 --- a/zokrates_core/src/imports.rs +++ b/zokrates_core/src/imports.rs @@ -21,15 +21,7 @@ pub struct CompiledImport { impl CompiledImport { fn new(prog: FlatProg, alias: String) -> CompiledImport { - match prog.functions.iter().find(|fun| fun.id == "main") { - Some(fun) => CompiledImport { - flat_func: FlatFunction { - id: alias, - ..fun.clone() - }, - }, - None => panic!("no main"), - } + unimplemented!("refactor imported flattened funcs") } } @@ -147,9 +139,7 @@ impl Importer { "BELLMAN/sha256round" => { use crate::standard::sha_round; - let compiled = FlatProg { - functions: vec![sha_round()], - }; + let compiled = FlatProg { main: sha_round() }; let alias = match import.alias { Some(ref alias) => alias.clone(), @@ -204,11 +194,17 @@ impl Importer { modules.insert(import.source.clone(), compiled); - functions.push(( - alias.clone(), - FunctionSymbol::There(String::from("main"), import.source.clone()) + functions.push( + FunctionDeclaration { + id: alias.clone(), + symbol: FunctionSymbol::There( + String::from("main"), + import.source.clone(), + ) .at(0, 0, 0), - )); + } + .at(0, 0, 0), + ); } Err(err) => { return Err(CompileErrorInner::ImportError( diff --git a/zokrates_core/src/ir/from_flat.rs b/zokrates_core/src/ir/from_flat.rs index 0153b477a..ff6b59855 100644 --- a/zokrates_core/src/ir/from_flat.rs +++ b/zokrates_core/src/ir/from_flat.rs @@ -16,7 +16,7 @@ impl From> for Function { .next() .unwrap(); Function { - id: flat_function.id, + id: String::from("main"), arguments: flat_function.arguments.into_iter().map(|p| p.id).collect(), returns: return_expressions .iter() @@ -63,12 +63,8 @@ impl QuadComb { impl From> for Prog { fn from(flat_prog: FlatProg) -> Prog { - // get the main function as all calls have been resolved - let main = flat_prog - .functions - .into_iter() - .find(|f| f.id == "main") - .unwrap(); + // get the main function + let main = flat_prog.main; // get the interface of the program, ie which inputs are private and public let private = main.arguments.iter().map(|p| p.private).collect(); diff --git a/zokrates_core/src/parser/parse/function.rs b/zokrates_core/src/parser/parse/function.rs index 86b33e457..f620a99cd 100644 --- a/zokrates_core/src/parser/parse/function.rs +++ b/zokrates_core/src/parser/parse/function.rs @@ -9,7 +9,8 @@ use crate::parser::Error; use super::statement::parse_statement; use crate::absy::{ - Function, FunctionNode, Node, Parameter, ParameterNode, Statement, Variable, VariableNode, + Function, FunctionNode, Identifier, Node, Parameter, ParameterNode, Statement, Variable, + VariableNode, }; use crate::types::{Signature, Type}; @@ -251,7 +252,7 @@ pub fn parse_function( mut lines: &mut Lines, input: &String, pos: &Position, -) -> Result<(FunctionNode, Position), Error> { +) -> Result<(Identifier, FunctionNode, Position), Error> { let mut current_line = pos.line; let (id, args, sig) = parse_function_header(input, pos)?; @@ -303,11 +304,11 @@ pub fn parse_function( }; Ok(( + id, Node::new( *pos, next_pos, Function { - id: id, arguments: args, statements: stats, signature: sig, diff --git a/zokrates_core/src/parser/parse/module.rs b/zokrates_core/src/parser/parse/module.rs index 5861afd18..f6e9505c5 100644 --- a/zokrates_core/src/parser/parse/module.rs +++ b/zokrates_core/src/parser/parse/module.rs @@ -8,7 +8,7 @@ use crate::parser::tokenize::{next_token, Position, Token}; use super::function::parse_function; use super::import::parse_import; -use crate::absy::{FunctionSymbol, Module, NodeValue}; +use crate::absy::{FunctionDeclaration, FunctionSymbol, Module, NodeValue}; pub fn parse_module(reader: &mut R) -> Result, Error> { let mut current_line = 1; @@ -35,11 +35,14 @@ pub fn parse_module(reader: &mut R) -> Result, E Err(err) => return Err(err), }, (Token::Def, ref s1, ref p1) => match parse_function(&mut lines, s1, p1) { - Ok((function, p2)) => { - functions.push(( - function.value.id.clone(), - FunctionSymbol::Here(function).at(0, 0, 0), - )); + Ok((identifier, function, p2)) => { + functions.push( + FunctionDeclaration { + id: identifier, + symbol: FunctionSymbol::Here(function).at(0, 0, 0), + } + .at(0, 0, 0), + ); current_line = p2.line; // this is the line of the return statement current_line += 1; } @@ -59,7 +62,7 @@ pub fn parse_module(reader: &mut R) -> Result, E } Ok(Module { - functions, + functions: functions, imports, imported_functions: vec![], }) diff --git a/zokrates_core/src/semantics.rs b/zokrates_core/src/semantics.rs index 7885a6231..421c18e58 100644 --- a/zokrates_core/src/semantics.rs +++ b/zokrates_core/src/semantics.rs @@ -152,34 +152,63 @@ impl Checker { typed_modules: &mut TypedModules, ) -> Result, Vec> { for func in &module.imported_functions { - self.functions.insert(FunctionKey { - id: func.id.clone(), - signature: func.signature.clone(), - }); + // self.functions.insert(FunctionKey { + // id: func.id.clone(), + // signature: func.signature.clone(), + // }); + unimplemented!("need to refactor imported functions") } let mut errors = vec![]; let mut checked_functions = HashMap::new(); - for (id, func) in module.functions { + for declaration in module.functions { self.enter_scope(); - match self.check_function_symbol(func, modules, typed_modules) { + let pos = declaration.pos(); + let declaration = declaration.value; + + match self.check_function_symbol(declaration.symbol, modules, typed_modules) { Ok(checked_function_symbols) => { - self.functions - .extend(checked_function_symbols.iter().map(|f| FunctionKey { - signature: f.signature(&typed_modules).clone(), - id: id.clone(), - })); - checked_functions.extend(checked_function_symbols.into_iter().map(|f| { - ( - FunctionKey { - signature: f.signature(&typed_modules).clone(), - id: id.clone(), - }, - f, - ) - })); + for funct in checked_function_symbols { + let query = FunctionQuery::new( + declaration.id.clone(), + &funct.signature(&typed_modules).inputs, + &funct + .signature(&typed_modules) + .outputs + .clone() + .into_iter() + .map(|o| Some(o)) + .collect(), + ); + + let candidates = self.find_candidates(&query); + + match candidates.len() { + 1 => { + errors.push(Error { + pos: Some(pos), + message: format!( + "Duplicate definition for function {} with signature {}", + declaration.id, + funct.signature(&typed_modules) + ), + }); + } + 0 => {} + _ => panic!("duplicate function declaration should have been caught"), + } + self.functions.insert( + FunctionKey::with_id(declaration.id.clone()) + .signature(funct.signature(&typed_modules).clone()), + ); + checked_functions.insert( + FunctionKey::with_id(declaration.id.clone()) + .signature(funct.signature(&typed_modules).clone()), + funct, + ); + } } Err(e) => { errors.extend(e); @@ -234,39 +263,10 @@ impl Checker { funct_node: FunctionNode, ) -> Result, Vec> { let mut errors = vec![]; - let pos = funct_node.pos(); let funct = funct_node.value; assert_eq!(funct.arguments.len(), funct.signature.inputs.len()); - let query = FunctionQuery::new( - funct.id.clone(), - &funct.signature.inputs, - &funct - .signature - .outputs - .clone() - .into_iter() - .map(|o| Some(o)) - .collect(), - ); - - let candidates = self.find_candidates(&query); - - match candidates.len() { - 1 => { - errors.push(Error { - pos: Some(pos), - message: format!( - "Duplicate definition for function {} with signature {}", - funct.id, funct.signature - ), - }); - } - 0 => {} - _ => panic!("duplicate function declaration should have been caught"), - } - for arg in funct.arguments.clone() { self.insert_scope(arg.value.id.value); } @@ -289,7 +289,6 @@ impl Checker { } Ok(TypedFunction { - id: funct.id.clone(), arguments: funct .arguments .iter() @@ -1078,11 +1077,10 @@ mod tests { // after semantic check, `bar` should import a checked function let foo: Module = Module { - functions: vec![( - String::from("main"), - FunctionSymbol::Here( + functions: vec![FunctionDeclaration { + id: String::from("main"), + symbol: FunctionSymbol::Here( Function { - id: String::from("main"), statements: vec![Statement::Return( ExpressionList { expressions: vec![ @@ -1098,16 +1096,19 @@ mod tests { .at(0, 0, 0), ) .at(0, 0, 0), - )], + } + .mock()], imported_functions: vec![], imports: vec![], }; let bar: Module = Module { - functions: vec![( - String::from("main"), - FunctionSymbol::There(String::from("main"), String::from("foo")).at(0, 0, 0), - )], + functions: vec![FunctionDeclaration { + id: String::from("main"), + symbol: FunctionSymbol::There(String::from("main"), String::from("foo")) + .at(0, 0, 0), + } + .mock()], imported_functions: vec![], imports: vec![], }; @@ -1217,7 +1218,6 @@ mod tests { .mock(), ]; let foo = Function { - id: "foo".to_string(), arguments: foo_args, statements: foo_statements, signature: Signature { @@ -1237,7 +1237,6 @@ mod tests { .mock()]; let bar = Function { - id: "bar".to_string(), arguments: bar_args, statements: bar_statements, signature: Signature { @@ -1248,8 +1247,16 @@ mod tests { .mock(); let funcs = vec![ - (String::from("foo"), FunctionSymbol::Here(foo).mock()), - (String::from("bar"), FunctionSymbol::Here(bar).mock()), + FunctionDeclaration { + id: String::from("foo"), + symbol: FunctionSymbol::Here(foo).mock(), + } + .mock(), + FunctionDeclaration { + id: String::from("bar"), + symbol: FunctionSymbol::Here(bar).mock(), + } + .mock(), ]; let module = Module { functions: funcs, @@ -1288,7 +1295,6 @@ mod tests { ]; let foo = Function { - id: "foo".to_string(), arguments: foo_args, statements: foo_statements, signature: Signature { @@ -1315,7 +1321,6 @@ mod tests { .mock(), ]; let bar = Function { - id: "bar".to_string(), arguments: bar_args, statements: bar_statements, signature: Signature { @@ -1335,7 +1340,6 @@ mod tests { .mock()]; let main = Function { - id: "main".to_string(), arguments: main_args, statements: main_statements, signature: Signature { @@ -1346,9 +1350,21 @@ mod tests { .mock(); let funcs = vec![ - (String::from("foo"), FunctionSymbol::Here(foo).mock()), - (String::from("bar"), FunctionSymbol::Here(bar).mock()), - (String::from("main"), FunctionSymbol::Here(main).mock()), + FunctionDeclaration { + id: String::from("foo"), + symbol: FunctionSymbol::Here(foo).mock(), + } + .mock(), + FunctionDeclaration { + id: String::from("bar"), + symbol: FunctionSymbol::Here(bar).mock(), + } + .mock(), + FunctionDeclaration { + id: String::from("main"), + symbol: FunctionSymbol::Here(main).mock(), + } + .mock(), ]; let module = Module { functions: funcs, @@ -1386,7 +1402,6 @@ mod tests { .mock(), ]; let foo = Function { - id: "foo".to_string(), arguments: vec![], statements: foo_statements, signature: Signature { @@ -1447,7 +1462,6 @@ mod tests { )]; let foo = Function { - id: "foo".to_string(), arguments: vec![], statements: foo_statements, signature: Signature { @@ -1458,7 +1472,6 @@ mod tests { .mock(); let foo_checked = TypedFunction { - id: "foo".to_string(), arguments: Vec::::new(), statements: foo_statements_checked, signature: Signature { @@ -1498,7 +1511,6 @@ mod tests { let functions = vec![foo].into_iter().collect(); let bar = Function { - id: "bar".to_string(), arguments: vec![], statements: bar_statements, signature: Signature { @@ -1544,7 +1556,6 @@ mod tests { let functions = vec![foo].into_iter().collect(); let bar = Function { - id: "bar".to_string(), arguments: vec![], statements: bar_statements, signature: Signature { @@ -1580,7 +1591,6 @@ mod tests { ]; let bar = Function { - id: "bar".to_string(), arguments: vec![], statements: bar_statements, signature: Signature { @@ -1624,7 +1634,6 @@ mod tests { .mock()]; let foo = Function { - id: "foo".to_string(), arguments: vec![crate::absy::Parameter { id: Variable::field_element("x").mock(), private: false, @@ -1663,7 +1672,6 @@ mod tests { ]; let main = Function { - id: "main".to_string(), arguments: vec![], statements: main_statements, signature: Signature { @@ -1675,8 +1683,16 @@ mod tests { let module = Module { functions: vec![ - (String::from("foo"), FunctionSymbol::Here(foo).mock()), - (String::from("main"), FunctionSymbol::Here(main).mock()), + FunctionDeclaration { + id: String::from("foo"), + symbol: FunctionSymbol::Here(foo).mock(), + } + .mock(), + FunctionDeclaration { + id: String::from("main"), + symbol: FunctionSymbol::Here(main).mock(), + } + .mock(), ], imports: vec![], imported_functions: vec![], @@ -1704,7 +1720,6 @@ mod tests { .mock()]; let bar = Function { - id: "bar".to_string(), arguments: vec![], statements: bar_statements, signature: Signature { @@ -1743,7 +1758,6 @@ mod tests { .mock()]; let bar = Function { - id: "bar".to_string(), arguments: vec![], statements: bar_statements, signature: Signature { @@ -1828,7 +1842,6 @@ mod tests { functions.insert(foo); let bar = Function { - id: "bar".to_string(), arguments: vec![], statements: bar_statements, signature: Signature { @@ -1839,7 +1852,6 @@ mod tests { .mock(); let bar_checked = TypedFunction { - id: "bar".to_string(), arguments: vec![], statements: bar_statements_checked, signature: Signature { @@ -1860,7 +1872,8 @@ mod tests { // return 2 // // should fail - let foo2_statements: Vec> = vec![Statement::Return( + + let foo1_statements: Vec> = vec![Statement::Return( ExpressionList { expressions: vec![Expression::Number(FieldPrime::from(1)).mock()], } @@ -1868,7 +1881,7 @@ mod tests { ) .mock()]; - let foo2_arguments = vec![ + let foo1_arguments = vec![ crate::absy::Parameter { id: Variable::field_element("a").mock(), private: true, @@ -1881,18 +1894,38 @@ mod tests { .mock(), ]; - let foo1 = FunctionKey { - id: "foo".to_string(), + let foo2_statements: Vec> = vec![Statement::Return( + ExpressionList { + expressions: vec![Expression::Number(FieldPrime::from(1)).mock()], + } + .mock(), + ) + .mock()]; + + let foo2_arguments = vec![ + crate::absy::Parameter { + id: Variable::field_element("c").mock(), + private: true, + } + .mock(), + crate::absy::Parameter { + id: Variable::field_element("d").mock(), + private: true, + } + .mock(), + ]; + + let foo1 = Function { + arguments: foo1_arguments, + statements: foo1_statements, signature: Signature { inputs: vec![Type::FieldElement, Type::FieldElement], outputs: vec![Type::FieldElement], }, - }; - - let functions = vec![foo1].into_iter().collect(); + } + .mock(); let foo2 = Function { - id: "foo".to_string(), arguments: foo2_arguments, statements: foo2_statements, signature: Signature { @@ -1902,9 +1935,26 @@ mod tests { } .mock(); - let mut checker = new_with_args(HashSet::new(), 0, functions); + let module = Module { + functions: vec![ + FunctionDeclaration { + id: String::from("foo"), + symbol: FunctionSymbol::Here(foo1).mock(), + } + .mock(), + FunctionDeclaration { + id: String::from("foo"), + symbol: FunctionSymbol::Here(foo2).mock(), + } + .mock(), + ], + imported_functions: vec![], + imports: vec![], + }; + + let mut checker = Checker::new(); assert_eq!( - checker.check_function(foo2), + checker.check_module(module, &mut HashMap::new(), &mut HashMap::new()), Err(vec![Error { pos: Some((Position::mock(), Position::mock())), @@ -1948,7 +1998,6 @@ mod tests { let main2_arguments = vec![]; let main1 = Function { - id: "main".to_string(), arguments: main1_arguments, statements: main1_statements, signature: Signature { @@ -1959,7 +2008,6 @@ mod tests { .mock(); let main2 = Function { - id: "main".to_string(), arguments: main2_arguments, statements: main2_statements, signature: Signature { @@ -1970,8 +2018,16 @@ mod tests { .mock(); let functions = vec![ - (String::from("main"), FunctionSymbol::Here(main1).mock()), - (String::from("main"), FunctionSymbol::Here(main2).mock()), + FunctionDeclaration { + id: String::from("main"), + symbol: FunctionSymbol::Here(main1).mock(), + } + .mock(), + FunctionDeclaration { + id: String::from("main"), + symbol: FunctionSymbol::Here(main2).mock(), + } + .mock(), ]; let main_module = Module { diff --git a/zokrates_core/src/standard.rs b/zokrates_core/src/standard.rs index 6a2960691..8743164a0 100644 --- a/zokrates_core/src/standard.rs +++ b/zokrates_core/src/standard.rs @@ -140,7 +140,6 @@ pub fn sha_round() -> FlatFunction { .collect(); FlatFunction { - id: "main".to_owned(), arguments, statements, signature, diff --git a/zokrates_core/src/static_analysis/flat_propagation.rs b/zokrates_core/src/static_analysis/flat_propagation.rs index c3b9caf11..1b26d5fac 100644 --- a/zokrates_core/src/static_analysis/flat_propagation.rs +++ b/zokrates_core/src/static_analysis/flat_propagation.rs @@ -103,14 +103,9 @@ impl Propagate for FlatFunction { impl FlatProg { pub fn propagate(self) -> FlatProg { - let mut functions = vec![]; + let main = self.main.propagate(); - for f in self.functions { - let fun = f.propagate(); - functions.push(fun); - } - - FlatProg { functions, ..self } + FlatProg { main } } } diff --git a/zokrates_core/src/typed_absy/mod.rs b/zokrates_core/src/typed_absy/mod.rs index 5b716c40f..e4f21ad42 100644 --- a/zokrates_core/src/typed_absy/mod.rs +++ b/zokrates_core/src/typed_absy/mod.rs @@ -147,8 +147,6 @@ impl fmt::Debug for TypedModule { #[derive(Clone, PartialEq)] pub struct TypedFunction { - /// Name of the program - pub id: Identifier, /// Arguments of the function pub arguments: Vec, /// Vector of statements that are executed when running the function @@ -161,8 +159,7 @@ impl fmt::Display for TypedFunction { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!( f, - "def {}({}) -> ({}):\n{}", - self.id, + "({}) -> ({}):\n{}", self.arguments .iter() .map(|x| format!("{}", x)) @@ -187,8 +184,7 @@ impl fmt::Debug for TypedFunction { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!( f, - "TypedFunction(id: {:?}, arguments: {:?}, ...):\n{}", - self.id, + "TypedFunction(arguments: {:?}, ...):\n{}", self.arguments, self.statements .iter() diff --git a/zokrates_core/src/types/conversions.rs b/zokrates_core/src/types/conversions.rs index 196aebd37..fa0b97f3d 100644 --- a/zokrates_core/src/types/conversions.rs +++ b/zokrates_core/src/types/conversions.rs @@ -101,12 +101,11 @@ pub fn split() -> FlatProg { })); FlatProg { - functions: vec![FlatFunction { - id: String::from("main"), + main: FlatFunction { arguments, statements, signature, - }], + }, } } @@ -157,7 +156,6 @@ pub fn cast(from: &Type, to: &Type) -> FlatFunction { .collect(); FlatFunction { - id: format!("_{}_to_{}", from, to), arguments, statements, signature, @@ -176,7 +174,6 @@ mod tests { #[test] fn bool_to_field() { let b2f: FlatFunction = cast(&Type::Boolean, &Type::FieldElement); - assert_eq!(b2f.id, String::from("_bool_to_field")); assert_eq!( b2f.arguments, vec![FlatParameter::private(FlatVariable::new(0))] @@ -203,9 +200,8 @@ mod tests { #[test] fn split254() { let unpack: FlatProg = split(); - let unpack = &unpack.functions[0]; + let unpack = &unpack.main; - assert_eq!(unpack.id, String::from("main")); assert_eq!( unpack.arguments, vec![FlatParameter::private(FlatVariable::new(0))] From 04b95e6b365b32b23af3d6d61f6654adaf04ef8b Mon Sep 17 00:00:00 2001 From: schaeff Date: Tue, 21 May 2019 11:55:21 +0200 Subject: [PATCH 014/162] define FunctionImport as ast node, remove FunctionSymbol node --- zokrates_core/src/absy/mod.rs | 39 +++++++++----- zokrates_core/src/absy/node.rs | 2 +- zokrates_core/src/flat_absy/mod.rs | 15 +----- zokrates_core/src/imports.rs | 10 ++-- zokrates_core/src/parser/parse/module.rs | 2 +- zokrates_core/src/semantics.rs | 67 +++++++++++++----------- 6 files changed, 70 insertions(+), 65 deletions(-) diff --git a/zokrates_core/src/absy/mod.rs b/zokrates_core/src/absy/mod.rs index b7d404154..3ea403f0f 100644 --- a/zokrates_core/src/absy/mod.rs +++ b/zokrates_core/src/absy/mod.rs @@ -37,18 +37,14 @@ pub struct Program { #[derive(PartialEq, Debug, Clone)] pub struct FunctionDeclaration { pub id: Identifier, - pub symbol: FunctionSymbolNode, + pub symbol: FunctionSymbol, } impl fmt::Display for FunctionDeclaration { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match self.symbol.value { + match self.symbol { FunctionSymbol::Here(ref fun) => write!(f, "def {}{}", self.id, fun), - FunctionSymbol::There(ref function_id, ref module_id) => write!( - f, - "import {} from {} as {}", - function_id, module_id, self.id - ), + FunctionSymbol::There(ref import) => write!(f, "import {} as {}", import, self.id), } } } @@ -66,17 +62,34 @@ pub struct Module { #[derive(Debug, Clone, PartialEq)] pub enum FunctionSymbol { Here(FunctionNode), - There(Identifier, ModuleId), + There(FunctionImportNode), +} + +#[derive(Debug, Clone, PartialEq)] +pub struct FunctionImport { + pub function_id: Identifier, + pub module_id: ModuleId, +} + +type FunctionImportNode = Node; + +impl FunctionImport { + pub fn with_id_in_module, U: Into>( + function_id: S, + module_id: U, + ) -> Self { + FunctionImport { + function_id: function_id.into(), + module_id: module_id.into(), + } + } } pub type FunctionSymbolNode = Node>; -impl fmt::Display for FunctionSymbol { +impl fmt::Display for FunctionImport { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match self { - FunctionSymbol::Here(fun_node) => write!(f, "{}", fun_node), - FunctionSymbol::There(id, module_id) => write!(f, "import {} from {}", id, module_id), - } + write!(f, "{} from {}", self.function_id, self.module_id) } } diff --git a/zokrates_core/src/absy/node.rs b/zokrates_core/src/absy/node.rs index 3a2f7d1e0..6c4db0ab0 100644 --- a/zokrates_core/src/absy/node.rs +++ b/zokrates_core/src/absy/node.rs @@ -56,7 +56,7 @@ impl NodeValue for Statement {} impl NodeValue for FunctionDeclaration {} impl NodeValue for Function {} impl NodeValue for Module {} -impl NodeValue for FunctionSymbol {} +impl NodeValue for FunctionImport {} impl NodeValue for Variable {} impl NodeValue for Parameter {} impl NodeValue for Import {} diff --git a/zokrates_core/src/flat_absy/mod.rs b/zokrates_core/src/flat_absy/mod.rs index 86fa0c866..bac310a0a 100644 --- a/zokrates_core/src/flat_absy/mod.rs +++ b/zokrates_core/src/flat_absy/mod.rs @@ -13,7 +13,7 @@ pub use self::flat_variable::FlatVariable; use crate::helpers::DirectiveStatement; use crate::types::Signature; -use std::collections::{BTreeMap, HashMap}; +use std::collections::HashMap; use std::fmt; use zokrates_field::field::Field; @@ -193,19 +193,6 @@ impl FlatExpression { } } - fn solve(&self, inputs: &mut BTreeMap) -> T { - match *self { - FlatExpression::Number(ref x) => x.clone(), - FlatExpression::Identifier(ref var) => match inputs.get(var) { - Some(v) => v.clone(), - None => panic!("Variable {:?} is undeclared in witness: {:?}", var, inputs), - }, - FlatExpression::Add(ref x, ref y) => x.solve(inputs) + y.solve(inputs), - FlatExpression::Sub(ref x, ref y) => x.solve(inputs) - y.solve(inputs), - FlatExpression::Mult(ref x, ref y) => x.solve(inputs) * y.solve(inputs), - } - } - pub fn is_linear(&self) -> bool { match *self { FlatExpression::Number(_) | FlatExpression::Identifier(_) => true, diff --git a/zokrates_core/src/imports.rs b/zokrates_core/src/imports.rs index e1bbd833b..174b2d88e 100644 --- a/zokrates_core/src/imports.rs +++ b/zokrates_core/src/imports.rs @@ -198,10 +198,12 @@ impl Importer { FunctionDeclaration { id: alias.clone(), symbol: FunctionSymbol::There( - String::from("main"), - import.source.clone(), - ) - .at(0, 0, 0), + FunctionImport::with_id_in_module( + "main", + import.source.clone(), + ) + .at(0, 0, 0), + ), } .at(0, 0, 0), ); diff --git a/zokrates_core/src/parser/parse/module.rs b/zokrates_core/src/parser/parse/module.rs index f6e9505c5..163031606 100644 --- a/zokrates_core/src/parser/parse/module.rs +++ b/zokrates_core/src/parser/parse/module.rs @@ -39,7 +39,7 @@ pub fn parse_module(reader: &mut R) -> Result, E functions.push( FunctionDeclaration { id: identifier, - symbol: FunctionSymbol::Here(function).at(0, 0, 0), + symbol: FunctionSymbol::Here(function), } .at(0, 0, 0), ); diff --git a/zokrates_core/src/semantics.rs b/zokrates_core/src/semantics.rs index 421c18e58..43af7610f 100644 --- a/zokrates_core/src/semantics.rs +++ b/zokrates_core/src/semantics.rs @@ -301,28 +301,28 @@ impl Checker { fn check_function_symbol( &mut self, - funct_symbol_node: FunctionSymbolNode, + funct_symbol: FunctionSymbol, modules: &mut Modules, typed_modules: &mut TypedModules, ) -> Result>, Vec> { - let pos = funct_symbol_node.pos(); - let funct_symbol = funct_symbol_node.value; - let mut errors = vec![]; match funct_symbol { FunctionSymbol::Here(funct_node) => self .check_function(funct_node) .map(|f| vec![TypedFunctionSymbol::Here(f)]), - FunctionSymbol::There(id, module_id) => { + FunctionSymbol::There(import_node) => { + let pos = import_node.pos(); + let import = import_node.value; + // check if the module was already checked - let to_insert = match typed_modules.get(&module_id).clone() { + let to_insert = match typed_modules.get(&import.module_id).clone() { // if it was, do nothing Some(_) => None, // if it was not, check it None => { match Checker::new().check_module( - modules.remove(&module_id.clone()).unwrap(), + modules.remove(&import.module_id.clone()).unwrap(), modules, typed_modules, ) { @@ -343,20 +343,20 @@ impl Checker { // insert into typed_modules if we checked anything match to_insert { Some(typed_module) => { - typed_modules.insert(module_id.clone(), typed_module); + typed_modules.insert(import.module_id.clone(), typed_module); } None => {} }; // find candidates in the checked module let candidates: Vec<_> = typed_modules - .get(&module_id) + .get(&import.module_id) .unwrap() .functions .iter() - .filter(|(k, _)| k.id == id) + .filter(|(k, _)| k.id == import.function_id) .map(|(_, v)| FunctionKey { - id: id.clone(), + id: import.function_id.clone(), signature: v.signature(&typed_modules).clone(), }) .collect(); @@ -364,11 +364,14 @@ impl Checker { match candidates.len() { 0 => Err(vec![Error { pos: Some(pos), - message: format!("Function {} not found in module {}", id, "TODO"), + message: format!( + "Function {} not found in module {}", + import.function_id, import.module_id + ), }]), _ => Ok(candidates .into_iter() - .map(|f| TypedFunctionSymbol::There(f, module_id.clone())) + .map(|f| TypedFunctionSymbol::There(f, import.module_id.clone())) .collect()), } } @@ -1084,18 +1087,17 @@ mod tests { statements: vec![Statement::Return( ExpressionList { expressions: vec![ - Expression::Number(FieldPrime::from(1)).at(0, 0, 0) + Expression::Number(FieldPrime::from(1)).mock() ], } - .at(0, 0, 0), + .mock(), ) - .at(0, 0, 0)], + .mock()], signature: Signature::new().outputs(vec![Type::FieldElement]), arguments: vec![], } - .at(0, 0, 0), - ) - .at(0, 0, 0), + .mock(), + ), } .mock()], imported_functions: vec![], @@ -1105,8 +1107,9 @@ mod tests { let bar: Module = Module { functions: vec![FunctionDeclaration { id: String::from("main"), - symbol: FunctionSymbol::There(String::from("main"), String::from("foo")) - .at(0, 0, 0), + symbol: FunctionSymbol::There( + FunctionImport::with_id_in_module("main", "foo").mock(), + ), } .mock()], imported_functions: vec![], @@ -1249,12 +1252,12 @@ mod tests { let funcs = vec![ FunctionDeclaration { id: String::from("foo"), - symbol: FunctionSymbol::Here(foo).mock(), + symbol: FunctionSymbol::Here(foo), } .mock(), FunctionDeclaration { id: String::from("bar"), - symbol: FunctionSymbol::Here(bar).mock(), + symbol: FunctionSymbol::Here(bar), } .mock(), ]; @@ -1352,17 +1355,17 @@ mod tests { let funcs = vec![ FunctionDeclaration { id: String::from("foo"), - symbol: FunctionSymbol::Here(foo).mock(), + symbol: FunctionSymbol::Here(foo), } .mock(), FunctionDeclaration { id: String::from("bar"), - symbol: FunctionSymbol::Here(bar).mock(), + symbol: FunctionSymbol::Here(bar), } .mock(), FunctionDeclaration { id: String::from("main"), - symbol: FunctionSymbol::Here(main).mock(), + symbol: FunctionSymbol::Here(main), } .mock(), ]; @@ -1685,12 +1688,12 @@ mod tests { functions: vec![ FunctionDeclaration { id: String::from("foo"), - symbol: FunctionSymbol::Here(foo).mock(), + symbol: FunctionSymbol::Here(foo), } .mock(), FunctionDeclaration { id: String::from("main"), - symbol: FunctionSymbol::Here(main).mock(), + symbol: FunctionSymbol::Here(main), } .mock(), ], @@ -1939,12 +1942,12 @@ mod tests { functions: vec![ FunctionDeclaration { id: String::from("foo"), - symbol: FunctionSymbol::Here(foo1).mock(), + symbol: FunctionSymbol::Here(foo1), } .mock(), FunctionDeclaration { id: String::from("foo"), - symbol: FunctionSymbol::Here(foo2).mock(), + symbol: FunctionSymbol::Here(foo2), } .mock(), ], @@ -2020,12 +2023,12 @@ mod tests { let functions = vec![ FunctionDeclaration { id: String::from("main"), - symbol: FunctionSymbol::Here(main1).mock(), + symbol: FunctionSymbol::Here(main1), } .mock(), FunctionDeclaration { id: String::from("main"), - symbol: FunctionSymbol::Here(main2).mock(), + symbol: FunctionSymbol::Here(main2), } .mock(), ]; From a7995b26dc3cf9e47eedd036824e06f19fc87af0 Mon Sep 17 00:00:00 2001 From: schaeff Date: Tue, 21 May 2019 12:26:21 +0200 Subject: [PATCH 015/162] use FunctionKey for flattening --- zokrates_core/src/flatten/mod.rs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/zokrates_core/src/flatten/mod.rs b/zokrates_core/src/flatten/mod.rs index ac2bd05d2..d34112014 100644 --- a/zokrates_core/src/flatten/mod.rs +++ b/zokrates_core/src/flatten/mod.rs @@ -458,8 +458,10 @@ impl Flattener { .inputs(param_expressions.iter().map(|e| e.get_type()).collect()) .outputs(return_types); + let key = FunctionKey::with_id(id.to_string()).signature(passed_signature); + let funct = self - .get_function(passed_signature, &symbols, &functions_flattened, id) + .get_function(&key, &symbols, &functions_flattened) .clone(); let mut replacement_map = HashMap::new(); @@ -1420,7 +1422,7 @@ impl Flattener { let symbols = main_module.functions.clone(); - self.load_corelib(&symbols, &mut functions_flattened); + //self.load_corelib(&symbols, &mut functions_flattened); for func in main_module.imported_functions { functions_flattened.push(func); @@ -1472,13 +1474,10 @@ impl Flattener { fn get_function<'a>( &mut self, - s: Signature, + key: &FunctionKey, symbols: &'a HashMap>, functions_flattened: &'a Vec>, - id: &str, ) -> FlatFunction { - let key = FunctionKey::with_id(id).signature(s.clone()); - match symbols.get(&key) { Some(f) => self.flatten_function_symbol(symbols, functions_flattened, f.clone()), None => unimplemented!("need to refactor storage of low level functions") From 50befe78043bea13e2c79e40ca6b2cc07d814b20 Mon Sep 17 00:00:00 2001 From: schaeff Date: Tue, 21 May 2019 12:45:08 +0200 Subject: [PATCH 016/162] remove diplay from typedfunctionsymbol, implement on module directly --- zokrates_core/src/absy/mod.rs | 2 -- zokrates_core/src/typed_absy/mod.rs | 25 ++++++++++--------------- 2 files changed, 10 insertions(+), 17 deletions(-) diff --git a/zokrates_core/src/absy/mod.rs b/zokrates_core/src/absy/mod.rs index 3ea403f0f..84f58b150 100644 --- a/zokrates_core/src/absy/mod.rs +++ b/zokrates_core/src/absy/mod.rs @@ -85,8 +85,6 @@ impl FunctionImport { } } -pub type FunctionSymbolNode = Node>; - impl fmt::Display for FunctionImport { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!(f, "{} from {}", self.function_id, self.module_id) diff --git a/zokrates_core/src/typed_absy/mod.rs b/zokrates_core/src/typed_absy/mod.rs index e4f21ad42..8581bddda 100644 --- a/zokrates_core/src/typed_absy/mod.rs +++ b/zokrates_core/src/typed_absy/mod.rs @@ -83,19 +83,6 @@ impl TypedFunctionSymbol { } } -impl fmt::Display for TypedFunctionSymbol { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match self { - TypedFunctionSymbol::Here(fun) => write!(f, "{}", fun), - TypedFunctionSymbol::There(key, module_id) => write!( - f, - "import {} from {} // with signature {}", - key.id, module_id, key.signature - ), - } - } -} - impl fmt::Display for TypedModule { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { let mut res = vec![]; @@ -113,8 +100,16 @@ impl fmt::Display for TypedModule { ); res.extend( self.functions - .values() - .map(|x| format!("{}", x)) + .iter() + .map(|(key, symbol)| match symbol { + TypedFunctionSymbol::Here(ref function) => { + format!("def {}{}", key.id, function) + } + TypedFunctionSymbol::There(ref fun_key, ref module_id) => format!( + "import {} from \"{}\" as {} // with signature {}", + fun_key.id, module_id, key.id, key.signature + ), + }) .collect::>(), ); write!(f, "{}", res.join("\n")) From 68dcaa1b15154905604c0d38f8cc8cee45e09b4a Mon Sep 17 00:00:00 2001 From: schaeff Date: Tue, 21 May 2019 15:30:44 +0200 Subject: [PATCH 017/162] remove imported functions, remove functions_flattened from flattening, move corelib to static analyser step, clean --- zokrates_core/src/absy/mod.rs | 18 +- zokrates_core/src/flatten/mod.rs | 370 +++--------------- zokrates_core/src/imports.rs | 23 +- zokrates_core/src/parser/parse/module.rs | 1 - zokrates_core/src/semantics.rs | 18 +- .../src/static_analysis/core_lib_injector.rs | 158 ++++++++ zokrates_core/src/static_analysis/mod.rs | 6 +- zokrates_core/src/typed_absy/mod.rs | 23 +- zokrates_core/src/types/conversions.rs | 15 +- 9 files changed, 257 insertions(+), 375 deletions(-) create mode 100644 zokrates_core/src/static_analysis/core_lib_injector.rs diff --git a/zokrates_core/src/absy/mod.rs b/zokrates_core/src/absy/mod.rs index 84f58b150..f4d15b2f9 100644 --- a/zokrates_core/src/absy/mod.rs +++ b/zokrates_core/src/absy/mod.rs @@ -45,6 +45,9 @@ impl fmt::Display for FunctionDeclaration { match self.symbol { FunctionSymbol::Here(ref fun) => write!(f, "def {}{}", self.id, fun), FunctionSymbol::There(ref import) => write!(f, "import {} as {}", import, self.id), + FunctionSymbol::Flat(ref flat_fun) => { + write!(f, "def {}{}:\n\t// hidden", self.id, flat_fun.signature) + } } } } @@ -56,13 +59,13 @@ pub struct Module { /// Functions of the module pub functions: FunctionDeclarations, pub imports: Vec, - pub imported_functions: Vec>, } #[derive(Debug, Clone, PartialEq)] pub enum FunctionSymbol { Here(FunctionNode), There(FunctionImportNode), + Flat(FlatFunction), } #[derive(Debug, Clone, PartialEq)] @@ -100,12 +103,6 @@ impl fmt::Display for Module { .map(|x| format!("{}", x)) .collect::>(), ); - res.extend( - self.imported_functions - .iter() - .map(|x| format!("{}", x)) - .collect::>(), - ); res.extend( self.functions .iter() @@ -120,17 +117,12 @@ impl fmt::Debug for Module { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!( f, - "module(\n\timports:\n\t\t{}\n\tfunctions:\n\t\t{}{}\n)", + "module(\n\timports:\n\t\t{}\n\tfunctions:\n\t\t{}\n)", self.imports .iter() .map(|x| format!("{:?}", x)) .collect::>() .join("\n\t\t"), - self.imported_functions - .iter() - .map(|x| format!("{}", x)) - .collect::>() - .join("\n\t\t"), self.functions .iter() .map(|x| format!("{:?}", x)) diff --git a/zokrates_core/src/flatten/mod.rs b/zokrates_core/src/flatten/mod.rs index d34112014..1bd81c854 100644 --- a/zokrates_core/src/flatten/mod.rs +++ b/zokrates_core/src/flatten/mod.rs @@ -8,7 +8,6 @@ use crate::flat_absy::*; use crate::helpers::{DirectiveStatement, Helper, RustHelper}; use crate::typed_absy::*; -use crate::types::conversions::cast; use crate::types::Type; use crate::types::{FunctionKey, Signature}; use bimap::BiMap; @@ -49,79 +48,6 @@ impl Flattener { Flattener { modules, ..f } } - /// Loads the code library - fn load_corelib( - &mut self, - symbols: &HashMap>, - functions_flattened: &mut Vec>, - ) -> () { - // Load type casting functions - functions_flattened.push(cast(&Type::Boolean, &Type::FieldElement)); - - // Load IfElse helper - let ie = TypedFunction { - arguments: vec![ - Parameter { - id: Variable { - id: "condition".to_string(), - _type: Type::Boolean, - }, - private: true, - }, - Parameter { - id: Variable { - id: "consequence".to_string(), - _type: Type::FieldElement, - }, - private: true, - }, - Parameter { - id: Variable { - id: "alternative".to_string(), - _type: Type::FieldElement, - }, - private: true, - }, - ], - statements: vec![ - TypedStatement::Definition( - TypedAssignee::Identifier(Variable::field_element("condition_as_field")), - FieldElementExpression::FunctionCall( - FunctionKey::with_id("_bool_to_field").signature( - Signature::new() - .inputs(vec![Type::Boolean]) - .outputs(vec![Type::FieldElement]), - ), - vec![BooleanExpression::Identifier("condition".to_string()).into()], - ) - .into(), - ), - TypedStatement::Return(vec![FieldElementExpression::Add( - box FieldElementExpression::Mult( - box FieldElementExpression::Identifier("condition_as_field".to_string()), - box FieldElementExpression::Identifier("consequence".to_string()), - ), - box FieldElementExpression::Mult( - box FieldElementExpression::Sub( - box FieldElementExpression::Number(T::one()), - box FieldElementExpression::Identifier( - "condition_as_field".to_string(), - ), - ), - box FieldElementExpression::Identifier("alternative".to_string()), - ), - ) - .into()]), - ], - signature: Signature::new() - .inputs(vec![Type::Boolean, Type::FieldElement, Type::FieldElement]) - .outputs(vec![Type::FieldElement]), - }; - - let ief = self.flatten_function(symbols, functions_flattened, ie); - functions_flattened.push(ief); - } - /// Flattens a boolean expression /// /// # Arguments @@ -136,8 +62,6 @@ impl Flattener { fn flatten_boolean_expression( &mut self, symbols: &HashMap>, - - functions_flattened: &Vec>, statements_flattened: &mut Vec>, expression: BooleanExpression, ) -> FlatExpression { @@ -153,18 +77,10 @@ impl Flattener { // We know from semantic checking that lhs and rhs have the same type // What the expression will flatten to depends on that type - let lhs_flattened = self.flatten_field_expression( - symbols, - functions_flattened, - statements_flattened, - lhs, - ); - let rhs_flattened = self.flatten_field_expression( - symbols, - functions_flattened, - statements_flattened, - rhs, - ); + let lhs_flattened = + self.flatten_field_expression(symbols, statements_flattened, lhs); + let rhs_flattened = + self.flatten_field_expression(symbols, statements_flattened, rhs); // lhs let lhs_id = self.use_sym(); @@ -328,7 +244,6 @@ impl Flattener { let x = self.flatten_field_expression( symbols, - functions_flattened, statements_flattened, FieldElementExpression::Sub(box lhs, box rhs), ); @@ -358,13 +273,11 @@ impl Flattener { BooleanExpression::Le(box lhs, box rhs) => { let lt = self.flatten_boolean_expression( symbols, - functions_flattened, statements_flattened, BooleanExpression::Lt(box lhs.clone(), box rhs.clone()), ); let eq = self.flatten_boolean_expression( symbols, - functions_flattened, statements_flattened, BooleanExpression::Eq(box lhs.clone(), box rhs.clone()), ); @@ -372,29 +285,17 @@ impl Flattener { } BooleanExpression::Gt(lhs, rhs) => self.flatten_boolean_expression( symbols, - functions_flattened, statements_flattened, BooleanExpression::Lt(rhs, lhs), ), BooleanExpression::Ge(lhs, rhs) => self.flatten_boolean_expression( symbols, - functions_flattened, statements_flattened, BooleanExpression::Le(rhs, lhs), ), BooleanExpression::Or(box lhs, box rhs) => { - let x = box self.flatten_boolean_expression( - symbols, - functions_flattened, - statements_flattened, - lhs, - ); - let y = box self.flatten_boolean_expression( - symbols, - functions_flattened, - statements_flattened, - rhs, - ); + let x = box self.flatten_boolean_expression(symbols, statements_flattened, lhs); + let y = box self.flatten_boolean_expression(symbols, statements_flattened, rhs); assert!(x.is_linear() && y.is_linear()); let name_x_and_y = self.use_sym(); statements_flattened.push(FlatStatement::Definition( @@ -407,18 +308,8 @@ impl Flattener { ) } BooleanExpression::And(box lhs, box rhs) => { - let x = self.flatten_boolean_expression( - symbols, - functions_flattened, - statements_flattened, - lhs, - ); - let y = self.flatten_boolean_expression( - symbols, - functions_flattened, - statements_flattened, - rhs, - ); + let x = self.flatten_boolean_expression(symbols, statements_flattened, lhs); + let y = self.flatten_boolean_expression(symbols, statements_flattened, rhs); let name_x_and_y = self.use_sym(); assert!(x.is_linear() && y.is_linear()); @@ -430,12 +321,7 @@ impl Flattener { FlatExpression::Identifier(name_x_and_y) } BooleanExpression::Not(box exp) => { - let x = self.flatten_boolean_expression( - symbols, - functions_flattened, - statements_flattened, - exp, - ); + let x = self.flatten_boolean_expression(symbols, statements_flattened, exp); FlatExpression::Sub(box FlatExpression::Number(T::one()), box x) } BooleanExpression::Value(b) => FlatExpression::Number(match b { @@ -448,7 +334,6 @@ impl Flattener { fn flatten_function_call( &mut self, symbols: &TypedFunctionSymbols, - functions_flattened: &Vec>, statements_flattened: &mut Vec>, id: &String, return_types: Vec, @@ -460,9 +345,7 @@ impl Flattener { let key = FunctionKey::with_id(id.to_string()).signature(passed_signature); - let funct = self - .get_function(&key, &symbols, &functions_flattened) - .clone(); + let funct = self.get_function(&key, &symbols).clone(); let mut replacement_map = HashMap::new(); @@ -471,12 +354,7 @@ impl Flattener { let params_flattened = param_expressions .into_iter() .map(|param_expr| { - self.flatten_expression( - symbols, - functions_flattened, - statements_flattened, - param_expr.clone(), - ) + self.flatten_expression(symbols, statements_flattened, param_expr.clone()) }) .into_iter() .flat_map(|x| x) @@ -556,37 +434,25 @@ impl Flattener { fn flatten_expression( &mut self, symbols: &HashMap>, - - functions_flattened: &Vec>, statements_flattened: &mut Vec>, expr: TypedExpression, ) -> Vec> { match expr { - TypedExpression::FieldElement(e) => vec![self.flatten_field_expression( - symbols, - functions_flattened, - statements_flattened, - e, - )], - TypedExpression::Boolean(e) => vec![self.flatten_boolean_expression( - symbols, - functions_flattened, - statements_flattened, - e, - )], - TypedExpression::FieldElementArray(e) => self.flatten_field_array_expression( - symbols, - functions_flattened, - statements_flattened, - e, - ), + TypedExpression::FieldElement(e) => { + vec![self.flatten_field_expression(symbols, statements_flattened, e)] + } + TypedExpression::Boolean(e) => { + vec![self.flatten_boolean_expression(symbols, statements_flattened, e)] + } + TypedExpression::FieldElementArray(e) => { + self.flatten_field_array_expression(symbols, statements_flattened, e) + } } } fn flatten_field_expression( &mut self, symbols: &HashMap>, - functions_flattened: &Vec>, statements_flattened: &mut Vec>, expr: FieldElementExpression, ) -> FlatExpression { @@ -596,18 +462,10 @@ impl Flattener { FlatExpression::Identifier(self.bijection.get_by_left(&x).unwrap().clone()) } FieldElementExpression::Add(box left, box right) => { - let left_flattened = self.flatten_field_expression( - symbols, - functions_flattened, - statements_flattened, - left, - ); - let right_flattened = self.flatten_field_expression( - symbols, - functions_flattened, - statements_flattened, - right, - ); + let left_flattened = + self.flatten_field_expression(symbols, statements_flattened, left); + let right_flattened = + self.flatten_field_expression(symbols, statements_flattened, right); let new_left = if left_flattened.is_linear() { left_flattened } else { @@ -625,18 +483,10 @@ impl Flattener { FlatExpression::Add(box new_left, box new_right) } FieldElementExpression::Sub(box left, box right) => { - let left_flattened = self.flatten_field_expression( - symbols, - functions_flattened, - statements_flattened, - left, - ); - let right_flattened = self.flatten_field_expression( - symbols, - functions_flattened, - statements_flattened, - right, - ); + let left_flattened = + self.flatten_field_expression(symbols, statements_flattened, left); + let right_flattened = + self.flatten_field_expression(symbols, statements_flattened, right); let new_left = if left_flattened.is_linear() { left_flattened @@ -656,18 +506,10 @@ impl Flattener { FlatExpression::Sub(box new_left, box new_right) } FieldElementExpression::Mult(box left, box right) => { - let left_flattened = self.flatten_field_expression( - symbols, - functions_flattened, - statements_flattened, - left, - ); - let right_flattened = self.flatten_field_expression( - symbols, - functions_flattened, - statements_flattened, - right, - ); + let left_flattened = + self.flatten_field_expression(symbols, statements_flattened, left); + let right_flattened = + self.flatten_field_expression(symbols, statements_flattened, right); let new_left = if left_flattened.is_linear() { left_flattened } else { @@ -685,18 +527,10 @@ impl Flattener { FlatExpression::Mult(box new_left, box new_right) } FieldElementExpression::Div(box left, box right) => { - let left_flattened = self.flatten_field_expression( - symbols, - functions_flattened, - statements_flattened, - left, - ); - let right_flattened = self.flatten_field_expression( - symbols, - functions_flattened, - statements_flattened, - right, - ); + let left_flattened = + self.flatten_field_expression(symbols, statements_flattened, left); + let right_flattened = + self.flatten_field_expression(symbols, statements_flattened, right); let new_left: FlatExpression = { let id = self.use_sym(); statements_flattened.push(FlatStatement::Definition(id, left_flattened)); @@ -745,7 +579,6 @@ impl Flattener { // flatten the base expression let base_flattened = self.flatten_field_expression( symbols, - functions_flattened, statements_flattened, base.clone(), ); @@ -769,7 +602,6 @@ impl Flattener { // flatten(base ** (n-1)) let tmp_expression = self.flatten_field_expression( symbols, - functions_flattened, statements_flattened, FieldElementExpression::Pow( box base, @@ -795,7 +627,6 @@ impl Flattener { FieldElementExpression::IfElse(box condition, box consequent, box alternative) => self .flatten_function_call( symbols, - functions_flattened, statements_flattened, &"_if_else_field".to_string(), vec![Type::FieldElement], @@ -806,7 +637,6 @@ impl Flattener { FieldElementExpression::FunctionCall(ref id, ref param_expressions) => { let exprs_flattened = self.flatten_function_call( symbols, - functions_flattened, statements_flattened, &id.id, vec![Type::FieldElement], @@ -829,7 +659,6 @@ impl Flattener { assert!(n < T::from(size)); self.flatten_field_expression( symbols, - functions_flattened, statements_flattened, expressions[n.to_dec_string().parse::().unwrap()].clone(), ) @@ -845,7 +674,6 @@ impl Flattener { // [if cond then [a, b] else [c, d]][1] == if cond then [a, b][1] else [c, d][1] self.flatten_field_expression( symbols, - functions_flattened, statements_flattened, FieldElementExpression::IfElse( condition, @@ -888,7 +716,6 @@ impl Flattener { self.flatten_statement( symbols, - functions_flattened, statements_flattened, range_check_statement, ); @@ -940,12 +767,7 @@ impl Flattener { FieldElementExpression::Add(box acc, box e) }); - self.flatten_field_expression( - symbols, - functions_flattened, - statements_flattened, - lookup, - ) + self.flatten_field_expression(symbols, statements_flattened, lookup) } } } @@ -956,7 +778,6 @@ impl Flattener { &mut self, symbols: &HashMap>, - functions_flattened: &Vec>, statements_flattened: &mut Vec>, expr: FieldElementArrayExpression, ) -> Vec> { @@ -973,20 +794,12 @@ impl Flattener { assert_eq!(size, values.len()); values .into_iter() - .map(|v| { - self.flatten_field_expression( - symbols, - functions_flattened, - statements_flattened, - v, - ) - }) + .map(|v| self.flatten_field_expression(symbols, statements_flattened, v)) .collect() } FieldElementArrayExpression::FunctionCall(size, ref key, ref param_expressions) => { let exprs_flattened = self.flatten_function_call( symbols, - functions_flattened, statements_flattened, &key.id, vec![Type::FieldElementArray(size)], @@ -1008,7 +821,6 @@ impl Flattener { .map(|i| { self.flatten_field_expression( symbols, - functions_flattened, statements_flattened, FieldElementExpression::IfElse( condition.clone(), @@ -1031,7 +843,6 @@ impl Flattener { fn flatten_statement( &mut self, symbols: &HashMap>, - functions_flattened: &Vec>, statements_flattened: &mut Vec>, stat: TypedStatement, ) { @@ -1039,14 +850,7 @@ impl Flattener { TypedStatement::Return(exprs) => { let flat_expressions = exprs .into_iter() - .map(|expr| { - self.flatten_expression( - symbols, - functions_flattened, - statements_flattened, - expr, - ) - }) + .map(|expr| self.flatten_expression(symbols, statements_flattened, expr)) .flat_map(|x| x) .collect::>(); @@ -1062,12 +866,7 @@ impl Flattener { // define n variables with n the number of primitive types for v_type // assign them to the n primitive types for expr - let rhs = self.flatten_expression( - symbols, - functions_flattened, - statements_flattened, - expr.clone(), - ); + let rhs = self.flatten_expression(symbols, statements_flattened, expr.clone()); match expr.get_type() { Type::FieldElement | Type::Boolean => { @@ -1131,7 +930,6 @@ impl Flattener { self.flatten_statement( symbols, - functions_flattened, statements_flattened, range_check_statement, ); @@ -1150,7 +948,6 @@ impl Flattener { let rhs_flattened = self.flatten_field_expression( symbols, - functions_flattened, statements_flattened, rhs, ); @@ -1187,18 +984,8 @@ impl Flattener { match (expr1, expr2) { (TypedExpression::FieldElement(e1), TypedExpression::FieldElement(e2)) => { let (lhs, rhs) = ( - self.flatten_field_expression( - symbols, - functions_flattened, - statements_flattened, - e1, - ), - self.flatten_field_expression( - symbols, - functions_flattened, - statements_flattened, - e2, - ), + self.flatten_field_expression(symbols, statements_flattened, e1), + self.flatten_field_expression(symbols, statements_flattened, e2), ); if lhs.is_linear() { @@ -1212,18 +999,8 @@ impl Flattener { } (TypedExpression::Boolean(e1), TypedExpression::Boolean(e2)) => { let (lhs, rhs) = ( - self.flatten_boolean_expression( - symbols, - functions_flattened, - statements_flattened, - e1, - ), - self.flatten_boolean_expression( - symbols, - functions_flattened, - statements_flattened, - e2, - ), + self.flatten_boolean_expression(symbols, statements_flattened, e1), + self.flatten_boolean_expression(symbols, statements_flattened, e2), ); if lhs.is_linear() { @@ -1240,18 +1017,8 @@ impl Flattener { TypedExpression::FieldElementArray(e2), ) => { let (lhs, rhs) = ( - self.flatten_field_array_expression( - symbols, - functions_flattened, - statements_flattened, - e1, - ), - self.flatten_field_array_expression( - symbols, - functions_flattened, - statements_flattened, - e2, - ), + self.flatten_field_array_expression(symbols, statements_flattened, e1), + self.flatten_field_array_expression(symbols, statements_flattened, e2), ); assert_eq!(lhs.len(), rhs.len()); @@ -1283,7 +1050,6 @@ impl Flattener { TypedExpressionList::FunctionCall(key, exprs, _) => { let rhs_flattened = self.flatten_function_call( symbols, - functions_flattened, statements_flattened, &key.id, var_types, @@ -1328,19 +1094,18 @@ impl Flattener { fn flatten_function_symbol( &mut self, symbols: &HashMap>, - functions_flattened: &Vec>, funct: TypedFunctionSymbol, ) -> FlatFunction { match funct { - TypedFunctionSymbol::Here(f) => self.flatten_function(symbols, functions_flattened, f), + TypedFunctionSymbol::Here(f) => self.flatten_function(symbols, f), TypedFunctionSymbol::There(key, module_id) => { let module = self.modules.get(&module_id).unwrap(); Flattener::with_modules(self.modules.clone()).flatten_function_symbol( &module.functions, - &vec![], module.functions.get(&key).unwrap().clone(), ) } + TypedFunctionSymbol::Flat(flat_function) => flat_function, } } @@ -1353,7 +1118,6 @@ impl Flattener { fn flatten_function( &mut self, symbols: &HashMap>, - functions_flattened: &Vec>, funct: TypedFunction, ) -> FlatFunction { self.bijection = BiMap::new(); @@ -1393,12 +1157,7 @@ impl Flattener { // flatten statements in functions and apply substitution for stat in funct.statements { - self.flatten_statement( - symbols, - functions_flattened, - &mut statements_flattened, - stat, - ); + self.flatten_statement(symbols, &mut statements_flattened, stat); } FlatFunction { @@ -1414,28 +1173,21 @@ impl Flattener { /// /// * `prog` - `Prog`ram that will be flattened. fn flatten_program(&mut self, prog: TypedProgram) -> FlatProg { - let mut functions_flattened = Vec::new(); - let main_module = prog.main; self.modules = prog.modules; - let symbols = main_module.functions.clone(); - - //self.load_corelib(&symbols, &mut functions_flattened); - - for func in main_module.imported_functions { - functions_flattened.push(func); - } - let main = main_module .functions - .into_iter() + .iter() .find(|(k, _)| k.id == "main") .unwrap() - .1; + .1 + .clone(); + + let symbols = main_module.functions; - let main_flattened = self.flatten_function_symbol(&symbols, &mut functions_flattened, main); + let main_flattened = self.flatten_function_symbol(&symbols, main); FlatProg { main: main_flattened, @@ -1476,17 +1228,9 @@ impl Flattener { &mut self, key: &FunctionKey, symbols: &'a HashMap>, - functions_flattened: &'a Vec>, ) -> FlatFunction { - match symbols.get(&key) { - Some(f) => self.flatten_function_symbol(symbols, functions_flattened, f.clone()), - None => unimplemented!("need to refactor storage of low level functions") - // functions_flattened - // .iter() - // .find(|f| f.id == id && f.signature == s) - // .expect(&format!("couldn't find {}", id)) - // .clone(), - } + let f = symbols.get(&key).unwrap().clone(); + self.flatten_function_symbol(symbols, f) } } diff --git a/zokrates_core/src/imports.rs b/zokrates_core/src/imports.rs index 174b2d88e..62144157f 100644 --- a/zokrates_core/src/imports.rs +++ b/zokrates_core/src/imports.rs @@ -120,6 +120,7 @@ impl Importer { Importer {} } + // Based on Imports of a program, populate `functions` for external imports and `flat_functions` for flat imports pub fn apply_imports>( &self, destination: Module, @@ -127,8 +128,7 @@ impl Importer { resolve_option: Option, &String) -> Result<(S, String, String), E>>, modules: &mut HashMap>, ) -> Result, CompileErrors> { - let mut origins: Vec> = vec![]; - let mut functions = vec![]; + let mut functions = vec![]; // functions, base case to import from other modules for import in destination.imports.iter() { let pos = import.pos(); @@ -139,14 +139,20 @@ impl Importer { "BELLMAN/sha256round" => { use crate::standard::sha_round; - let compiled = FlatProg { main: sha_round() }; + let compiled = sha_round(); let alias = match import.alias { Some(ref alias) => alias.clone(), None => String::from("sha256round"), }; - origins.push(CompiledImport::new(compiled, alias)); + functions.push( + FunctionDeclaration { + id: alias.clone(), + symbol: FunctionSymbol::Flat(compiled), + } + .at(0, 0, 0), + ); } s => { return Err(CompileErrorInner::ImportError( @@ -167,7 +173,13 @@ impl Importer { None => String::from("split"), }; - origins.push(CompiledImport::new(compiled, alias)); + functions.push( + FunctionDeclaration { + id: alias.clone(), + symbol: FunctionSymbol::Flat(compiled), + } + .at(0, 0, 0), + ); } s => { return Err(CompileErrorInner::ImportError( @@ -232,7 +244,6 @@ impl Importer { Ok(Module { imports: vec![], functions: functions, - imported_functions: origins.into_iter().map(|o| o.flat_func).collect(), }) } } diff --git a/zokrates_core/src/parser/parse/module.rs b/zokrates_core/src/parser/parse/module.rs index 163031606..738574b16 100644 --- a/zokrates_core/src/parser/parse/module.rs +++ b/zokrates_core/src/parser/parse/module.rs @@ -64,6 +64,5 @@ pub fn parse_module(reader: &mut R) -> Result, E Ok(Module { functions: functions, imports, - imported_functions: vec![], }) } diff --git a/zokrates_core/src/semantics.rs b/zokrates_core/src/semantics.rs index 43af7610f..4d88cf5da 100644 --- a/zokrates_core/src/semantics.rs +++ b/zokrates_core/src/semantics.rs @@ -151,14 +151,6 @@ impl Checker { modules: &mut Modules, typed_modules: &mut TypedModules, ) -> Result, Vec> { - for func in &module.imported_functions { - // self.functions.insert(FunctionKey { - // id: func.id.clone(), - // signature: func.signature.clone(), - // }); - unimplemented!("need to refactor imported functions") - } - let mut errors = vec![]; let mut checked_functions = HashMap::new(); @@ -224,7 +216,6 @@ impl Checker { Ok(TypedModule { functions: checked_functions, - imported_functions: module.imported_functions, imports: module.imports.into_iter().map(|i| i.value).collect(), }) } @@ -375,6 +366,7 @@ impl Checker { .collect()), } } + FunctionSymbol::Flat(flat_fun) => Ok(vec![TypedFunctionSymbol::Flat(flat_fun)]), } } @@ -1100,7 +1092,6 @@ mod tests { ), } .mock()], - imported_functions: vec![], imports: vec![], }; @@ -1112,7 +1103,6 @@ mod tests { ), } .mock()], - imported_functions: vec![], imports: vec![], }; @@ -1136,7 +1126,6 @@ mod tests { )] .into_iter() .collect(), - imported_functions: vec![], imports: vec![] }) ); @@ -1264,7 +1253,6 @@ mod tests { let module = Module { functions: funcs, imports: vec![], - imported_functions: vec![], }; let mut checker = Checker::new(); @@ -1372,7 +1360,6 @@ mod tests { let module = Module { functions: funcs, imports: vec![], - imported_functions: vec![], }; let mut checker = Checker::new(); @@ -1698,7 +1685,6 @@ mod tests { .mock(), ], imports: vec![], - imported_functions: vec![], }; let mut checker = new_with_args(HashSet::new(), 0, HashSet::new()); @@ -1951,7 +1937,6 @@ mod tests { } .mock(), ], - imported_functions: vec![], imports: vec![], }; @@ -2036,7 +2021,6 @@ mod tests { let main_module = Module { functions: functions, imports: vec![], - imported_functions: vec![], }; let program = Program { diff --git a/zokrates_core/src/static_analysis/core_lib_injector.rs b/zokrates_core/src/static_analysis/core_lib_injector.rs new file mode 100644 index 000000000..fc8ab4751 --- /dev/null +++ b/zokrates_core/src/static_analysis/core_lib_injector.rs @@ -0,0 +1,158 @@ +use crate::typed_absy::Folder; +use crate::typed_absy::*; +use crate::types::{FunctionKey, Signature, Type}; +use types::conversions::cast; +use zokrates_field::field::Field; + +pub struct CoreLibInjector {} + +impl CoreLibInjector { + fn new() -> Self { + CoreLibInjector {} + } + + pub fn inject(p: TypedProgram) -> TypedProgram { + CoreLibInjector::new().fold_program(p) + } +} + +impl Folder for CoreLibInjector { + fn fold_program(&mut self, p: TypedProgram) -> TypedProgram { + // instanciate core lib functions + + // IfElse + + let signature = Signature::new() + .inputs(vec![Type::Boolean, Type::FieldElement, Type::FieldElement]) + .outputs(vec![Type::FieldElement]); + + let ie = TypedFunction { + arguments: vec![ + Parameter { + id: Variable { + id: "condition".to_string(), + _type: Type::Boolean, + }, + private: true, + }, + Parameter { + id: Variable { + id: "consequence".to_string(), + _type: Type::FieldElement, + }, + private: true, + }, + Parameter { + id: Variable { + id: "alternative".to_string(), + _type: Type::FieldElement, + }, + private: true, + }, + ], + statements: vec![ + TypedStatement::Definition( + TypedAssignee::Identifier(Variable::field_element("condition_as_field")), + FieldElementExpression::FunctionCall( + FunctionKey::with_id("_bool_to_field").signature( + Signature::new() + .inputs(vec![Type::Boolean]) + .outputs(vec![Type::FieldElement]), + ), + vec![BooleanExpression::Identifier("condition".to_string()).into()], + ) + .into(), + ), + TypedStatement::Return(vec![FieldElementExpression::Add( + box FieldElementExpression::Mult( + box FieldElementExpression::Identifier("condition_as_field".to_string()), + box FieldElementExpression::Identifier("consequence".to_string()), + ), + box FieldElementExpression::Mult( + box FieldElementExpression::Sub( + box FieldElementExpression::Number(T::one()), + box FieldElementExpression::Identifier( + "condition_as_field".to_string(), + ), + ), + box FieldElementExpression::Identifier("alternative".to_string()), + ), + ) + .into()]), + ], + signature: signature.clone(), + }; + + let ie_key = FunctionKey::with_id("_if_else_field").signature(signature); + + // cast + let bool_to_field = cast(&Type::Boolean, &Type::FieldElement); + let bool_to_field_key = FunctionKey::with_id("_bool_to_field").signature( + Signature::new() + .inputs(vec![Type::Boolean]) + .outputs(vec![Type::FieldElement]), + ); + + // create corelib module + let core_lib_module = TypedModule { + functions: vec![ + (ie_key, TypedFunctionSymbol::Here(ie)), + (bool_to_field_key, TypedFunctionSymbol::Flat(bool_to_field)), + ] + .into_iter() + .collect(), + imports: vec![], + }; + + TypedProgram { + main: self.fold_module(p.main), + modules: p + .modules + .into_iter() + .map(|(k, m)| (k, self.fold_module(m))) + .chain(std::iter::once(( + String::from("#corelib#"), + core_lib_module, + ))) + .collect(), + } + } + + fn fold_module(&mut self, m: TypedModule) -> TypedModule { + let mut functions = m.functions; + functions.extend(vec![ + ( + FunctionKey::with_id("_if_else_field").signature( + Signature::new() + .inputs(vec![Type::Boolean, Type::FieldElement, Type::FieldElement]) + .outputs(vec![Type::FieldElement]), + ), + TypedFunctionSymbol::There( + FunctionKey::with_id("_if_else_field").signature( + Signature::new() + .inputs(vec![Type::Boolean, Type::FieldElement, Type::FieldElement]) + .outputs(vec![Type::FieldElement]), + ), + String::from("#corelib#"), + ), + ), + ( + FunctionKey::with_id("_bool_to_field").signature( + Signature::new() + .inputs(vec![Type::Boolean]) + .outputs(vec![Type::FieldElement]), + ), + TypedFunctionSymbol::There( + FunctionKey::with_id("_bool_to_field").signature( + Signature::new() + .inputs(vec![Type::Boolean]) + .outputs(vec![Type::FieldElement]), + ), + String::from("#corelib#"), + ), + ), + ]); + + TypedModule { functions, ..m } + } +} diff --git a/zokrates_core/src/static_analysis/mod.rs b/zokrates_core/src/static_analysis/mod.rs index bf741e13f..3395e8ef1 100644 --- a/zokrates_core/src/static_analysis/mod.rs +++ b/zokrates_core/src/static_analysis/mod.rs @@ -4,11 +4,13 @@ //! @author Thibaut Schaeffer //! @date 2018 +mod core_lib_injector; mod flat_propagation; mod power_check; mod propagation; mod unroll; +use self::core_lib_injector::CoreLibInjector; use self::power_check::PowerChecker; use self::propagation::Propagator; use self::unroll::Unroller; @@ -26,8 +28,10 @@ impl Analyse for TypedProgram { let r = PowerChecker::check(self); // unroll let r = Unroller::unroll(r); - //propagate + // propagate let r = Propagator::propagate(r); + // inject core lib + let r = CoreLibInjector::inject(r); r } } diff --git a/zokrates_core/src/typed_absy/mod.rs b/zokrates_core/src/typed_absy/mod.rs index 8581bddda..1f04b4d11 100644 --- a/zokrates_core/src/typed_absy/mod.rs +++ b/zokrates_core/src/typed_absy/mod.rs @@ -59,19 +59,19 @@ pub struct TypedModule { /// Functions of the program pub functions: TypedFunctionSymbols, pub imports: Vec, - pub imported_functions: Vec>, } #[derive(Debug, Clone, PartialEq)] pub enum TypedFunctionSymbol { Here(TypedFunction), There(FunctionKey, TypedModuleId), + Flat(FlatFunction), } impl TypedFunctionSymbol { - pub fn signature(&self, modules: &TypedModules) -> Signature { + pub fn signature<'a>(&'a self, modules: &'a TypedModules) -> &'a Signature { match self { - TypedFunctionSymbol::Here(f) => f.signature.clone(), + TypedFunctionSymbol::Here(f) => &f.signature, TypedFunctionSymbol::There(key, module_id) => modules .get(module_id) .unwrap() @@ -79,6 +79,7 @@ impl TypedFunctionSymbol { .get(key) .unwrap() .signature(&modules), + TypedFunctionSymbol::Flat(flat_fun) => &flat_fun.signature, } } } @@ -92,12 +93,6 @@ impl fmt::Display for TypedModule { .map(|x| format!("{}", x)) .collect::>(), ); - res.extend( - self.imported_functions - .iter() - .map(|x| format!("{}", x)) - .collect::>(), - ); res.extend( self.functions .iter() @@ -109,6 +104,9 @@ impl fmt::Display for TypedModule { "import {} from \"{}\" as {} // with signature {}", fun_key.id, module_id, key.id, key.signature ), + TypedFunctionSymbol::Flat(ref flat_fun) => { + format!("def {}{}:\n\t// hidden", key.id, flat_fun.signature) + } }) .collect::>(), ); @@ -120,17 +118,12 @@ impl fmt::Debug for TypedModule { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!( f, - "program(\n\timports:\n\t\t{}\n\tfunctions:\n\t\t{}{}\n)", + "program(\n\timports:\n\t\t{}\n\tfunctions:\n\t\t{}\n)", self.imports .iter() .map(|x| format!("{:?}", x)) .collect::>() .join("\n\t\t"), - self.imported_functions - .iter() - .map(|x| format!("{}", x)) - .collect::>() - .join("\n\t\t"), self.functions .iter() .map(|x| format!("{:?}", x)) diff --git a/zokrates_core/src/types/conversions.rs b/zokrates_core/src/types/conversions.rs index fa0b97f3d..d8540f7a3 100644 --- a/zokrates_core/src/types/conversions.rs +++ b/zokrates_core/src/types/conversions.rs @@ -18,7 +18,7 @@ fn use_variable( var } -pub fn split() -> FlatProg { +pub fn split() -> FlatFunction { let nbits = T::get_required_bits(); let mut counter = 0; @@ -100,12 +100,10 @@ pub fn split() -> FlatProg { expressions: outputs, })); - FlatProg { - main: FlatFunction { - arguments, - statements, - signature, - }, + FlatFunction { + arguments, + statements, + signature, } } @@ -199,8 +197,7 @@ mod tests { #[test] fn split254() { - let unpack: FlatProg = split(); - let unpack = &unpack.main; + let unpack: FlatFunction = split(); assert_eq!( unpack.arguments, From b795feb7aa7b1bd205a2ad3c785ae72df2ce0dcb Mon Sep 17 00:00:00 2001 From: schaeff Date: Tue, 21 May 2019 15:57:46 +0200 Subject: [PATCH 018/162] fix positions in imports, fix flatten test --- zokrates_core/src/absy/node.rs | 4 ++ zokrates_core/src/flatten/mod.rs | 102 +++++++++++++++---------------- zokrates_core/src/imports.rs | 19 ++---- 3 files changed, 59 insertions(+), 66 deletions(-) diff --git a/zokrates_core/src/absy/node.rs b/zokrates_core/src/absy/node.rs index 6c4db0ab0..a514c72c5 100644 --- a/zokrates_core/src/absy/node.rs +++ b/zokrates_core/src/absy/node.rs @@ -32,6 +32,10 @@ pub trait NodeValue: fmt::Display + Sized + PartialEq { Node::new(start, start.col(delta), self) } + fn start_end(self, start: Position, end: Position) -> Node { + Node::new(start, end, self) + } + #[cfg(test)] fn mock(self) -> Node { Node::new(Position::mock(), Position::mock(), self) diff --git a/zokrates_core/src/flatten/mod.rs b/zokrates_core/src/flatten/mod.rs index 1bd81c854..c962b7603 100644 --- a/zokrates_core/src/flatten/mod.rs +++ b/zokrates_core/src/flatten/mod.rs @@ -1234,60 +1234,60 @@ impl Flattener { } } -// #[cfg(test)] -// mod tests { -// use super::*; -// use crate::types::Signature; -// use crate::types::Type; -// use zokrates_field::field::FieldPrime; - -// #[test] -// fn multiple_definition() { -// // def foo() -// // return 1, 2 -// // def main() -// // a, b = foo() +#[cfg(test)] +mod tests { + use super::*; + use crate::types::Signature; + use crate::types::Type; + use zokrates_field::field::FieldPrime; + + #[test] + fn multiple_definition() { + // def foo() + // return 1, 2 + // def main() + // a, b = foo() + + let mut flattener = Flattener::new(); + let foo = TypedFunction { + arguments: vec![], + statements: vec![TypedStatement::Return(vec![ + FieldElementExpression::Number(FieldPrime::from(1)).into(), + FieldElementExpression::Number(FieldPrime::from(2)).into(), + ], + )], + signature: Signature::new() + .inputs(vec![]) + .outputs(vec![Type::FieldElement, Type::FieldElement]), + }; + let mut statements_flattened = vec![]; + let statement = TypedStatement::MultipleDefinition( + vec![ + Variable::field_element("a".to_string()), + Variable::field_element("b".to_string()), + ], + TypedExpressionList::FunctionCall( + FunctionKey::with_id("foo").signature(Signature::new().outputs(vec![Type::FieldElement, Type::FieldElement])), + vec![], + vec![Type::FieldElement, Type::FieldElement], + ), + ); -// let mut flattener = Flattener::new(); -// let mut functions_flattened = vec![FlatFunction { -// id: "foo".to_string(), -// arguments: vec![], -// statements: vec![FlatStatement::Return(FlatExpressionList { -// expressions: vec![ -// FlatExpression::Number(FieldPrime::from(1)), -// FlatExpression::Number(FieldPrime::from(2)), -// ], -// })], -// signature: Signature::new() -// .inputs(vec![]) -// .outputs(vec![Type::FieldElement, Type::FieldElement]), -// }]; -// let mut statements_flattened = vec![]; -// let statement = TypedStatement::MultipleDefinition( -// vec![ -// Variable::field_element("a".to_string()), -// Variable::field_element("b".to_string()), -// ], -// TypedExpressionList::FunctionCall( -// "foo".to_string(), -// vec![], -// vec![Type::FieldElement, Type::FieldElement], -// ), -// ); + let symbols = vec![(FunctionKey::with_id("foo").signature(Signature::new().outputs(vec![Type::FieldElement, Type::FieldElement])), TypedFunctionSymbol::Here(foo))].into_iter().collect(); -// flattener.flatten_statement( -// &mut functions_flattened, -// &mut statements_flattened, -// statement, -// ); + flattener.flatten_statement( + &symbols, + &mut statements_flattened, + statement, + ); -// let a = FlatVariable::new(0); + let a = FlatVariable::new(0); -// assert_eq!( -// statements_flattened[0], -// FlatStatement::Definition(a, FlatExpression::Number(FieldPrime::from(1))) -// ); -// } + assert_eq!( + statements_flattened[0], + FlatStatement::Definition(a, FlatExpression::Number(FieldPrime::from(1))) + ); + } // #[test] // fn multiple_definition2() { @@ -2147,4 +2147,4 @@ impl Flattener { // FlatVariable::new(2) // ); // } -// } +} diff --git a/zokrates_core/src/imports.rs b/zokrates_core/src/imports.rs index 62144157f..d7ce401b6 100644 --- a/zokrates_core/src/imports.rs +++ b/zokrates_core/src/imports.rs @@ -7,7 +7,6 @@ use crate::absy::*; use crate::compile::compile_module; use crate::compile::{CompileErrorInner, CompileErrors}; -use crate::flat_absy::*; use crate::parser::Position; use std::collections::HashMap; use std::fmt; @@ -15,16 +14,6 @@ use std::io; use std::io::BufRead; use zokrates_field::field::Field; -pub struct CompiledImport { - pub flat_func: FlatFunction, -} - -impl CompiledImport { - fn new(prog: FlatProg, alias: String) -> CompiledImport { - unimplemented!("refactor imported flattened funcs") - } -} - #[derive(PartialEq, Debug)] pub struct Error { pos: Option<(Position, Position)>, @@ -151,7 +140,7 @@ impl Importer { id: alias.clone(), symbol: FunctionSymbol::Flat(compiled), } - .at(0, 0, 0), + .start_end(pos.0, pos.1), ); } s => { @@ -178,7 +167,7 @@ impl Importer { id: alias.clone(), symbol: FunctionSymbol::Flat(compiled), } - .at(0, 0, 0), + .start_end(pos.0, pos.1), ); } s => { @@ -214,10 +203,10 @@ impl Importer { "main", import.source.clone(), ) - .at(0, 0, 0), + .start_end(pos.0, pos.1), ), } - .at(0, 0, 0), + .start_end(pos.0, pos.1), ); } Err(err) => { From 25bdb65d20d68e48f480782e578875cb1be9a27e Mon Sep 17 00:00:00 2001 From: schaeff Date: Tue, 21 May 2019 21:50:43 +0200 Subject: [PATCH 019/162] inliner wip --- zokrates_core/src/flatten/mod.rs | 1741 ++++++++++--------- zokrates_core/src/static_analysis/inline.rs | 125 ++ zokrates_core/src/static_analysis/mod.rs | 5 + zokrates_core/src/typed_absy/mod.rs | 2 +- 4 files changed, 1003 insertions(+), 870 deletions(-) create mode 100644 zokrates_core/src/static_analysis/inline.rs diff --git a/zokrates_core/src/flatten/mod.rs b/zokrates_core/src/flatten/mod.rs index c962b7603..608cc01ea 100644 --- a/zokrates_core/src/flatten/mod.rs +++ b/zokrates_core/src/flatten/mod.rs @@ -1252,10 +1252,9 @@ mod tests { let foo = TypedFunction { arguments: vec![], statements: vec![TypedStatement::Return(vec![ - FieldElementExpression::Number(FieldPrime::from(1)).into(), - FieldElementExpression::Number(FieldPrime::from(2)).into(), - ], - )], + FieldElementExpression::Number(FieldPrime::from(1)).into(), + FieldElementExpression::Number(FieldPrime::from(2)).into(), + ])], signature: Signature::new() .inputs(vec![]) .outputs(vec![Type::FieldElement, Type::FieldElement]), @@ -1267,19 +1266,23 @@ mod tests { Variable::field_element("b".to_string()), ], TypedExpressionList::FunctionCall( - FunctionKey::with_id("foo").signature(Signature::new().outputs(vec![Type::FieldElement, Type::FieldElement])), + FunctionKey::with_id("foo").signature( + Signature::new().outputs(vec![Type::FieldElement, Type::FieldElement]), + ), vec![], vec![Type::FieldElement, Type::FieldElement], ), ); - let symbols = vec![(FunctionKey::with_id("foo").signature(Signature::new().outputs(vec![Type::FieldElement, Type::FieldElement])), TypedFunctionSymbol::Here(foo))].into_iter().collect(); + let symbols = vec![( + FunctionKey::with_id("foo") + .signature(Signature::new().outputs(vec![Type::FieldElement, Type::FieldElement])), + TypedFunctionSymbol::Here(foo), + )] + .into_iter() + .collect(); - flattener.flatten_statement( - &symbols, - &mut statements_flattened, - statement, - ); + flattener.flatten_statement(&symbols, &mut statements_flattened, statement); let a = FlatVariable::new(0); @@ -1289,862 +1292,862 @@ mod tests { ); } -// #[test] -// fn multiple_definition2() { -// // def dup(x) -// // return x, x -// // def main() -// // a, b = dup(2) - -// let a = FlatVariable::new(0); - -// let mut flattener = Flattener::new(); -// let mut functions_flattened = vec![FlatFunction { -// id: "dup".to_string(), -// arguments: vec![FlatParameter { -// id: a, -// private: true, -// }], -// statements: vec![FlatStatement::Return(FlatExpressionList { -// expressions: vec![FlatExpression::Identifier(a), FlatExpression::Identifier(a)], -// })], -// signature: Signature::new() -// .inputs(vec![Type::FieldElement]) -// .outputs(vec![Type::FieldElement, Type::FieldElement]), -// }]; -// let statement = TypedStatement::MultipleDefinition( -// vec![ -// Variable::field_element("a".to_string()), -// Variable::field_element("b".to_string()), -// ], -// TypedExpressionList::FunctionCall( -// "dup".to_string(), -// vec![TypedExpression::FieldElement( -// FieldElementExpression::Number(FieldPrime::from(2)), -// )], -// vec![Type::FieldElement, Type::FieldElement], -// ), -// ); - -// let fun = TypedFunction { -// id: String::from("main"), -// arguments: vec![], -// statements: vec![statement], -// signature: Signature { -// inputs: vec![], -// outputs: vec![], -// }, -// }; - -// let f = flattener.flatten_function(&mut functions_flattened, fun); - -// let a = FlatVariable::new(0); - -// assert_eq!( -// f.statements[0], -// FlatStatement::Definition(a, FlatExpression::Number(FieldPrime::from(2))) -// ); -// } - -// #[test] -// fn simple_definition() { -// // def foo() -// // return 1 -// // def main() -// // a = foo() - -// let mut flattener = Flattener::new(); -// let mut functions_flattened = vec![FlatFunction { -// id: "foo".to_string(), -// arguments: vec![], -// statements: vec![FlatStatement::Return(FlatExpressionList { -// expressions: vec![FlatExpression::Number(FieldPrime::from(1))], -// })], -// signature: Signature::new() -// .inputs(vec![]) -// .outputs(vec![Type::FieldElement]), -// }]; -// let mut statements_flattened = vec![]; -// let statement = TypedStatement::Definition( -// TypedAssignee::Identifier(Variable::field_element("a")), -// TypedExpression::FieldElement(FieldElementExpression::FunctionCall( -// "foo".to_string(), -// vec![], -// )), -// ); - -// flattener.flatten_statement( -// &mut functions_flattened, -// &mut statements_flattened, -// statement, -// ); - -// let a = FlatVariable::new(0); - -// assert_eq!( -// statements_flattened[0], -// FlatStatement::Definition(a, FlatExpression::Number(FieldPrime::from(1))) -// ); -// } - -// #[test] -// fn redefine_argument() { -// // def foo(a) -// // a = a + 1 -// // return 1 - -// // should flatten to no redefinition -// // def foo(a) -// // a_0 = a + 1 -// // return 1 - -// let mut flattener = Flattener::new(); -// let mut functions_flattened = vec![]; - -// let funct = TypedFunction { -// id: "foo".to_string(), -// signature: Signature::new() -// .inputs(vec![Type::FieldElement]) -// .outputs(vec![Type::FieldElement]), -// arguments: vec![Parameter { -// id: Variable::field_element("a"), -// private: true, -// }], -// statements: vec![ -// TypedStatement::Definition( -// TypedAssignee::Identifier(Variable::field_element("a")), -// FieldElementExpression::Add( -// box FieldElementExpression::Identifier("a".to_string()), -// box FieldElementExpression::Number(FieldPrime::from(1)), -// ) -// .into(), -// ), -// TypedStatement::Return(vec![ -// FieldElementExpression::Number(FieldPrime::from(1)).into() -// ]), -// ], -// }; - -// let flat_funct = flattener.flatten_function(&mut functions_flattened, funct); - -// let a = FlatVariable::new(0); -// let a_0 = FlatVariable::new(1); - -// assert_eq!( -// flat_funct.statements[0], -// FlatStatement::Definition( -// a_0, -// FlatExpression::Add( -// box FlatExpression::Identifier(a), -// box FlatExpression::Number(FieldPrime::from(1)) -// ) -// ) -// ); -// } - -// #[test] -// fn call_with_def() { -// // def foo(): -// // a = 3 -// // return a - -// // def main(): -// // return foo() - -// let foo = TypedFunction { -// id: String::from("foo"), -// arguments: vec![], -// statements: vec![ -// TypedStatement::Definition( -// TypedAssignee::Identifier(Variable::field_element("a")), -// FieldElementExpression::Number(FieldPrime::from(3)).into(), -// ), -// TypedStatement::Return(vec![ -// FieldElementExpression::Identifier(String::from("a")).into() -// ]), -// ], -// signature: Signature { -// inputs: vec![], -// outputs: vec![Type::FieldElement], -// }, -// }; - -// let main = TypedFunction { -// id: String::from("main"), -// arguments: vec![], -// statements: vec![TypedStatement::Return(vec![ -// FieldElementExpression::FunctionCall(String::from("foo"), vec![]).into(), -// ])], -// signature: Signature { -// inputs: vec![], -// outputs: vec![Type::FieldElement], -// }, -// }; - -// let mut flattener = Flattener::new(); - -// let foo_flattened = flattener.flatten_function(&mut vec![], foo); - -// let expected = FlatFunction { -// id: String::from("main"), -// arguments: vec![], -// statements: vec![ -// FlatStatement::Definition( -// FlatVariable::new(0), -// FlatExpression::Number(FieldPrime::from(3)), -// ), -// FlatStatement::Return(FlatExpressionList { -// expressions: vec![FlatExpression::Identifier(FlatVariable::new(0))], -// }), -// ], -// signature: Signature::new().outputs(vec![Type::FieldElement]), -// }; - -// let main_flattened = flattener.flatten_function(&mut vec![foo_flattened], main); - -// assert_eq!(main_flattened, expected); -// } - -// #[test] -// fn powers() { -// // def main(): -// // field a = 7 -// // field b = a**4 -// // return b - -// // def main(): -// // _0 = 7 -// // _1 = (_0 * _0) -// // _2 = (_1 * _0) -// // _3 = (_2 * _0) -// // return _3 - -// let function = TypedFunction { -// id: String::from("main"), -// arguments: vec![], -// statements: vec![ -// TypedStatement::Definition( -// TypedAssignee::Identifier(Variable::field_element("a")), -// FieldElementExpression::Number(FieldPrime::from(7)).into(), -// ), -// TypedStatement::Definition( -// TypedAssignee::Identifier(Variable::field_element("b")), -// FieldElementExpression::Pow( -// box FieldElementExpression::Identifier(String::from("a")), -// box FieldElementExpression::Number(FieldPrime::from(4)), -// ) -// .into(), -// ), -// TypedStatement::Return(vec![ -// FieldElementExpression::Identifier(String::from("b")).into() -// ]), -// ], -// signature: Signature { -// inputs: vec![], -// outputs: vec![Type::FieldElement], -// }, -// }; - -// let mut flattener = Flattener::new(); - -// let expected = FlatFunction { -// id: String::from("main"), -// arguments: vec![], -// statements: vec![ -// FlatStatement::Definition( -// FlatVariable::new(0), -// FlatExpression::Number(FieldPrime::from(7)), -// ), -// FlatStatement::Definition( -// FlatVariable::new(1), -// FlatExpression::Mult( -// box FlatExpression::Identifier(FlatVariable::new(0)), -// box FlatExpression::Identifier(FlatVariable::new(0)), -// ), -// ), -// FlatStatement::Definition( -// FlatVariable::new(2), -// FlatExpression::Mult( -// box FlatExpression::Identifier(FlatVariable::new(1)), -// box FlatExpression::Identifier(FlatVariable::new(0)), -// ), -// ), -// FlatStatement::Definition( -// FlatVariable::new(3), -// FlatExpression::Mult( -// box FlatExpression::Identifier(FlatVariable::new(2)), -// box FlatExpression::Identifier(FlatVariable::new(0)), -// ), -// ), -// FlatStatement::Return(FlatExpressionList { -// expressions: vec![FlatExpression::Identifier(FlatVariable::new(3))], -// }), -// ], -// signature: Signature::new().outputs(vec![Type::FieldElement]), -// }; - -// let flattened = flattener.flatten_function(&mut vec![], function); - -// assert_eq!(flattened, expected); -// } - -// #[test] -// fn overload() { -// // def foo() -// // return 1 -// // def foo() -// // return 1, 2 -// // def main() -// // a = foo() -// // b, c = foo() -// // return 1 -// // -// // should not panic -// // - -// let mut flattener = Flattener::new(); -// let functions = vec![ -// TypedFunction { -// id: "foo".to_string(), -// arguments: vec![], -// statements: vec![TypedStatement::Return(vec![TypedExpression::FieldElement( -// FieldElementExpression::Number(FieldPrime::from(1)), -// )])], -// signature: Signature::new() -// .inputs(vec![]) -// .outputs(vec![Type::FieldElement]), -// }, -// TypedFunction { -// id: "foo".to_string(), -// arguments: vec![], -// statements: vec![TypedStatement::Return(vec![ -// TypedExpression::FieldElement(FieldElementExpression::Number( -// FieldPrime::from(1), -// )), -// TypedExpression::FieldElement(FieldElementExpression::Number( -// FieldPrime::from(2), -// )), -// ])], -// signature: Signature::new() -// .inputs(vec![]) -// .outputs(vec![Type::FieldElement, Type::FieldElement]), -// }, -// TypedFunction { -// id: "main".to_string(), -// arguments: vec![], -// statements: vec![ -// TypedStatement::Definition( -// TypedAssignee::Identifier(Variable::field_element("a")), -// TypedExpression::FieldElement(FieldElementExpression::FunctionCall( -// "foo".to_string(), -// vec![], -// )), -// ), -// TypedStatement::MultipleDefinition( -// vec![ -// Variable::field_element("b".to_string()), -// Variable::field_element("c".to_string()), -// ], -// TypedExpressionList::FunctionCall( -// "foo".to_string(), -// vec![], -// vec![Type::FieldElement, Type::FieldElement], -// ), -// ), -// TypedStatement::Return(vec![TypedExpression::FieldElement( -// FieldElementExpression::Number(FieldPrime::from(1)), -// )]), -// ], -// signature: Signature::new() -// .inputs(vec![]) -// .outputs(vec![Type::FieldElement]), -// }, -// ]; - -// flattener.flatten_program(TypedModule { -// functions: functions -// .into_iter() -// .map(|f| { -// ( -// FunctionKey { -// id: f.id.clone(), -// signature: f.signature.clone(), -// }, -// f, -// ) -// }) -// .collect(), -// imported_functions: vec![], -// imports: vec![], -// }); - -// // shouldn't panic -// } - -// #[test] -// fn if_else() { -// let mut flattener = Flattener::new(); -// let expression = FieldElementExpression::IfElse( -// box BooleanExpression::Eq( -// box FieldElementExpression::Number(FieldPrime::from(32)), -// box FieldElementExpression::Number(FieldPrime::from(4)), -// ), -// box FieldElementExpression::Number(FieldPrime::from(12)), -// box FieldElementExpression::Number(FieldPrime::from(51)), -// ); - -// let mut functions_flattened = vec![]; -// flattener.load_corelib(&mut functions_flattened); - -// flattener.flatten_field_expression(&functions_flattened, &mut vec![], expression); -// } - -// #[test] -// fn geq_leq() { -// let mut flattener = Flattener::new(); -// let expression_le = BooleanExpression::Le( -// box FieldElementExpression::Number(FieldPrime::from(32)), -// box FieldElementExpression::Number(FieldPrime::from(4)), -// ); - -// let expression_ge = BooleanExpression::Ge( -// box FieldElementExpression::Number(FieldPrime::from(32)), -// box FieldElementExpression::Number(FieldPrime::from(4)), -// ); - -// flattener.flatten_boolean_expression(&mut vec![], &mut vec![], expression_le); - -// flattener.flatten_boolean_expression(&mut vec![], &mut vec![], expression_ge); -// } - -// #[test] -// fn bool_and() { -// let expression = FieldElementExpression::IfElse( -// box BooleanExpression::And( -// box BooleanExpression::Eq( -// box FieldElementExpression::Number(FieldPrime::from(4)), -// box FieldElementExpression::Number(FieldPrime::from(4)), -// ), -// box BooleanExpression::Lt( -// box FieldElementExpression::Number(FieldPrime::from(4)), -// box FieldElementExpression::Number(FieldPrime::from(20)), -// ), -// ), -// box FieldElementExpression::Number(FieldPrime::from(12)), -// box FieldElementExpression::Number(FieldPrime::from(51)), -// ); - -// let mut flattener = Flattener::new(); -// let mut functions_flattened = vec![]; -// flattener.load_corelib(&mut functions_flattened); -// flattener.flatten_field_expression(&functions_flattened, &mut vec![], expression); -// } - -// #[test] -// fn div() { -// // a = 5 / b / b -// let mut flattener = Flattener::new(); -// let mut functions_flattened = vec![]; -// let mut statements_flattened = vec![]; - -// let definition = TypedStatement::Definition( -// TypedAssignee::Identifier(Variable::field_element("b")), -// FieldElementExpression::Number(FieldPrime::from(42)).into(), -// ); - -// let statement = TypedStatement::Definition( -// TypedAssignee::Identifier(Variable::field_element("a")), -// FieldElementExpression::Div( -// box FieldElementExpression::Div( -// box FieldElementExpression::Number(FieldPrime::from(5)), -// box FieldElementExpression::Identifier(String::from("b")), -// ), -// box FieldElementExpression::Identifier(String::from("b")), -// ) -// .into(), -// ); - -// flattener.flatten_statement( -// &mut functions_flattened, -// &mut statements_flattened, -// definition, -// ); - -// flattener.flatten_statement( -// &mut functions_flattened, -// &mut statements_flattened, -// statement, -// ); - -// // define b -// let b = FlatVariable::new(0); -// // define new wires for members of Div -// let five = FlatVariable::new(1); -// let b0 = FlatVariable::new(2); -// // Define inverse of denominator to prevent div by 0 -// let invb0 = FlatVariable::new(3); -// // Define inverse -// let sym_0 = FlatVariable::new(4); -// // Define result, which is first member to next Div -// let sym_1 = FlatVariable::new(5); -// // Define second member -// let b1 = FlatVariable::new(6); -// // Define inverse of denominator to prevent div by 0 -// let invb1 = FlatVariable::new(7); -// // Define inverse -// let sym_2 = FlatVariable::new(8); -// // Define left hand side -// let a = FlatVariable::new(9); - -// assert_eq!( -// statements_flattened, -// vec![ -// FlatStatement::Definition(b, FlatExpression::Number(FieldPrime::from(42))), -// // inputs to first div (5/b) -// FlatStatement::Definition(five, FlatExpression::Number(FieldPrime::from(5))), -// FlatStatement::Definition(b0, b.into()), -// // check div by 0 -// FlatStatement::Directive(DirectiveStatement::new( -// vec![invb0], -// Helper::Rust(RustHelper::Div), -// vec![FlatExpression::Number(FieldPrime::from(1)), b0.into()] -// )), -// FlatStatement::Condition( -// FlatExpression::Number(FieldPrime::from(1)), -// FlatExpression::Mult(box invb0.into(), box b0.into()), -// ), -// // execute div -// FlatStatement::Directive(DirectiveStatement::new( -// vec![sym_0], -// Helper::Rust(RustHelper::Div), -// vec![five, b0] -// )), -// FlatStatement::Condition( -// five.into(), -// FlatExpression::Mult(box b0.into(), box sym_0.into()), -// ), -// // inputs to second div (res/b) -// FlatStatement::Definition(sym_1, sym_0.into()), -// FlatStatement::Definition(b1, b.into()), -// // check div by 0 -// FlatStatement::Directive(DirectiveStatement::new( -// vec![invb1], -// Helper::Rust(RustHelper::Div), -// vec![FlatExpression::Number(FieldPrime::from(1)), b1.into()] -// )), -// FlatStatement::Condition( -// FlatExpression::Number(FieldPrime::from(1)), -// FlatExpression::Mult(box invb1.into(), box b1.into()), -// ), -// // execute div -// FlatStatement::Directive(DirectiveStatement::new( -// vec![sym_2], -// Helper::Rust(RustHelper::Div), -// vec![sym_1, b1] -// )), -// FlatStatement::Condition( -// sym_1.into(), -// FlatExpression::Mult(box b1.into(), box sym_2.into()), -// ), -// // result -// FlatStatement::Definition(a, sym_2.into()), -// ] -// ); -// } - -// #[test] -// fn field_array() { -// // foo = [ , , ] - -// let mut flattener = Flattener::new(); -// let mut functions_flattened = vec![]; -// let mut statements_flattened = vec![]; -// let statement = TypedStatement::Definition( -// TypedAssignee::Identifier(Variable::field_array("foo", 3)), -// FieldElementArrayExpression::Value( -// 3, -// vec![ -// FieldElementExpression::Number(FieldPrime::from(1)), -// FieldElementExpression::Number(FieldPrime::from(2)), -// FieldElementExpression::Number(FieldPrime::from(3)), -// ], -// ) -// .into(), -// ); -// let expression = FieldElementArrayExpression::Identifier(3, String::from("foo")); - -// flattener.flatten_statement( -// &mut functions_flattened, -// &mut statements_flattened, -// statement, -// ); - -// let expressions = flattener.flatten_field_array_expression( -// &mut functions_flattened, -// &mut statements_flattened, -// expression, -// ); - -// assert_eq!( -// expressions, -// vec![ -// FlatExpression::Identifier(FlatVariable::new(0)), -// FlatExpression::Identifier(FlatVariable::new(1)), -// FlatExpression::Identifier(FlatVariable::new(2)), -// ] -// ); -// } - -// #[test] -// fn array_definition() { -// // field[3] foo = [1, 2, 3] - -// let mut flattener = Flattener::new(); -// let mut functions_flattened = vec![]; -// let mut statements_flattened = vec![]; -// let statement = TypedStatement::Definition( -// TypedAssignee::Identifier(Variable::field_array("foo", 3)), -// FieldElementArrayExpression::Value( -// 3, -// vec![ -// FieldElementExpression::Number(FieldPrime::from(1)), -// FieldElementExpression::Number(FieldPrime::from(2)), -// FieldElementExpression::Number(FieldPrime::from(3)), -// ], -// ) -// .into(), -// ); - -// flattener.flatten_statement( -// &mut functions_flattened, -// &mut statements_flattened, -// statement, -// ); - -// assert_eq!( -// statements_flattened, -// vec![ -// FlatStatement::Definition( -// FlatVariable::new(0), -// FlatExpression::Number(FieldPrime::from(1)) -// ), -// FlatStatement::Definition( -// FlatVariable::new(1), -// FlatExpression::Number(FieldPrime::from(2)) -// ), -// FlatStatement::Definition( -// FlatVariable::new(2), -// FlatExpression::Number(FieldPrime::from(3)) -// ), -// ] -// ); -// } - -// #[test] -// fn array_selection() { -// // field[3] foo = [1, 2, 3] -// // foo[1] - -// let mut flattener = Flattener::new(); -// let mut functions_flattened = vec![]; -// let mut statements_flattened = vec![]; -// let statement = TypedStatement::Definition( -// TypedAssignee::Identifier(Variable::field_array("foo", 3)), -// FieldElementArrayExpression::Value( -// 3, -// vec![ -// FieldElementExpression::Number(FieldPrime::from(1)), -// FieldElementExpression::Number(FieldPrime::from(2)), -// FieldElementExpression::Number(FieldPrime::from(3)), -// ], -// ) -// .into(), -// ); - -// let expression = FieldElementExpression::Select( -// box FieldElementArrayExpression::Identifier(3, String::from("foo")), -// box FieldElementExpression::Number(FieldPrime::from(1)), -// ); - -// flattener.flatten_statement::( -// &mut functions_flattened, -// &mut statements_flattened, -// statement, -// ); - -// let flat_expression = flattener.flatten_field_expression::( -// &mut functions_flattened, -// &mut statements_flattened, -// expression, -// ); - -// assert_eq!( -// flat_expression, -// FlatExpression::Identifier(FlatVariable::new(1)), -// ); -// } - -// #[test] -// fn array_sum() { -// // field[3] foo = [1, 2, 3] -// // bar = foo[0] + foo[1] + foo[2] -// // we don't optimise detecting constants, this will be done in an optimiser pass - -// let mut flattener = Flattener::new(); -// let mut functions_flattened = vec![]; -// let mut statements_flattened = vec![]; -// let def = TypedStatement::Definition( -// TypedAssignee::Identifier(Variable::field_array("foo", 3)), -// FieldElementArrayExpression::Value( -// 3, -// vec![ -// FieldElementExpression::Number(FieldPrime::from(1)), -// FieldElementExpression::Number(FieldPrime::from(2)), -// FieldElementExpression::Number(FieldPrime::from(3)), -// ], -// ) -// .into(), -// ); - -// let sum = TypedStatement::Definition( -// TypedAssignee::Identifier(Variable::field_element("bar")), -// FieldElementExpression::Add( -// box FieldElementExpression::Add( -// box FieldElementExpression::Select( -// box FieldElementArrayExpression::Identifier(3, String::from("foo")), -// box FieldElementExpression::Number(FieldPrime::from(0)), -// ), -// box FieldElementExpression::Select( -// box FieldElementArrayExpression::Identifier(3, String::from("foo")), -// box FieldElementExpression::Number(FieldPrime::from(1)), -// ), -// ), -// box FieldElementExpression::Select( -// box FieldElementArrayExpression::Identifier(3, String::from("foo")), -// box FieldElementExpression::Number(FieldPrime::from(2)), -// ), -// ) -// .into(), -// ); - -// flattener.flatten_statement::( -// &mut functions_flattened, -// &mut statements_flattened, -// def, -// ); - -// flattener.flatten_statement::( -// &mut functions_flattened, -// &mut statements_flattened, -// sum, -// ); - -// assert_eq!( -// statements_flattened[3], -// FlatStatement::Definition( -// FlatVariable::new(3), -// FlatExpression::Add( -// box FlatExpression::Add( -// box FlatExpression::Identifier(FlatVariable::new(0)), -// box FlatExpression::Identifier(FlatVariable::new(1)), -// ), -// box FlatExpression::Identifier(FlatVariable::new(2)), -// ) -// ) -// ); -// } - -// #[test] -// fn array_if() { -// // if 1 == 1 then [1] else [3] fi - -// let with_arrays = { -// let mut flattener = Flattener::new(); -// let mut functions_flattened = vec![]; -// flattener.load_corelib(&mut functions_flattened); -// let mut statements_flattened = vec![]; - -// let e = FieldElementArrayExpression::IfElse( -// box BooleanExpression::Eq( -// box FieldElementExpression::Number(FieldPrime::from(1)), -// box FieldElementExpression::Number(FieldPrime::from(1)), -// ), -// box FieldElementArrayExpression::Value( -// 1, -// vec![FieldElementExpression::Number(FieldPrime::from(1))], -// ), -// box FieldElementArrayExpression::Value( -// 1, -// vec![FieldElementExpression::Number(FieldPrime::from(3))], -// ), -// ); - -// ( -// flattener.flatten_field_array_expression( -// &mut functions_flattened, -// &mut statements_flattened, -// e, -// )[0] -// .clone(), -// statements_flattened, -// ) -// }; - -// let without_arrays = { -// let mut flattener = Flattener::new(); -// let mut functions_flattened = vec![]; -// flattener.load_corelib(&mut functions_flattened); -// let mut statements_flattened = vec![]; - -// // if 1 == 1 then 1 else 3 fi -// let e = FieldElementExpression::IfElse( -// box BooleanExpression::Eq( -// box FieldElementExpression::Number(FieldPrime::from(1)), -// box FieldElementExpression::Number(FieldPrime::from(1)), -// ), -// box FieldElementExpression::Number(FieldPrime::from(1)), -// box FieldElementExpression::Number(FieldPrime::from(3)), -// ); - -// ( -// flattener.flatten_field_expression( -// &mut functions_flattened, -// &mut statements_flattened, -// e, -// ), -// statements_flattened, -// ) -// }; - -// assert_eq!(with_arrays, without_arrays); -// } - -// #[test] -// fn next_variable() { -// let mut flattener = Flattener::new(); -// assert_eq!( -// FlatVariable::new(0), -// flattener.use_variable(&String::from("a")) -// ); -// assert_eq!( -// flattener.get_latest_var_substitution(&String::from("a")), -// FlatVariable::new(0) -// ); -// assert_eq!( -// FlatVariable::new(1), -// flattener.use_variable(&String::from("a")) -// ); -// assert_eq!( -// flattener.get_latest_var_substitution(&String::from("a")), -// FlatVariable::new(1) -// ); -// assert_eq!( -// FlatVariable::new(2), -// flattener.use_variable(&String::from("a")) -// ); -// assert_eq!( -// flattener.get_latest_var_substitution(&String::from("a")), -// FlatVariable::new(2) -// ); -// } + // #[test] + // fn multiple_definition2() { + // // def dup(x) + // // return x, x + // // def main() + // // a, b = dup(2) + + // let a = FlatVariable::new(0); + + // let mut flattener = Flattener::new(); + // let mut functions_flattened = vec![FlatFunction { + // id: "dup".to_string(), + // arguments: vec![FlatParameter { + // id: a, + // private: true, + // }], + // statements: vec![FlatStatement::Return(FlatExpressionList { + // expressions: vec![FlatExpression::Identifier(a), FlatExpression::Identifier(a)], + // })], + // signature: Signature::new() + // .inputs(vec![Type::FieldElement]) + // .outputs(vec![Type::FieldElement, Type::FieldElement]), + // }]; + // let statement = TypedStatement::MultipleDefinition( + // vec![ + // Variable::field_element("a".to_string()), + // Variable::field_element("b".to_string()), + // ], + // TypedExpressionList::FunctionCall( + // "dup".to_string(), + // vec![TypedExpression::FieldElement( + // FieldElementExpression::Number(FieldPrime::from(2)), + // )], + // vec![Type::FieldElement, Type::FieldElement], + // ), + // ); + + // let fun = TypedFunction { + // id: String::from("main"), + // arguments: vec![], + // statements: vec![statement], + // signature: Signature { + // inputs: vec![], + // outputs: vec![], + // }, + // }; + + // let f = flattener.flatten_function(&mut functions_flattened, fun); + + // let a = FlatVariable::new(0); + + // assert_eq!( + // f.statements[0], + // FlatStatement::Definition(a, FlatExpression::Number(FieldPrime::from(2))) + // ); + // } + + // #[test] + // fn simple_definition() { + // // def foo() + // // return 1 + // // def main() + // // a = foo() + + // let mut flattener = Flattener::new(); + // let mut functions_flattened = vec![FlatFunction { + // id: "foo".to_string(), + // arguments: vec![], + // statements: vec![FlatStatement::Return(FlatExpressionList { + // expressions: vec![FlatExpression::Number(FieldPrime::from(1))], + // })], + // signature: Signature::new() + // .inputs(vec![]) + // .outputs(vec![Type::FieldElement]), + // }]; + // let mut statements_flattened = vec![]; + // let statement = TypedStatement::Definition( + // TypedAssignee::Identifier(Variable::field_element("a")), + // TypedExpression::FieldElement(FieldElementExpression::FunctionCall( + // "foo".to_string(), + // vec![], + // )), + // ); + + // flattener.flatten_statement( + // &mut functions_flattened, + // &mut statements_flattened, + // statement, + // ); + + // let a = FlatVariable::new(0); + + // assert_eq!( + // statements_flattened[0], + // FlatStatement::Definition(a, FlatExpression::Number(FieldPrime::from(1))) + // ); + // } + + // #[test] + // fn redefine_argument() { + // // def foo(a) + // // a = a + 1 + // // return 1 + + // // should flatten to no redefinition + // // def foo(a) + // // a_0 = a + 1 + // // return 1 + + // let mut flattener = Flattener::new(); + // let mut functions_flattened = vec![]; + + // let funct = TypedFunction { + // id: "foo".to_string(), + // signature: Signature::new() + // .inputs(vec![Type::FieldElement]) + // .outputs(vec![Type::FieldElement]), + // arguments: vec![Parameter { + // id: Variable::field_element("a"), + // private: true, + // }], + // statements: vec![ + // TypedStatement::Definition( + // TypedAssignee::Identifier(Variable::field_element("a")), + // FieldElementExpression::Add( + // box FieldElementExpression::Identifier("a".to_string()), + // box FieldElementExpression::Number(FieldPrime::from(1)), + // ) + // .into(), + // ), + // TypedStatement::Return(vec![ + // FieldElementExpression::Number(FieldPrime::from(1)).into() + // ]), + // ], + // }; + + // let flat_funct = flattener.flatten_function(&mut functions_flattened, funct); + + // let a = FlatVariable::new(0); + // let a_0 = FlatVariable::new(1); + + // assert_eq!( + // flat_funct.statements[0], + // FlatStatement::Definition( + // a_0, + // FlatExpression::Add( + // box FlatExpression::Identifier(a), + // box FlatExpression::Number(FieldPrime::from(1)) + // ) + // ) + // ); + // } + + // #[test] + // fn call_with_def() { + // // def foo(): + // // a = 3 + // // return a + + // // def main(): + // // return foo() + + // let foo = TypedFunction { + // id: String::from("foo"), + // arguments: vec![], + // statements: vec![ + // TypedStatement::Definition( + // TypedAssignee::Identifier(Variable::field_element("a")), + // FieldElementExpression::Number(FieldPrime::from(3)).into(), + // ), + // TypedStatement::Return(vec![ + // FieldElementExpression::Identifier(String::from("a")).into() + // ]), + // ], + // signature: Signature { + // inputs: vec![], + // outputs: vec![Type::FieldElement], + // }, + // }; + + // let main = TypedFunction { + // id: String::from("main"), + // arguments: vec![], + // statements: vec![TypedStatement::Return(vec![ + // FieldElementExpression::FunctionCall(String::from("foo"), vec![]).into(), + // ])], + // signature: Signature { + // inputs: vec![], + // outputs: vec![Type::FieldElement], + // }, + // }; + + // let mut flattener = Flattener::new(); + + // let foo_flattened = flattener.flatten_function(&mut vec![], foo); + + // let expected = FlatFunction { + // id: String::from("main"), + // arguments: vec![], + // statements: vec![ + // FlatStatement::Definition( + // FlatVariable::new(0), + // FlatExpression::Number(FieldPrime::from(3)), + // ), + // FlatStatement::Return(FlatExpressionList { + // expressions: vec![FlatExpression::Identifier(FlatVariable::new(0))], + // }), + // ], + // signature: Signature::new().outputs(vec![Type::FieldElement]), + // }; + + // let main_flattened = flattener.flatten_function(&mut vec![foo_flattened], main); + + // assert_eq!(main_flattened, expected); + // } + + // #[test] + // fn powers() { + // // def main(): + // // field a = 7 + // // field b = a**4 + // // return b + + // // def main(): + // // _0 = 7 + // // _1 = (_0 * _0) + // // _2 = (_1 * _0) + // // _3 = (_2 * _0) + // // return _3 + + // let function = TypedFunction { + // id: String::from("main"), + // arguments: vec![], + // statements: vec![ + // TypedStatement::Definition( + // TypedAssignee::Identifier(Variable::field_element("a")), + // FieldElementExpression::Number(FieldPrime::from(7)).into(), + // ), + // TypedStatement::Definition( + // TypedAssignee::Identifier(Variable::field_element("b")), + // FieldElementExpression::Pow( + // box FieldElementExpression::Identifier(String::from("a")), + // box FieldElementExpression::Number(FieldPrime::from(4)), + // ) + // .into(), + // ), + // TypedStatement::Return(vec![ + // FieldElementExpression::Identifier(String::from("b")).into() + // ]), + // ], + // signature: Signature { + // inputs: vec![], + // outputs: vec![Type::FieldElement], + // }, + // }; + + // let mut flattener = Flattener::new(); + + // let expected = FlatFunction { + // id: String::from("main"), + // arguments: vec![], + // statements: vec![ + // FlatStatement::Definition( + // FlatVariable::new(0), + // FlatExpression::Number(FieldPrime::from(7)), + // ), + // FlatStatement::Definition( + // FlatVariable::new(1), + // FlatExpression::Mult( + // box FlatExpression::Identifier(FlatVariable::new(0)), + // box FlatExpression::Identifier(FlatVariable::new(0)), + // ), + // ), + // FlatStatement::Definition( + // FlatVariable::new(2), + // FlatExpression::Mult( + // box FlatExpression::Identifier(FlatVariable::new(1)), + // box FlatExpression::Identifier(FlatVariable::new(0)), + // ), + // ), + // FlatStatement::Definition( + // FlatVariable::new(3), + // FlatExpression::Mult( + // box FlatExpression::Identifier(FlatVariable::new(2)), + // box FlatExpression::Identifier(FlatVariable::new(0)), + // ), + // ), + // FlatStatement::Return(FlatExpressionList { + // expressions: vec![FlatExpression::Identifier(FlatVariable::new(3))], + // }), + // ], + // signature: Signature::new().outputs(vec![Type::FieldElement]), + // }; + + // let flattened = flattener.flatten_function(&mut vec![], function); + + // assert_eq!(flattened, expected); + // } + + // #[test] + // fn overload() { + // // def foo() + // // return 1 + // // def foo() + // // return 1, 2 + // // def main() + // // a = foo() + // // b, c = foo() + // // return 1 + // // + // // should not panic + // // + + // let mut flattener = Flattener::new(); + // let functions = vec![ + // TypedFunction { + // id: "foo".to_string(), + // arguments: vec![], + // statements: vec![TypedStatement::Return(vec![TypedExpression::FieldElement( + // FieldElementExpression::Number(FieldPrime::from(1)), + // )])], + // signature: Signature::new() + // .inputs(vec![]) + // .outputs(vec![Type::FieldElement]), + // }, + // TypedFunction { + // id: "foo".to_string(), + // arguments: vec![], + // statements: vec![TypedStatement::Return(vec![ + // TypedExpression::FieldElement(FieldElementExpression::Number( + // FieldPrime::from(1), + // )), + // TypedExpression::FieldElement(FieldElementExpression::Number( + // FieldPrime::from(2), + // )), + // ])], + // signature: Signature::new() + // .inputs(vec![]) + // .outputs(vec![Type::FieldElement, Type::FieldElement]), + // }, + // TypedFunction { + // id: "main".to_string(), + // arguments: vec![], + // statements: vec![ + // TypedStatement::Definition( + // TypedAssignee::Identifier(Variable::field_element("a")), + // TypedExpression::FieldElement(FieldElementExpression::FunctionCall( + // "foo".to_string(), + // vec![], + // )), + // ), + // TypedStatement::MultipleDefinition( + // vec![ + // Variable::field_element("b".to_string()), + // Variable::field_element("c".to_string()), + // ], + // TypedExpressionList::FunctionCall( + // "foo".to_string(), + // vec![], + // vec![Type::FieldElement, Type::FieldElement], + // ), + // ), + // TypedStatement::Return(vec![TypedExpression::FieldElement( + // FieldElementExpression::Number(FieldPrime::from(1)), + // )]), + // ], + // signature: Signature::new() + // .inputs(vec![]) + // .outputs(vec![Type::FieldElement]), + // }, + // ]; + + // flattener.flatten_program(TypedModule { + // functions: functions + // .into_iter() + // .map(|f| { + // ( + // FunctionKey { + // id: f.id.clone(), + // signature: f.signature.clone(), + // }, + // f, + // ) + // }) + // .collect(), + // imported_functions: vec![], + // imports: vec![], + // }); + + // // shouldn't panic + // } + + // #[test] + // fn if_else() { + // let mut flattener = Flattener::new(); + // let expression = FieldElementExpression::IfElse( + // box BooleanExpression::Eq( + // box FieldElementExpression::Number(FieldPrime::from(32)), + // box FieldElementExpression::Number(FieldPrime::from(4)), + // ), + // box FieldElementExpression::Number(FieldPrime::from(12)), + // box FieldElementExpression::Number(FieldPrime::from(51)), + // ); + + // let mut functions_flattened = vec![]; + // flattener.load_corelib(&mut functions_flattened); + + // flattener.flatten_field_expression(&functions_flattened, &mut vec![], expression); + // } + + // #[test] + // fn geq_leq() { + // let mut flattener = Flattener::new(); + // let expression_le = BooleanExpression::Le( + // box FieldElementExpression::Number(FieldPrime::from(32)), + // box FieldElementExpression::Number(FieldPrime::from(4)), + // ); + + // let expression_ge = BooleanExpression::Ge( + // box FieldElementExpression::Number(FieldPrime::from(32)), + // box FieldElementExpression::Number(FieldPrime::from(4)), + // ); + + // flattener.flatten_boolean_expression(&mut vec![], &mut vec![], expression_le); + + // flattener.flatten_boolean_expression(&mut vec![], &mut vec![], expression_ge); + // } + + // #[test] + // fn bool_and() { + // let expression = FieldElementExpression::IfElse( + // box BooleanExpression::And( + // box BooleanExpression::Eq( + // box FieldElementExpression::Number(FieldPrime::from(4)), + // box FieldElementExpression::Number(FieldPrime::from(4)), + // ), + // box BooleanExpression::Lt( + // box FieldElementExpression::Number(FieldPrime::from(4)), + // box FieldElementExpression::Number(FieldPrime::from(20)), + // ), + // ), + // box FieldElementExpression::Number(FieldPrime::from(12)), + // box FieldElementExpression::Number(FieldPrime::from(51)), + // ); + + // let mut flattener = Flattener::new(); + // let mut functions_flattened = vec![]; + // flattener.load_corelib(&mut functions_flattened); + // flattener.flatten_field_expression(&functions_flattened, &mut vec![], expression); + // } + + // #[test] + // fn div() { + // // a = 5 / b / b + // let mut flattener = Flattener::new(); + // let mut functions_flattened = vec![]; + // let mut statements_flattened = vec![]; + + // let definition = TypedStatement::Definition( + // TypedAssignee::Identifier(Variable::field_element("b")), + // FieldElementExpression::Number(FieldPrime::from(42)).into(), + // ); + + // let statement = TypedStatement::Definition( + // TypedAssignee::Identifier(Variable::field_element("a")), + // FieldElementExpression::Div( + // box FieldElementExpression::Div( + // box FieldElementExpression::Number(FieldPrime::from(5)), + // box FieldElementExpression::Identifier(String::from("b")), + // ), + // box FieldElementExpression::Identifier(String::from("b")), + // ) + // .into(), + // ); + + // flattener.flatten_statement( + // &mut functions_flattened, + // &mut statements_flattened, + // definition, + // ); + + // flattener.flatten_statement( + // &mut functions_flattened, + // &mut statements_flattened, + // statement, + // ); + + // // define b + // let b = FlatVariable::new(0); + // // define new wires for members of Div + // let five = FlatVariable::new(1); + // let b0 = FlatVariable::new(2); + // // Define inverse of denominator to prevent div by 0 + // let invb0 = FlatVariable::new(3); + // // Define inverse + // let sym_0 = FlatVariable::new(4); + // // Define result, which is first member to next Div + // let sym_1 = FlatVariable::new(5); + // // Define second member + // let b1 = FlatVariable::new(6); + // // Define inverse of denominator to prevent div by 0 + // let invb1 = FlatVariable::new(7); + // // Define inverse + // let sym_2 = FlatVariable::new(8); + // // Define left hand side + // let a = FlatVariable::new(9); + + // assert_eq!( + // statements_flattened, + // vec![ + // FlatStatement::Definition(b, FlatExpression::Number(FieldPrime::from(42))), + // // inputs to first div (5/b) + // FlatStatement::Definition(five, FlatExpression::Number(FieldPrime::from(5))), + // FlatStatement::Definition(b0, b.into()), + // // check div by 0 + // FlatStatement::Directive(DirectiveStatement::new( + // vec![invb0], + // Helper::Rust(RustHelper::Div), + // vec![FlatExpression::Number(FieldPrime::from(1)), b0.into()] + // )), + // FlatStatement::Condition( + // FlatExpression::Number(FieldPrime::from(1)), + // FlatExpression::Mult(box invb0.into(), box b0.into()), + // ), + // // execute div + // FlatStatement::Directive(DirectiveStatement::new( + // vec![sym_0], + // Helper::Rust(RustHelper::Div), + // vec![five, b0] + // )), + // FlatStatement::Condition( + // five.into(), + // FlatExpression::Mult(box b0.into(), box sym_0.into()), + // ), + // // inputs to second div (res/b) + // FlatStatement::Definition(sym_1, sym_0.into()), + // FlatStatement::Definition(b1, b.into()), + // // check div by 0 + // FlatStatement::Directive(DirectiveStatement::new( + // vec![invb1], + // Helper::Rust(RustHelper::Div), + // vec![FlatExpression::Number(FieldPrime::from(1)), b1.into()] + // )), + // FlatStatement::Condition( + // FlatExpression::Number(FieldPrime::from(1)), + // FlatExpression::Mult(box invb1.into(), box b1.into()), + // ), + // // execute div + // FlatStatement::Directive(DirectiveStatement::new( + // vec![sym_2], + // Helper::Rust(RustHelper::Div), + // vec![sym_1, b1] + // )), + // FlatStatement::Condition( + // sym_1.into(), + // FlatExpression::Mult(box b1.into(), box sym_2.into()), + // ), + // // result + // FlatStatement::Definition(a, sym_2.into()), + // ] + // ); + // } + + // #[test] + // fn field_array() { + // // foo = [ , , ] + + // let mut flattener = Flattener::new(); + // let mut functions_flattened = vec![]; + // let mut statements_flattened = vec![]; + // let statement = TypedStatement::Definition( + // TypedAssignee::Identifier(Variable::field_array("foo", 3)), + // FieldElementArrayExpression::Value( + // 3, + // vec![ + // FieldElementExpression::Number(FieldPrime::from(1)), + // FieldElementExpression::Number(FieldPrime::from(2)), + // FieldElementExpression::Number(FieldPrime::from(3)), + // ], + // ) + // .into(), + // ); + // let expression = FieldElementArrayExpression::Identifier(3, String::from("foo")); + + // flattener.flatten_statement( + // &mut functions_flattened, + // &mut statements_flattened, + // statement, + // ); + + // let expressions = flattener.flatten_field_array_expression( + // &mut functions_flattened, + // &mut statements_flattened, + // expression, + // ); + + // assert_eq!( + // expressions, + // vec![ + // FlatExpression::Identifier(FlatVariable::new(0)), + // FlatExpression::Identifier(FlatVariable::new(1)), + // FlatExpression::Identifier(FlatVariable::new(2)), + // ] + // ); + // } + + // #[test] + // fn array_definition() { + // // field[3] foo = [1, 2, 3] + + // let mut flattener = Flattener::new(); + // let mut functions_flattened = vec![]; + // let mut statements_flattened = vec![]; + // let statement = TypedStatement::Definition( + // TypedAssignee::Identifier(Variable::field_array("foo", 3)), + // FieldElementArrayExpression::Value( + // 3, + // vec![ + // FieldElementExpression::Number(FieldPrime::from(1)), + // FieldElementExpression::Number(FieldPrime::from(2)), + // FieldElementExpression::Number(FieldPrime::from(3)), + // ], + // ) + // .into(), + // ); + + // flattener.flatten_statement( + // &mut functions_flattened, + // &mut statements_flattened, + // statement, + // ); + + // assert_eq!( + // statements_flattened, + // vec![ + // FlatStatement::Definition( + // FlatVariable::new(0), + // FlatExpression::Number(FieldPrime::from(1)) + // ), + // FlatStatement::Definition( + // FlatVariable::new(1), + // FlatExpression::Number(FieldPrime::from(2)) + // ), + // FlatStatement::Definition( + // FlatVariable::new(2), + // FlatExpression::Number(FieldPrime::from(3)) + // ), + // ] + // ); + // } + + // #[test] + // fn array_selection() { + // // field[3] foo = [1, 2, 3] + // // foo[1] + + // let mut flattener = Flattener::new(); + // let mut functions_flattened = vec![]; + // let mut statements_flattened = vec![]; + // let statement = TypedStatement::Definition( + // TypedAssignee::Identifier(Variable::field_array("foo", 3)), + // FieldElementArrayExpression::Value( + // 3, + // vec![ + // FieldElementExpression::Number(FieldPrime::from(1)), + // FieldElementExpression::Number(FieldPrime::from(2)), + // FieldElementExpression::Number(FieldPrime::from(3)), + // ], + // ) + // .into(), + // ); + + // let expression = FieldElementExpression::Select( + // box FieldElementArrayExpression::Identifier(3, String::from("foo")), + // box FieldElementExpression::Number(FieldPrime::from(1)), + // ); + + // flattener.flatten_statement::( + // &mut functions_flattened, + // &mut statements_flattened, + // statement, + // ); + + // let flat_expression = flattener.flatten_field_expression::( + // &mut functions_flattened, + // &mut statements_flattened, + // expression, + // ); + + // assert_eq!( + // flat_expression, + // FlatExpression::Identifier(FlatVariable::new(1)), + // ); + // } + + // #[test] + // fn array_sum() { + // // field[3] foo = [1, 2, 3] + // // bar = foo[0] + foo[1] + foo[2] + // // we don't optimise detecting constants, this will be done in an optimiser pass + + // let mut flattener = Flattener::new(); + // let mut functions_flattened = vec![]; + // let mut statements_flattened = vec![]; + // let def = TypedStatement::Definition( + // TypedAssignee::Identifier(Variable::field_array("foo", 3)), + // FieldElementArrayExpression::Value( + // 3, + // vec![ + // FieldElementExpression::Number(FieldPrime::from(1)), + // FieldElementExpression::Number(FieldPrime::from(2)), + // FieldElementExpression::Number(FieldPrime::from(3)), + // ], + // ) + // .into(), + // ); + + // let sum = TypedStatement::Definition( + // TypedAssignee::Identifier(Variable::field_element("bar")), + // FieldElementExpression::Add( + // box FieldElementExpression::Add( + // box FieldElementExpression::Select( + // box FieldElementArrayExpression::Identifier(3, String::from("foo")), + // box FieldElementExpression::Number(FieldPrime::from(0)), + // ), + // box FieldElementExpression::Select( + // box FieldElementArrayExpression::Identifier(3, String::from("foo")), + // box FieldElementExpression::Number(FieldPrime::from(1)), + // ), + // ), + // box FieldElementExpression::Select( + // box FieldElementArrayExpression::Identifier(3, String::from("foo")), + // box FieldElementExpression::Number(FieldPrime::from(2)), + // ), + // ) + // .into(), + // ); + + // flattener.flatten_statement::( + // &mut functions_flattened, + // &mut statements_flattened, + // def, + // ); + + // flattener.flatten_statement::( + // &mut functions_flattened, + // &mut statements_flattened, + // sum, + // ); + + // assert_eq!( + // statements_flattened[3], + // FlatStatement::Definition( + // FlatVariable::new(3), + // FlatExpression::Add( + // box FlatExpression::Add( + // box FlatExpression::Identifier(FlatVariable::new(0)), + // box FlatExpression::Identifier(FlatVariable::new(1)), + // ), + // box FlatExpression::Identifier(FlatVariable::new(2)), + // ) + // ) + // ); + // } + + // #[test] + // fn array_if() { + // // if 1 == 1 then [1] else [3] fi + + // let with_arrays = { + // let mut flattener = Flattener::new(); + // let mut functions_flattened = vec![]; + // flattener.load_corelib(&mut functions_flattened); + // let mut statements_flattened = vec![]; + + // let e = FieldElementArrayExpression::IfElse( + // box BooleanExpression::Eq( + // box FieldElementExpression::Number(FieldPrime::from(1)), + // box FieldElementExpression::Number(FieldPrime::from(1)), + // ), + // box FieldElementArrayExpression::Value( + // 1, + // vec![FieldElementExpression::Number(FieldPrime::from(1))], + // ), + // box FieldElementArrayExpression::Value( + // 1, + // vec![FieldElementExpression::Number(FieldPrime::from(3))], + // ), + // ); + + // ( + // flattener.flatten_field_array_expression( + // &mut functions_flattened, + // &mut statements_flattened, + // e, + // )[0] + // .clone(), + // statements_flattened, + // ) + // }; + + // let without_arrays = { + // let mut flattener = Flattener::new(); + // let mut functions_flattened = vec![]; + // flattener.load_corelib(&mut functions_flattened); + // let mut statements_flattened = vec![]; + + // // if 1 == 1 then 1 else 3 fi + // let e = FieldElementExpression::IfElse( + // box BooleanExpression::Eq( + // box FieldElementExpression::Number(FieldPrime::from(1)), + // box FieldElementExpression::Number(FieldPrime::from(1)), + // ), + // box FieldElementExpression::Number(FieldPrime::from(1)), + // box FieldElementExpression::Number(FieldPrime::from(3)), + // ); + + // ( + // flattener.flatten_field_expression( + // &mut functions_flattened, + // &mut statements_flattened, + // e, + // ), + // statements_flattened, + // ) + // }; + + // assert_eq!(with_arrays, without_arrays); + // } + + // #[test] + // fn next_variable() { + // let mut flattener = Flattener::new(); + // assert_eq!( + // FlatVariable::new(0), + // flattener.use_variable(&String::from("a")) + // ); + // assert_eq!( + // flattener.get_latest_var_substitution(&String::from("a")), + // FlatVariable::new(0) + // ); + // assert_eq!( + // FlatVariable::new(1), + // flattener.use_variable(&String::from("a")) + // ); + // assert_eq!( + // flattener.get_latest_var_substitution(&String::from("a")), + // FlatVariable::new(1) + // ); + // assert_eq!( + // FlatVariable::new(2), + // flattener.use_variable(&String::from("a")) + // ); + // assert_eq!( + // flattener.get_latest_var_substitution(&String::from("a")), + // FlatVariable::new(2) + // ); + // } } diff --git a/zokrates_core/src/static_analysis/inline.rs b/zokrates_core/src/static_analysis/inline.rs new file mode 100644 index 000000000..99caf67df --- /dev/null +++ b/zokrates_core/src/static_analysis/inline.rs @@ -0,0 +1,125 @@ +use std::collections::HashMap; +use typed_absy::folder::fold_boolean_expression; +use typed_absy::folder::fold_field_array_expression; +use typed_absy::folder::fold_field_expression; +use typed_absy::folder::fold_statement; +use typed_absy::BooleanExpression; +use typed_absy::FieldElementArrayExpression; +use typed_absy::FieldElementExpression; +use typed_absy::TypedStatement; +use typed_absy::{ + Folder, TypedFunctionSymbol, TypedModule, TypedModuleId, TypedModules, TypedProgram, +}; +use types::FunctionKey; +use zokrates_field::field::Field; + +pub struct Inliner<'a, T: Field> { + modules: &'a TypedModules, + symbols: &'a HashMap>, + statement_buffer: Vec>, +} + +impl<'a, T: Field> Inliner<'a, T> { + fn with_modules_and_module_id(modules: &'a TypedModules, module_id: TypedModuleId) -> Self { + Inliner { + modules, + symbols: &modules.get(&module_id).unwrap().functions, + statement_buffer: vec![], + } + } + + pub fn inline(p: TypedProgram) -> TypedProgram { + let mut modules = p.modules.clone(); + modules.insert(String::from("main"), p.main.clone()); + Inliner::with_modules_and_module_id(&modules, String::from("main")).fold_program(p) + } + + fn flush(self) -> Vec> { + self.statement_buffer + } +} + +impl<'a, T: Field> Folder for Inliner<'a, T> { + fn fold_program(&mut self, p: TypedProgram) -> TypedProgram { + let main_module = p.main; + + let (main_key, main) = main_module + .functions + .iter() + .find(|(k, _)| k.id == "main") + .unwrap(); + + let main = self.fold_function_symbol(main.clone()); + + TypedProgram { + main: TypedModule { + functions: std::iter::once((main_key.clone(), main)).collect(), + imports: vec![], + }, + modules: HashMap::new(), + } + } + + fn fold_statement(&mut self, s: TypedStatement) -> Vec> { + match s { + TypedStatement::MultipleDefinition(..) => { + println!("multidef!"); + unimplemented!() + } + s => fold_statement(self, s), + } + } + + fn fold_field_expression(&mut self, e: FieldElementExpression) -> FieldElementExpression { + match e { + FieldElementExpression::FunctionCall(key, expressions) => { + // get the symbol + let symbol = self.symbols.get(&key).cloned().unwrap(); + match symbol { + TypedFunctionSymbol::Here(f) => { + // if it's here, we can inline the call recursively with the same checker as the context is the same + let statements: Vec<_> = f + .statements + .clone() + .into_iter() + .flat_map(|s| self.fold_statement(s)) + .collect(); + self.statement_buffer.extend(statements); + } + TypedFunctionSymbol::There(function_key, typed_module_id) => { + // if it's there, create a new Inliner, inline there and get the statements back + let mut inliner = Inliner::with_modules_and_module_id( + self.modules, + typed_module_id.clone(), + ); + let function = self + .modules + .get(&typed_module_id) + .unwrap() + .functions + .get(&function_key) + .unwrap(); + inliner.fold_function_symbol(function.clone()); + self.statement_buffer.extend(inliner.flush()); + } + TypedFunctionSymbol::Flat(..) => unimplemented!(), + } + FieldElementExpression::Number(T::from(4242)) + } + e => fold_field_expression(self, e), + } + } + + fn fold_field_array_expression( + &mut self, + e: FieldElementArrayExpression, + ) -> FieldElementArrayExpression { + match e { + FieldElementArrayExpression::FunctionCall(..) => { + println!("field element array call!"); + unimplemented!() + } + e => fold_field_array_expression(self, e), + } + } +} diff --git a/zokrates_core/src/static_analysis/mod.rs b/zokrates_core/src/static_analysis/mod.rs index 3395e8ef1..b7348ffb5 100644 --- a/zokrates_core/src/static_analysis/mod.rs +++ b/zokrates_core/src/static_analysis/mod.rs @@ -6,11 +6,13 @@ mod core_lib_injector; mod flat_propagation; +mod inline; mod power_check; mod propagation; mod unroll; use self::core_lib_injector::CoreLibInjector; +use self::inline::Inliner; use self::power_check::PowerChecker; use self::propagation::Propagator; use self::unroll::Unroller; @@ -28,6 +30,9 @@ impl Analyse for TypedProgram { let r = PowerChecker::check(self); // unroll let r = Unroller::unroll(r); + // inline + let r = Inliner::inline(r); + println!("{}", r); // propagate let r = Propagator::propagate(r); // inject core lib diff --git a/zokrates_core/src/typed_absy/mod.rs b/zokrates_core/src/typed_absy/mod.rs index 1f04b4d11..9e482ba1a 100644 --- a/zokrates_core/src/typed_absy/mod.rs +++ b/zokrates_core/src/typed_absy/mod.rs @@ -22,7 +22,7 @@ use zokrates_field::field::Field; pub use self::folder::Folder; -type Identifier = String; +pub type Identifier = String; pub type TypedModuleId = String; From 4c5b9d5376871c10c5b10bc7c0357840decbdfa8 Mon Sep 17 00:00:00 2001 From: schaeff Date: Thu, 23 May 2019 19:32:28 +0200 Subject: [PATCH 020/162] implement inliner.wip --- .../examples/arrays/update_with_call.code | 5 +- zokrates_core/src/absy/mod.rs | 2 +- zokrates_core/src/compile.rs | 9 +- zokrates_core/src/flatten/mod.rs | 12 +- zokrates_core/src/imports.rs | 28 +- zokrates_core/src/semantics.rs | 13 +- .../src/static_analysis/core_lib_injector.rs | 2 +- zokrates_core/src/static_analysis/inline.rs | 786 ++++++++++++++++-- zokrates_core/src/static_analysis/mod.rs | 4 +- zokrates_core/src/typed_absy/folder.rs | 2 +- zokrates_core/src/typed_absy/mod.rs | 20 +- zokrates_core/src/types/mod.rs | 4 + 12 files changed, 801 insertions(+), 86 deletions(-) diff --git a/zokrates_cli/examples/arrays/update_with_call.code b/zokrates_cli/examples/arrays/update_with_call.code index fcc3eb1a3..d6b107c93 100644 --- a/zokrates_cli/examples/arrays/update_with_call.code +++ b/zokrates_cli/examples/arrays/update_with_call.code @@ -1,9 +1,8 @@ def foo(field a) -> (field): return 2 -def main(field a) -> (field, field): +def main(field a) -> (field): field[2] result = [0, 0] field r = foo(a) result[1] = r - result[1] == r - return result[1], r \ No newline at end of file + return 1 \ No newline at end of file diff --git a/zokrates_core/src/absy/mod.rs b/zokrates_core/src/absy/mod.rs index f4d15b2f9..328e98bae 100644 --- a/zokrates_core/src/absy/mod.rs +++ b/zokrates_core/src/absy/mod.rs @@ -31,7 +31,7 @@ pub type FunctionDeclarations = Vec>; pub struct Program { pub modules: HashMap>, - pub main: Module, + pub main: ModuleId, } #[derive(PartialEq, Debug, Clone)] diff --git a/zokrates_core/src/compile.rs b/zokrates_core/src/compile.rs index 735568b09..9fe714ba6 100644 --- a/zokrates_core/src/compile.rs +++ b/zokrates_core/src/compile.rs @@ -159,9 +159,14 @@ pub fn compile_program ) -> Result, CompileErrors> { let mut modules = HashMap::new(); - let main = compile_module(reader, location, resolve_option, &mut modules)?; + let main = compile_module(reader, location.clone(), resolve_option, &mut modules)?; - Ok(Program { main, modules }) + modules.insert(location.clone().unwrap(), main); + + Ok(Program { + main: location.unwrap(), + modules, + }) } pub fn compile_module>( diff --git a/zokrates_core/src/flatten/mod.rs b/zokrates_core/src/flatten/mod.rs index 608cc01ea..6c54b7d3d 100644 --- a/zokrates_core/src/flatten/mod.rs +++ b/zokrates_core/src/flatten/mod.rs @@ -458,9 +458,12 @@ impl Flattener { ) -> FlatExpression { match expr { FieldElementExpression::Number(x) => FlatExpression::Number(x), // force to be a field element - FieldElementExpression::Identifier(x) => { - FlatExpression::Identifier(self.bijection.get_by_left(&x).unwrap().clone()) - } + FieldElementExpression::Identifier(x) => FlatExpression::Identifier( + self.bijection + .get_by_left(&x) + .expect(&format!("{} should be defined", x)) + .clone(), + ), FieldElementExpression::Add(box left, box right) => { let left_flattened = self.flatten_field_expression(symbols, statements_flattened, left); @@ -1173,7 +1176,7 @@ impl Flattener { /// /// * `prog` - `Prog`ram that will be flattened. fn flatten_program(&mut self, prog: TypedProgram) -> FlatProg { - let main_module = prog.main; + let main_module = prog.modules.get(&prog.main).unwrap().clone(); self.modules = prog.modules; @@ -1229,6 +1232,7 @@ impl Flattener { key: &FunctionKey, symbols: &'a HashMap>, ) -> FlatFunction { + println!("search {:#?} in {:#?}", key, symbols.keys()); let f = symbols.get(&key).unwrap().clone(); self.flatten_function_symbol(symbols, f) } diff --git a/zokrates_core/src/imports.rs b/zokrates_core/src/imports.rs index d7ce401b6..c6f287c28 100644 --- a/zokrates_core/src/imports.rs +++ b/zokrates_core/src/imports.rs @@ -131,8 +131,19 @@ impl Importer { let compiled = sha_round(); let alias = match import.alias { - Some(ref alias) => alias.clone(), - None => String::from("sha256round"), + Some(ref alias) => { + if alias == "sha256" { + alias.clone() + } else { + return Err(CompileErrorInner::from(Error::new(format!( + "Aliasing gadgets is not supported, found alias {}", + alias + ))) + .with_context(&location) + .into()); + } + } + None => String::from("sha256"), }; functions.push( @@ -158,7 +169,18 @@ impl Importer { "PACKING/split" => { let compiled = split(); let alias = match import.alias { - Some(ref alias) => alias.clone(), + Some(ref alias) => { + if alias == "split" { + alias.clone() + } else { + return Err(CompileErrorInner::from(Error::new(format!( + "Aliasing gadgets is not supported, found alias {}", + alias + ))) + .with_context(&location) + .into()); + } + } None => String::from("split"), }; diff --git a/zokrates_core/src/semantics.rs b/zokrates_core/src/semantics.rs index 4d88cf5da..1f2fc455f 100644 --- a/zokrates_core/src/semantics.rs +++ b/zokrates_core/src/semantics.rs @@ -133,14 +133,17 @@ impl Checker { program: Program, ) -> Result, Vec> { let mut modules = program.modules; + let main = modules.remove(&program.main).unwrap(); let mut typed_modules = HashMap::new(); - let main_module = self.check_module(program.main, &mut modules, &mut typed_modules)?; + let main_module = self.check_module(main, &mut modules, &mut typed_modules)?; Checker::check_single_main(&main_module).map_err(|e| vec![e])?; + typed_modules.insert(program.main.clone(), main_module); + Ok(TypedProgram { - main: main_module, + main: program.main, modules: typed_modules, }) } @@ -2024,8 +2027,10 @@ mod tests { }; let program = Program { - modules: HashMap::new(), - main: main_module, + modules: vec![(String::from("main"), main_module)] + .into_iter() + .collect(), + main: String::from("main"), }; let mut checker = Checker::new(); diff --git a/zokrates_core/src/static_analysis/core_lib_injector.rs b/zokrates_core/src/static_analysis/core_lib_injector.rs index fc8ab4751..ab6eeaabf 100644 --- a/zokrates_core/src/static_analysis/core_lib_injector.rs +++ b/zokrates_core/src/static_analysis/core_lib_injector.rs @@ -105,7 +105,7 @@ impl Folder for CoreLibInjector { }; TypedProgram { - main: self.fold_module(p.main), + main: p.main, modules: p .modules .into_iter() diff --git a/zokrates_core/src/static_analysis/inline.rs b/zokrates_core/src/static_analysis/inline.rs index 99caf67df..9df68ae77 100644 --- a/zokrates_core/src/static_analysis/inline.rs +++ b/zokrates_core/src/static_analysis/inline.rs @@ -1,47 +1,111 @@ use std::collections::HashMap; -use typed_absy::folder::fold_boolean_expression; -use typed_absy::folder::fold_field_array_expression; -use typed_absy::folder::fold_field_expression; -use typed_absy::folder::fold_statement; -use typed_absy::BooleanExpression; -use typed_absy::FieldElementArrayExpression; -use typed_absy::FieldElementExpression; -use typed_absy::TypedStatement; -use typed_absy::{ - Folder, TypedFunctionSymbol, TypedModule, TypedModuleId, TypedModules, TypedProgram, -}; +use typed_absy::{folder::*, *}; use types::FunctionKey; use zokrates_field::field::Field; +#[derive(Debug)] pub struct Inliner<'a, T: Field> { modules: &'a TypedModules, - symbols: &'a HashMap>, + module_id: TypedModuleId, statement_buffer: Vec>, + context: Vec<(TypedModuleId, FunctionKey, usize)>, + call_count: HashMap<(TypedModuleId, FunctionKey), usize>, } impl<'a, T: Field> Inliner<'a, T> { - fn with_modules_and_module_id(modules: &'a TypedModules, module_id: TypedModuleId) -> Self { + fn with_modules_and_module_id_and_call_count_and_context>( + modules: &'a TypedModules, + module_id: S, + call_count: HashMap<(TypedModuleId, FunctionKey), usize>, + context: Vec<(TypedModuleId, FunctionKey, usize)>, + ) -> Self { Inliner { modules, - symbols: &modules.get(&module_id).unwrap().functions, + module_id: module_id.into(), statement_buffer: vec![], + call_count, + context, } } pub fn inline(p: TypedProgram) -> TypedProgram { - let mut modules = p.modules.clone(); - modules.insert(String::from("main"), p.main.clone()); - Inliner::with_modules_and_module_id(&modules, String::from("main")).fold_program(p) + let modules = p.modules.clone(); + let context = vec![]; + let call_count = HashMap::new(); + Inliner::with_modules_and_module_id_and_call_count_and_context( + &modules, + p.main.clone(), + call_count, + context, + ) + .fold_program(p) } - fn flush(self) -> Vec> { - self.statement_buffer + fn inline_call( + &mut self, + function: &TypedFunction, + expressions: Vec>, + ) -> Vec> { + // add definitions for the inputs + let inputs_bindings: Vec<_> = function + .arguments + .iter() + .zip(expressions) + .map(|(a, e)| { + TypedStatement::Definition( + TypedAssignee::Identifier(self.fold_variable(a.id.clone())), + e, + ) + }) + .collect(); + + self.statement_buffer.extend(inputs_bindings); + + // filter out the return statement and keep it aside + let (statements, ret): (Vec<_>, Vec<_>) = function + .statements + .clone() + .into_iter() + .flat_map(|s| self.fold_statement(s)) + .partition(|s| match s { + TypedStatement::Return(..) => false, + _ => true, + }); + + // add all statements to the buffer + self.statement_buffer.extend(statements); + + self.context.pop(); + + match ret[0].clone() { + TypedStatement::Return(exprs) => exprs, + _ => panic!(""), + } + } + + fn fork(&mut self, module_id: TypedModuleId) -> Self { + Self::with_modules_and_module_id_and_call_count_and_context( + &self.modules, + module_id, + std::mem::replace(&mut self.call_count, HashMap::new()), + std::mem::replace(&mut self.context, vec![]), + ) + } + + fn merge(&mut self, other: Inliner) { + self.statement_buffer.extend(other.statement_buffer); + self.call_count = other.call_count; + self.context = other.context; + } + + fn module(&self) -> &TypedModule { + self.modules.get(&self.module_id).unwrap() } } impl<'a, T: Field> Folder for Inliner<'a, T> { fn fold_program(&mut self, p: TypedProgram) -> TypedProgram { - let main_module = p.main; + let main_module = p.modules.get(&p.main).unwrap().clone(); let (main_key, main) = main_module .functions @@ -51,60 +115,152 @@ impl<'a, T: Field> Folder for Inliner<'a, T> { let main = self.fold_function_symbol(main.clone()); + // TODO import flat used anywhere here :/ + // maybe flag them when we find a call to them and then add them here with the correct path + + let split = crate::types::conversions::split(); + let split_key = FunctionKey::with_id("split").signature(split.signature.clone()); + + let sha_round = crate::standard::sha_round(); + let sha_round_key = FunctionKey::with_id("sha256").signature(sha_round.signature.clone()); + TypedProgram { - main: TypedModule { - functions: std::iter::once((main_key.clone(), main)).collect(), - imports: vec![], - }, - modules: HashMap::new(), + main: String::from("main"), + modules: vec![( + String::from("main"), + TypedModule { + functions: vec![ + (split_key, TypedFunctionSymbol::Flat(split)), + (sha_round_key, TypedFunctionSymbol::Flat(sha_round)), + (main_key.clone(), main), + ] + .into_iter() + .collect(), + imports: vec![], + }, + )] + .into_iter() + .collect(), } } fn fold_statement(&mut self, s: TypedStatement) -> Vec> { - match s { - TypedStatement::MultipleDefinition(..) => { - println!("multidef!"); - unimplemented!() + let folded = match s { + TypedStatement::MultipleDefinition(variables, elist) => { + match elist { + TypedExpressionList::FunctionCall(key, expressions, types) => { + let expressions: Vec<_> = expressions + .into_iter() + .map(|e| self.fold_expression(e)) + .collect(); + + let expressions = expressions + .into_iter() + .map(|e| self.fold_expression(e)) + .collect(); + // get the symbol + let symbol = self.module().functions.get(&key).unwrap().clone(); + match symbol { + TypedFunctionSymbol::Here(function) => { + self.call_count + .entry((self.module_id.clone(), key.clone())) + .and_modify(|i| *i += 1) + .or_insert(1); + self.context.push(( + self.module_id.clone(), + key.clone(), + *self + .call_count + .get(&(self.module_id.clone(), key.clone())) + .unwrap(), + )); + // if it's here, we can inline the call recursively with the same checker as the context is the same + let ret = self.inline_call(&function, expressions); + let variables: Vec<_> = variables + .into_iter() + .map(|a| self.fold_variable(a)) + .collect(); + variables + .into_iter() + .zip(ret.into_iter()) + .map(|(v, e)| { + TypedStatement::Definition(TypedAssignee::Identifier(v), e) + }) + .collect() + } + TypedFunctionSymbol::There(function_key, typed_module_id) => { + // if it's there, create a new Inliner, inline there and get the statements back + // calling `There(key, module)` is calling `key` in `module` + let mut inliner = self.fork(typed_module_id); // create a new inliner for `typed_module_id` with the call count starting from where we got to + let statements = + inliner.fold_statement(TypedStatement::MultipleDefinition( + variables, + TypedExpressionList::FunctionCall( + function_key, + expressions, + types, + ), + )); // inline the function call + self.merge(inliner); // merge the inliner back + statements + } + _ => vec![TypedStatement::MultipleDefinition( + variables, + TypedExpressionList::FunctionCall(key, expressions, types), + )], + // we do not inline flat calls as we can't do it before flattening + } + } + } } s => fold_statement(self, s), - } + }; + self.statement_buffer.drain(..).chain(folded).collect() } fn fold_field_expression(&mut self, e: FieldElementExpression) -> FieldElementExpression { match e { FieldElementExpression::FunctionCall(key, expressions) => { + let expressions = expressions + .into_iter() + .map(|e| self.fold_expression(e)) + .collect(); // get the symbol - let symbol = self.symbols.get(&key).cloned().unwrap(); + let symbol = self.module().functions.get(&key).unwrap().clone(); match symbol { - TypedFunctionSymbol::Here(f) => { + TypedFunctionSymbol::Here(function) => { // if it's here, we can inline the call recursively with the same checker as the context is the same - let statements: Vec<_> = f - .statements - .clone() - .into_iter() - .flat_map(|s| self.fold_statement(s)) - .collect(); - self.statement_buffer.extend(statements); + + self.call_count + .entry((self.module_id.clone(), key.clone())) + .and_modify(|i| *i += 1) + .or_insert(1); + self.context.push(( + self.module_id.clone(), + key.clone(), + *self + .call_count + .get(&(self.module_id.clone(), key.clone())) + .unwrap(), + )); + let ret = self.inline_call(&function, expressions); + match ret[0].clone() { + TypedExpression::FieldElement(e) => e, + _ => unreachable!(), + } } TypedFunctionSymbol::There(function_key, typed_module_id) => { // if it's there, create a new Inliner, inline there and get the statements back - let mut inliner = Inliner::with_modules_and_module_id( - self.modules, - typed_module_id.clone(), - ); - let function = self - .modules - .get(&typed_module_id) - .unwrap() - .functions - .get(&function_key) - .unwrap(); - inliner.fold_function_symbol(function.clone()); - self.statement_buffer.extend(inliner.flush()); + // calling `There(key, module)` is calling `key` in `module` + let mut inliner = self.fork(typed_module_id); // create a new inliner for `typed_module_id` with the call count starting from where we got to + let expression = inliner.fold_field_expression( + FieldElementExpression::FunctionCall(function_key, expressions), + ); // inline the function call + self.merge(inliner); // merge the inliner back + expression // return the return expression } - TypedFunctionSymbol::Flat(..) => unimplemented!(), + _ => FieldElementExpression::FunctionCall(key, expressions), // we do not inline flat calls as we can't do it before flattening } - FieldElementExpression::Number(T::from(4242)) } e => fold_field_expression(self, e), } @@ -115,11 +271,527 @@ impl<'a, T: Field> Folder for Inliner<'a, T> { e: FieldElementArrayExpression, ) -> FieldElementArrayExpression { match e { - FieldElementArrayExpression::FunctionCall(..) => { - println!("field element array call!"); - unimplemented!() + FieldElementArrayExpression::FunctionCall(size, key, expressions) => { + // get the symbol + let symbol = self.module().functions.get(&key).unwrap().clone(); + match symbol { + TypedFunctionSymbol::Here(function) => { + // if it's here, we can inline the call recursively with the same checker as the context is the same + + self.call_count + .entry((self.module_id.clone(), key.clone())) + .and_modify(|i| *i += 1) + .or_insert(1); + self.context.push(( + self.module_id.clone(), + key.clone(), + *self + .call_count + .get(&(self.module_id.clone(), key.clone())) + .unwrap(), + )); + let ret = self.inline_call(&function, expressions); + + match ret[0].clone() { + TypedExpression::FieldElementArray(e) => e, + _ => unreachable!(), + } + } + TypedFunctionSymbol::There(function_key, typed_module_id) => { + // if it's there, create a new Inliner, inline there and get the statements back + // calling `There(key, module)` is calling `key` in `module` + let mut inliner = self.fork(typed_module_id); // create a new inliner for `typed_module_id` with the call count starting from where we got to + let expression = inliner.fold_field_array_expression( + FieldElementArrayExpression::FunctionCall( + size, + function_key, + expressions, + ), + ); // inline the function call + self.merge(inliner); // merge the inliner back + expression // return the return expression + } + _ => FieldElementArrayExpression::FunctionCall(size, key, expressions), + } } e => fold_field_array_expression(self, e), } } + + // prefix all names with context + fn fold_name(&mut self, n: String) -> String { + match self.context.len() { + 0 => n, + _ => format!( + "{}_{}", + self.context + .iter() + .map(|(module_id, function_key, i)| format!( + "{}::{}_{}", + module_id, function_key.to_slug(), i + )) + .collect::>() + .join("_"), + n + ), + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + use std::collections::HashMap; + use types::{FunctionKey, Signature, Type}; + use zokrates_field::field::FieldPrime; + + #[test] + fn call_other_module_without_variables() { + // // main + // from "foo" import foo + // def main() -> (field): + // return foo() + // + // // foo + // def foo() -> (field): + // return 42 + // + // + // // inlined + // def main() -> (field): + // return 42 + + let main = TypedModule { + functions: vec![ + ( + FunctionKey::with_id("main") + .signature(Signature::new().outputs(vec![Type::FieldElement])), + TypedFunctionSymbol::Here(TypedFunction { + arguments: vec![], + statements: vec![TypedStatement::Return(vec![ + FieldElementExpression::FunctionCall( + FunctionKey::with_id("foo") + .signature(Signature::new().outputs(vec![Type::FieldElement])), + vec![], + ) + .into(), + ])], + signature: Signature::new().outputs(vec![Type::FieldElement]), + }), + ), + ( + FunctionKey::with_id("foo") + .signature(Signature::new().outputs(vec![Type::FieldElement])), + TypedFunctionSymbol::There( + FunctionKey::with_id("foo") + .signature(Signature::new().outputs(vec![Type::FieldElement])), + String::from("foo"), + ), + ), + ] + .into_iter() + .collect(), + imports: vec![], + }; + + let foo = TypedModule { + functions: vec![( + FunctionKey::with_id("foo") + .signature(Signature::new().outputs(vec![Type::FieldElement])), + TypedFunctionSymbol::Here(TypedFunction { + arguments: vec![], + statements: vec![TypedStatement::Return(vec![ + FieldElementExpression::Number(FieldPrime::from(42)).into(), + ])], + signature: Signature::new().outputs(vec![Type::FieldElement]), + }), + )] + .into_iter() + .collect(), + imports: vec![], + }; + + let modules: HashMap<_, _> = vec![(String::from("main"), main), (String::from("foo"), foo)] + .into_iter() + .collect(); + + let program = TypedProgram { + main: String::from("main"), + modules, + }; + + let program = Inliner::inline(program); + + assert_eq!(program.modules.len(), 1); + assert_eq!( + program + .modules + .get(&String::from("main")) + .unwrap() + .functions + .get( + &FunctionKey::with_id("main") + .signature(Signature::new().outputs(vec![Type::FieldElement])) + ) + .unwrap(), + &TypedFunctionSymbol::Here(TypedFunction { + arguments: vec![], + statements: vec![TypedStatement::Return(vec![ + FieldElementExpression::Number(FieldPrime::from(42)).into(), + ])], + signature: Signature::new().outputs(vec![Type::FieldElement]), + }) + ); + } + + #[test] + fn call_other_module_with_variables() { + // // main + // from "foo" import foo + // def main(field a) -> (field): + // return a * foo(a) + // + // // foo + // def foo(field a) -> (field): + // return a * a + // + // + // // inlined + // def main() -> (field): + // field a_0 = a + // return a * a_0 * a_0 + + let main = TypedModule { + functions: vec![ + ( + FunctionKey::with_id("main").signature( + Signature::new() + .inputs(vec![Type::FieldElement]) + .outputs(vec![Type::FieldElement]), + ), + TypedFunctionSymbol::Here(TypedFunction { + arguments: vec![Parameter::private(Variable::field_element("a"))], + statements: vec![TypedStatement::Return(vec![ + FieldElementExpression::Mult( + box FieldElementExpression::Identifier(String::from("a")), + box FieldElementExpression::FunctionCall( + FunctionKey::with_id("foo").signature( + Signature::new() + .inputs(vec![Type::FieldElement]) + .outputs(vec![Type::FieldElement]), + ), + vec![FieldElementExpression::Identifier(String::from("a")) + .into()], + ), + ) + .into(), + ])], + signature: Signature::new() + .inputs(vec![Type::FieldElement]) + .outputs(vec![Type::FieldElement]), + }), + ), + ( + FunctionKey::with_id("foo").signature( + Signature::new() + .inputs(vec![Type::FieldElement]) + .outputs(vec![Type::FieldElement]), + ), + TypedFunctionSymbol::There( + FunctionKey::with_id("foo").signature( + Signature::new() + .inputs(vec![Type::FieldElement]) + .outputs(vec![Type::FieldElement]), + ), + String::from("foo"), + ), + ), + ] + .into_iter() + .collect(), + imports: vec![], + }; + + let foo = TypedModule { + functions: vec![( + FunctionKey::with_id("foo").signature( + Signature::new() + .inputs(vec![Type::FieldElement]) + .outputs(vec![Type::FieldElement]), + ), + TypedFunctionSymbol::Here(TypedFunction { + arguments: vec![Parameter::private(Variable::field_element("a"))], + statements: vec![TypedStatement::Return(vec![FieldElementExpression::Mult( + box FieldElementExpression::Identifier(String::from("a")), + box FieldElementExpression::Identifier(String::from("a")), + ) + .into()])], + signature: Signature::new() + .inputs(vec![Type::FieldElement]) + .outputs(vec![Type::FieldElement]), + }), + )] + .into_iter() + .collect(), + imports: vec![], + }; + + let modules: HashMap<_, _> = vec![(String::from("main"), main), (String::from("foo"), foo)] + .into_iter() + .collect(); + + let program: TypedProgram = TypedProgram { + main: String::from("main"), + modules, + }; + + let program = Inliner::inline(program); + + assert_eq!(program.modules.len(), 1); + + assert_eq!( + program + .modules + .get(&String::from("main")) + .unwrap() + .functions + .get( + &FunctionKey::with_id("main").signature( + Signature::new() + .inputs(vec![Type::FieldElement]) + .outputs(vec![Type::FieldElement]) + ) + ) + .unwrap(), + &TypedFunctionSymbol::Here(TypedFunction { + arguments: vec![Parameter::private(Variable::field_element("a"))], + statements: vec![ + TypedStatement::Definition( + TypedAssignee::Identifier(Variable::field_element("a_0")), + FieldElementExpression::Identifier(String::from("a")).into() + ), + TypedStatement::Return(vec![FieldElementExpression::Mult( + box FieldElementExpression::Identifier(String::from("a")), + box FieldElementExpression::Mult( + box FieldElementExpression::Identifier(String::from("a_0")), + box FieldElementExpression::Identifier(String::from("a_0")) + ) + ) + .into(),]) + ], + signature: Signature::new() + .inputs(vec![Type::FieldElement]) + .outputs(vec![Type::FieldElement]), + }) + ); + } + + #[test] + fn multi_def_from_other_module() { + // // foo + // def foo() -> (field): + // return 42 + + // // main + // def main() -> (field): + // field b = foo() + // return b + + // inlined + // def main() -> (field) + // field a_0 = 42 + // return a_0 + + let main = TypedModule { + functions: vec![ + ( + FunctionKey::with_id("main") + .signature(Signature::new().outputs(vec![Type::FieldElement])), + TypedFunctionSymbol::Here(TypedFunction { + arguments: vec![], + statements: vec![ + TypedStatement::MultipleDefinition( + vec![Variable::field_element("a")], + TypedExpressionList::FunctionCall( + FunctionKey::with_id("foo").signature( + Signature::new().outputs(vec![Type::FieldElement]), + ), + vec![], + vec![Type::FieldElement], + ), + ), + TypedStatement::Return(vec![FieldElementExpression::Identifier( + String::from("a"), + ) + .into()]), + ], + signature: Signature::new().outputs(vec![Type::FieldElement]), + }), + ), + ( + FunctionKey::with_id("foo") + .signature(Signature::new().outputs(vec![Type::FieldElement])), + TypedFunctionSymbol::There( + FunctionKey::with_id("foo") + .signature(Signature::new().outputs(vec![Type::FieldElement])), + String::from("foo"), + ), + ), + ] + .into_iter() + .collect(), + imports: vec![], + }; + + let foo = TypedModule { + functions: vec![( + FunctionKey::with_id("foo") + .signature(Signature::new().outputs(vec![Type::FieldElement])), + TypedFunctionSymbol::Here(TypedFunction { + arguments: vec![], + statements: vec![TypedStatement::Return(vec![ + FieldElementExpression::Number(FieldPrime::from(42)).into(), + ])], + signature: Signature::new().outputs(vec![Type::FieldElement]), + }), + )] + .into_iter() + .collect(), + imports: vec![], + }; + + let modules: HashMap<_, _> = vec![(String::from("main"), main), (String::from("foo"), foo)] + .into_iter() + .collect(); + + let program = TypedProgram { + main: String::from("main"), + modules, + }; + + let program = Inliner::inline(program); + + assert_eq!(program.modules.len(), 1); + assert_eq!( + program + .modules + .get(&String::from("main")) + .unwrap() + .functions + .get( + &FunctionKey::with_id("main") + .signature(Signature::new().outputs(vec![Type::FieldElement])) + ) + .unwrap(), + &TypedFunctionSymbol::Here(TypedFunction { + arguments: vec![], + statements: vec![ + TypedStatement::Definition( + TypedAssignee::Identifier(Variable::field_element("a_0")), + FieldElementExpression::Number(FieldPrime::from(42)).into() + ), + TypedStatement::Return(vec![FieldElementExpression::Identifier(String::from( + "a_0" + )) + .into(),]) + ], + signature: Signature::new().outputs(vec![Type::FieldElement]), + }) + ); + } + + #[test] + fn multi_def_from_same_module() { + // // main + // def foo() -> (field): + // return 42 + // def main() -> (field): + // field a = foo() + // return a + + // inlined + // def main() -> (field) + // field a_0 = 42 + // return a_0 + + let main = TypedModule { + functions: vec![ + ( + FunctionKey::with_id("main") + .signature(Signature::new().outputs(vec![Type::FieldElement])), + TypedFunctionSymbol::Here(TypedFunction { + arguments: vec![], + statements: vec![ + TypedStatement::MultipleDefinition( + vec![Variable::field_element("a")], + TypedExpressionList::FunctionCall( + FunctionKey::with_id("foo").signature( + Signature::new().outputs(vec![Type::FieldElement]), + ), + vec![], + vec![Type::FieldElement], + ), + ), + TypedStatement::Return(vec![FieldElementExpression::Identifier( + String::from("a"), + ) + .into()]), + ], + signature: Signature::new().outputs(vec![Type::FieldElement]), + }), + ), + ( + FunctionKey::with_id("foo") + .signature(Signature::new().outputs(vec![Type::FieldElement])), + TypedFunctionSymbol::Here(TypedFunction { + arguments: vec![], + statements: vec![TypedStatement::Return(vec![ + FieldElementExpression::Number(FieldPrime::from(42)).into(), + ])], + signature: Signature::new().outputs(vec![Type::FieldElement]), + }), + ), + ] + .into_iter() + .collect(), + imports: vec![], + }; + + let modules: HashMap<_, _> = vec![(String::from("main"), main)].into_iter().collect(); + + let program = TypedProgram { + main: String::from("main"), + modules, + }; + + let program = Inliner::inline(program); + + assert_eq!(program.modules.len(), 1); + assert_eq!( + program + .modules + .get(&String::from("main")) + .unwrap() + .functions + .get( + &FunctionKey::with_id("main") + .signature(Signature::new().outputs(vec![Type::FieldElement])) + ) + .unwrap(), + &TypedFunctionSymbol::Here(TypedFunction { + arguments: vec![], + statements: vec![ + TypedStatement::Definition( + TypedAssignee::Identifier(Variable::field_element("a_0")), + FieldElementExpression::Number(FieldPrime::from(42)).into() + ), + TypedStatement::Return(vec![FieldElementExpression::Identifier(String::from( + "a_0" + )) + .into(),]) + ], + signature: Signature::new().outputs(vec![Type::FieldElement]), + }) + ); + } } diff --git a/zokrates_core/src/static_analysis/mod.rs b/zokrates_core/src/static_analysis/mod.rs index b7348ffb5..b6f10f716 100644 --- a/zokrates_core/src/static_analysis/mod.rs +++ b/zokrates_core/src/static_analysis/mod.rs @@ -26,15 +26,15 @@ pub trait Analyse { impl Analyse for TypedProgram { fn analyse(self) -> Self { - println!("{}", self); let r = PowerChecker::check(self); // unroll let r = Unroller::unroll(r); + println!("CHECKED\n{}", r); // inline let r = Inliner::inline(r); - println!("{}", r); // propagate let r = Propagator::propagate(r); + println!("HEYYY\n{}", r); // inject core lib let r = CoreLibInjector::inject(r); r diff --git a/zokrates_core/src/typed_absy/folder.rs b/zokrates_core/src/typed_absy/folder.rs index 44443cc74..bd26f1cee 100644 --- a/zokrates_core/src/typed_absy/folder.rs +++ b/zokrates_core/src/typed_absy/folder.rs @@ -298,6 +298,6 @@ pub fn fold_program>(f: &mut F, p: TypedProgram) -> Ty .into_iter() .map(|(module_id, module)| (module_id, f.fold_module(module))) .collect(), - main: f.fold_module(p.main), + main: p.main, } } diff --git a/zokrates_core/src/typed_absy/mod.rs b/zokrates_core/src/typed_absy/mod.rs index 9e482ba1a..93eff6839 100644 --- a/zokrates_core/src/typed_absy/mod.rs +++ b/zokrates_core/src/typed_absy/mod.rs @@ -33,18 +33,22 @@ pub type TypedFunctionSymbols = HashMap>; #[derive(PartialEq, Debug)] pub struct TypedProgram { pub modules: TypedModules, - pub main: TypedModule, + pub main: TypedModuleId, } impl fmt::Display for TypedProgram { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - writeln!(f, "| main: |")?; - writeln!(f, "{}", "-".repeat(100))?; - writeln!(f, "{}", self.main)?; - writeln!(f, "{}", "-".repeat(100))?; - writeln!(f, "")?; for (module_id, module) in &self.modules { - writeln!(f, "| {}: |", module_id)?; + writeln!( + f, + "| {}: |{}", + module_id, + if *module_id == self.main { + "<---- main" + } else { + "" + } + )?; writeln!(f, "{}", "-".repeat(100))?; writeln!(f, "{}", module)?; writeln!(f, "{}", "-".repeat(100))?; @@ -118,7 +122,7 @@ impl fmt::Debug for TypedModule { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!( f, - "program(\n\timports:\n\t\t{}\n\tfunctions:\n\t\t{}\n)", + "module(\n\timports:\n\t\t{}\n\tfunctions:\n\t\t{}\n)", self.imports .iter() .map(|x| format!("{:?}", x)) diff --git a/zokrates_core/src/types/mod.rs b/zokrates_core/src/types/mod.rs index 66a2998ff..137f1cf2d 100644 --- a/zokrates_core/src/types/mod.rs +++ b/zokrates_core/src/types/mod.rs @@ -122,6 +122,10 @@ impl FunctionKey { self.signature = signature; self } + + pub fn to_slug(&self) -> String { + format!("{}_{}", self.id, self.signature.to_slug()) + } } #[cfg(test)] From 7ebd8b9aad8a1447f0865ca8087b745b05039719 Mon Sep 17 00:00:00 2001 From: schaeff Date: Thu, 23 May 2019 19:32:34 +0200 Subject: [PATCH 021/162] implement inliner.wip --- zokrates_core/src/static_analysis/inline.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/zokrates_core/src/static_analysis/inline.rs b/zokrates_core/src/static_analysis/inline.rs index 9df68ae77..844059b8f 100644 --- a/zokrates_core/src/static_analysis/inline.rs +++ b/zokrates_core/src/static_analysis/inline.rs @@ -328,7 +328,9 @@ impl<'a, T: Field> Folder for Inliner<'a, T> { .iter() .map(|(module_id, function_key, i)| format!( "{}::{}_{}", - module_id, function_key.to_slug(), i + module_id, + function_key.to_slug(), + i )) .collect::>() .join("_"), From 645ea26dc2d62f9e25116ffd12b54536f26c6164 Mon Sep 17 00:00:00 2001 From: schaeff Date: Fri, 24 May 2019 13:18:29 +0200 Subject: [PATCH 022/162] use flattener technique for inliner --- .../examples/arrays/update_with_call.code | 5 +- zokrates_core/src/compile.rs | 7 +- zokrates_core/src/flatten/mod.rs | 1 - zokrates_core/src/static_analysis/inline.rs | 225 +++++++++--------- zokrates_core/src/static_analysis/mod.rs | 2 - zokrates_core/src/types/mod.rs | 13 - zokrates_core/src/types/signature.rs | 89 ------- 7 files changed, 126 insertions(+), 216 deletions(-) diff --git a/zokrates_cli/examples/arrays/update_with_call.code b/zokrates_cli/examples/arrays/update_with_call.code index d6b107c93..fcc3eb1a3 100644 --- a/zokrates_cli/examples/arrays/update_with_call.code +++ b/zokrates_cli/examples/arrays/update_with_call.code @@ -1,8 +1,9 @@ def foo(field a) -> (field): return 2 -def main(field a) -> (field): +def main(field a) -> (field, field): field[2] result = [0, 0] field r = foo(a) result[1] = r - return 1 \ No newline at end of file + result[1] == r + return result[1], r \ No newline at end of file diff --git a/zokrates_core/src/compile.rs b/zokrates_core/src/compile.rs index 9fe714ba6..0681b1532 100644 --- a/zokrates_core/src/compile.rs +++ b/zokrates_core/src/compile.rs @@ -128,6 +128,7 @@ pub fn compile>( location: Option, resolve_option: Option, &String) -> Result<(S, String, String), E>>, ) -> Result, CompileErrors> { + println!("{:?}", location); let compiled = compile_program(reader, location.clone(), resolve_option)?; // check semantics @@ -161,10 +162,12 @@ pub fn compile_program let main = compile_module(reader, location.clone(), resolve_option, &mut modules)?; - modules.insert(location.clone().unwrap(), main); + let location = location.unwrap_or("???".to_string()); + + modules.insert(location.clone(), main); Ok(Program { - main: location.unwrap(), + main: location, modules, }) } diff --git a/zokrates_core/src/flatten/mod.rs b/zokrates_core/src/flatten/mod.rs index 6c54b7d3d..9e2ad9179 100644 --- a/zokrates_core/src/flatten/mod.rs +++ b/zokrates_core/src/flatten/mod.rs @@ -1232,7 +1232,6 @@ impl Flattener { key: &FunctionKey, symbols: &'a HashMap>, ) -> FlatFunction { - println!("search {:#?} in {:#?}", key, symbols.keys()); let f = symbols.get(&key).unwrap().clone(); self.flatten_function_symbol(symbols, f) } diff --git a/zokrates_core/src/static_analysis/inline.rs b/zokrates_core/src/static_analysis/inline.rs index 844059b8f..59e521516 100644 --- a/zokrates_core/src/static_analysis/inline.rs +++ b/zokrates_core/src/static_analysis/inline.rs @@ -1,6 +1,6 @@ -use std::collections::HashMap; +use bimap::BiMap; use typed_absy::{folder::*, *}; -use types::FunctionKey; +use types::{FunctionKey, Type}; use zokrates_field::field::Field; #[derive(Debug)] @@ -8,35 +8,33 @@ pub struct Inliner<'a, T: Field> { modules: &'a TypedModules, module_id: TypedModuleId, statement_buffer: Vec>, - context: Vec<(TypedModuleId, FunctionKey, usize)>, - call_count: HashMap<(TypedModuleId, FunctionKey), usize>, + bijection: BiMap, + next_var_idx: usize, } impl<'a, T: Field> Inliner<'a, T> { - fn with_modules_and_module_id_and_call_count_and_context>( + fn with_modules_and_module_id_and_bijection_and_next_var_idx>( modules: &'a TypedModules, module_id: S, - call_count: HashMap<(TypedModuleId, FunctionKey), usize>, - context: Vec<(TypedModuleId, FunctionKey, usize)>, + bijection: BiMap, + next_var_idx: usize, ) -> Self { Inliner { modules, module_id: module_id.into(), statement_buffer: vec![], - call_count, - context, + bijection, + next_var_idx, } } pub fn inline(p: TypedProgram) -> TypedProgram { let modules = p.modules.clone(); - let context = vec![]; - let call_count = HashMap::new(); - Inliner::with_modules_and_module_id_and_call_count_and_context( + Inliner::with_modules_and_module_id_and_bijection_and_next_var_idx( &modules, p.main.clone(), - call_count, - context, + BiMap::new(), + 0, ) .fold_program(p) } @@ -53,7 +51,7 @@ impl<'a, T: Field> Inliner<'a, T> { .zip(expressions) .map(|(a, e)| { TypedStatement::Definition( - TypedAssignee::Identifier(self.fold_variable(a.id.clone())), + self.fold_assignee(TypedAssignee::Identifier(a.id.clone())), e, ) }) @@ -75,7 +73,7 @@ impl<'a, T: Field> Inliner<'a, T> { // add all statements to the buffer self.statement_buffer.extend(statements); - self.context.pop(); + //self.context.pop(); match ret[0].clone() { TypedStatement::Return(exprs) => exprs, @@ -84,23 +82,41 @@ impl<'a, T: Field> Inliner<'a, T> { } fn fork(&mut self, module_id: TypedModuleId) -> Self { - Self::with_modules_and_module_id_and_call_count_and_context( + Self::with_modules_and_module_id_and_bijection_and_next_var_idx( &self.modules, module_id, - std::mem::replace(&mut self.call_count, HashMap::new()), - std::mem::replace(&mut self.context, vec![]), + std::mem::replace(&mut self.bijection, BiMap::new()), + self.next_var_idx, ) } fn merge(&mut self, other: Inliner) { self.statement_buffer.extend(other.statement_buffer); - self.call_count = other.call_count; - self.context = other.context; + self.bijection = other.bijection; + self.next_var_idx = other.next_var_idx; } fn module(&self) -> &TypedModule { self.modules.get(&self.module_id).unwrap() } + + /// Checks if the given name is a not used variable and returns a fresh variable. + /// # Arguments + /// + /// * `name` - a String that holds the name of the variable + fn use_variable(&mut self, name: &Variable) -> Variable { + // issue the variable we'll use + let var = self.issue_new_variable(name.get_type()); + + self.bijection.insert(name.clone(), var.clone()); + var + } + + fn issue_new_variable(&mut self, ty: Type) -> Variable { + let var = Variable::new(format!("_{}", self.next_var_idx.to_string()), ty); + self.next_var_idx += 1; + var + } } impl<'a, T: Field> Folder for Inliner<'a, T> { @@ -144,41 +160,31 @@ impl<'a, T: Field> Folder for Inliner<'a, T> { } } + fn fold_parameter(&mut self, p: Parameter) -> Parameter { + Parameter { + id: self.use_variable(&p.id), + ..p + } + } + fn fold_statement(&mut self, s: TypedStatement) -> Vec> { let folded = match s { TypedStatement::MultipleDefinition(variables, elist) => { match elist { TypedExpressionList::FunctionCall(key, expressions, types) => { - let expressions: Vec<_> = expressions - .into_iter() - .map(|e| self.fold_expression(e)) - .collect(); - - let expressions = expressions - .into_iter() - .map(|e| self.fold_expression(e)) - .collect(); // get the symbol let symbol = self.module().functions.get(&key).unwrap().clone(); match symbol { TypedFunctionSymbol::Here(function) => { - self.call_count - .entry((self.module_id.clone(), key.clone())) - .and_modify(|i| *i += 1) - .or_insert(1); - self.context.push(( - self.module_id.clone(), - key.clone(), - *self - .call_count - .get(&(self.module_id.clone(), key.clone())) - .unwrap(), - )); // if it's here, we can inline the call recursively with the same checker as the context is the same + let expressions = expressions + .into_iter() + .map(|e| self.fold_expression(e)) + .collect(); let ret = self.inline_call(&function, expressions); let variables: Vec<_> = variables .into_iter() - .map(|a| self.fold_variable(a)) + .map(|a| self.use_variable(&a)) .collect(); variables .into_iter() @@ -205,8 +211,18 @@ impl<'a, T: Field> Folder for Inliner<'a, T> { statements } _ => vec![TypedStatement::MultipleDefinition( - variables, - TypedExpressionList::FunctionCall(key, expressions, types), + variables + .into_iter() + .map(|a| self.use_variable(&a)) + .collect(), + TypedExpressionList::FunctionCall( + key, + expressions + .into_iter() + .map(|e| self.fold_expression(e)) + .collect(), + types, + ), )], // we do not inline flat calls as we can't do it before flattening } @@ -220,29 +236,19 @@ impl<'a, T: Field> Folder for Inliner<'a, T> { fn fold_field_expression(&mut self, e: FieldElementExpression) -> FieldElementExpression { match e { + FieldElementExpression::Identifier(id) => FieldElementExpression::Identifier( + self.fold_variable(Variable::field_element(id)).id, + ), FieldElementExpression::FunctionCall(key, expressions) => { - let expressions = expressions - .into_iter() - .map(|e| self.fold_expression(e)) - .collect(); // get the symbol let symbol = self.module().functions.get(&key).unwrap().clone(); match symbol { TypedFunctionSymbol::Here(function) => { // if it's here, we can inline the call recursively with the same checker as the context is the same - - self.call_count - .entry((self.module_id.clone(), key.clone())) - .and_modify(|i| *i += 1) - .or_insert(1); - self.context.push(( - self.module_id.clone(), - key.clone(), - *self - .call_count - .get(&(self.module_id.clone(), key.clone())) - .unwrap(), - )); + let expressions = expressions + .into_iter() + .map(|e| self.fold_expression(e)) + .collect(); let ret = self.inline_call(&function, expressions); match ret[0].clone() { TypedExpression::FieldElement(e) => e, @@ -259,7 +265,13 @@ impl<'a, T: Field> Folder for Inliner<'a, T> { self.merge(inliner); // merge the inliner back expression // return the return expression } - _ => FieldElementExpression::FunctionCall(key, expressions), // we do not inline flat calls as we can't do it before flattening + _ => FieldElementExpression::FunctionCall( + key, + expressions + .into_iter() + .map(|e| self.fold_expression(e)) + .collect(), + ), // we do not inline flat calls as we can't do it before flattening } } e => fold_field_expression(self, e), @@ -271,25 +283,22 @@ impl<'a, T: Field> Folder for Inliner<'a, T> { e: FieldElementArrayExpression, ) -> FieldElementArrayExpression { match e { + FieldElementArrayExpression::Identifier(size, id) => { + FieldElementArrayExpression::Identifier( + size, + self.fold_variable(Variable::field_array(id, size)).id, + ) + } FieldElementArrayExpression::FunctionCall(size, key, expressions) => { // get the symbol let symbol = self.module().functions.get(&key).unwrap().clone(); match symbol { TypedFunctionSymbol::Here(function) => { // if it's here, we can inline the call recursively with the same checker as the context is the same - - self.call_count - .entry((self.module_id.clone(), key.clone())) - .and_modify(|i| *i += 1) - .or_insert(1); - self.context.push(( - self.module_id.clone(), - key.clone(), - *self - .call_count - .get(&(self.module_id.clone(), key.clone())) - .unwrap(), - )); + let expressions = expressions + .into_iter() + .map(|e| self.fold_expression(e)) + .collect(); let ret = self.inline_call(&function, expressions); match ret[0].clone() { @@ -311,7 +320,14 @@ impl<'a, T: Field> Folder for Inliner<'a, T> { self.merge(inliner); // merge the inliner back expression // return the return expression } - _ => FieldElementArrayExpression::FunctionCall(size, key, expressions), + _ => FieldElementArrayExpression::FunctionCall( + size, + key, + expressions + .into_iter() + .map(|e| self.fold_expression(e)) + .collect(), + ), } } e => fold_field_array_expression(self, e), @@ -319,22 +335,17 @@ impl<'a, T: Field> Folder for Inliner<'a, T> { } // prefix all names with context - fn fold_name(&mut self, n: String) -> String { - match self.context.len() { - 0 => n, - _ => format!( - "{}_{}", - self.context - .iter() - .map(|(module_id, function_key, i)| format!( - "{}::{}_{}", - module_id, - function_key.to_slug(), - i - )) - .collect::>() - .join("_"), - n + fn fold_variable(&mut self, v: Variable) -> Variable { + self.bijection.get_by_left(&v).unwrap().clone() + } + + // introduce new variables in assignees + fn fold_assignee(&mut self, a: TypedAssignee) -> TypedAssignee { + match a { + TypedAssignee::Identifier(v) => TypedAssignee::Identifier(self.use_variable(&v)), + TypedAssignee::ArrayElement(box a, box index) => TypedAssignee::ArrayElement( + box self.fold_assignee(a), + box self.fold_field_expression(index), ), } } @@ -566,17 +577,17 @@ mod tests { ) .unwrap(), &TypedFunctionSymbol::Here(TypedFunction { - arguments: vec![Parameter::private(Variable::field_element("a"))], + arguments: vec![Parameter::private(Variable::field_element("_0"))], statements: vec![ TypedStatement::Definition( - TypedAssignee::Identifier(Variable::field_element("a_0")), - FieldElementExpression::Identifier(String::from("a")).into() + TypedAssignee::Identifier(Variable::field_element("_1")), + FieldElementExpression::Identifier(String::from("_0")).into() ), TypedStatement::Return(vec![FieldElementExpression::Mult( - box FieldElementExpression::Identifier(String::from("a")), + box FieldElementExpression::Identifier(String::from("_0")), box FieldElementExpression::Mult( - box FieldElementExpression::Identifier(String::from("a_0")), - box FieldElementExpression::Identifier(String::from("a_0")) + box FieldElementExpression::Identifier(String::from("_1")), + box FieldElementExpression::Identifier(String::from("_1")) ) ) .into(),]) @@ -601,8 +612,8 @@ mod tests { // inlined // def main() -> (field) - // field a_0 = 42 - // return a_0 + // field _0 = 42 + // return _0 let main = TypedModule { functions: vec![ @@ -689,11 +700,11 @@ mod tests { arguments: vec![], statements: vec![ TypedStatement::Definition( - TypedAssignee::Identifier(Variable::field_element("a_0")), + TypedAssignee::Identifier(Variable::field_element("_0")), FieldElementExpression::Number(FieldPrime::from(42)).into() ), TypedStatement::Return(vec![FieldElementExpression::Identifier(String::from( - "a_0" + "_0" )) .into(),]) ], @@ -713,8 +724,8 @@ mod tests { // inlined // def main() -> (field) - // field a_0 = 42 - // return a_0 + // field _0 = 42 + // return _0 let main = TypedModule { functions: vec![ @@ -784,11 +795,11 @@ mod tests { arguments: vec![], statements: vec![ TypedStatement::Definition( - TypedAssignee::Identifier(Variable::field_element("a_0")), + TypedAssignee::Identifier(Variable::field_element("_0")), FieldElementExpression::Number(FieldPrime::from(42)).into() ), TypedStatement::Return(vec![FieldElementExpression::Identifier(String::from( - "a_0" + "_0" )) .into(),]) ], diff --git a/zokrates_core/src/static_analysis/mod.rs b/zokrates_core/src/static_analysis/mod.rs index b6f10f716..91385c2b7 100644 --- a/zokrates_core/src/static_analysis/mod.rs +++ b/zokrates_core/src/static_analysis/mod.rs @@ -29,12 +29,10 @@ impl Analyse for TypedProgram { let r = PowerChecker::check(self); // unroll let r = Unroller::unroll(r); - println!("CHECKED\n{}", r); // inline let r = Inliner::inline(r); // propagate let r = Propagator::propagate(r); - println!("HEYYY\n{}", r); // inject core lib let r = CoreLibInjector::inject(r); r diff --git a/zokrates_core/src/types/mod.rs b/zokrates_core/src/types/mod.rs index 137f1cf2d..01897da4e 100644 --- a/zokrates_core/src/types/mod.rs +++ b/zokrates_core/src/types/mod.rs @@ -40,14 +40,6 @@ impl Type { Type::FieldElementArray(size) => size * Type::FieldElement.get_primitive_count(), } } - - fn to_slug(&self) -> String { - match *self { - Type::FieldElement => String::from("f"), - Type::Boolean => String::from("b"), - Type::FieldElementArray(size) => format!("{}[{}]", Type::FieldElement.to_slug(), size), // TODO differentiate types? - } - } } #[derive(Serialize, Deserialize, Clone, PartialEq, Hash, Eq)] @@ -122,10 +114,6 @@ impl FunctionKey { self.signature = signature; self } - - pub fn to_slug(&self) -> String { - format!("{}_{}", self.id, self.signature.to_slug()) - } } #[cfg(test)] @@ -136,6 +124,5 @@ mod tests { fn array() { let t = Type::FieldElementArray(42); assert_eq!(t.get_primitive_count(), 42); - assert_eq!(t.to_slug(), "f[42]"); } } diff --git a/zokrates_core/src/types/signature.rs b/zokrates_core/src/types/signature.rs index 0727c063e..4eaa916f8 100644 --- a/zokrates_core/src/types/signature.rs +++ b/zokrates_core/src/types/signature.rs @@ -38,49 +38,6 @@ impl fmt::Display for Signature { } impl Signature { - /// Returns a slug for a signature, with the following encoding: - /// i{inputs}o{outputs} where {inputs} and {outputs} each encode a list of types. - /// A list of types is encoded by compressing sequences of the same type like so: - /// - /// [field, field, field] -> 3f - /// [field] -> f - /// [field, bool, field] -> fbf - /// [field, field, bool, field] -> 2fbf - /// - pub fn to_slug(&self) -> String { - let to_slug = |types| { - let mut res = vec![]; - for t in types { - let len = res.len(); - if len == 0 { - res.push((1, t)) - } else { - if res[len - 1].1 == t { - res[len - 1].0 += 1; - } else { - res.push((1, t)) - } - } - } - res.into_iter() - .map(|(n, t): (usize, &Type)| { - let mut r = String::new(); - - if n > 1 { - r.push_str(&format!("{}", n)); - } - r.push_str(&t.to_slug()); - r - }) - .fold(String::new(), |mut acc, e| { - acc.push_str(&e); - acc - }) - }; - - format!("i{}o{}", to_slug(&self.inputs), to_slug(&self.outputs)) - } - pub fn new() -> Signature { Signature { inputs: vec![], @@ -111,50 +68,4 @@ mod tests { assert_eq!(s.to_string(), String::from("(field, bool) -> (bool)")); } - - #[test] - fn slug_0() { - let s = Signature::new().inputs(vec![]).outputs(vec![]); - - assert_eq!(s.to_slug(), String::from("io")); - } - - #[test] - fn slug_1() { - let s = Signature::new() - .inputs(vec![Type::FieldElement, Type::Boolean]) - .outputs(vec![ - Type::FieldElement, - Type::FieldElement, - Type::Boolean, - Type::FieldElement, - ]); - - assert_eq!(s.to_slug(), String::from("ifbo2fbf")); - } - - #[test] - fn slug_2() { - let s = Signature::new() - .inputs(vec![ - Type::FieldElement, - Type::FieldElement, - Type::FieldElement, - ]) - .outputs(vec![Type::FieldElement, Type::Boolean, Type::FieldElement]); - - assert_eq!(s.to_slug(), String::from("i3fofbf")); - } - - #[test] - fn array_slug() { - let s = Signature::new() - .inputs(vec![ - Type::FieldElementArray(42), - Type::FieldElementArray(21), - ]) - .outputs(vec![]); - - assert_eq!(s.to_slug(), String::from("if[42]f[21]o")); - } } From 41a1b4d6751673fb9105e053566f27b95033186a Mon Sep 17 00:00:00 2001 From: schaeff Date: Mon, 27 May 2019 11:19:19 +0200 Subject: [PATCH 023/162] remove print --- zokrates_core/src/compile.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/zokrates_core/src/compile.rs b/zokrates_core/src/compile.rs index 0681b1532..4ee20bc16 100644 --- a/zokrates_core/src/compile.rs +++ b/zokrates_core/src/compile.rs @@ -128,7 +128,6 @@ pub fn compile>( location: Option, resolve_option: Option, &String) -> Result<(S, String, String), E>>, ) -> Result, CompileErrors> { - println!("{:?}", location); let compiled = compile_program(reader, location.clone(), resolve_option)?; // check semantics From 39685271d963ecf7fd0e719aabe465de758fc9a3 Mon Sep 17 00:00:00 2001 From: schaeff Date: Tue, 28 May 2019 11:54:52 +0200 Subject: [PATCH 024/162] improve inliner --- zokrates_core/src/flatten/mod.rs | 1 - zokrates_core/src/static_analysis/inline.rs | 520 +++++++++++--------- zokrates_core/src/static_analysis/mod.rs | 2 + 3 files changed, 293 insertions(+), 230 deletions(-) diff --git a/zokrates_core/src/flatten/mod.rs b/zokrates_core/src/flatten/mod.rs index 9e2ad9179..2b1d973a4 100644 --- a/zokrates_core/src/flatten/mod.rs +++ b/zokrates_core/src/flatten/mod.rs @@ -780,7 +780,6 @@ impl Flattener { fn flatten_field_array_expression( &mut self, symbols: &HashMap>, - statements_flattened: &mut Vec>, expr: FieldElementArrayExpression, ) -> Vec> { diff --git a/zokrates_core/src/static_analysis/inline.rs b/zokrates_core/src/static_analysis/inline.rs index 59e521516..e53dac878 100644 --- a/zokrates_core/src/static_analysis/inline.rs +++ b/zokrates_core/src/static_analysis/inline.rs @@ -1,20 +1,20 @@ use bimap::BiMap; use typed_absy::{folder::*, *}; -use types::{FunctionKey, Type}; +use types::FunctionKey; use zokrates_field::field::Field; #[derive(Debug)] -pub struct Inliner<'a, T: Field> { - modules: &'a TypedModules, +pub struct Inliner { + modules: TypedModules, module_id: TypedModuleId, statement_buffer: Vec>, bijection: BiMap, next_var_idx: usize, } -impl<'a, T: Field> Inliner<'a, T> { +impl Inliner { fn with_modules_and_module_id_and_bijection_and_next_var_idx>( - modules: &'a TypedModules, + modules: TypedModules, module_id: S, bijection: BiMap, next_var_idx: usize, @@ -29,110 +29,24 @@ impl<'a, T: Field> Inliner<'a, T> { } pub fn inline(p: TypedProgram) -> TypedProgram { - let modules = p.modules.clone(); - Inliner::with_modules_and_module_id_and_bijection_and_next_var_idx( - &modules, - p.main.clone(), - BiMap::new(), - 0, - ) - .fold_program(p) - } - - fn inline_call( - &mut self, - function: &TypedFunction, - expressions: Vec>, - ) -> Vec> { - // add definitions for the inputs - let inputs_bindings: Vec<_> = function - .arguments - .iter() - .zip(expressions) - .map(|(a, e)| { - TypedStatement::Definition( - self.fold_assignee(TypedAssignee::Identifier(a.id.clone())), - e, - ) - }) - .collect(); - - self.statement_buffer.extend(inputs_bindings); - - // filter out the return statement and keep it aside - let (statements, ret): (Vec<_>, Vec<_>) = function - .statements - .clone() - .into_iter() - .flat_map(|s| self.fold_statement(s)) - .partition(|s| match s { - TypedStatement::Return(..) => false, - _ => true, - }); - - // add all statements to the buffer - self.statement_buffer.extend(statements); - - //self.context.pop(); - - match ret[0].clone() { - TypedStatement::Return(exprs) => exprs, - _ => panic!(""), - } - } - - fn fork(&mut self, module_id: TypedModuleId) -> Self { - Self::with_modules_and_module_id_and_bijection_and_next_var_idx( - &self.modules, - module_id, - std::mem::replace(&mut self.bijection, BiMap::new()), - self.next_var_idx, - ) - } - - fn merge(&mut self, other: Inliner) { - self.statement_buffer.extend(other.statement_buffer); - self.bijection = other.bijection; - self.next_var_idx = other.next_var_idx; - } - - fn module(&self) -> &TypedModule { - self.modules.get(&self.module_id).unwrap() - } - - /// Checks if the given name is a not used variable and returns a fresh variable. - /// # Arguments - /// - /// * `name` - a String that holds the name of the variable - fn use_variable(&mut self, name: &Variable) -> Variable { - // issue the variable we'll use - let var = self.issue_new_variable(name.get_type()); + let main_module_id = p.main; - self.bijection.insert(name.clone(), var.clone()); - var - } - - fn issue_new_variable(&mut self, ty: Type) -> Variable { - let var = Variable::new(format!("_{}", self.next_var_idx.to_string()), ty); - self.next_var_idx += 1; - var - } -} - -impl<'a, T: Field> Folder for Inliner<'a, T> { - fn fold_program(&mut self, p: TypedProgram) -> TypedProgram { - let main_module = p.modules.get(&p.main).unwrap().clone(); + let main_module = p.modules.get(&main_module_id).unwrap().clone(); let (main_key, main) = main_module .functions - .iter() + .into_iter() .find(|(k, _)| k.id == "main") .unwrap(); - let main = self.fold_function_symbol(main.clone()); + let mut inliner = Inliner::with_modules_and_module_id_and_bijection_and_next_var_idx( + p.modules, + main_module_id, + BiMap::new(), + 0, + ); - // TODO import flat used anywhere here :/ - // maybe flag them when we find a call to them and then add them here with the correct path + let main = inliner.fold_function_symbol(main); let split = crate::types::conversions::split(); let split_key = FunctionKey::with_id("split").signature(split.signature.clone()); @@ -160,6 +74,93 @@ impl<'a, T: Field> Folder for Inliner<'a, T> { } } + // try to inline a call to function with key `key` in the context of `self` + // if inlining succeeds, return the expressions returned by the function call + // if inlining fails (as in the case of flat function symbols), return the arguments to the function call for further processing + fn try_inline_call( + &mut self, + key: &FunctionKey, + expressions: Vec>, + ) -> Result>, Vec>> { + // here we clone a function symbol, which is cheap except when it contains the function body, in which case we'd clone anyways + match self.module().functions.get(&key).unwrap().clone() { + // if the function called is in the same module, we can go ahead and inline in this module + TypedFunctionSymbol::Here(function) => { + // add definitions for the inputs + let inputs_bindings: Vec<_> = function + .arguments + .iter() + .zip(expressions) + .map(|(a, e)| { + TypedStatement::Definition( + self.fold_assignee(TypedAssignee::Identifier(a.id.clone())), + e, + ) + }) + .collect(); + + self.statement_buffer.extend(inputs_bindings); + + // filter out the return statement and keep it aside + let (statements, mut ret): (Vec<_>, Vec<_>) = function + .statements + .into_iter() + .flat_map(|s| self.fold_statement(s)) + .partition(|s| match s { + TypedStatement::Return(..) => false, + _ => true, + }); + + // add all statements to the buffer + self.statement_buffer.extend(statements); + + match ret.pop().unwrap() { + TypedStatement::Return(exprs) => Ok(exprs), + _ => panic!(""), + } + } + // if the function called is in some other module, we switch context to that module and call the function locally there + TypedFunctionSymbol::There(function_key, module_id) => { + let current_module = self.change_module(module_id); + let res = self.try_inline_call(&function_key, expressions)?; + self.change_module(current_module); + Ok(res) + } + // if the function is a flat symbol, there's nothing we can inline at this stage so we return the inputs + TypedFunctionSymbol::Flat(_) => Err(expressions), + } + } + + // Focus the Inliner on another module with id `module_id` and return the current `module_id` + fn change_module(&mut self, module_id: TypedModuleId) -> TypedModuleId { + std::mem::replace(&mut self.module_id, module_id) + } + + fn module(&self) -> &TypedModule { + self.modules.get(&self.module_id).unwrap() + } + + /// Checks if the given name is a not used variable and returns a fresh variable. + /// # Arguments + /// + /// * `variable` - a Variable that holds the name of the variable + fn use_variable(&mut self, variable: &Variable) -> Variable { + let name = self.issue_new_name(); + // issue the variable we'll use + let var = Variable::new(name.clone(), variable.get_type()); + + self.bijection.insert(variable.clone(), var.clone()); + var + } + + fn issue_new_name(&mut self) -> Identifier { + let var = format!("_{}", self.next_var_idx.to_string()); + self.next_var_idx += 1; + var + } +} + +impl Folder for Inliner { fn fold_parameter(&mut self, p: Parameter) -> Parameter { Parameter { id: self.use_variable(&p.id), @@ -169,66 +170,34 @@ impl<'a, T: Field> Folder for Inliner<'a, T> { fn fold_statement(&mut self, s: TypedStatement) -> Vec> { let folded = match s { - TypedStatement::MultipleDefinition(variables, elist) => { - match elist { - TypedExpressionList::FunctionCall(key, expressions, types) => { - // get the symbol - let symbol = self.module().functions.get(&key).unwrap().clone(); - match symbol { - TypedFunctionSymbol::Here(function) => { - // if it's here, we can inline the call recursively with the same checker as the context is the same - let expressions = expressions - .into_iter() - .map(|e| self.fold_expression(e)) - .collect(); - let ret = self.inline_call(&function, expressions); - let variables: Vec<_> = variables - .into_iter() - .map(|a| self.use_variable(&a)) - .collect(); - variables - .into_iter() - .zip(ret.into_iter()) - .map(|(v, e)| { - TypedStatement::Definition(TypedAssignee::Identifier(v), e) - }) - .collect() - } - TypedFunctionSymbol::There(function_key, typed_module_id) => { - // if it's there, create a new Inliner, inline there and get the statements back - // calling `There(key, module)` is calling `key` in `module` - let mut inliner = self.fork(typed_module_id); // create a new inliner for `typed_module_id` with the call count starting from where we got to - let statements = - inliner.fold_statement(TypedStatement::MultipleDefinition( - variables, - TypedExpressionList::FunctionCall( - function_key, - expressions, - types, - ), - )); // inline the function call - self.merge(inliner); // merge the inliner back - statements - } - _ => vec![TypedStatement::MultipleDefinition( - variables - .into_iter() - .map(|a| self.use_variable(&a)) - .collect(), - TypedExpressionList::FunctionCall( - key, - expressions - .into_iter() - .map(|e| self.fold_expression(e)) - .collect(), - types, - ), - )], - // we do not inline flat calls as we can't do it before flattening - } + TypedStatement::MultipleDefinition(variables, elist) => match elist { + TypedExpressionList::FunctionCall(key, expressions, types) => { + let expressions: Vec<_> = expressions + .into_iter() + .map(|e| self.fold_expression(e)) + .collect(); + + match self.try_inline_call(&key, expressions) { + Ok(ret) => variables + .into_iter() + .zip(ret.into_iter()) + .map(|(v, e)| { + TypedStatement::Definition( + TypedAssignee::Identifier(self.use_variable(&v)), + e, + ) + }) + .collect(), + Err(expressions) => vec![TypedStatement::MultipleDefinition( + variables + .into_iter() + .map(|a| self.use_variable(&a)) + .collect(), + TypedExpressionList::FunctionCall(key, expressions, types), + )], } } - } + }, s => fold_statement(self, s), }; self.statement_buffer.drain(..).chain(folded).collect() @@ -240,38 +209,18 @@ impl<'a, T: Field> Folder for Inliner<'a, T> { self.fold_variable(Variable::field_element(id)).id, ), FieldElementExpression::FunctionCall(key, expressions) => { - // get the symbol - let symbol = self.module().functions.get(&key).unwrap().clone(); - match symbol { - TypedFunctionSymbol::Here(function) => { - // if it's here, we can inline the call recursively with the same checker as the context is the same - let expressions = expressions - .into_iter() - .map(|e| self.fold_expression(e)) - .collect(); - let ret = self.inline_call(&function, expressions); - match ret[0].clone() { - TypedExpression::FieldElement(e) => e, - _ => unreachable!(), - } - } - TypedFunctionSymbol::There(function_key, typed_module_id) => { - // if it's there, create a new Inliner, inline there and get the statements back - // calling `There(key, module)` is calling `key` in `module` - let mut inliner = self.fork(typed_module_id); // create a new inliner for `typed_module_id` with the call count starting from where we got to - let expression = inliner.fold_field_expression( - FieldElementExpression::FunctionCall(function_key, expressions), - ); // inline the function call - self.merge(inliner); // merge the inliner back - expression // return the return expression - } - _ => FieldElementExpression::FunctionCall( - key, - expressions - .into_iter() - .map(|e| self.fold_expression(e)) - .collect(), - ), // we do not inline flat calls as we can't do it before flattening + //inline the arguments + let expressions: Vec<_> = expressions + .into_iter() + .map(|e| self.fold_expression(e)) + .collect(); + + match self.try_inline_call(&key, expressions) { + Ok(mut ret) => match ret.pop().unwrap() { + TypedExpression::FieldElement(e) => e, + _ => unreachable!(), + }, + Err(expressions) => FieldElementExpression::FunctionCall(key, expressions), } } e => fold_field_expression(self, e), @@ -290,51 +239,27 @@ impl<'a, T: Field> Folder for Inliner<'a, T> { ) } FieldElementArrayExpression::FunctionCall(size, key, expressions) => { - // get the symbol - let symbol = self.module().functions.get(&key).unwrap().clone(); - match symbol { - TypedFunctionSymbol::Here(function) => { - // if it's here, we can inline the call recursively with the same checker as the context is the same - let expressions = expressions - .into_iter() - .map(|e| self.fold_expression(e)) - .collect(); - let ret = self.inline_call(&function, expressions); - - match ret[0].clone() { - TypedExpression::FieldElementArray(e) => e, - _ => unreachable!(), - } - } - TypedFunctionSymbol::There(function_key, typed_module_id) => { - // if it's there, create a new Inliner, inline there and get the statements back - // calling `There(key, module)` is calling `key` in `module` - let mut inliner = self.fork(typed_module_id); // create a new inliner for `typed_module_id` with the call count starting from where we got to - let expression = inliner.fold_field_array_expression( - FieldElementArrayExpression::FunctionCall( - size, - function_key, - expressions, - ), - ); // inline the function call - self.merge(inliner); // merge the inliner back - expression // return the return expression + //inline the arguments + let expressions: Vec<_> = expressions + .into_iter() + .map(|e| self.fold_expression(e)) + .collect(); + + match self.try_inline_call(&key, expressions) { + Ok(mut ret) => match ret.pop().unwrap() { + TypedExpression::FieldElementArray(e) => e, + _ => unreachable!(), + }, + Err(expressions) => { + FieldElementArrayExpression::FunctionCall(size, key, expressions) } - _ => FieldElementArrayExpression::FunctionCall( - size, - key, - expressions - .into_iter() - .map(|e| self.fold_expression(e)) - .collect(), - ), } } e => fold_field_array_expression(self, e), } } - // prefix all names with context + // use renamed variables fn fold_variable(&mut self, v: Variable) -> Variable { self.bijection.get_by_left(&v).unwrap().clone() } @@ -807,4 +732,141 @@ mod tests { }) ); } + + #[test] + fn recursive_call_in_other_module() { + // // main + // def main(field a) -> (field): + // return id(id(a)) + + // // id + // def main(field a) -> (field) + // return a + + let main = TypedModule { + functions: vec![ + ( + FunctionKey::with_id("main").signature( + Signature::new() + .inputs(vec![Type::FieldElement]) + .outputs(vec![Type::FieldElement]), + ), + TypedFunctionSymbol::Here(TypedFunction { + arguments: vec![Parameter::private(Variable::field_element("a"))], + statements: vec![TypedStatement::Return(vec![ + FieldElementExpression::FunctionCall( + FunctionKey::with_id("id").signature( + Signature::new() + .inputs(vec![Type::FieldElement]) + .outputs(vec![Type::FieldElement]), + ), + vec![FieldElementExpression::FunctionCall( + FunctionKey::with_id("id").signature( + Signature::new() + .inputs(vec![Type::FieldElement]) + .outputs(vec![Type::FieldElement]), + ), + vec![FieldElementExpression::Identifier(String::from("a")) + .into()], + ) + .into()], + ) + .into(), + ])], + signature: Signature::new() + .inputs(vec![Type::FieldElement]) + .outputs(vec![Type::FieldElement]), + }), + ), + ( + FunctionKey::with_id("id").signature( + Signature::new() + .inputs(vec![Type::FieldElement]) + .outputs(vec![Type::FieldElement]), + ), + TypedFunctionSymbol::There( + FunctionKey::with_id("main").signature( + Signature::new() + .inputs(vec![Type::FieldElement]) + .outputs(vec![Type::FieldElement]), + ), + String::from("id"), + ), + ), + ] + .into_iter() + .collect(), + imports: vec![], + }; + + let id = TypedModule { + functions: vec![( + FunctionKey::with_id("main").signature( + Signature::new() + .inputs(vec![Type::FieldElement]) + .outputs(vec![Type::FieldElement]), + ), + TypedFunctionSymbol::Here(TypedFunction { + arguments: vec![Parameter::private(Variable::field_element("a"))], + statements: vec![TypedStatement::Return(vec![ + FieldElementExpression::Identifier(String::from("a")).into(), + ])], + signature: Signature::new() + .inputs(vec![Type::FieldElement]) + .outputs(vec![Type::FieldElement]), + }), + )] + .into_iter() + .collect(), + imports: vec![], + }; + + let modules: HashMap<_, _> = vec![(String::from("main"), main), (String::from("id"), id)] + .into_iter() + .collect(); + + let program: TypedProgram = TypedProgram { + main: String::from("main"), + modules, + }; + + let program = Inliner::inline(program); + + assert_eq!(program.modules.len(), 1); + assert_eq!( + program + .modules + .get(&String::from("main")) + .unwrap() + .functions + .get( + &FunctionKey::with_id("main").signature( + Signature::new() + .inputs(vec![Type::FieldElement]) + .outputs(vec![Type::FieldElement]) + ) + ) + .unwrap(), + &TypedFunctionSymbol::Here(TypedFunction { + arguments: vec![Parameter::private(Variable::field_element("_0"))], + statements: vec![ + TypedStatement::Definition( + TypedAssignee::Identifier(Variable::field_element("_1")), + FieldElementExpression::Identifier(String::from("_0")).into() + ), + TypedStatement::Definition( + TypedAssignee::Identifier(Variable::field_element("_2")), + FieldElementExpression::Identifier(String::from("_1")).into() + ), + TypedStatement::Return(vec![FieldElementExpression::Identifier(String::from( + "_2" + )) + .into(),]) + ], + signature: Signature::new() + .inputs(vec![Type::FieldElement]) + .outputs(vec![Type::FieldElement]), + }) + ); + } } diff --git a/zokrates_core/src/static_analysis/mod.rs b/zokrates_core/src/static_analysis/mod.rs index 91385c2b7..f25d25eb2 100644 --- a/zokrates_core/src/static_analysis/mod.rs +++ b/zokrates_core/src/static_analysis/mod.rs @@ -31,10 +31,12 @@ impl Analyse for TypedProgram { let r = Unroller::unroll(r); // inline let r = Inliner::inline(r); + print!("{}", r); // propagate let r = Propagator::propagate(r); // inject core lib let r = CoreLibInjector::inject(r); + print!("{}", r); r } } From a946299c71035282e7c0909b4d3ce8bf6c00696e Mon Sep 17 00:00:00 2001 From: schaeff Date: Tue, 28 May 2019 14:51:50 +0200 Subject: [PATCH 025/162] adapt flatten tests --- zokrates_core/src/flat_absy/mod.rs | 2 +- zokrates_core/src/flatten/mod.rs | 1565 ++++++++++------------ zokrates_core/src/static_analysis/mod.rs | 2 +- 3 files changed, 673 insertions(+), 896 deletions(-) diff --git a/zokrates_core/src/flat_absy/mod.rs b/zokrates_core/src/flat_absy/mod.rs index bac310a0a..29024e39d 100644 --- a/zokrates_core/src/flat_absy/mod.rs +++ b/zokrates_core/src/flat_absy/mod.rs @@ -17,7 +17,7 @@ use std::collections::HashMap; use std::fmt; use zokrates_field::field::Field; -#[derive(Clone)] +#[derive(Clone, PartialEq)] pub struct FlatProg { /// FlatFunctions of the program pub main: FlatFunction, diff --git a/zokrates_core/src/flatten/mod.rs b/zokrates_core/src/flatten/mod.rs index 2b1d973a4..7d9bb9671 100644 --- a/zokrates_core/src/flatten/mod.rs +++ b/zokrates_core/src/flatten/mod.rs @@ -1244,912 +1244,689 @@ mod tests { use zokrates_field::field::FieldPrime; #[test] - fn multiple_definition() { - // def foo() - // return 1, 2 - // def main() - // a, b = foo() - - let mut flattener = Flattener::new(); - let foo = TypedFunction { + fn powers() { + // def main(): + // field a = 7 + // field b = a**4 + // return b + + // def main(): + // _0 = 7 + // _1 = (_0 * _0) + // _2 = (_1 * _0) + // _3 = (_2 * _0) + // return _3 + + let main_fun = TypedFunction { arguments: vec![], - statements: vec![TypedStatement::Return(vec![ - FieldElementExpression::Number(FieldPrime::from(1)).into(), - FieldElementExpression::Number(FieldPrime::from(2)).into(), - ])], - signature: Signature::new() - .inputs(vec![]) - .outputs(vec![Type::FieldElement, Type::FieldElement]), + statements: vec![ + TypedStatement::Definition( + TypedAssignee::Identifier(Variable::field_element("a")), + FieldElementExpression::Number(FieldPrime::from(7)).into(), + ), + TypedStatement::Definition( + TypedAssignee::Identifier(Variable::field_element("b")), + FieldElementExpression::Pow( + box FieldElementExpression::Identifier(String::from("a")), + box FieldElementExpression::Number(FieldPrime::from(4)), + ) + .into(), + ), + TypedStatement::Return(vec![ + FieldElementExpression::Identifier(String::from("b")).into() + ]), + ], + signature: Signature { + inputs: vec![], + outputs: vec![Type::FieldElement], + }, + }; + + let program = TypedProgram { + modules: vec![( + String::from("main"), + TypedModule { + functions: vec![( + FunctionKey::with_id("main") + .signature(Signature::new().outputs(vec![Type::FieldElement])), + TypedFunctionSymbol::Here(main_fun), + )] + .into_iter() + .collect(), + imports: vec![], + }, + )] + .into_iter() + .collect(), + main: String::from("main"), + }; + + let flat_prog = Flattener::flatten(program); + + let expected = FlatProg { + main: FlatFunction { + arguments: vec![], + statements: vec![ + FlatStatement::Definition( + FlatVariable::new(0), + FlatExpression::Number(FieldPrime::from(7)), + ), + FlatStatement::Definition( + FlatVariable::new(1), + FlatExpression::Mult( + box FlatExpression::Identifier(FlatVariable::new(0)), + box FlatExpression::Identifier(FlatVariable::new(0)), + ), + ), + FlatStatement::Definition( + FlatVariable::new(2), + FlatExpression::Mult( + box FlatExpression::Identifier(FlatVariable::new(1)), + box FlatExpression::Identifier(FlatVariable::new(0)), + ), + ), + FlatStatement::Definition( + FlatVariable::new(3), + FlatExpression::Mult( + box FlatExpression::Identifier(FlatVariable::new(2)), + box FlatExpression::Identifier(FlatVariable::new(0)), + ), + ), + FlatStatement::Return(FlatExpressionList { + expressions: vec![FlatExpression::Identifier(FlatVariable::new(3))], + }), + ], + signature: Signature::new().outputs(vec![Type::FieldElement]), + }, + }; + + assert_eq!(flat_prog, expected); + } + + #[test] + fn if_else() { + let program: TypedProgram = TypedProgram { + modules: vec![( + String::from("main"), + TypedModule { + functions: HashMap::new(), + imports: vec![], + }, + )] + .into_iter() + .collect(), + main: String::from("main"), }; + + use static_analysis::CoreLibInjector; + let program = CoreLibInjector::inject(program); + + let expression = FieldElementExpression::IfElse( + box BooleanExpression::Eq( + box FieldElementExpression::Number(FieldPrime::from(32)), + box FieldElementExpression::Number(FieldPrime::from(4)), + ), + box FieldElementExpression::Number(FieldPrime::from(12)), + box FieldElementExpression::Number(FieldPrime::from(51)), + ); + let mut statements_flattened = vec![]; - let statement = TypedStatement::MultipleDefinition( - vec![ - Variable::field_element("a".to_string()), - Variable::field_element("b".to_string()), - ], - TypedExpressionList::FunctionCall( - FunctionKey::with_id("foo").signature( - Signature::new().outputs(vec![Type::FieldElement, Type::FieldElement]), + + let functions = program.modules.get("main").unwrap().functions.clone(); + + let mut flattener = Flattener::with_modules(program.modules); + + flattener.flatten_field_expression(&functions, &mut statements_flattened, expression); + } + + #[test] + fn geq_leq() { + let program: TypedProgram = TypedProgram { + modules: vec![( + String::from("main"), + TypedModule { + functions: HashMap::new(), + imports: vec![], + }, + )] + .into_iter() + .collect(), + main: String::from("main"), + }; + + use static_analysis::CoreLibInjector; + let program = CoreLibInjector::inject(program); + + let functions = program.modules.get("main").unwrap().functions.clone(); + + let mut flattener = Flattener::with_modules(program.modules); + let expression_le = BooleanExpression::Le( + box FieldElementExpression::Number(FieldPrime::from(32)), + box FieldElementExpression::Number(FieldPrime::from(4)), + ); + + let expression_ge = BooleanExpression::Ge( + box FieldElementExpression::Number(FieldPrime::from(32)), + box FieldElementExpression::Number(FieldPrime::from(4)), + ); + + flattener.flatten_boolean_expression(&functions, &mut vec![], expression_le); + + flattener.flatten_boolean_expression(&functions, &mut vec![], expression_ge); + } + + #[test] + fn bool_and() { + let program: TypedProgram = TypedProgram { + modules: vec![( + String::from("main"), + TypedModule { + functions: HashMap::new(), + imports: vec![], + }, + )] + .into_iter() + .collect(), + main: String::from("main"), + }; + + use static_analysis::CoreLibInjector; + let program = CoreLibInjector::inject(program); + + let mut statements_flattened = vec![]; + + let functions = program.modules.get("main").unwrap().functions.clone(); + + let mut flattener = Flattener::with_modules(program.modules); + + let expression = FieldElementExpression::IfElse( + box BooleanExpression::And( + box BooleanExpression::Eq( + box FieldElementExpression::Number(FieldPrime::from(4)), + box FieldElementExpression::Number(FieldPrime::from(4)), + ), + box BooleanExpression::Lt( + box FieldElementExpression::Number(FieldPrime::from(4)), + box FieldElementExpression::Number(FieldPrime::from(20)), ), - vec![], - vec![Type::FieldElement, Type::FieldElement], ), + box FieldElementExpression::Number(FieldPrime::from(12)), + box FieldElementExpression::Number(FieldPrime::from(51)), + ); + + flattener.flatten_field_expression(&functions, &mut statements_flattened, expression); + } + + #[test] + fn div() { + // a = 5 / b / b + let program: TypedProgram = TypedProgram { + modules: vec![( + String::from("main"), + TypedModule { + functions: HashMap::new(), + imports: vec![], + }, + )] + .into_iter() + .collect(), + main: String::from("main"), + }; + + let mut statements_flattened = vec![]; + + let functions = program.modules.get("main").unwrap().functions.clone(); + + let mut flattener = Flattener::with_modules(program.modules); + + let definition = TypedStatement::Definition( + TypedAssignee::Identifier(Variable::field_element("b")), + FieldElementExpression::Number(FieldPrime::from(42)).into(), + ); + + let statement = TypedStatement::Definition( + TypedAssignee::Identifier(Variable::field_element("a")), + FieldElementExpression::Div( + box FieldElementExpression::Div( + box FieldElementExpression::Number(FieldPrime::from(5)), + box FieldElementExpression::Identifier(String::from("b")), + ), + box FieldElementExpression::Identifier(String::from("b")), + ) + .into(), + ); + + flattener.flatten_statement(&functions, &mut statements_flattened, definition); + + flattener.flatten_statement(&functions, &mut statements_flattened, statement); + + // define b + let b = FlatVariable::new(0); + // define new wires for members of Div + let five = FlatVariable::new(1); + let b0 = FlatVariable::new(2); + // Define inverse of denominator to prevent div by 0 + let invb0 = FlatVariable::new(3); + // Define inverse + let sym_0 = FlatVariable::new(4); + // Define result, which is first member to next Div + let sym_1 = FlatVariable::new(5); + // Define second member + let b1 = FlatVariable::new(6); + // Define inverse of denominator to prevent div by 0 + let invb1 = FlatVariable::new(7); + // Define inverse + let sym_2 = FlatVariable::new(8); + // Define left hand side + let a = FlatVariable::new(9); + + assert_eq!( + statements_flattened, + vec![ + FlatStatement::Definition(b, FlatExpression::Number(FieldPrime::from(42))), + // inputs to first div (5/b) + FlatStatement::Definition(five, FlatExpression::Number(FieldPrime::from(5))), + FlatStatement::Definition(b0, b.into()), + // check div by 0 + FlatStatement::Directive(DirectiveStatement::new( + vec![invb0], + Helper::Rust(RustHelper::Div), + vec![FlatExpression::Number(FieldPrime::from(1)), b0.into()] + )), + FlatStatement::Condition( + FlatExpression::Number(FieldPrime::from(1)), + FlatExpression::Mult(box invb0.into(), box b0.into()), + ), + // execute div + FlatStatement::Directive(DirectiveStatement::new( + vec![sym_0], + Helper::Rust(RustHelper::Div), + vec![five, b0] + )), + FlatStatement::Condition( + five.into(), + FlatExpression::Mult(box b0.into(), box sym_0.into()), + ), + // inputs to second div (res/b) + FlatStatement::Definition(sym_1, sym_0.into()), + FlatStatement::Definition(b1, b.into()), + // check div by 0 + FlatStatement::Directive(DirectiveStatement::new( + vec![invb1], + Helper::Rust(RustHelper::Div), + vec![FlatExpression::Number(FieldPrime::from(1)), b1.into()] + )), + FlatStatement::Condition( + FlatExpression::Number(FieldPrime::from(1)), + FlatExpression::Mult(box invb1.into(), box b1.into()), + ), + // execute div + FlatStatement::Directive(DirectiveStatement::new( + vec![sym_2], + Helper::Rust(RustHelper::Div), + vec![sym_1, b1] + )), + FlatStatement::Condition( + sym_1.into(), + FlatExpression::Mult(box b1.into(), box sym_2.into()), + ), + // result + FlatStatement::Definition(a, sym_2.into()), + ] + ); + } + + #[test] + fn field_array() { + // foo = [ , , ] + + let program: TypedProgram = TypedProgram { + modules: vec![( + String::from("main"), + TypedModule { + functions: HashMap::new(), + imports: vec![], + }, + )] + .into_iter() + .collect(), + main: String::from("main"), + }; + + let functions = program.modules.get("main").unwrap().functions.clone(); + + let mut flattener = Flattener::with_modules(program.modules); + let mut statements_flattened = vec![]; + let statement = TypedStatement::Definition( + TypedAssignee::Identifier(Variable::field_array("foo", 3)), + FieldElementArrayExpression::Value( + 3, + vec![ + FieldElementExpression::Number(FieldPrime::from(1)), + FieldElementExpression::Number(FieldPrime::from(2)), + FieldElementExpression::Number(FieldPrime::from(3)), + ], + ) + .into(), + ); + let expression = FieldElementArrayExpression::Identifier(3, String::from("foo")); + + flattener.flatten_statement(&functions, &mut statements_flattened, statement); + + let expressions = flattener.flatten_field_array_expression( + &functions, + &mut statements_flattened, + expression, + ); + + assert_eq!( + expressions, + vec![ + FlatExpression::Identifier(FlatVariable::new(0)), + FlatExpression::Identifier(FlatVariable::new(1)), + FlatExpression::Identifier(FlatVariable::new(2)), + ] + ); + } + + #[test] + fn array_definition() { + // field[3] foo = [1, 2, 3] + + let program: TypedProgram = TypedProgram { + modules: vec![( + String::from("main"), + TypedModule { + functions: HashMap::new(), + imports: vec![], + }, + )] + .into_iter() + .collect(), + main: String::from("main"), + }; + + let functions = program.modules.get("main").unwrap().functions.clone(); + + let mut flattener = Flattener::with_modules(program.modules); + let mut statements_flattened = vec![]; + let statement = TypedStatement::Definition( + TypedAssignee::Identifier(Variable::field_array("foo", 3)), + FieldElementArrayExpression::Value( + 3, + vec![ + FieldElementExpression::Number(FieldPrime::from(1)), + FieldElementExpression::Number(FieldPrime::from(2)), + FieldElementExpression::Number(FieldPrime::from(3)), + ], + ) + .into(), + ); + + flattener.flatten_statement(&functions, &mut statements_flattened, statement); + + assert_eq!( + statements_flattened, + vec![ + FlatStatement::Definition( + FlatVariable::new(0), + FlatExpression::Number(FieldPrime::from(1)) + ), + FlatStatement::Definition( + FlatVariable::new(1), + FlatExpression::Number(FieldPrime::from(2)) + ), + FlatStatement::Definition( + FlatVariable::new(2), + FlatExpression::Number(FieldPrime::from(3)) + ), + ] + ); + } + + #[test] + fn array_selection() { + // field[3] foo = [1, 2, 3] + // foo[1] + + let program: TypedProgram = TypedProgram { + modules: vec![( + String::from("main"), + TypedModule { + functions: HashMap::new(), + imports: vec![], + }, + )] + .into_iter() + .collect(), + main: String::from("main"), + }; + + let functions = program.modules.get("main").unwrap().functions.clone(); + + let mut flattener = Flattener::with_modules(program.modules); + let mut statements_flattened = vec![]; + let statement = TypedStatement::Definition( + TypedAssignee::Identifier(Variable::field_array("foo", 3)), + FieldElementArrayExpression::Value( + 3, + vec![ + FieldElementExpression::Number(FieldPrime::from(1)), + FieldElementExpression::Number(FieldPrime::from(2)), + FieldElementExpression::Number(FieldPrime::from(3)), + ], + ) + .into(), + ); + + let expression = FieldElementExpression::Select( + box FieldElementArrayExpression::Identifier(3, String::from("foo")), + box FieldElementExpression::Number(FieldPrime::from(1)), + ); + + flattener.flatten_statement(&functions, &mut statements_flattened, statement); + + let flat_expression = + flattener.flatten_field_expression(&functions, &mut statements_flattened, expression); + + assert_eq!( + flat_expression, + FlatExpression::Identifier(FlatVariable::new(1)), + ); + } + + #[test] + fn array_sum() { + // field[3] foo = [1, 2, 3] + // bar = foo[0] + foo[1] + foo[2] + // we don't optimise detecting constants, this will be done in an optimiser pass + + let program: TypedProgram = TypedProgram { + modules: vec![( + String::from("main"), + TypedModule { + functions: HashMap::new(), + imports: vec![], + }, + )] + .into_iter() + .collect(), + main: String::from("main"), + }; + + let functions = program.modules.get("main").unwrap().functions.clone(); + + let mut flattener = Flattener::with_modules(program.modules); + + let mut statements_flattened = vec![]; + let def = TypedStatement::Definition( + TypedAssignee::Identifier(Variable::field_array("foo", 3)), + FieldElementArrayExpression::Value( + 3, + vec![ + FieldElementExpression::Number(FieldPrime::from(1)), + FieldElementExpression::Number(FieldPrime::from(2)), + FieldElementExpression::Number(FieldPrime::from(3)), + ], + ) + .into(), ); - let symbols = vec![( - FunctionKey::with_id("foo") - .signature(Signature::new().outputs(vec![Type::FieldElement, Type::FieldElement])), - TypedFunctionSymbol::Here(foo), - )] - .into_iter() - .collect(); + let sum = TypedStatement::Definition( + TypedAssignee::Identifier(Variable::field_element("bar")), + FieldElementExpression::Add( + box FieldElementExpression::Add( + box FieldElementExpression::Select( + box FieldElementArrayExpression::Identifier(3, String::from("foo")), + box FieldElementExpression::Number(FieldPrime::from(0)), + ), + box FieldElementExpression::Select( + box FieldElementArrayExpression::Identifier(3, String::from("foo")), + box FieldElementExpression::Number(FieldPrime::from(1)), + ), + ), + box FieldElementExpression::Select( + box FieldElementArrayExpression::Identifier(3, String::from("foo")), + box FieldElementExpression::Number(FieldPrime::from(2)), + ), + ) + .into(), + ); - flattener.flatten_statement(&symbols, &mut statements_flattened, statement); + flattener.flatten_statement(&functions, &mut statements_flattened, def); - let a = FlatVariable::new(0); + flattener.flatten_statement(&functions, &mut statements_flattened, sum); assert_eq!( - statements_flattened[0], - FlatStatement::Definition(a, FlatExpression::Number(FieldPrime::from(1))) + statements_flattened[3], + FlatStatement::Definition( + FlatVariable::new(3), + FlatExpression::Add( + box FlatExpression::Add( + box FlatExpression::Identifier(FlatVariable::new(0)), + box FlatExpression::Identifier(FlatVariable::new(1)), + ), + box FlatExpression::Identifier(FlatVariable::new(2)), + ) + ) ); } - // #[test] - // fn multiple_definition2() { - // // def dup(x) - // // return x, x - // // def main() - // // a, b = dup(2) - - // let a = FlatVariable::new(0); - - // let mut flattener = Flattener::new(); - // let mut functions_flattened = vec![FlatFunction { - // id: "dup".to_string(), - // arguments: vec![FlatParameter { - // id: a, - // private: true, - // }], - // statements: vec![FlatStatement::Return(FlatExpressionList { - // expressions: vec![FlatExpression::Identifier(a), FlatExpression::Identifier(a)], - // })], - // signature: Signature::new() - // .inputs(vec![Type::FieldElement]) - // .outputs(vec![Type::FieldElement, Type::FieldElement]), - // }]; - // let statement = TypedStatement::MultipleDefinition( - // vec![ - // Variable::field_element("a".to_string()), - // Variable::field_element("b".to_string()), - // ], - // TypedExpressionList::FunctionCall( - // "dup".to_string(), - // vec![TypedExpression::FieldElement( - // FieldElementExpression::Number(FieldPrime::from(2)), - // )], - // vec![Type::FieldElement, Type::FieldElement], - // ), - // ); - - // let fun = TypedFunction { - // id: String::from("main"), - // arguments: vec![], - // statements: vec![statement], - // signature: Signature { - // inputs: vec![], - // outputs: vec![], - // }, - // }; - - // let f = flattener.flatten_function(&mut functions_flattened, fun); - - // let a = FlatVariable::new(0); - - // assert_eq!( - // f.statements[0], - // FlatStatement::Definition(a, FlatExpression::Number(FieldPrime::from(2))) - // ); - // } - - // #[test] - // fn simple_definition() { - // // def foo() - // // return 1 - // // def main() - // // a = foo() - - // let mut flattener = Flattener::new(); - // let mut functions_flattened = vec![FlatFunction { - // id: "foo".to_string(), - // arguments: vec![], - // statements: vec![FlatStatement::Return(FlatExpressionList { - // expressions: vec![FlatExpression::Number(FieldPrime::from(1))], - // })], - // signature: Signature::new() - // .inputs(vec![]) - // .outputs(vec![Type::FieldElement]), - // }]; - // let mut statements_flattened = vec![]; - // let statement = TypedStatement::Definition( - // TypedAssignee::Identifier(Variable::field_element("a")), - // TypedExpression::FieldElement(FieldElementExpression::FunctionCall( - // "foo".to_string(), - // vec![], - // )), - // ); - - // flattener.flatten_statement( - // &mut functions_flattened, - // &mut statements_flattened, - // statement, - // ); - - // let a = FlatVariable::new(0); - - // assert_eq!( - // statements_flattened[0], - // FlatStatement::Definition(a, FlatExpression::Number(FieldPrime::from(1))) - // ); - // } - - // #[test] - // fn redefine_argument() { - // // def foo(a) - // // a = a + 1 - // // return 1 - - // // should flatten to no redefinition - // // def foo(a) - // // a_0 = a + 1 - // // return 1 - - // let mut flattener = Flattener::new(); - // let mut functions_flattened = vec![]; - - // let funct = TypedFunction { - // id: "foo".to_string(), - // signature: Signature::new() - // .inputs(vec![Type::FieldElement]) - // .outputs(vec![Type::FieldElement]), - // arguments: vec![Parameter { - // id: Variable::field_element("a"), - // private: true, - // }], - // statements: vec![ - // TypedStatement::Definition( - // TypedAssignee::Identifier(Variable::field_element("a")), - // FieldElementExpression::Add( - // box FieldElementExpression::Identifier("a".to_string()), - // box FieldElementExpression::Number(FieldPrime::from(1)), - // ) - // .into(), - // ), - // TypedStatement::Return(vec![ - // FieldElementExpression::Number(FieldPrime::from(1)).into() - // ]), - // ], - // }; - - // let flat_funct = flattener.flatten_function(&mut functions_flattened, funct); - - // let a = FlatVariable::new(0); - // let a_0 = FlatVariable::new(1); - - // assert_eq!( - // flat_funct.statements[0], - // FlatStatement::Definition( - // a_0, - // FlatExpression::Add( - // box FlatExpression::Identifier(a), - // box FlatExpression::Number(FieldPrime::from(1)) - // ) - // ) - // ); - // } - - // #[test] - // fn call_with_def() { - // // def foo(): - // // a = 3 - // // return a - - // // def main(): - // // return foo() - - // let foo = TypedFunction { - // id: String::from("foo"), - // arguments: vec![], - // statements: vec![ - // TypedStatement::Definition( - // TypedAssignee::Identifier(Variable::field_element("a")), - // FieldElementExpression::Number(FieldPrime::from(3)).into(), - // ), - // TypedStatement::Return(vec![ - // FieldElementExpression::Identifier(String::from("a")).into() - // ]), - // ], - // signature: Signature { - // inputs: vec![], - // outputs: vec![Type::FieldElement], - // }, - // }; - - // let main = TypedFunction { - // id: String::from("main"), - // arguments: vec![], - // statements: vec![TypedStatement::Return(vec![ - // FieldElementExpression::FunctionCall(String::from("foo"), vec![]).into(), - // ])], - // signature: Signature { - // inputs: vec![], - // outputs: vec![Type::FieldElement], - // }, - // }; - - // let mut flattener = Flattener::new(); - - // let foo_flattened = flattener.flatten_function(&mut vec![], foo); - - // let expected = FlatFunction { - // id: String::from("main"), - // arguments: vec![], - // statements: vec![ - // FlatStatement::Definition( - // FlatVariable::new(0), - // FlatExpression::Number(FieldPrime::from(3)), - // ), - // FlatStatement::Return(FlatExpressionList { - // expressions: vec![FlatExpression::Identifier(FlatVariable::new(0))], - // }), - // ], - // signature: Signature::new().outputs(vec![Type::FieldElement]), - // }; - - // let main_flattened = flattener.flatten_function(&mut vec![foo_flattened], main); - - // assert_eq!(main_flattened, expected); - // } - - // #[test] - // fn powers() { - // // def main(): - // // field a = 7 - // // field b = a**4 - // // return b - - // // def main(): - // // _0 = 7 - // // _1 = (_0 * _0) - // // _2 = (_1 * _0) - // // _3 = (_2 * _0) - // // return _3 - - // let function = TypedFunction { - // id: String::from("main"), - // arguments: vec![], - // statements: vec![ - // TypedStatement::Definition( - // TypedAssignee::Identifier(Variable::field_element("a")), - // FieldElementExpression::Number(FieldPrime::from(7)).into(), - // ), - // TypedStatement::Definition( - // TypedAssignee::Identifier(Variable::field_element("b")), - // FieldElementExpression::Pow( - // box FieldElementExpression::Identifier(String::from("a")), - // box FieldElementExpression::Number(FieldPrime::from(4)), - // ) - // .into(), - // ), - // TypedStatement::Return(vec![ - // FieldElementExpression::Identifier(String::from("b")).into() - // ]), - // ], - // signature: Signature { - // inputs: vec![], - // outputs: vec![Type::FieldElement], - // }, - // }; - - // let mut flattener = Flattener::new(); - - // let expected = FlatFunction { - // id: String::from("main"), - // arguments: vec![], - // statements: vec![ - // FlatStatement::Definition( - // FlatVariable::new(0), - // FlatExpression::Number(FieldPrime::from(7)), - // ), - // FlatStatement::Definition( - // FlatVariable::new(1), - // FlatExpression::Mult( - // box FlatExpression::Identifier(FlatVariable::new(0)), - // box FlatExpression::Identifier(FlatVariable::new(0)), - // ), - // ), - // FlatStatement::Definition( - // FlatVariable::new(2), - // FlatExpression::Mult( - // box FlatExpression::Identifier(FlatVariable::new(1)), - // box FlatExpression::Identifier(FlatVariable::new(0)), - // ), - // ), - // FlatStatement::Definition( - // FlatVariable::new(3), - // FlatExpression::Mult( - // box FlatExpression::Identifier(FlatVariable::new(2)), - // box FlatExpression::Identifier(FlatVariable::new(0)), - // ), - // ), - // FlatStatement::Return(FlatExpressionList { - // expressions: vec![FlatExpression::Identifier(FlatVariable::new(3))], - // }), - // ], - // signature: Signature::new().outputs(vec![Type::FieldElement]), - // }; - - // let flattened = flattener.flatten_function(&mut vec![], function); - - // assert_eq!(flattened, expected); - // } - - // #[test] - // fn overload() { - // // def foo() - // // return 1 - // // def foo() - // // return 1, 2 - // // def main() - // // a = foo() - // // b, c = foo() - // // return 1 - // // - // // should not panic - // // - - // let mut flattener = Flattener::new(); - // let functions = vec![ - // TypedFunction { - // id: "foo".to_string(), - // arguments: vec![], - // statements: vec![TypedStatement::Return(vec![TypedExpression::FieldElement( - // FieldElementExpression::Number(FieldPrime::from(1)), - // )])], - // signature: Signature::new() - // .inputs(vec![]) - // .outputs(vec![Type::FieldElement]), - // }, - // TypedFunction { - // id: "foo".to_string(), - // arguments: vec![], - // statements: vec![TypedStatement::Return(vec![ - // TypedExpression::FieldElement(FieldElementExpression::Number( - // FieldPrime::from(1), - // )), - // TypedExpression::FieldElement(FieldElementExpression::Number( - // FieldPrime::from(2), - // )), - // ])], - // signature: Signature::new() - // .inputs(vec![]) - // .outputs(vec![Type::FieldElement, Type::FieldElement]), - // }, - // TypedFunction { - // id: "main".to_string(), - // arguments: vec![], - // statements: vec![ - // TypedStatement::Definition( - // TypedAssignee::Identifier(Variable::field_element("a")), - // TypedExpression::FieldElement(FieldElementExpression::FunctionCall( - // "foo".to_string(), - // vec![], - // )), - // ), - // TypedStatement::MultipleDefinition( - // vec![ - // Variable::field_element("b".to_string()), - // Variable::field_element("c".to_string()), - // ], - // TypedExpressionList::FunctionCall( - // "foo".to_string(), - // vec![], - // vec![Type::FieldElement, Type::FieldElement], - // ), - // ), - // TypedStatement::Return(vec![TypedExpression::FieldElement( - // FieldElementExpression::Number(FieldPrime::from(1)), - // )]), - // ], - // signature: Signature::new() - // .inputs(vec![]) - // .outputs(vec![Type::FieldElement]), - // }, - // ]; - - // flattener.flatten_program(TypedModule { - // functions: functions - // .into_iter() - // .map(|f| { - // ( - // FunctionKey { - // id: f.id.clone(), - // signature: f.signature.clone(), - // }, - // f, - // ) - // }) - // .collect(), - // imported_functions: vec![], - // imports: vec![], - // }); - - // // shouldn't panic - // } - - // #[test] - // fn if_else() { - // let mut flattener = Flattener::new(); - // let expression = FieldElementExpression::IfElse( - // box BooleanExpression::Eq( - // box FieldElementExpression::Number(FieldPrime::from(32)), - // box FieldElementExpression::Number(FieldPrime::from(4)), - // ), - // box FieldElementExpression::Number(FieldPrime::from(12)), - // box FieldElementExpression::Number(FieldPrime::from(51)), - // ); - - // let mut functions_flattened = vec![]; - // flattener.load_corelib(&mut functions_flattened); - - // flattener.flatten_field_expression(&functions_flattened, &mut vec![], expression); - // } - - // #[test] - // fn geq_leq() { - // let mut flattener = Flattener::new(); - // let expression_le = BooleanExpression::Le( - // box FieldElementExpression::Number(FieldPrime::from(32)), - // box FieldElementExpression::Number(FieldPrime::from(4)), - // ); - - // let expression_ge = BooleanExpression::Ge( - // box FieldElementExpression::Number(FieldPrime::from(32)), - // box FieldElementExpression::Number(FieldPrime::from(4)), - // ); - - // flattener.flatten_boolean_expression(&mut vec![], &mut vec![], expression_le); - - // flattener.flatten_boolean_expression(&mut vec![], &mut vec![], expression_ge); - // } - - // #[test] - // fn bool_and() { - // let expression = FieldElementExpression::IfElse( - // box BooleanExpression::And( - // box BooleanExpression::Eq( - // box FieldElementExpression::Number(FieldPrime::from(4)), - // box FieldElementExpression::Number(FieldPrime::from(4)), - // ), - // box BooleanExpression::Lt( - // box FieldElementExpression::Number(FieldPrime::from(4)), - // box FieldElementExpression::Number(FieldPrime::from(20)), - // ), - // ), - // box FieldElementExpression::Number(FieldPrime::from(12)), - // box FieldElementExpression::Number(FieldPrime::from(51)), - // ); - - // let mut flattener = Flattener::new(); - // let mut functions_flattened = vec![]; - // flattener.load_corelib(&mut functions_flattened); - // flattener.flatten_field_expression(&functions_flattened, &mut vec![], expression); - // } - - // #[test] - // fn div() { - // // a = 5 / b / b - // let mut flattener = Flattener::new(); - // let mut functions_flattened = vec![]; - // let mut statements_flattened = vec![]; - - // let definition = TypedStatement::Definition( - // TypedAssignee::Identifier(Variable::field_element("b")), - // FieldElementExpression::Number(FieldPrime::from(42)).into(), - // ); - - // let statement = TypedStatement::Definition( - // TypedAssignee::Identifier(Variable::field_element("a")), - // FieldElementExpression::Div( - // box FieldElementExpression::Div( - // box FieldElementExpression::Number(FieldPrime::from(5)), - // box FieldElementExpression::Identifier(String::from("b")), - // ), - // box FieldElementExpression::Identifier(String::from("b")), - // ) - // .into(), - // ); - - // flattener.flatten_statement( - // &mut functions_flattened, - // &mut statements_flattened, - // definition, - // ); - - // flattener.flatten_statement( - // &mut functions_flattened, - // &mut statements_flattened, - // statement, - // ); - - // // define b - // let b = FlatVariable::new(0); - // // define new wires for members of Div - // let five = FlatVariable::new(1); - // let b0 = FlatVariable::new(2); - // // Define inverse of denominator to prevent div by 0 - // let invb0 = FlatVariable::new(3); - // // Define inverse - // let sym_0 = FlatVariable::new(4); - // // Define result, which is first member to next Div - // let sym_1 = FlatVariable::new(5); - // // Define second member - // let b1 = FlatVariable::new(6); - // // Define inverse of denominator to prevent div by 0 - // let invb1 = FlatVariable::new(7); - // // Define inverse - // let sym_2 = FlatVariable::new(8); - // // Define left hand side - // let a = FlatVariable::new(9); - - // assert_eq!( - // statements_flattened, - // vec![ - // FlatStatement::Definition(b, FlatExpression::Number(FieldPrime::from(42))), - // // inputs to first div (5/b) - // FlatStatement::Definition(five, FlatExpression::Number(FieldPrime::from(5))), - // FlatStatement::Definition(b0, b.into()), - // // check div by 0 - // FlatStatement::Directive(DirectiveStatement::new( - // vec![invb0], - // Helper::Rust(RustHelper::Div), - // vec![FlatExpression::Number(FieldPrime::from(1)), b0.into()] - // )), - // FlatStatement::Condition( - // FlatExpression::Number(FieldPrime::from(1)), - // FlatExpression::Mult(box invb0.into(), box b0.into()), - // ), - // // execute div - // FlatStatement::Directive(DirectiveStatement::new( - // vec![sym_0], - // Helper::Rust(RustHelper::Div), - // vec![five, b0] - // )), - // FlatStatement::Condition( - // five.into(), - // FlatExpression::Mult(box b0.into(), box sym_0.into()), - // ), - // // inputs to second div (res/b) - // FlatStatement::Definition(sym_1, sym_0.into()), - // FlatStatement::Definition(b1, b.into()), - // // check div by 0 - // FlatStatement::Directive(DirectiveStatement::new( - // vec![invb1], - // Helper::Rust(RustHelper::Div), - // vec![FlatExpression::Number(FieldPrime::from(1)), b1.into()] - // )), - // FlatStatement::Condition( - // FlatExpression::Number(FieldPrime::from(1)), - // FlatExpression::Mult(box invb1.into(), box b1.into()), - // ), - // // execute div - // FlatStatement::Directive(DirectiveStatement::new( - // vec![sym_2], - // Helper::Rust(RustHelper::Div), - // vec![sym_1, b1] - // )), - // FlatStatement::Condition( - // sym_1.into(), - // FlatExpression::Mult(box b1.into(), box sym_2.into()), - // ), - // // result - // FlatStatement::Definition(a, sym_2.into()), - // ] - // ); - // } - - // #[test] - // fn field_array() { - // // foo = [ , , ] - - // let mut flattener = Flattener::new(); - // let mut functions_flattened = vec![]; - // let mut statements_flattened = vec![]; - // let statement = TypedStatement::Definition( - // TypedAssignee::Identifier(Variable::field_array("foo", 3)), - // FieldElementArrayExpression::Value( - // 3, - // vec![ - // FieldElementExpression::Number(FieldPrime::from(1)), - // FieldElementExpression::Number(FieldPrime::from(2)), - // FieldElementExpression::Number(FieldPrime::from(3)), - // ], - // ) - // .into(), - // ); - // let expression = FieldElementArrayExpression::Identifier(3, String::from("foo")); - - // flattener.flatten_statement( - // &mut functions_flattened, - // &mut statements_flattened, - // statement, - // ); - - // let expressions = flattener.flatten_field_array_expression( - // &mut functions_flattened, - // &mut statements_flattened, - // expression, - // ); - - // assert_eq!( - // expressions, - // vec![ - // FlatExpression::Identifier(FlatVariable::new(0)), - // FlatExpression::Identifier(FlatVariable::new(1)), - // FlatExpression::Identifier(FlatVariable::new(2)), - // ] - // ); - // } - - // #[test] - // fn array_definition() { - // // field[3] foo = [1, 2, 3] - - // let mut flattener = Flattener::new(); - // let mut functions_flattened = vec![]; - // let mut statements_flattened = vec![]; - // let statement = TypedStatement::Definition( - // TypedAssignee::Identifier(Variable::field_array("foo", 3)), - // FieldElementArrayExpression::Value( - // 3, - // vec![ - // FieldElementExpression::Number(FieldPrime::from(1)), - // FieldElementExpression::Number(FieldPrime::from(2)), - // FieldElementExpression::Number(FieldPrime::from(3)), - // ], - // ) - // .into(), - // ); - - // flattener.flatten_statement( - // &mut functions_flattened, - // &mut statements_flattened, - // statement, - // ); - - // assert_eq!( - // statements_flattened, - // vec![ - // FlatStatement::Definition( - // FlatVariable::new(0), - // FlatExpression::Number(FieldPrime::from(1)) - // ), - // FlatStatement::Definition( - // FlatVariable::new(1), - // FlatExpression::Number(FieldPrime::from(2)) - // ), - // FlatStatement::Definition( - // FlatVariable::new(2), - // FlatExpression::Number(FieldPrime::from(3)) - // ), - // ] - // ); - // } - - // #[test] - // fn array_selection() { - // // field[3] foo = [1, 2, 3] - // // foo[1] - - // let mut flattener = Flattener::new(); - // let mut functions_flattened = vec![]; - // let mut statements_flattened = vec![]; - // let statement = TypedStatement::Definition( - // TypedAssignee::Identifier(Variable::field_array("foo", 3)), - // FieldElementArrayExpression::Value( - // 3, - // vec![ - // FieldElementExpression::Number(FieldPrime::from(1)), - // FieldElementExpression::Number(FieldPrime::from(2)), - // FieldElementExpression::Number(FieldPrime::from(3)), - // ], - // ) - // .into(), - // ); - - // let expression = FieldElementExpression::Select( - // box FieldElementArrayExpression::Identifier(3, String::from("foo")), - // box FieldElementExpression::Number(FieldPrime::from(1)), - // ); - - // flattener.flatten_statement::( - // &mut functions_flattened, - // &mut statements_flattened, - // statement, - // ); - - // let flat_expression = flattener.flatten_field_expression::( - // &mut functions_flattened, - // &mut statements_flattened, - // expression, - // ); - - // assert_eq!( - // flat_expression, - // FlatExpression::Identifier(FlatVariable::new(1)), - // ); - // } - - // #[test] - // fn array_sum() { - // // field[3] foo = [1, 2, 3] - // // bar = foo[0] + foo[1] + foo[2] - // // we don't optimise detecting constants, this will be done in an optimiser pass - - // let mut flattener = Flattener::new(); - // let mut functions_flattened = vec![]; - // let mut statements_flattened = vec![]; - // let def = TypedStatement::Definition( - // TypedAssignee::Identifier(Variable::field_array("foo", 3)), - // FieldElementArrayExpression::Value( - // 3, - // vec![ - // FieldElementExpression::Number(FieldPrime::from(1)), - // FieldElementExpression::Number(FieldPrime::from(2)), - // FieldElementExpression::Number(FieldPrime::from(3)), - // ], - // ) - // .into(), - // ); - - // let sum = TypedStatement::Definition( - // TypedAssignee::Identifier(Variable::field_element("bar")), - // FieldElementExpression::Add( - // box FieldElementExpression::Add( - // box FieldElementExpression::Select( - // box FieldElementArrayExpression::Identifier(3, String::from("foo")), - // box FieldElementExpression::Number(FieldPrime::from(0)), - // ), - // box FieldElementExpression::Select( - // box FieldElementArrayExpression::Identifier(3, String::from("foo")), - // box FieldElementExpression::Number(FieldPrime::from(1)), - // ), - // ), - // box FieldElementExpression::Select( - // box FieldElementArrayExpression::Identifier(3, String::from("foo")), - // box FieldElementExpression::Number(FieldPrime::from(2)), - // ), - // ) - // .into(), - // ); - - // flattener.flatten_statement::( - // &mut functions_flattened, - // &mut statements_flattened, - // def, - // ); - - // flattener.flatten_statement::( - // &mut functions_flattened, - // &mut statements_flattened, - // sum, - // ); - - // assert_eq!( - // statements_flattened[3], - // FlatStatement::Definition( - // FlatVariable::new(3), - // FlatExpression::Add( - // box FlatExpression::Add( - // box FlatExpression::Identifier(FlatVariable::new(0)), - // box FlatExpression::Identifier(FlatVariable::new(1)), - // ), - // box FlatExpression::Identifier(FlatVariable::new(2)), - // ) - // ) - // ); - // } - - // #[test] - // fn array_if() { - // // if 1 == 1 then [1] else [3] fi - - // let with_arrays = { - // let mut flattener = Flattener::new(); - // let mut functions_flattened = vec![]; - // flattener.load_corelib(&mut functions_flattened); - // let mut statements_flattened = vec![]; - - // let e = FieldElementArrayExpression::IfElse( - // box BooleanExpression::Eq( - // box FieldElementExpression::Number(FieldPrime::from(1)), - // box FieldElementExpression::Number(FieldPrime::from(1)), - // ), - // box FieldElementArrayExpression::Value( - // 1, - // vec![FieldElementExpression::Number(FieldPrime::from(1))], - // ), - // box FieldElementArrayExpression::Value( - // 1, - // vec![FieldElementExpression::Number(FieldPrime::from(3))], - // ), - // ); - - // ( - // flattener.flatten_field_array_expression( - // &mut functions_flattened, - // &mut statements_flattened, - // e, - // )[0] - // .clone(), - // statements_flattened, - // ) - // }; - - // let without_arrays = { - // let mut flattener = Flattener::new(); - // let mut functions_flattened = vec![]; - // flattener.load_corelib(&mut functions_flattened); - // let mut statements_flattened = vec![]; - - // // if 1 == 1 then 1 else 3 fi - // let e = FieldElementExpression::IfElse( - // box BooleanExpression::Eq( - // box FieldElementExpression::Number(FieldPrime::from(1)), - // box FieldElementExpression::Number(FieldPrime::from(1)), - // ), - // box FieldElementExpression::Number(FieldPrime::from(1)), - // box FieldElementExpression::Number(FieldPrime::from(3)), - // ); - - // ( - // flattener.flatten_field_expression( - // &mut functions_flattened, - // &mut statements_flattened, - // e, - // ), - // statements_flattened, - // ) - // }; - - // assert_eq!(with_arrays, without_arrays); - // } - - // #[test] - // fn next_variable() { - // let mut flattener = Flattener::new(); - // assert_eq!( - // FlatVariable::new(0), - // flattener.use_variable(&String::from("a")) - // ); - // assert_eq!( - // flattener.get_latest_var_substitution(&String::from("a")), - // FlatVariable::new(0) - // ); - // assert_eq!( - // FlatVariable::new(1), - // flattener.use_variable(&String::from("a")) - // ); - // assert_eq!( - // flattener.get_latest_var_substitution(&String::from("a")), - // FlatVariable::new(1) - // ); - // assert_eq!( - // FlatVariable::new(2), - // flattener.use_variable(&String::from("a")) - // ); - // assert_eq!( - // flattener.get_latest_var_substitution(&String::from("a")), - // FlatVariable::new(2) - // ); - // } + #[test] + fn array_if() { + // if 1 == 1 then [1] else [3] fi + + let with_arrays = { + let program: TypedProgram = TypedProgram { + modules: vec![( + String::from("main"), + TypedModule { + functions: HashMap::new(), + imports: vec![], + }, + )] + .into_iter() + .collect(), + main: String::from("main"), + }; + + use static_analysis::CoreLibInjector; + let program = CoreLibInjector::inject(program); + + let functions = program.modules.get("main").unwrap().functions.clone(); + + let mut flattener = Flattener::with_modules(program.modules); + let mut statements_flattened = vec![]; + + let e = FieldElementArrayExpression::IfElse( + box BooleanExpression::Eq( + box FieldElementExpression::Number(FieldPrime::from(1)), + box FieldElementExpression::Number(FieldPrime::from(1)), + ), + box FieldElementArrayExpression::Value( + 1, + vec![FieldElementExpression::Number(FieldPrime::from(1))], + ), + box FieldElementArrayExpression::Value( + 1, + vec![FieldElementExpression::Number(FieldPrime::from(3))], + ), + ); + + ( + flattener.flatten_field_array_expression(&functions, &mut statements_flattened, e) + [0] + .clone(), + statements_flattened, + ) + }; + + let without_arrays = { + let program: TypedProgram = TypedProgram { + modules: vec![( + String::from("main"), + TypedModule { + functions: HashMap::new(), + imports: vec![], + }, + )] + .into_iter() + .collect(), + main: String::from("main"), + }; + + use static_analysis::CoreLibInjector; + let program = CoreLibInjector::inject(program); + let mut statements_flattened = vec![]; + + let functions = program.modules.get("main").unwrap().functions.clone(); + + let mut flattener = Flattener::with_modules(program.modules); + // if 1 == 1 then 1 else 3 fi + let e = FieldElementExpression::IfElse( + box BooleanExpression::Eq( + box FieldElementExpression::Number(FieldPrime::from(1)), + box FieldElementExpression::Number(FieldPrime::from(1)), + ), + box FieldElementExpression::Number(FieldPrime::from(1)), + box FieldElementExpression::Number(FieldPrime::from(3)), + ); + + ( + flattener.flatten_field_expression(&functions, &mut statements_flattened, e), + statements_flattened, + ) + }; + + assert_eq!(with_arrays, without_arrays); + } + + #[test] + fn next_variable() { + let mut flattener: Flattener = Flattener::new(); + assert_eq!( + FlatVariable::new(0), + flattener.use_variable(&String::from("a")) + ); + assert_eq!( + flattener.get_latest_var_substitution(&String::from("a")), + FlatVariable::new(0) + ); + assert_eq!( + FlatVariable::new(1), + flattener.use_variable(&String::from("a")) + ); + assert_eq!( + flattener.get_latest_var_substitution(&String::from("a")), + FlatVariable::new(1) + ); + assert_eq!( + FlatVariable::new(2), + flattener.use_variable(&String::from("a")) + ); + assert_eq!( + flattener.get_latest_var_substitution(&String::from("a")), + FlatVariable::new(2) + ); + } } diff --git a/zokrates_core/src/static_analysis/mod.rs b/zokrates_core/src/static_analysis/mod.rs index f25d25eb2..b732269d8 100644 --- a/zokrates_core/src/static_analysis/mod.rs +++ b/zokrates_core/src/static_analysis/mod.rs @@ -11,7 +11,7 @@ mod power_check; mod propagation; mod unroll; -use self::core_lib_injector::CoreLibInjector; +pub use self::core_lib_injector::CoreLibInjector; use self::inline::Inliner; use self::power_check::PowerChecker; use self::propagation::Propagator; From c06ca06cb7c06f4e0d254cdfef72a3cd813bcf31 Mon Sep 17 00:00:00 2001 From: schaeff Date: Wed, 29 May 2019 19:37:58 +0200 Subject: [PATCH 026/162] register functionsymbol sourcemap --- zokrates_core/src/parser/parse/module.rs | 69 ++++++++++++------------ 1 file changed, 35 insertions(+), 34 deletions(-) diff --git a/zokrates_core/src/parser/parse/module.rs b/zokrates_core/src/parser/parse/module.rs index 738574b16..d17e79334 100644 --- a/zokrates_core/src/parser/parse/module.rs +++ b/zokrates_core/src/parser/parse/module.rs @@ -8,7 +8,7 @@ use crate::parser::tokenize::{next_token, Position, Token}; use super::function::parse_function; use super::import::parse_import; -use crate::absy::{FunctionDeclaration, FunctionSymbol, Module, NodeValue}; +use crate::absy::{FunctionDeclaration, FunctionSymbol, Module, Node}; pub fn parse_module(reader: &mut R) -> Result, Error> { let mut current_line = 1; @@ -19,43 +19,44 @@ pub fn parse_module(reader: &mut R) -> Result, E loop { match lines.next() { Some(Ok(ref x)) if x.trim().starts_with("//") || x.trim() == "" => current_line += 1, - Some(Ok(ref x)) => match next_token( - x, - &Position { + Some(Ok(ref x)) => { + let p0 = Position { line: current_line, col: 1, - }, - ) { - (Token::Import, ref s1, ref p1) => match parse_import(s1, p1) { - Ok((import, p2)) => { - imports.push(import); - current_line = p2.line; // this is the line of the import statement - current_line += 1; + }; + match next_token(x, &p0) { + (Token::Import, ref s1, ref p1) => match parse_import(s1, p1) { + Ok((import, p2)) => { + imports.push(import); + current_line = p2.line; // this is the line of the import statement + current_line += 1; + } + Err(err) => return Err(err), + }, + (Token::Def, ref s1, ref p1) => match parse_function(&mut lines, s1, p1) { + Ok((identifier, function, p2)) => { + functions.push(Node::new( + p0, + p2, + FunctionDeclaration { + id: identifier, + symbol: FunctionSymbol::Here(function), + }, + )); + current_line = p2.line; // this is the line of the return statement + current_line += 1; + } + Err(err) => return Err(err), + }, + (t1, _, p1) => { + return Err(Error { + expected: vec![Token::Def], + got: t1, + pos: p1, + }); } - Err(err) => return Err(err), - }, - (Token::Def, ref s1, ref p1) => match parse_function(&mut lines, s1, p1) { - Ok((identifier, function, p2)) => { - functions.push( - FunctionDeclaration { - id: identifier, - symbol: FunctionSymbol::Here(function), - } - .at(0, 0, 0), - ); - current_line = p2.line; // this is the line of the return statement - current_line += 1; - } - Err(err) => return Err(err), - }, - (t1, _, p1) => { - return Err(Error { - expected: vec![Token::Def], - got: t1, - pos: p1, - }); } - }, + } None => break, Some(Err(err)) => panic!("Error while reading function definitions: {}", err), } From cdf394c7e17341329243b7a9dca3eb253c33e8b8 Mon Sep 17 00:00:00 2001 From: schaeff Date: Tue, 11 Jun 2019 11:12:37 +0200 Subject: [PATCH 027/162] solve conflicts except compile loop --- .cargo/bin/zokrates | Bin 6212287 -> 0 bytes Cargo.lock | 658 ++++-- full_test.sh | 4 +- test.sh | 4 +- zokrates_book/src/gettingstarted.md | 4 +- zokrates_book/src/sha256example.md | 16 +- zokrates_cli/Cargo.toml | 2 +- zokrates_cli/src/bin.rs | 2 +- .../tests/code/n_choose_k.arguments.json | 1 + zokrates_cli/tests/code/n_choose_k.code | 12 + .../tests/code/n_choose_k.expected.witness | 1 + zokrates_core/Cargo.lock | 375 ---- zokrates_core/Cargo.toml | 4 +- zokrates_core/lib/gm17.cpp | 2 +- zokrates_core/lib/pghr13.cpp | 2 +- zokrates_core/lib/util.cpp | 4 + zokrates_core/lib/util.hpp | 2 + zokrates_core/src/absy/from_ast.rs | 521 +++++ zokrates_core/src/absy/mod.rs | 182 +- zokrates_core/src/absy/node.rs | 37 +- zokrates_core/src/absy/parameter.rs | 28 +- zokrates_core/src/absy/variable.rs | 58 +- zokrates_core/src/compile.rs | 70 +- zokrates_core/src/flatten/mod.rs | 771 +++++-- zokrates_core/src/imports.rs | 300 +-- zokrates_core/src/ir/expression.rs | 4 +- zokrates_core/src/ir/mod.rs | 2 +- zokrates_core/src/lib.rs | 3 +- zokrates_core/src/parser/error.rs | 29 - zokrates_core/src/parser/mod.rs | 6 +- zokrates_core/src/parser/parse/expression.rs | 1057 --------- .../src/parser/parse/expression_list.rs | 100 - zokrates_core/src/parser/parse/function.rs | 319 --- zokrates_core/src/parser/parse/import.rs | 118 - zokrates_core/src/parser/parse/mod.rs | 8 - zokrates_core/src/parser/parse/module.rs | 69 - zokrates_core/src/parser/parse/statement.rs | 789 ------- zokrates_core/src/parser/tokenize/mod.rs | 4 - zokrates_core/src/parser/tokenize/token.rs | 113 - .../src/parser/tokenize/tokenizer.rs | 554 ----- zokrates_core/src/proof_system/bn128/g16.rs | 38 +- zokrates_core/src/proof_system/bn128/gm17.rs | 12 +- .../src/proof_system/bn128/pghr13.rs | 12 +- .../src/proof_system/bn128/utils/bellman.rs | 115 +- zokrates_core/src/semantics.rs | 364 +-- .../src/static_analysis/core_lib_injector.rs | 26 +- zokrates_core/src/static_analysis/inline.rs | 1965 +++++++++-------- zokrates_core/src/static_analysis/mod.rs | 10 +- .../src/static_analysis/power_check.rs | 7 +- .../src/static_analysis/propagation.rs | 53 +- zokrates_core/src/static_analysis/unroll.rs | 145 +- zokrates_core/src/typed_absy/folder.rs | 93 +- zokrates_core/src/typed_absy/mod.rs | 263 ++- zokrates_core/src/typed_absy/parameter.rs | 18 +- zokrates_core/src/typed_absy/variable.rs | 58 +- zokrates_core/src/types/conversions.rs | 18 +- zokrates_core/src/types/mod.rs | 40 +- zokrates_core/src/types/signature.rs | 43 + zokrates_core/tests/utils/mod.rs | 2 +- zokrates_fs_resolver/src/lib.rs | 21 +- zokrates_parser/Cargo.toml | 12 + zokrates_parser/README.md | 3 + zokrates_parser/src/lib.rs | 146 ++ zokrates_parser/src/zokrates.pest | 100 + zokrates_pest_ast/Cargo.toml | 16 + zokrates_pest_ast/README.md | 3 + zokrates_pest_ast/src/lib.rs | 880 ++++++++ zokrates_stdlib/Cargo.toml | 2 +- zokrates_stdlib/src/lib.rs | 1 + zokrates_stdlib/src/main.rs | 1 - 70 files changed, 5087 insertions(+), 5615 deletions(-) delete mode 100755 .cargo/bin/zokrates create mode 100644 zokrates_cli/tests/code/n_choose_k.arguments.json create mode 100644 zokrates_cli/tests/code/n_choose_k.code create mode 100644 zokrates_cli/tests/code/n_choose_k.expected.witness delete mode 100644 zokrates_core/Cargo.lock create mode 100644 zokrates_core/src/absy/from_ast.rs delete mode 100644 zokrates_core/src/parser/error.rs delete mode 100644 zokrates_core/src/parser/parse/expression.rs delete mode 100644 zokrates_core/src/parser/parse/expression_list.rs delete mode 100644 zokrates_core/src/parser/parse/function.rs delete mode 100644 zokrates_core/src/parser/parse/import.rs delete mode 100644 zokrates_core/src/parser/parse/mod.rs delete mode 100644 zokrates_core/src/parser/parse/module.rs delete mode 100644 zokrates_core/src/parser/parse/statement.rs delete mode 100644 zokrates_core/src/parser/tokenize/token.rs delete mode 100644 zokrates_core/src/parser/tokenize/tokenizer.rs create mode 100644 zokrates_parser/Cargo.toml create mode 100644 zokrates_parser/README.md create mode 100644 zokrates_parser/src/lib.rs create mode 100644 zokrates_parser/src/zokrates.pest create mode 100644 zokrates_pest_ast/Cargo.toml create mode 100644 zokrates_pest_ast/README.md create mode 100644 zokrates_pest_ast/src/lib.rs create mode 100644 zokrates_stdlib/src/lib.rs delete mode 100644 zokrates_stdlib/src/main.rs diff --git a/.cargo/bin/zokrates b/.cargo/bin/zokrates deleted file mode 100755 index 1a41a39772a3d9fc841fbb3228ff3e1766c0c9b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6212287 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⋘d=r`?%WuY@sEck??A8m*>M;T18hg5fGLud zkJ&QIH0>}_*@0_6m*E6TBk-3o;QDE9ql1&0>(;><{|R3ZE7-~w zVMZ&U9z!z8%{0RWUQ>sc{t1KM@0_B$iZA7%@G@p8op+#Rdgh_F`<- zpf)h_WFuN6%nFz2XTsXO8y_8=u)YG(7RvN;!54lf+y3mN?%-psfH{1NB9<{t zk>60UPN(P|MIjBr0xq_=f+7SmdU->OyoRp0vP>s-izAWkK?N(icMPb;dE~Zz`tJxW zcXDI5o`rM9DLHQGkZ>%v2kcJ~z0Tfym5L&M8S}wY#Satf!+;t=2Am_R{Za)dLcwol{^o{XA5+NiET(CN!6+nk(+0gr- zYzHwMR8bfbR*L(B1q~qSzd&op7gy3JjQuG^=w-_4gkOs9w9mUn;mm&S9CPU*j1lb& zJ=}&DsaX?8pr2(!1!~sYrH6%UJI4yX+zv5N`5yPPouP+`zxC0>kQ>$928?XCe)xW# zL+_Snem}?Yw&?v&`?j0kL0`$LZg+m^eO5)&N5iwXZEAnEd1q#K+i!fc`wScSNbTp0 z@XgN0Pp7Rfrg}k=Uny&%e1&Z?<1eAvwf>rhCBL<0A$j&Xpg5g`r! z@_LvvbXgfG|BUGP^?WZf|3Ui^q>Pn!M(#mU=>LrI-B1g#mG_@ggWC-8!R;5*mhl`! zUjT)p3@SmxbNU5iO3E`G`>#@r2GJ@}{41=arFdkZCljSOWiQ>2dB9KimwdrRlZc~? z8l93B!uF7Tu?#{LKlvkJyTLAiD&&*pWT?6HF`0wa^5S+JZwr6o`?SNKw?E%8{!I8} z@(zT>yqP{>Z{O%(B;d@>D z+1Sy+pVGMC5AQ#v2It}r&o%yx`^NaQ5)XUvr`LUc{OPx48~D>{AA>*NWoZ!L&q5gU z?eNC~U-&}=xMg^y0WPDd+mgrqVgCql|HcV^OL_bwxH&qFO!vFr$YifJH&i$`<#XrD z0pCO`0=SH3CWnM6ZM1xL#B!My%PSk6ai!=E#j-cLV*lk{KY0JPiQvs6mhb-#zzeZF zKd!{`*kKB|-erM=$>1-c8?#qlZ(BsWRb5X{JFO%Eh z%T~b`I2jl|Q%b5wgUbdq#?avNV$2v7tj=NNT*PpDMqUs1%>B`HzgCShbj>_c00pGC zgD>#J!0=bG*LwC)C1tpR#_^*0iY?;#QLs=e8q(`k=wBai5vy-L-Ds`L!@c}ToM?bNYy_!?b#tS zz)R5`szeLb_ooi%-XU{<@4mis!Ij;ZY#2)(MMBr{S197O^l**~^c-CQjl2vRc`;Ux z(J70xk0Dx6%jX7~F94%;d4PpIFzz}k{T!|k$Z7aZ=pjV}I%gICbdP@(m;BSSieCNv zuDui^*n5#$!_if~HO%D)H3Cj$&;0_&+mg>Oi|tFTo%$T0k_}bK5Vp?`@TGZ%#daX0 zTd&<2p77}1KAv#o9K{o^hRehiBf0ad_snm5`p2ix{B!u-`5zO++n?WrPwICtw}*bR zGjn?d#Ws`&TU4x9A5nAr z%&$<}tj1iWhI$yts}MfbjZi(Ug&)Dmv#cQbapG;{HGEY+X>a<=o@toab_<5k|D`tW zfUx>J?{|2?3hM;LGY}jCQ#AqvhotNofwY99xn~3da|oQFkqCZa(ni1)ht%P>4!`wQ zBGZUt{MwBSIa-ykHav-{$|x()sck~s=))^hsVFh0b4K5xiaeZF8iIBecC zg{EAaSNtsE9{BMu2yr*R02WWVKs4-u=rImNW7yf?hv*`DPQ;E?6ak3-V1oyuFahWW z2-6Or3PW>0(6j&t0Bh&|FZF+h@$9O=6Y&t#v8@G|7qZzKPONIY2H7T&z^vBD6CE=n zyxa)$g%}wcg1_U5F`?q7RcN)W@ym|!j>%6VPZVShym00=@AuynnQ?S5GUJ+HLEz8v zlD#fW#)Dnp#NQLY9pR7;7R?wFEXIX>aG@7|d*b)I@a@5|um~INUsn0?6f zF1y4^tcs6-U#>8k?%oUhcVqG`U@Q>UO1$4Gel(n%vE)1OuUM($8?P?H5Gn$*@R{WF zX+iOU!qNGjmA+ylay`l??VXw2e^X{E9x#_CUerH}k`{o!mFjhT<2A>#hhFGnXa&-W z#vC8SrD9wfQxW7fOm)ohVO%SdYhhl4syOEOa$KvBYvsIFfxyr47;FUC8?h??+Hh~I zk3(q|%tm1FmD|MNdw;G#EPgEW$DLD&c{f_P|zAcDUaDma_5MC!&t=6U= z#P@a_pOm8v<#%#TTS5>xXnD?J`;yxUG}q5{O@>I7N1-0oRmsuOcPcr$_wmAtJ@8Ge zSN_6syutvtL{M7vO>h%&ihA_TpTfWw@T%C=x72_bsDXtt7NJ@Q)~}831FiG8&1d<% z&w2Gvi~1)xYz%4)LV-0^jZ=Z9+RrFTC|I#5p@CUL%5c2`YUY6C$bQKoeSoXbyF{@; zy^9UlpOtqdkUz!_%a!keIt@775}&{EU1U*t*WuH)ZLGszJF9gVHD9ems=_A{bLBlT z-SC&~$@@aY&b-_k`pgwFgdNHI+8xOIkyCa?-oJM%rwM zpiH)#arftAY+k0CGw)wLu6K%{n?|`0q(>lKBJwpPvpNz)n50+FhgBo%9n5yCwJE0F;HcDe-Yn+8ZeD_RcT87|Fg(8&P=BMc0 z!j*6ewqVG5v)X#_L+=%TG|GpM`Sx=^g2%lY3tWc({rkDMe1JLoQQU}A5B0K}?<|=*$R4H#7$Lr~P&q5VjGw_Yov_kZbbe0gGZe>c zNlYm&NR8|jxUEHRnLGoi4YZ`qnH*M}tcK>aG|VgtF#0gMVmwK@N6*zsnA9r1rul#? zMV~;lh~t$lk?!T*?~*1+^?1!yNlhwe>Di9)hRf83KYf=J<}D@d2(a$)^;HZ%fZ z3W2rCpYmr#VGBm5KyXrUC@d22gDK^K;OLq_a8x7^oKPPK{upGPn#qpAFK{o_h+|2x z@mvo&*SnW+qsc;iN2?2ptdDJ8HdtE0G&fidNhFo)R-jzSEy;jCHF!?G{TN_Rf$M(WV|!DA$J3x4^}N~;}b>}3Vdac?Dl#ruP8_}q?RrT-+{TD%wYAQK#Z3Uvjn zSEv28z0W&MvZ0I9s0#%3E-%P}8rEa0=@1`Jh}ZFUxiD(@ouI|H6j-gOG6ZfL7-Ca& zgr6+tV7Q|I8N+8IW0+8FZn2Vgmu$hE_|Y2ro1uSvDTvr`sMP17WmAI|m`SH1{K($F zAw_L(VMba&Mo+KXX9Z?==8HD1A_1Sp4=jKcx~rLZGAmb~BK z)7l$ce2M`iv*qob=bzw1r8k?2N_dG_Tb2OjIqAf7KK)WS6T(11f~gm?cw8W=wuiSz{ZANZGXT+E-Jo{D30(%hI}pJ4E21}D8}~c7`y%wTGbV{ zUd*=RFkrHF(fTFHLGY>`4|m7}a_<0B&`{w&>n>VEfh4Mb2nNA>ig01OK&4p2{DYu< zk;ItX(awF7Y|Fl7MnQ)R5JPn8u>I>X9Mo$2hyBR6oXaU(&YYP!!MU*isG<&;YM!F; z;ZEb6>7><4+v`t5>;2F=^BsA_KWPMDrYumeUE5bgnulL1{UORV*-HE>B3WC>7m>|q zJ@wG<)jw`f!sa8j(Ko0PN)n%!PaG6Yz7k#dVdp2y@DTP~3O{*5I#?=@kSw($)OrS* z?w3255?-TnK)_i(dQq&1=S7y^MR-s3^22vU$PTuAFGAGDk;=> zx64SM(ZrH+Jlyb{?iN06E;SecUbU^%94BFWh(we0(6N2!lT}7D_)=e>{y!5F_QKUb5J{P8Z!}p<>ZC9s64CSq)7I(>8jMG+gB zXfm1mZ)czjaVrqUk*C8rmBC^EAVw-Y<#El%RXPMt1UwO%I?#DwlTmbGZFq;cR3;1v z2S6`E8uyq6FZX0UVd6nag@29yvbUm8rkPPOnQ3`tnZ90gB;tA1U}WZ&2l2PC9Fhju zyezDpRYhjLfu`Scbou8NtIRZfd9T*MF z00D+DS**;qIV@M(W7P|rkcYFO-$-c3CC)Qf605wcIaID-I+^|H4uEz3&qEcT#fdWt z@WYWm=eRc5f0x@{durPHxmZT%kEC1hSE7#n9JEX;p-#Fq^p3W6DZ*t?Gwk1!z{;}r zh;zsQHnttW?N@k=TXLz{@o~v@$cEOveHQY3hokuJDKM9xu>wOEvL>TdZ1u%gY!`kG zT0h{~31xr0cmDOD_1Bp-gXR{RTlt&M^)z3I<}FsiVy{T1gboZ|>C2A%Bh&|i2HWyM zPsQ;ATyWmNg-*6|t@muZ3hkuEf-?UByfQ0&w@gc>gAA{1D1;di@wpFK5Hc+O2tx`` z-hd5C=>W4Hu9OZQ39o|(A&)|b5`2L^U{WMk@FgfkQZAgC{lV(-TZI{<9~QWZL76#3 z{O1F)b2RIY>;UM|pq&DEY83m}fNiRFXCyQ`%NS^4xdZ*kYHUo%hK8*;fh4(JBrhLGTY;*@bYw5v? zS>U4fTTus-j~UuZbRO`suncRwA49F=Oo@Eh!1?shOT+h2fxFA?1SGCe^Bt-H*Dbd@73qerNv3O zeG7g5MqtLjQJ)#$>nI%#`JrS{H}>mEIRD?&aBFL8(3r4HG{ z8-#A-$Qi551e#9a&BW3z(WD(+Xm_eg*T6UNPN(<}tj+&Gy?^L_P)g}wLKhbFP;%p> zg@KY0M}lw*m08(E4fv|S*TsS952Br`lk)lPJ)0Vdz9VJ2a|}v#Zt2b|q}XL^q((PD zfK@esb5h=3hXzPRj!ae!W;Ak?s?7`vF4e4&$`j@hwmQ$o5og`}BM7G`JX%t(hwhF5 zeF$o6PH5@h0XRq;qyd}+|0V$ErU7^p7?nNb184K25M!t$W%_M+F!OjebTpg^UcUD3 z-#m0#ZhwY!Mhd)QdlmB4$Vw~3kOAp| z-vao;iF{r5H}LcEs|v)2^80t-)mdm4T2I|t68#zf%j4szpLhg(JQn^#T;J8qMq_{i zDmo!3=ZS4Q;nD#|Jp4R316)=k`710O9pOHL#FBbC-IAl2tq2~4J*buI8rFCmFFWhY zamV_DX9+yI96=3XI)n7)fiCYGcKV z|JE<};om*rdmj9|`DTTG*YB4H|5Uz@+SN-J4m?TMz(j&Osm^}(sE1)jF($ zBTt7FwIS0Qcy$SkL9lT+a$<1gz#>$#)ob#>4qmB0~9w=wcF?pRed&7bSG#U&oCOV_VvIro_kmCR=I*H zIS!ku5Rr&33d%0!HiE+Jp2VloP(m z_hNn4UU_7^T(mEfjx!CzN3jjfE?TppMg_w7Bm#zmfDI^at7Kz0^<~CVws16B&HzKAOOM z^S87<8uS1F2z&%`>;MOR@hQ2MA!$!?}pxyFBI!a(RP)C}V)l2ITD2O4Egh zlRR0V5eyz%`6sT{ol4m~^Z;iTa)}tGC4CxgPO?qZc1g>FaoJEBK>~wk(CXkx7_fv_ zym~%{jNZw7%Iw3}DaIeP*A7sO|F7RMtm{8$&v(Hz1oFGh9vwSoC;7j`t^_dz8`m!~ z*a-NA?Ry6K`M<6sbA3+(L=S$#pNh4Xc>LE&SAKeY0knE>(vA(ibJ#weF)L7L8JwkU z9X*v;e!;bfX!AnK@QH@u6Ac@m=wA5v0-S8MaI$^bSvgHlK^cqT5rEPP3|$^a1IKm8 z2HSFz7Gs=-E`EuZONvGd(Z=%bA+LKwR>`~P;BN~F9%WU4Fu*Or(rM2`B-c>!3h|WI z5%D=Iv{BLr41|HLdEz0*wEl07hpYok6uEzsc*yy$Dsulu@sNJl?&eTFxa&^FLmq#{ zp?rz4UNBE6|HKP(<00!oZO%e^;vqvPK~VeRA&Y!1-FV3UY-!>l*GAACxWnUnXf~1? z4;dp3*4gh)Q4Mc04K*9_@Q;5(e#!G{A-|PB`U`;c-{_BC3lF8yR2enD^+}$4_0%v~ zwsufl@QQIz^u_)HIw%e)5*6#;3*XD=R{fU#{$D)xZ-s9{0#Dka0ep{|yFK`Je%ZkH zuSnu2d>3~S_!|Gu8qpctyr|s#9h6j)ifSrW&Cqr5WVk3q5tA6U*i0s)M?%L43)EVD z(G==xC)5eH0w=BHHnHPWb$wlwVu8HaW0ih@h>)y-vC4|5Wcqx&RO6rks!UU!gz5W$ zn}Q=LleqfbB`xTf*^+bQ_okBB@@ukGkuGB;Zz^fTMW(9KwC6uYO+|NuO*`41`oy-4 zh&5X}{Qjh2gZ_1Y(lm@( z0R7+QPa1dPf54x#7y%E;$Q}EWqAy6x-Re(z;CW(@OWkMuiRWH_(h#}g^(TGYQOU3z zf6@rZJNlDelG}#fiR9XwB6*Ox^iDe8QNG^J`+N7rbOhCQo4wyOXWOL8xf)W9NnFb% z)vx}?N2=A;K2rUNX*5s|ZZ9yTx+~$g^YN}%5mnl~@H_pior7O@iEp{^oByZ}em#&C z>hYKFHBG_q%nk;AK6wt000X_PxgJfF7P|}%y~|L#?8ErktX!>jk0kB>FGV+hhHv1& zwyp}yT4Lct)CEi8l~0DT#AbKTJA&Hk<2jO*dk11l0=*TuL)%r#!*Q5!7sBfoOC2J6 zcj%vReVhEY6<&Xy-~L7wRx6o_28O>$OSi%lJp1e~ctxK#u>rbsv|u$|II2bkqOvjO z@AibjoLGXbJ=hT4{9(hBYOfGnh-IR1IvR7iXv`8ihUdsv=^sVXTB}$jExO<=sWUoF zqCI*kuz#Wd9K95hAML(D`Jy^K2Mquo)-UyvEZ(}6DJlOMeC~pw?_PXXd?1S&WN#2xU=mO>4CvTenj92V-d2`kP%A42mF4nc~DUl{u-Yoo` zM(n)u=GLW3-lVkSWYm`2^~jrl{zd=$(TSI$!mNAdNbt%-w|GoL=S0Qcz2Jj8@&p&RFr@mSK`Fw11bF{~u_qPti zyS(=0XAkh)eja&@{`~W6e&AV1kH7V0WSjf_t*7}~y8hPRv!(I3_TX?~P!0Q(+yEYu zTz~6&7!Xub;}@!iy-dU1kbl1O_SczeL3d;R^vltm)3+kdtF>OZx*;otvLTu3JXzrVpMMKHSX(dqU0Z~#KW{BRr-i1=yJ2dQLXOU!Ki zVh?IHBCC_DlNaC{W&Gg6N#p2=3wDxi%O}e-G3$1y*Yq4-#}oCMp4e@J6ZM*&*l>drKF``9>@-k@9n2%(2b$(!zSAl$J%9XV+TjjI z;cQHe|A@pLj%QH^zHc`B$GFSoJ@7H=^RPZ|)aOBc9+BUhN^0cywvsyey}P8Izu4*B zL4I#5*@zY3PVY7H3y9&DaA{7VL97y=O1K2k*S0JM4A{~A;clTf zJEPT3b4JnYd2Zlb^;?3T<=ttqEEmNq8V+UB=|Lu!dJG`L=`4RtoQ}5_E2q8CLfLGH`jnoAVcjLic zBQ5iLu&F-MgWV#(rqYdC9`RN171DLjA$2_7$c8;p*$c;O)NzEzvv~}1AVQNITI5%+ zr@zn_^HR!C1xb)=H36GK`WxqT%pPDC_>_n>VdG?-g+2&UqwPRk=S#}Da+qF=%(bZ` ztk37@^PoPTtbvP$lml2!rUY@g`dimAu z(T_ae6XRmLo;Q_5$cV8=w}KZzR+jwUT~aHJ+LP7OlhLK<+xY$o!aK4IU19R_ z^|Nu0kqa_sj1WW9sU}IQo?vOjH7VsNXvf-)f^sbOh=Xu$z@%qwd7x)a*xCQ9s!FJi z4aPB(M!k^O=VtN%MZz3X4Vr_~596QeAo*4VR|uPO{KiuE%Q^e7aE^}y1)2`%%-JxN z6<7H@`w0Ucls8;CNl%q6ku z;MqnXq1OUornoa8vspD?+t} zLVQ(m8Ips?;>&%_{l3J!5jii$cfd0HBcVB3`G!$y8V+xpf+dvO+HOMbK5Ouh&w3gL znntl*8egG_fhhUM=cjOTK5gLyif;mE%2G=}f>q1G&7O=^#Uc@LF#4&P3Shi;vH&`C78H`u>>m&Rgd zkvz4*zF2N=uzx0(eg4#4?62SWN1?)9Yn5?#E zt=8oSF{0is8D5YhN&_)zOZ>Q`Y{2FCh5}?z*vo76jAL;S^m6fFq(!C zuCM3o>evzqw=rbhAU(4dJ%SJ5+wZEX&53tx+sn|1rY1^$s6@fEs~5YpU%l19M6l~M zc}MWtb@>LrL99ZUQiAg*b+rQ?%lSpVeSM&zf8I7E zIadS8HzfMwLh`1c`5<`$+}$2X9#N|xdFa~)k{)_9`wLVF%&)n=x`fp$R-ex-6sIyt z9PuM9UH^^g@cQM55dRc|5wM8K%a{Txn&;A#}IRdQ(u1I`()DJ2}lTJIlcqG{Kto}r9j&uXfy{Gr4dlGUcS2e3i)ayE=TbW zxDiCKsR(?rMBuSChZAZ(1?laKlZVM2Q7;-(V?k?tW`d>QK)8^?!=wX#;f`{G+rZ|c zXAdWL!8>QBUR$?M#f@)x*hHt^yh1JTFqqa-5Mr0nN1-*(sbR+YSzI>5Sh#i7xAW`z z-|uevIDP2O(Z_rVBDwT&$xnUsk>k&N{(J?#E^it7ApEM%P+v@|69!YbqwR6n8)q%d zbc!G8+Z{(v;e*kSFfuaV2Bi;TcbsQ?IYjAL6g>bjSk!T#&k0u2kOl7zlWxk;q43^_ z+93DO>Dv@Ybq+c$&W3*fAR*vF;}4{fJoUqBdq_UrzgR!) zG>l7_$A5kOuyNh>eBJ%1d1|9^OX{wzAJzzW7$CHx`eA$gRv}g$5o`C<54-R;4h~81 zeBYaR?oA&olq*yaP5rR{`3F%7S431g+flnoy@w6}OjP#?g?1WwHO5P!u*)>^e)G4DcbtRKBX9e)11Q<2I&_8) z?~teA)gzBZazD+Mw_f!D=RcOOwl796n7P~Z@pq5jHXNx&8aT%8^~3S2>wR#n&TjR> z@#HfV9B+Tcz|lv)yFFj)t=SrG_hSm*p!f*u$?gdZ`8VckeFCoG%_z99nde?Q4tw_d zG~8=6;sJ$A?eV`urJ%65} z?@Jl0W+ylSshAa48xnh^Y?;FwY z6L;-y_{IOQbMRaL3qSnsZuG(LFW80df!|h?ho+o9_Jv&zzi&jpS7Ow=7yshh(Q~}= z`QbbL@EbGL2frSE{BS!~f>| z(*0%$xqid^(pwNB0+D~S{L(Qnv%W=s>3bNVR~wu)h3EEVhvw#&_QEDummb~v#&M)F z`14Eu3A%J!y7{Fe*wW;eJ_0+44E4Qd$Pn`6m);}|*4g_ER1N2whTm{Mza!i8elMbI z;*t7$5iE)7t0&k^tzDq$)^DcLp9qzHHJ){2_fk&~CG%A^L0HM{stLYB`(LZwu%V4h zoAtTi_&2f1MEj3QiPPxqpK#5f!FzfUC&%1bMtMK?ldWQeU%5OF|Hb#?RXs+t!H*#6 z^V$F7?n~gKs;>VDNgygZ6E!xiw2UQc5SQRe3hD$1ypai}f;6q5>90tGxTG*a`m0NT ziDev8X^Yl>Yx_&pw$`epmEuyWiL6?+)UDJt)`d3?N?H_9k@%%ct(mSLEOOy z&v!CcozDS}fVOnN-tX96)zKQ0nLB+n(sV6`rZ;;z^2#9J4^ni&&5NShhTo~}daeVc z<%kWYWPC~)QP7|mBH*;ejy^gEN;2=&OBK8+ejc$C2{2bI)WA$1uK`Ojs{}*~?b$2T zW{Hz`DR>^Yu~T^VxxRTNdM%*d2YvIWK$m{hH<$d-%VAEtx;=p1`eyEr4a)xY0|nx> z>jlIIQeWzMJozAWzHjBNq8{2a$BNI&v1e|pBN$0#Lh5I~=aKi%DOX(chIIx%4gBgs zo89T_8T{ef-&6ld8uNuh<0=h&2kYD4;2h!#cEGG}=X7z(3rA$EMn{QP%7M~`hzCl$ zy#DYldXr!ES_37=AMTP*muy?8Ay$}&wlq%+=!A}l#>d9w>k4n29*9pY0%JQOKJgg( zGr=drBU*X%A&!BvMkL|O!a0O%BV|jc75N?tpeAERClPB7B-{!q4;$f362zm-O&6^A zX#+RnQs*Xl-xm|+GkNfpeR?}BilU9J)D(8t<=l=#<` z{|^TU9>&cLvwgKKQ+WDcGZCm-&I113{eV$3&tgE=!?!1#&~8Huwr>(Qn;p3Qg@H+^n&&lP#t$4vN5bHqFYIyel6Oi&d2T(bh4q1XMkul4G@Ci=tgb~#=4 zGah5bQ9aYo!|^nxiG6KPtpS$syNZN|-%SZB=-u+DK|2@yF4}e%5J*Tklh3(?EUyxq zU!YDQ5~7nNt!G9~_jnv`mnvN`Krg|;-bcqDEi-iX!D4?iBwJd%+a0C8sGEcEGo`&m#pa0L%R#zTR~a}0=^l6&+8Lzq zOCB*`OEbU&iGOJsobe9D=%HbJ9fxL957)t)Gb88i$SrO~iBe$@ymSb`vMcB&5N$sGHz;p7aMrBhs7Ty_aoft66& z-L}W-D-3LaQ%7LOJaOufH3k$Oe_#Ldvx(?w-{RA(@jb(*Ys7!$;M0kh8<+_`U5lVi z7d~A#M)9)^4;vu5*Uw-N1vvOhC042eM|_NU*%w_3C91<&9}H*rVAA2}slbfIDL5eF zbrv-#Y{rs-F%HkaA3-IFfExp}2rDyauMEpq(*w)l|z;opJn^>;Ki8EUfHK_{tmuiFe)kNGi9It*|nY7ryC${ zr>C(K`}BHIM8FG|_Nig?2F6yzh z8hc<>ISZYV<>~*)o3v;H3jl2HSD-Ktc!0>`1k{gusiJiIf-&LvvGZWKbOe_38pn<- zOFbv2k1ScAcV1)8NIBLX`vAkGyXUp)svv?XvvdZDV02m{pn2tM*Q9|4Xru}T{}=C_ z*c|B{s}z~>pVt~&>F*J?$QZkytTf%;T3UxnL90J{(N=!1b7{b-Ng@!u{O zBOmV_)m|8<9Wesqx@!!K$6zM_VSL)}1;z(bzUsL>dI37$xAN8dIX$EAd&KGF$X7Ei zAsEy4=z9_E>7wuZuxXFYlUnksCWl6Td4wrU52&p3CjE;}@8X|=-LA_d9TLh_ z^ST+DA+9TVy;5BVdELZoY%E`nUl=@9z8G#0TQa-23%?wftsCOoN`aa>T`Y z6u1xS^377uGSPJ<8I;^3K@Q8Kep;H?p0ta5?tbLGw2S*Tln=-6DY8*c4z~Xb9tSU8$Wj5?*aA2Gln{cjVH3;JD zqzUH+;pM_1qft<$ej?%s7{Sr=1(X-|)Hq9pil0a0gfMuaDXmNe2iX5LztX; zx#v#O)v!lmr)iF_;R3XmSPSSo00X>S?eicecl#aMfj39G1b+>1J_x|VmX2-#o;>L) zzylU=Ht5)*oJft#1UJ4mvnz1+q`TkQbYvQXv{1_pym}Cgs4cOVkb^IQh|%qwxS^4r z6F|~4C%A7yWmcn_U@P{R6%S$;@G1egg);&%;Bi4X4+fR39;iDLUBG@cmV+azNwVN* z2IA>i5*Hc<4ouJ!0(4QWnhEm&PC^)w$gSZlBohh8-m^xoQfSb!H`{v9MeS{)nn~?# z=rE|gx&66ZZSy~G!3;frsFn5C`NI==z^e3le;gRz&3hC66ukB=euq4*G3OxXV6KO& z2#8((^3^|$cXHO+p4*>2p!W1nWJw;)owNw&8VlkE-6L1lXbr(m`>^kd2H9A9)9 zYV;7K51BvOvBymGNWX9`hm^*0Br5`ty25f-#x~GTHnqnFEYcxP*@^HYkOytyC?Sk| z&WdZ`%xzQnmMU2KH6Ve(cTPB0w8)_ZBT2v>jmpSvYIqhZjjdJO{I1SG<&y2PEf};( z73`Qx3B*CyJHE>MRKZJlo_t$BM=FW9JQsy-jpS~#KhM2uC-4b0jx~O?t>@EDrJ(Kk zby?}!71(G%6{X5P4LdCPS`tZar9;r8|Mhvi+&LJWkkg$6ch3)p=Kie9F6dYL z#MH~u^CK3|>`LA{HXyHk;`zD8KJl}sm3`vJzYrDB1z((Z3{Dt|?X+TRinahRe5)r~ zpolDAl$4Gutny!Gk@%F7(3mNs!Sou-7z|XR$V@UPlBgteBG$RxxxR+Qete3w4op#j z}sdLhsMVZ zfAc)Pb&7x*CWlb`;zB6>zGw{!FtsX28E(8&WHkn=0@;NhgKy04CpJF_roNFt&m4 zV63M23poUTA&B5FSRPl84Fm_c3^~5UfHA$HuzNtO(#SweNk}1-FWcl-OL@qBNDSd@ zU`h}$MIZ-Q5ysC56+k9P$i&{WFB*Cfno`p7gXk8J;KPBD*>dbD##Jjl^$$iis`Jr7 zKeM{}FA)*0nuCJ~S1G@!L4MI`{93V1$uIkc1qHp>6rRaC(u!aEEM)yrZJ}Ydz@wr9 z{2Vaj=Y*M52bf9qfLS%4WAXCK?+Ts6b(zlLiWwlRgeLNRxT4e72ght;Cd!B0xN$HZ zbc!3&-vf*vKWDH0H{-{cFZ4fteD2^r#gBUrb>RnjArpoIDF&2nm}m{`6*paf2&!^t z(!sK?IB3HoA90nxO*l6K;nVu}c*JGwvZL5hg>b6G>jxX@Pa_E>B_V1E;s`QR=|rIi zf|pVmETJ+O^mR-pN(KO2ODkxk_F8fZR>qr!>}Nf0SPDcu5v&1B1w+RT6HQMceNQKS zUo7;^)SIMlX85G0-zJ0yLeun9iHgGT9kKyt5M9U&r1iMD@is}tTK{ntIQ1ZixIe)c z8bWDdxs22{E)>zOT8L^UQryZix3B zn)SBxqxbHIvX{oey%==D%G2ZIEC4K<1=5OPlF_!wy=JIjw2Hx^6#*++kzZr!!9s|8 zf|*pq>0x~q(oY9@A1e!ziL;DI3i7M#prpY2eB_+YNABr-)NCe@fB`GzSF6P6+H%};sPq=xIHSnt0!b23NSrZPRLltj1}x=U zP$`j{qWW(BGEl0GJspNx{%JK{1pUPnL4TR8dVgdFgl!7|TiI&>s~K$q*HvD{dfap& zGR!PN$qPZG`4yxOs15xnFEEVNZ;v>#vlU?$B!AI8QMRpg_99{@t0}l}mLlFUi6q3qE z-Xn>bt(H$<=rImG2=_J(k=Dj$CESm*!&x8r7GDNpvn0FjddoM?hM2F!eaiY%@D4{F zlraV9#|UR+RNjeJ%iB3t5Ykdf|Dd^j^lN*QJX|=qb!*zxM+$w>rT5;TqYbOb0*JW`zi#~<)vGpGh ztXoJl-~wrlStcNfjHK>G{FkSqT6C&^y}w)GS!eo}hj)*o@VX3`=2$<$k23PB_xp}t z{lEX+{OY^D{^nO-gI%T1_?55W6rvD$7WEtQEF-_dCRYrc9JtTO`R-0H6Z9bDAAtKz zZd)(R0P-Hy$W|bz{Q$k0APBzU^1Vg)BSXbNbiVunNa{#ahRd!MYFrS2pdGXz4TfUV zgXE@U`y?Q*BuH;WC2I`(7!(I3Y!TabgO7-F>gu_Y3)pv2fAldwFighI_WlxsZDIQ?zx#s&X4()%b6~ zDz>Vqo^50Q;KEeFnhVorN!gEe`54~YcM8VBLm{!9w9_`4y|aAg zitBv0qI6G$_Wc{b(y#EH4|jq)QPI|W}5z@HnE(xOCDavy)MKf*(f&{`zYuo#C5#1O zIE~>Kt-)icK45CpoU80pPR$IyCKNT`8!Wyf2Ye5l;Q`-nY}IptZw`Vp3BIpJJAyBr zPqrS_cLl!#f^RpSe}M7r2Su3y#t|8Sy&xVS2Vggx?g7}6H^&WAx&%@As{eF5JYoS3rz~V^F$_ zhy%orqx*tj2|Xk1L;1X)1abmI4wI)QNz6ak-e1sEq%Z`Xe=>A_QTM6%2T}z=G{x9G$*Y4wGlB@P zp+bQ(L|ocLs^IxBCtM={GVwQ@>Oz1L``6q%0y@mI_lP|5nq9Pra}O5e7B0YZ48I{| zcSkQ>=EubTeS-j!c%v8<8b;k=|MYZpUl3r4l)@l8aG(9$zaM=L3lf%+j@ug-t>ah? zB`urm0wlr-#*T6UGGI4)Irqs3swXAAaJ`|V0|~#L$JZZ)UiU5h-h8EJ@C%>kh2Nf2 zJn*YPxTcGBPl2I;@Vn(Y13wS{u`~wyxpZm%Qy7k)jD#C`$X$Z{;cr-t5SGFtk_$>B zXUQfSgJaG3L~|HHC$O2ekcQI!<*$By0yuz)pX%fM)t^{taFQwHr3!v`GM~8PD!>`i z`Ky2aRV8=%?Ww<3a@Uw^4QNH8_;m1d0fy1H_*wK+&+zk}Nojzp{I@50@blhZdGPbT zJqkZ}e$N1r@H6>fg55DlE3Afvap}PK?``L5Me)iA1_p|%07}mJvJS+8B-MgVByKCpo8TE|p2eINqrdqKf zs5U$mrNaI^UIln1&q{cO1t>f<$SbrQo?6MPVqR7As)Sdyyh2_c)V8Rl9-TteVlZ5q zsQU$Wo#%v>G-ril)M&8Q`DowPCw$HXd+nSpFIg8%uW+62I!6lfj=RpED)&zBwIe;# zd*xeZ9X$OGHM2u;xU1TEq6F?whd!pG+kHzP&;6}u^sx-gEiFiJ{X4+}z{cA>^znla z6%=1sXrTD%!0#yZx^Ln4<_kT8UwFJ1etU{N@T>Tx2Yyp_EBM`V^?`t&N8ihN$WJQN zs&NO2>&b0$lu9|)J<;Pk=DlY0cl~PJTI|Bcq_6S(Nx)l56EbPbh+2#hCvoe#WgWxk5Y^k zu_9IQ%Q6kZw={!RN21{dEG^8`W){@tw9cFl@g0&o)G3=b!ASLSHRvOqgpw7ZTWoa$Z3RXw@gyGqA57*I_8vmB|w{KbMxn#h#|a#b`UH z7^(==ob|;>>IrYA-S#)sV_@Tp(#hFFFyM5nI@m{NAm#-*;^Yibem%Jn`!Pz_!ppe@ zi1(0){Pc3(j(0fgvI2V2=upenY$!U9TJf<(+P9fV75wTPfo0u^iKQs((XVof632tp zYuyHWkwyfiYy^kv@O+!s2$zKkB*p+@07BFd0V{x#Iw{tra$Eq+F~kbsDKv|6{Nq7e zccH2D8Z&b(KU7~se>&HNl-&PxEbra3KU|)`I!nDOV9(kCG#y4`tvT=JvH8SM7I1on z0OXIsL22E+LtgiDJn?%9%=)+V<Ai|>Q#OiQ;aY?Z!f`6j-|-6&^0L_?-o7Gt&{SjL&KAY?5EICa5)n1FM1X3r+*}y$~gU zh-$r|(X+<>C@-@Ok5Dw0hr`7)rP&-Lug3zMp|s6-Dsm;bH0M=1^Tdp+%*-hH)r0SS zzCYm?@IeTG_rZVh#4-KKPwp3gkbqbGL*E+Ko&W+aesabb!%sf`xgvobSG4CR*q?yu z6CE%o!z`w7XC9Qs_56Z(swK_QfA6P~_HVPIP>UlW7TZ^s zXI^GHh=|`1hm`6deG{pIydw=q6^;DyxZJMUA?O|>uAlZat_q5{UgRC})H^v6)pBnJ_FM=WA zHl45rTj%&1QAdP6hb6se6eF%s0;z3OzOG#t;|0uHtKhXf04V)Jy`=aPCkycy_p?wW^FZWBLhki-#Vg{qBet7?A}ULL3202{U9zm5P>~uSd9vASco^H>CX&Ur8|5L zD;Uxrdxcy;%*uaa5!pPGHY*b$Wuv@g!)!o$0JZfIDZE?W&c?=>1!>!|6>CWqgy4b! zMb#A~uhnc69Q4f*@-T9lMQjA~3|LUkiA0I_k(-@P3&k(VgE=r9pH*b}qW=x%6p9b7h+mB@7D#hYYDbDf@x!b+ZPNLy zr>!}ksH?wObDrfD?E6LNQ`Rd?i;(yVnHx-a?4QIfN*7WE-@!6eF=Ctb&?V!)d+1wd ztoVnDXJcZXmgHdZt;Dv3cD?PZKZQNOxn`ih;{@ekkjD3LY^el0bp_7Tmxc%$=^85$;xd8L`d&rjy)0lR0+^TDtY%Dlfj8+h1td5dU?il3L01v$D`Fo2%5_I4BOQui7Vs)^ zQAKPQ-F0aEi^rf+LkH=2BIym#1#kx(g}x#|19~{^@DL<05o|KFXuUwUbbH+sl7!wh4XrWX(5y?s91nLeJ7Gyu#LfJcI@6vgLFR3Co#5ZbW z=ELF+AKrium7i`6&FIJA6Aw%T&Zd>GvoM(HSD#Rl{)b=Ftt1odo~P_d(xYAW^HQe0 zy~HBXb_`y-4#8`);c5Ih9lTZ+IhVwr=keLYb4@PdtXU;+feAuCiZ>)+tS>Vd9ZH8M zWDO8|ozO1i5FRp$AHPkrtL@X?+g2`V5-p2+Z1w}o76?DM;nYfW7{T4Y(OuVlO#?R9_PUpa@;Oi=gtueIaoYT z4g-8~Fy|kBo8(aZ;fR8+`myvB+Z#_%+Lzz1SfnuE(&<{4@T_OdGZl)xZxOO;VL9Kz>rZjf2a&Q~-*XKhA4O=f5xyn7SOp6( zK47JkG&%on)3UZWjy&0C9$konGU`;pw@E=XL)?<9nx{ld-J%%3_#Z4wi#Tsc(5QKg_z>cRNgAd$t9!9z;uiHZ=8 zm4#%D3=A;tEz<(Hs(}j&@E9)h(A@0{sgX6I<6$gZ987YS-k0v z-{RXugvdG56%4`Y7pavS;t&kM^=zaycjrPbLrx&XZ6HG~X2&NkLpjE`BmUt5EIgWE z82>;;lGwwn5Edpf6niB>xmgD=U|y{FJu+EgNSmWE9pTbXe9?0_*Nt2n2s$i60Xgrc zd?{3fHV5g;TQ$O$Z{|fc-Zt~15*I6Z5yV9kFG_H+oEHJ<&I=e}8d*U@L^w`pE$bFS z5~RgVtCZ|ys-fg<<~#UWo8`BCY76;BSDin;n$1bg`Qw2_x?&`_<8>1&DApAqkCIe~ z6dclkE5)5JUozb7c!*0x`BDN0p^^*1@O%xg3RFL#;eZsBrkI9i=FF(XBb5M;C~wVe zTd1QNzn_O0;?iiv#``5%Uw(FCKFg%@;9$;t`Q!6Kpdx<-#icOCvr|}xQ$&>&(-Xw} zGG7-qVxXK#*j3|9Raq6G58lL#95PiZqadcLO!hxus#HcnOqI%lrlxA6z((_x|7BB^ zvaJWH0KDgGpnZe<3c`Og$S-n42(;vyhtwd<13avY)^TOXAdmc197zs&otMS+$jz=t z%M;3=oE7_VkYnXH%FeqXcR)Svvg?j;7#O)%;(qcgNNhD!N*7WbqNz)V`Cz4ZG=N*_TB=|k)qXBp zf0B=AElaDkSQx;w864z9Npjs106@~DutJG8=9X0WD8NV9cO`2cFg6r>6+5YNY3#!i z2iY+>(h+vaPq`qerkF&!#E-u@C0w^5^9Dqo*lQOy=<)iZcXK$Mj}6DF)gc6NMp3O^ z`F)EYLTTFcAu>BrkO2;ZitNvL!6?XgBd3O1-a?F1df|Uh6xk*!gtGQ8Mp31I%lbdb z#6L>p$_SdnVOpprT(FK%-K$Lucj6xf7+ihuqJ~QlE8+3&09YRG@sB)_v+d%E)S;l1 z;Nw)m4dQH)iIXPJ+(Vpl&t{Q4!En;?j?bK@IUr%8DxwxO^3RIj-7l~Ai#};690@d# z4TjiX*7Nv~oeHvj7#}k2n4a;s6KP3s#fQB7k%wA8`L2gr_pVmdx*%lun}=R$Ocnbb zNOqT9wm{6%kqRsJ_lm}=;1`E*4sjGIr0olT58JY$7o+R|L5w7EBWMT~&Ji#u=Hd55 z{2nqkJ95a_oVwx-um@)+4=dX+sWMBh$7a`E)Q$~22J^E^(5DD*WDB&il(kPo&5@!* zV$;w{r07J7E0r{0R^x3Ap3cG3%hBeqsGSirNvM$NBm$ZV;P8Rpjex`9WD<6A4I7WC z_NYUV1Ce#G0tjFH)-V+{bj4Tn2Vfs16zljEc?nKZ1cQ(wki$k$OrAr)jpoaRG?+m< zeaiy*CWje*Vp>USC+n!4fSaW3dn4LaFb7p)Ufgria&K32;#*Cy9TK0K%~=72FdM$; zmr>2wY+tm1)uok00?7sOO2U-1j=4OfEH)*(EH+5M$$@}tP>4qDH7Hh$Cv)&%gztd~ zMOVzm)k%DH6<(bpAg3vBAxwF7vnd2O36ws-=(2o^U+0ZCuT_AL$m`bQ0(q?@8Tro0 z=`hTL-N8ns6&++Gzu&Kz-6;tkca^q(v5O@MtXW3k*_tXCeYl?LMXVlu#6oa+(LyA) z($k|lmOzkd%E42yRIobnZNXB3d8O2@7CACSsYtjYX4h~<(v*uUaxDz<56-ly&3Dl* z`W4vKo+}Vx|0VvVFA{;ulW-Grsm|p#VbAXugo$GM`WbFqtLLMD{lC}!xbO6(ZdxNA{3J{ zO!WlA6&)ek!ygNwAR~WtD7J^^G2z5}7^RV+y#ySCIb3Y?z-mMq9^P{Tpbz8B*$U)q zuYe;U6c^ja1o#x7A~m59EFl0c@0Oc8s9E47<_;Opq9y?#=#O{Rc&Ab&-%Xm0Y4%G6 zm2VnVl15*CS&$^m(o|ZRM39G7ux1~WR<_qJZzOa5)P*HPVxCY_EM04$NhJ?3r`~`IU1b=U|6^kl?B0!1Q((m#a6($FKsF$gj%W z#NvM3Beya^C12vv02aYLUlDWx`PH8SbgC+(uLSs6Wvl#}V^IJyP7CwwH!%BvoJ+6^ z9>CC&b-;qRnA4Sb5^_$$hM604E12{afrWKqv__vG@G4>OC!Jqgspuv%fzr&Wq61sN zlZq_(@>x>0+J;rmP)oSx&X-qL-BK?$kzdddeu<)m@}0V8J@OuXm-48m ziSLmiEg-+zLW#rZgL1D-H0;MpU9K9x#PS;cqW*f09av8L0B1u;fQ=GmrBb}4k(9a( zH4-1PuUb+#0|`7@g(|hmbNwND;rcPWLu`&yKr$t9p%Q7Op1&~*6U#~036DEWct?|N z6TVY*ICBmjr^5+=0EHA~I0j4@$P&%_aRVNvk{uJ=tbk<3>@#3Ndl20dgK$+y3&*u@281)hW-s75R7+&wLhe@#>F# z%|DMUGR%{@cZogpj|BMt2KE`H6SpsUfTH2@Als;wwleX9neZ1}2(iDyFByXSl-@}V zSPa(t8kkR8lC8d)HVDiFx^^%KkU@x$d@hk$83c|A&HbQ?60%<;WHAT)Fjq;)LlbA9 zpreeBfWu69@t5TL3Cax!SM&}@+$2^~qMKOZp?M0GLz-aAv1xgR*XRVW9hprh31HV} zRg~`aH4Mc$K=ffl01wE}$p{L=F~vK;GwSjahhuUoVta*w3?jp5gr|^B3s!#nmDQAnWJ&nCRL#)+y4u z)RPSJkSbW0Ly5ZGYX^reeMeLm*IG4Io@hgBiM`^t5V?opmX>a8jqP;0$*MRCd-|P_ z$VKJZ^FK;9UpJbvdGZnYc$a+!3jk2}%40`d_wFy~^Z5GrvNh@4N!T-limMm~2a#14 zwHex?$fdIcWd@8&=iB>2a(chUf1|7JFp2wZ&KPyc&*2YkY*^AS2PpvT0lOi`#3xVw zw$dTTpC!tXOCRcoe1<<5xbN_NIMJ{0y+fQj4n<7e+7*0{%{K5&BCeh~`Wt7ohcDvk zz<5J3ocFy4x+dc37AUVCr7TKFlplHUN(qXE8)u2WX*JHQ3dLsn;Yx*Ui3Q7#h06~P zLz#%YGhPlmnHHq|;7)ih3n4UsCcLKxuv~uCVo2GB-$9f332_`ur!vgPb=Mzc8QzP3^z`RMpSnCRJ?YLS89a z+D|NAP^|&W8uCjG6sZBQ-K_6h`_q^nzi+SS9t*Cg?J5Iz8HiqXFi~sGtYPC^339YOPKkFlZpLu|Us= z@tIUmw9j%#Hryt^`bds^Kpo>Ew#w{K-6P5YwTt;{P#cRl0=PT;6 zVkMjLE)?5N$&mw8{wFlo@$4%_$`IYstO>;?fkE_`H@(Ec9cbPJSCuGDR_sOl^jlN| zhB?(8PT35(bA1i8XCzKQ2hi!yETs_Btwuu;JO!yc>cP3P`8Z!z`#SoRIE>CyHw%Ye zB9P9acPjX49L5ruKs1(Y9kU?^jLTjV=m{UR1b2u*BR(I((rt{21-K$o3Z$+U3sD&RU{$H*e61f;=$npCu^ayK2IRdmfr<3ZzC;{ z=yBc3YrneQ%E&7)TAhHEo*wT7ZkT;IK@q{;AdeUgT)A7e%J&B^2OHXoJ<>tJioD1Np z!e2Q%se&Ji>qa3NEMY{?f zP_She;fRS@im}<@Q}G34X5I{{8y4C)C=XZIxCxzmB2>ea{ctsBrY&(amr#60n&SQp zej$PR$Y1={bR3{DsW=orA944OTfPY`k)c-HDzrvot5C~_fc?==%q{-?FW20FT)6*4 zy!1;bZlSol{Pbcx-fFIqucCyAJfUh zg_`RQPF#(0a%?+;!9f8G2!#`j!_xZO?*Ke7*D~2Kq{UcCs_KcDKgaKEth^M z2oSoo5TL9#9i@gD)FV7G(R8Q7h>VR=6?68|CQjLdaOGB^KytXmr@A(2aNkiJW)j5e znEe@8^AX};H8${Ld%e zzzEa(?PAa3p>Hu#u`zvGkt=XW077T_{e%qdgl|U5LUZ1i=O%VYEQR0xw~%YynF*+5 zOjx~fEqE$YcRwaSS(|)IzKg5G)%fFJ#q0l(uOf4-7~_auHdtULA%TcRU_NGtu5_&G zG&J0U&18fjL{u@DAgNt34wuGGzeVdvUM`-?uhgg5Uxl{Z){M9Q!F&6W#oY8kLyRUY z`|@wPCbDj9noif<1VTT_U2>eKXe%VhSb`!i4vS|9avH2R&3P)2NOr=nzjhO-*4RMkrm-n%Ni6)y4SYZv=t4eeqv; z!NYMU|G>j>PlV-@0Di7WaoqiZ*8~%|zy$K(neL=t4_RG7?(zmT-vd{?w3`1*{`Jva!S99l`Wk*m_Ar`t2zuhi zzBSK!;CBVAZ!Y*Q01_Xi8}Po0e7*#8#DtsB;Uhc6_h<_lPxow$*b5|)P`MT92Qp#%u* zA}XQbg3N}hOFe!e1|ewV{L!6@LGBX-jMN10^7&Pr7k8h;*p<{&jD}4p{Nd=UM5#4P zOj%^O7Bvyx)dGV*MJBUZ7mrTTze6s0Fra46S3TY`Rzb#TLJuJn zQIsNB@DTDxTYvoO(3=E8;DLyjnhIF%)07LM>(tOe1$rd zthhXK-bEb{wob37skM@uxa#pBd4|j08fRZ&{XH)hF2V392^M1_J<-$a89iN$WdMmT z>=#c|NK%>Wi%!G1I8uyDB3&?eZYIOX1Q$>lb|%&Rj1YVf4Rcx>b;5v7L^IcU5^8$k z(%d4SK{{KeE;9&du1~uX(DK7sAI~pLyo5^4{x!;HANv+>!XwCMou;?taRNHM?YPd< z+irk!fv9w5g5fo`vrx7 zzYQfDVVREoyFB}pA3OZXwHvkv-Wt#g+-InO=Del&<$u&D$irzcn1=i}C#5wO2gQDrDVDd&Q`K$ydFzSL_LcUV3k@Xm~wM z#lmgR*vNbPuz9X!krp$14XDkbN5@`q>PA{#a`D)UJg}`>-@@3%9%cQ_o`^d$r;2Kj<^JfqLu!Vn0{xz|$_+WB=kRlGu%Xr7N$Lt9VcCD+4pzSH20#BbK@BD^EYlY3w`uN;M(Y3aD$RRsWe( zPBr#~UfWYX`jSG5UfNUc!YH*pMJ{`2PuV1&i9JOwKb!WH1@K8I2GtvTN*kO`_^N02 zlxN}gO*5u;_7odH%3x0ki(|{Nr|elHjOqDryBJeFKDSSU=I64f6!F$@nXj>JaGC25 z(Ojkzd&+52W~=?Xuc)$9P1%h0lttTaMZ?`3=?hhwIy*84RC9Mv4FY(~k-pjOj`S@? zZRSYdiy;fc7NHsP##BL6&5$n|rU?+TC4A{{2d0noWfDHrj|h+?ch_2xOW@QlhGi^1 zbqn?ewn?xlE?RjJu$Fw38yTg~@Kpv#1UflK_cl(YPaKJj9>c%p;&ACZb*s4vBZhM@ zn5W^eWF4y3cab^VHjETIvx)-CtvHU_8ZSHXN^pTKo6_9w+{k#BF#%TVdW@DY#gr+A zP{hxw#|Rae!WjKQObByPjO4l&eMr{bZXwshFl-jjMpn{$Q33Miy{9&K#359t3NCI2 zMk?ub5<-6gB~&vwjI3!L(lewA{w=N~jatYj`OAl0B5b97`z64j+$4alh1ee=)}B~Y zdXP(q^{hX{2PR9y1O#X;()m8NjL98PuWTP3Q+}+J`RrNBkL%H65S%aiM~wvilk%h3 zF<&p|BnD}*uJl-}J^4QDuQ=oNMSsJI&Ybe&V%q#`(>r`tqjZNIJ^{j&o_hsgN%?U~ zrzt<~g+qaitSE6kn;iyhK)x?;zK>GcHu^T-$1UO|a>S{L4-&Q9=@w3xCx}8Io&@b& zB&6^jclPWc#jDJ5X9&n+`j0i($_@?MUL~&&V1A=s`GX!Ot% z#e<}Y81YOmuXYh}z&_~|z}3-1PrgBs@Pb@J!abqiO=ZC6{m$3(*k(<X8c6~0VnvnE7vAxA?60FT;&6fa;` z>h$2NAWis%_U6YGjdpTGOm$kE!{T}NqZ6hf__GW;WpYre;JcV+x9Moa{f1=0--a|O z3Vkk1QK<2+)MM;j+23erQ?dq@f8|7plq*+>Cv96E>M`cFsMP5)w+&MWc;NDNeChVg zT#O?!Tx_;DpByfB)E^BcJ%qokaVvHL(vmAay_}y z1IcSo@<8%RoxN>#>JvCx2}Of%tg}0O>n=XH=kY?nhEvN$oP7Yl=hpNLelI`nh2OH@ zd*F9=nFoI7EK`_x+}^%`U(e%(W~0}A3%^yD^bCHtZSuk|e4ht?KR?a`zh7Ld;P>{P zPZxg2q1Sy2zxThfFyjElM7x%y;f;>wc@X zZ=9c1`by+rYsnaB#25MN{>?1NK4b^W(V25A{(w$)>dslRF6gY$IKM;uHxAra{LTaS zKTQOn!Hx6mqcH>2f=~NMK<<*C`ysyMI`mTTbRYJc-+fQN#+UqfU78Vy$8-GMyw4P0 zQn10qm%Idr7voEw-Q6C(IFCJ-nDz;SDmK9mOj%~OZ+r6&-}NxO(uj=+i;^7dJ6H(& zK&rqG85LU{V6ErF9N*2&KpWcb)m@8~g&kzr$BA2OB<#5SZLx7;7NSkCty3OjZ<9Pu z;4wntZzXIWWZcC#v#dKApBn03|Uk~=7r;DfA|+ba5Xlia->UkXZafb=V;{N`iLFD z*~LM%F;0spV@GoRc9HA&wHkF!kT>gSxh4>qACa(24k}wifO6aK7Cy%wjt)Hq;-?B8 zf^bIZxSGD?8hYVs@f|*hP>6ZWp0gRfnsWl40Jv4y9bzGvPJYKkRYJ1p{~N)lmC)$( zt#~0mDog!?EJSM4fsIi~=woG@*O-!eHUkL>p+pdv82MM5tj*lYX`QwbP46G)W)%D{ z{j6s{-ECEJmQ-8VNQ)b8^$qeDqPCyASD5E%xjaBu2{H7rNxnj?Chvi!0EKP>y|x;4 zd|~W782nHH%t**6a~}Q;WMP)X|7bR<4zmLMq@vh33yO+r1;{=Qd;GAQ5GAoIe-6y1 z4ts_DF{*YHp^jQ~f&rv{-ASUB)Wc6{Y;2X^6?#+pZPJ0nWquAN)68AYf$i(e0Y2=K zGkNnfH-qk(TEUR`|IBxUeF?dly!)KC97%6`W&Yg;bacE2I{K6>P$d z6>on5pja_nwS#wH_<}7@^Z7M+ZuWa|L3of;&jlg+7b&@WpszvPBmm=GdBgz}f-`Ahg$yo!La;wg?A4k86Mv)Ouu{i5cMu{Tt-Z4cmZWLsE-D+R1LqzLM6Wd zSS?#@Scy`JCkSs($M&kG(0C~($J?<(kUIli#Jdo#yd5hWqC58GOdYE`uG>yUKhIkB zod?T&_{{=J#1G0088+!4KGz91;P7`uxQ8ViC<=?5w zVZ0@%kA%*8iK&(Hi!6`$MGA~c*#W+z%y(6J5PwM$SZ}2hzJ}z%Xm|k{2JQ5+Wh5dY zU@%+_YGfj*W>=A5lAvVMM8R5ITd^{@0R0s~U;aVL3@Rx_C!vQx5R%A1FWTLgM#)v6 z3@_TvHfYxcJyfGix2V_f6_iT+m4w=Bup6l<%~aHI!(2?uEDden^<@xl$m$yI1@)jq zWNt#BUQRZKDAF}2Q;V14W=057G7h;?8*u`-(28FpPJz2^hYU>G^vfKi8Jwyslg!jh zZgDbAI`l^2D6*aMat?-5JAl$87AVG4x?V0KBle)(OY zlI?Fs zKNw4;+$*Y0z$+%GqAFpuYq|!kjxx7het)mQfL;M1A4(562-!E-$8usZ*hf7F9+&Zx zgEZk*bC5>*jJ-_cI{+>)fNQBR5oh7NgV>L?tE+|c=P1)XqqrKS61S5R0Vus4AQU1< z6#0}R@*zrQqU4)rpb$F>X2JnA_1Y*^9}d_@jJ0asIHf2l-AN+>y4%l*OH@n zgtO{IZ~PE>4NgUapP|`U(F0ujL62~)hO<%0$xY9O=37k!_z1TAu+p@#!%+~1MbRSL^on0xk|~~vqCk<$C3=xNCqDk1>U|YRv!h{Y zSRtS8qhV>8=I`n8qc0TLh@y&<8_}3b61Xhh(M04oGAix?SyfF4FKk+0`S(|dm9Ks)*)G^O(Ub3Qq*Bwvn5R!6|3N#AptC>n9zc*sCde$BkuF!n)STpBUv+$jJOUnBw`O&sQE!oN+ncyayCQa$jM`xoN!Fd z8l^+W5PcLD`owp(cV)S`g?62NrOY0id`miQrB_x%Y0D72VE{&XfiSZi*hr4B8QAP_ z0j)@AWfev64mD{mpzR~wlfQ~47ZEmXscpvvd<`|oAeY#2IGf1838MRHrfnmorcDIN zzBbdU=Gwzt+ov_CDMuR6*8{WNpkK~=mtBJOdF&FLtF-c#$u1$a7`p_UaN8y3{Tnd< z0)&IiFkkgi=NR4tGpz!E%S_wK4)=KE%95dwP9@_@uRiXP_XPb21PA>D3hgZ*35rM& ze^=<2$xOS26Qh?N)!k@&!?o(aW4qRxHxHyRf2(_l+(y ztyF+@i(}q5bFcp|Oh1X1#^A?CXlP zU$P{L)=+aLF1(IIuSl6j+|HaXkR~m~(Q=A3H%oh4N@&V^>Wx&&3-du~n4jAL=7oT? zg8B3gFkfH{MEeEvDXgXMVXl~mn^}+txS53lyNg+rU>>?PZA&egmJl9ek!Ys!1!jR6 zPIE%Q8DLFM%ui@xKK);q7;uf=nzma}S9;-qZbdvY=1yZ@7B1Z0=9+H4kj?+;^?hmH zNJ%c0n-*=Cz72!Aqii?auawr#^^|B0LDij!mpt5)~G3J%>iyh(etN1(N%d#-> z4%PZEi&L$s1&Bo0;(JapXOZ%-d=Gh8)z>SB*7_iT`0re8M(EWf9sn;v9%vZ)9~o&o zFM%8zDO_`brtXDlj#}|5*0FAkK9f+Ud!x@WD3$mVScDi+`g`;w-OfkfgfT1rH5gMv zzUPeopx3$|eKyK;Kl)cV`U#qT2LQaiF>rTHzi9)nn}ppqtTYv0faNi<{S}M}LO?wr zLQD^k8Gxw}aGo?ky1|R4u)?bKeK3e+t$#Uqfa)_okP+pX|p_ zru)gh4W$xKkd^?~UQISELGA6_nm&7lNBd~#j>2O5Su=F! z^k6#n_J}OEkSv>79oXMWfS&;^;-FJ=vCoF?3MzZX&@J<84Bcd=VzpIaeU7EOofKxA z&SK%Fr0$VDa9qeAU2@D4z zz7#0z`-dP7JFcQ?2?2>&jg=#mNm)MSq&{pmU$l--YB!;u-(fDHqLRfBWUvxE#az@f4yVG3+aG$S=RdQbIEZ;zQg;bX~gD%jhdwTk|mbb?y1AKtF`zEV8O5aT5 z%|XeWLm8iW28y{yZJibi6*}wY@4!e2Z_ZxiWntt7HFnooV zjGz53?=$T;_|?s3zrkGWGvI!MZ*7wO1_yHgn|otG*ZIbO{bLR1C4!HAu>bA-5k1>~ z^zx6=V3hMQmM!GHM(Ke4N*mBNTi@o{uQJ;bLjI52D8M_A`v-HZKYR8M)(T`YWV@e@ zUW+fR&)~PNyl3#c?T23Yg|GI&?k1Gm1(gXJJ1| z?n40=pvc}lyFkuH_W-B^x5M|zKWBzZJz6(Ae51>~a5;T}2QD|C=7Gx#*ep)GdU~CK zi`n6OAn9}ad+I;QXTQ(|wwv37Z4i3jxA?W<)XZ>P?t%qYU@$n=mr8wO=u=c9g9*RSix8;xne z%6_#U&*y!n_2bf;%=$6%KWhCL{+NK+;AcI?(nI>?E|HNKe((3|Uxhv&P-?#NzcOPX zM`WmZ^|CauWR;jb&x3_u8|4RPF74*3es<_@-HFfWdPaz117uwVOG4V&>C5VLv}vSRfi^>A4Hb? zAYf?uCTxnJK>Fw&7RYo=QX%?jk|_KFjXMedEqB8I&2gC?cS5?eze7NENJtmvZVF~t z2O99~8&E?vBxV^ELaG>UG@*TZ|8&Z^CKOC(@h7jqO=nsB>+y=aIS_smW{PVl#GNMZ z4>EawA=6n^CIeQSjiZ0(Az#1hAQB(tl;FfQCh6zqJSORHU{sdOlrMS;W&KX3gQ@vf zvaVXmBR2uROd{72=!jS0FyxRVSmSvqY2#M#$~h+~x5KeS&dErHOuRoV@fyBxhtC8t zZ7To%dc2wJ&A%_R$}CI2#k+R-_pi6i0ZHLlB2_SPshZg{6E~qOc9nKKAZZ?Ah7z^- zqcuq6!f%c#az)A~9+32!z&Y{Lz0hi1`R%VMsJ%D|v6<1u{x*P3BU8Fe%}3*aBAA%l|@}q(IlM3vV370$c5u^in+D z6!hkUGyIOT)E&R;E?-2?<>dtm{(YE#X~l%hoRDKRobaCSyFiZoOEa$EeOg|=_btzQ zO#1+#zVpw96B_uf>;`_!pAWJvaiv!7m^MG64?6M)&c&$NFsollE3RF^C!zZy*z{Y1 z~wTN#3cu!N@yf0BJe@;UR&v!QUpqti4>h^5E6wiHD4G zg*k2zPI|zP#^26PdoXBwNBrc6?c3ugi#%S1N(|cGDwVs?b^$ssXnTW{>P%mDrPzTf zHb@^h>6X^ldimx019_o}5xmvxcMTrH;Cc<7V=H@={mYWfnA(J*22+2#Bn?RshQ2<> zgQ;H_>A}>I!xRhH@qh<@>|6iw&oj|wfnT5L%Q;771|G+1fOq*~FYt!ecz}0BtA~GH zd6oj+>eYtKUG%N;k#>@Qax^kLWXwOg7SaldY$3h0OVKm3S)dCfF=jCd5Fsj41xG^9 zBAwN^lNfGaq`_!X+Nsn{l-!gkSInwu?r*Cy&;EVp6Jf(t1C#(*OC!ZkN&z|9!9Du8CgiQihlyq`6t9%yrF!|lJn%c| zB@g^g<}oplKNtMLz|X}$`yqePBk&0b-1b2}dgojHDjz-jy)L6}~qDbNW&Kod4fm_zth`3ceqF&%pQ3uPXT7e_wm} zB0rSaVwC-8jhx?S4}B7f0b>8QU|qs_+?|{<`GvDd6L#VVT9M#+tEKsZNs#bG*&`G^ z^{Lz~kn70jks5Tbz3MsCi^V61TxD5C{r8REf^{gg>uq2Chp2^X04z(C$@S^kKn&zh zf@dmy8dVF*rBBZeazU}I_!p<6DJEiKU!?VLY-j3O3aOQNB1<LcPec7Of`$M26UD zZ+?QX1ONv4q7NCkuw{Y@r)H;~r8;si2OJ=viYsCtpyT$^X9=szA=E&8FgvawIE1r4 z@h!d&-zq~)T9{yyB1|wDKY&=#kctFCb9Tvd#|{Hw;t_Ze0AdIe*Eqt&*Wt3l!-zhI zdV59eJ+>YY03;59P@zwfMmjeGH~Yvjzyf1&fmO?GaUoi{bSJmPrNJQvkO_q7;fh3{QUR-j`)uc zI~mL*DYMmn?Td=tf8Uf%Ci<5jJ+0)#mox#)Y*Hmb8$Y=;FCu@#Ol2!vv9TJe)gFUDC@ z4Lj>TpPVpzc{nyd5RT0)#&1bD_Px<~5jn|OdcH>ZZ(z#pk9^SnC0`AAzXDr zkq;MHTzkf5`xvtL?wKu(ZUClVer8!1tvL0LGCv>LyP zK}>~{qq()d6yXkkuiI+H=NF?(zUUMD$mvqzVccUG9*spp95AJ zkrU7ipftGw6sCVOcnebMntZCV*vjfgZ^kUwoQ*67#SEtO3P_Q77`6E9p{JYjFm1scHWV( zarw}ii6*Y~4GGJ?^ubi*&s?6?#h||qUzGz~dd(j5D}!pHzdHDatVtihf`vqtm0Se% z{{D*irOayt{k$bS;&p4uhr@g~{08lX;Q!4F#mez=rXSfKk$4@hxvWt93S@tUZ8L`7 z(k;FlHlVE3VamJ9&O}+9yb;51sqMSrr(Kox)Vp9_raG6D`?FZt_s2s{NKOuwu8W+F zzWL2~tk_@EU3Yh-0$piASMXc9Wx)}wzGBR!d3ApaZ5)(~ekFY&fE_oK)2=t90}H$;^YA^{nql&C$mr`O)UO zd{|_#5q&KzGFy@dMVlkJ<)d~ci%3PsTk&fLJj{lz*gsPRF^wa`Er8#O&CHt+YlAs% z=GsS85v2G$3S9si)xF|8S~5*~rTBCFeDr3MHKL7Osbv4Mo}Kp{^xz=fgNM`0)xT=L z4y-^B3Y>nCkygv=IXJr}6pEiCBpr@@m@3!}(>{?F{Ao}qb}_(maoHtn9Uiz8ZY=hu z)p_*6RQ4uSaFTeq4Dj&l;G?x@8zW~k8C5|^K{!)DHsBYO4})Y8mNj?NLMto5e67s@ zSQx*X1aSAL4d1aay!A1CI5<~~#W|`J#c*zpFT^i%rxv5_vcEtM1TT>FB&TT9&ay`r z;sMeNP(&8_`@HysvzLwo6`$S42=OMomb+Hoabb|V&Ah8Ocgy9p1O0?|fgc?_1@bKJ{XxrRR~F z)y(c!%S~3B`3^?)X8B!Kv{HUiH+~6Ie4`p*q(`kUKRB8Xq=o#T^g?RS4;D&~_;sF#If2eU{mbwN5X}qVXRo-nMwbP#Xt2{NCm_#PX4e%Fh zPa8^vV{b^DG6RkI1$I?){o)|8<^hU)h%ITrEcJmkw;4GYbbLZ_v|)RhM?TPXTLCq3l|X=g-ZxKECWF{9*~ma)Vt*-2*yDgaui58s$Q3XwmkOPP zAoc748gJs~nB`i1FL;IfYJFd?-?NjPZRt5?J1FRs_2-SpQJDHBcxA=?M1WnGFq0$Xu-?%oMg!&L^O!UVrz9XKH2hQEOP_vxv7Jc}O z;c0-EA4tTdu^2}teF8`bixCCja5%(V?|so%@j4tku?Q+Ha6nYbP-D(15E7PhdRL;= z$+7U+y9J+dGak$G*^&Z=aFDw#d{=MoHc?gqop@*q8!ef@g{Wz)3%r9?RdBZ{RW;1U%Cf+o2 zzG`{3l2_HdYT{KTua>LXBwuR92L@150UGDMpbRP$6w<)rdqJU2z$N*E_$^qGpwS48 zR``Z!mS#ouER;XKnvF>1`QyRSbjA7OF%9a2jCh%U5khmOf+ir`=4bP0wv}&wl0uBp z(stAGI0QnO76bVToZ5DHXzm9J{{*@IbODw$5O8Pe09P%SWRRXnmJfupc9Z5e1AM$M z=J>?p3j(DO*m(ARzc_xtBc*t62b*&SBu8Za9=M>6^N(`Fu1|m8lddLsoDZroP)ht>-S?^zGDR{;dtC+A)t8c|lHB9q z#{dS_g6;u!KMo#%t;L>j0Xl=LD*K(u0|rE2!l43GN$l_xK1a@Ybk6pn5#BWO=3nxL zM*>vwG0r3l{FI_GdXRiEEs;=sTePiMFcAmiO~aXZ@j=*wiewFOKE!@oUz9OqxPn5p zlUMPH5HT1D=AW1c=XoKV=fzGMUg|dTW(1fA%3=z+5H#l0OPrR-`M7JLUpvSaEnZ=z z;G%$KY9X(xIgEM?gRbtNeakJhektmc>bNlQwGb>97epTLdxLT{H?n`EM>Y!iX&PTf zm;ioNQ4>DoO$~4E;tiHI5;oOm8u1Lr(2FA0#5eF1g;w%sMUm`{*~kpw!V~K8OAael zpfIao#-}F!#-NtrS~W8tR4^F;A(@WPTRMI;#>6`DG3$&?9vd59s@6)7JVyh#jIT_@ z6xeZN(v3_6^rr+FEzpb)*Ow}C50Akn1Z2U#9 z(FcqZQWsT6_E?9Kuw(KyI@ZQo^2dY8O$KCi1q9CJr~}pmkkdqfm&5T-ge);7;0(iz zU@y~?(LxMm{CT##F&mJ@sySbX5gkMQBC1H=^Cxqj{E36nfV{G=@c z$j?mH`Q!0#GTA;L!hisPBUw$oxaf| zZSMvL<2TFQZ-{^PtNP6X=MAE3?eCYX4=$0%Y2L*Pk3K~~l7d$ZsVN2t)@ua{?)afF zvCQH`4XF<|p7>Wv%|zL7>`q0mxNnks9Dspek=@r3AdPcDQuoM9SWSSZm^+^zr>J6` z1)YEf33)Z6LQBGVNz|M91fUo#b*+Z=m_|nRvg8o1lmM1lNb~*c(kkN2;QRo`N^=Sr@eq-W=@X?S%~_OgL+Vam%q^A8xXQ&px}s(!6cf zzVWu{@AMAaUIkzkZ@Un4*kf$F3C<${W;wq~V_P9zb3MVf^Ue3U(rQL*lbAB-t>j(R zf@BwFU}-za(%vRZTkWtkdxA!?>*?%Dix5cgv5-=8jZ{nAaxVt~LZO<{a}6b&T1qxR zHOhmyf(%O~2APxGy!v`Lg9ILD$Xu>veIiuEAgEwfBFE&aMA=X4sqW8%=5uk>Xp@EF z_F7cJw@s`=hb*FVfl%yxM{b0z>-<9enUojWIEm+1K^(YbbSO3{NQI#p_k3xEHV#G) zKo2~3oI-;~oz=1#J5CJ(YJ{wYy4zTkIgG?0W>Zvb$q3KxvP~$%1)OXlVeN61t>+t8 zy|Us1)QRh$m%G97hqEzTi0Ii!St%kS5YCq#hx!^&g?>ImKfjaDf8jizpr0?}^V`+) zBwQdHlh@!+g56>b5XnfmcEQ15tDO-Ld+n zjh`0c29d`0$~a}h^ap=0Qy)l~_i>XvD*f(HxD7R4S7@){#gYvWaCX@%am{*aq#h;q zDSdSlnvp=-X~a&gua;)vq3Elhs4M8J(SdlT_0{UMQl#}&C?`hFA-P&gVien?u+^?* z`!F=q8XhqgAQYOUM{nDgk40iKncWc}5a5UA(LGQWbY0Nusca2@QmMT4QZf3&EI~G$ zPHG@*sSp1x-AF4w7#atR@zwKVvt|RN7#eJ24j-Ew#Gp&GGMUJiYOVtis19nzk=6)x zZIIaknae*6bF1vyOi!Rf3@tbH0+Gg)7$ZA#^{ag5FnP86_whkmCFQcAW9+;wXL=0CPjrs$xMn zDve}DLLE1ivGsuOI@a1Oiun*GlAO(~7$_GtZPbB8yto~6E7 z?YtqY7(7}%{vUaqNq<|i%~HynP;@hMy=D8pzZ88A#h$ks53L9tKfwA{&La3GQmvu* zb+8=2hq!4frg0P@&lk47GV2dne}t#@Ol!$r7_YuYd|0wK+ozHaFWHN;TW$y5N1yRU z`OBK@OTq1U@klY6la(`7K>mwoe%r#!#MhSe^apWCI5W>8Ju8t^icfb zyb7ER?q=eb(~wGeD}(}KO{5a4Wi3oxw!~-~WfFoN(HnFWfWa;td&hp6-h8Ndh3-l} zXDWRkw8qVyDi~iWr>wM-`d|=dealc^D0Wp|MeN&tzzdxM^iJ9^cKQHk=$Q4?^RC-C zcJQU1Uzs)PaR;mozePoG-$yTD7YM>HV|i!~!Yfg)fG`&?6GutWjxe&ms$q02SqCky zy@Sz%Osd@;Mms8XrJFJTy@OE=>T|&eog$2GAJaXI{*X1Q*#)BpRFwD!A>IjQTwppV z`%!y8>c=Qlv>){+=j%~3j-_{_o`?Eeqo(kLQQz~G?ne#Gc;*jjf@`=56(wHB(Bb)? zAgD3;D;-f|Dk>J#cn7`!UN{JsDmW7_lc4Wi_LF!^Ic>>0%O#}!f9l=^KFaFa`%i#K zyx{r=Y8&&)F+X#4j3Kkw(yM>Eg9t$ka2?X}ik zd+q3ASaht|q}(pKeeqQz_caD}JP0T1b$F+zUe=H!g@(o_$S!enaDZ~59IOtyXkxBP zJUoi>!HNd!D}!dLcVB-U>%QVamMDveK!K} zQ)bS2XE`+$W83x?wY9&4+D9k5^6f)%M|VBgJ~(%HvWwG6c(cl&RWsH3KwR^3mIj9L zePn^gS1|{ABL7>935mSv=gv%Zz5&zmekwB>#jatkI!xk_UV&^UGwwTuZ;68gYNBb2BiH zea0-(jv{AM&!9IOJA2_rRxz5KKkiZE?7P#Cr$)V%8j+QyRBFt#vFj=XcgzFrdt!(4 zo#wH7Y>jozsw9f@<wB~7_~e9`4L6n0 zA&&{3q2-@HQh>SLM1Hc-ewS@M;n2)rhZC0YEFQYR-%IF*aMXzju(GFES>t+r!2+WRYwAjfRfYi-UyaI0EK>{> z(#`x9MAX|9;OL{ZtUV@;vNAD?PgM}zUj2LQSl-NU7MrqxgvQL=xFO`j7MNd&nWQ`4$aY!G z|9eE4u1)>_5>ZB2+5fK)rOHP3e-ly8knU56alrp=5!nyv_YBZThy zPs_FnhT!%i#ola1kEzW(!Xj%+n5ivcUV(mVuUZT=sWz7C7s8%&dV`+uX!td~KvI{l zs)1RN&a@J!(!oee$o5*g$7Zhr`~Jy_jye4Asc0;;?VqgZD}Pr-YbE<-rfsdhPjtgB zv~1?BEWWX|YgjaUYoa-G!B&j_d)xNCS6R4w#`)4o9;-X75R9izd^xB^yM?)+-7S9! zpQY8uiLM|j>Q`v$FyZlBj5 zBE~WJ(i4o*?!{(ZV$tG-;V4>z#ee2<20E4pa`X9<6?>rHJN@qgOtHd){O_Lr_idm4 zk^gy8!-(93XoeLogJ~ly!`y?hD?9CY?fJ+4CRP4X{xwYA;8pX%j}F!hZ3{-WJ2536 zTt#8U>}@d^repXHS=fhllpD^lO9AO{v;A9sQ4_+rm0G?a49LX)S-Z!Q{-~vKS=z>lw{R}4h4H~Oy()Vp7B=ON%Ab?ne?;Oz3 z@zH>`BRk$7&^Bt^fM&EfAVq!K$cB#B%Ex#8mHQLpySB!@cYobOiB%mhm)AX+el~}8 z$7NgCR1;e?p{!w1eB1z8Q)&WInI(3(*nU#S-v+cF(=m2H`;i?8WL+mhG&^1_Z+Ku* z<$#8Tr|+uu78eCM0DN@ED!XOB1yXceQx4~-H6aMQH+0NX_(uu@?2wMD6ugySQ)c8@ zhq{}hD-=v~_4Ut9=~ZT0r?MlgY}>wMJZy)I*&8V{Zop-i341ZOIjbgy#xMBcueF5G zh&5s7k`POa*>LyXhOE+S&6Qq@P+9hMs}nLwo%iQ<1t0iKA)l}iZ{?AV?1P02#5Sc@ z2H#YyEU{?N4@Z@>yea)aL;jDcp4nR1Sm?fBAu2cUf5Buoa1U2{RlT`*Ll-9a}h9Urm??qU%nJ6S(c$v#TyaRXwVHZ&}ON-3c-9PAu(pRhh(bp{(hE%aX^3XtJpXATqvABLca>vDGez$EMcnLVP zr1HmFJx*kIhJHQ8<2VfdJgzeK30u9X9*50M9O5LkZ#?(lAm1!jdTVmw?9x^B{L#@> z<@)6PYDJH7v~)_=`3cMG3JdQ`#}yWy?n5<9Za7OSxH-+~wTD@vc(a({9v z(#_gOk9jd8=jiu=V7PqqS85cUvn**^oa07ujxC~8$@}U^zgL;^RUKnI7i4dAr8%j@ zUO@~b*k0R|Zmo>W#!zgyhI0Lb96D%s_$bjnm67j3Fq)!-E3>ze{0}x{8-&LsOO_EG zTLoG9#~Y*NQ>WJGBVp~)S8d54#O*+q^OCBU#a48Vy=od;KgCW%G?l1eJBmTGt22U z&2xPsIDfd>vN5>Iq6?dbyU*A81`T)@4f3J^knLSMu7o^(Ew+5LPWT93L2xPwwU%%o zjYvN@g#K z>YfM&mFZJ=gXF~*o-9!zPR!ovQ)|*EkI3F`u-3a~qIMPL_S?*Z{+?!D|2uAKochUq zei~Z(iG3c^>j+?+{S`gs$^0e;gy+wsjDX#pozn zjPqzwzav^?jrC9Oh!Fo^v#0%{pJsPA!uz3}$gp$6XzmTN@2(>kDMvU{I~DZf4!$?` z?_A9&YU;@uXPe(Uec2xAGj}B$tK{VB@eY?O8JgW4E|(1dKRfJ?+}dCJaY&QTj-?ak z-$A=&=&bKaXOiIQ4w6mV>9OTQQ=JGej_#ab1c?Nx)&ExBHrdjqAY7ah4a|Yq;lP0TX5IyZq?V(F6MS1kdI+; z)Jfbd^KlL7)AwjdPuf+Dij$BSz}l!I_c6J%@Ig?ysG*dW=l0n#cJzbDu9Xc7&oM%I z>QleNNYL!W-RU#6Ugez@ey5ns_Bo+`YO?U{x5~i)7iAk|StfVKH{!9U6Fq)a{hi1Y&K`i8}sp+R~{mv2DDZcSDnzd3XK6@f4v*;|*dn2CHAcxb6 z#B(Utt#HAULX}4DdbeEA3Xpy8hV*>a%iLYb6(?6UST8=nXlGV5d1vzWV&6wgzTBn|1||=!T}iga-lD|8*WDQ zFMGR*+a_Ljfw}-h+BWI?-w8U{=ZDhvJz4~KI9N(aI7*4xRgZq!<8vs(N(Z#`9g)e8 z!RS=x@S0fnLf{!z=jKrHHC8bXlw|gw2T)moilIk-m+0#63CVV=KT-C`9cpY?I7^CivITz`2A(09_KUGgilGLnpaxen0`Ds z@DBw!)Y)ey7kUMu(U~51e=%QmN==m5s8v}pzzwnGh(@+?iEq-z<%a85N_2`3W1z*- zn8k$61r~b^pQ5>dks3|i@$_Xc9)ruSQszh++6G*31n=^wT=u7=**xs9%%p60nzC1` zTw@tlom>xX28||E<}QM9VqG-AS%o`@YLVX=hy!*5eN&YJXVqM}a5DSIjWz1=jCAv! zoRBZ&Gu;f^Jt4kuLXqumu1QZAp}EpO{Pm%W3-~ICLep(CY4!SqsG@J33b^JUY|Za7 zmmWHG*+5cO%n6FMrxOMFe!f%|PO;XHJ`H{Iqh6VIwfribu=FskVgyg8aF+b|27~W( z&$>T0FVr<_Q6FrJIw6Iz6`x&`Y#V0F`~JlJEN^6~y2o?76;l^B)eQEF9gM&fabEjL zER=|5S%>wXs99c9T;ug%IuP~vwZJvZpC@6jWD?TYe3ZL*is=zvZ#(tswW1)W*BP1V6!=G{@N
    bsLVf&LJh1h_?#$-Z;wgYhhoSr2%8q;J>mG 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

    V?byZKk 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 z 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ℜ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�}#$+Tv|y(mci>P9@881ocC&l0hTY$$Ik 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%0DR-DY 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