From 6ef8df427a769b881eeaa1267015e66034c861fb Mon Sep 17 00:00:00 2001 From: kevaundray Date: Wed, 25 Oct 2023 03:25:12 +0000 Subject: [PATCH 1/6] expose all of the blackbox function names --- acvm-repo/acir/Cargo.toml | 4 ++-- acvm-repo/acir/src/circuit/black_box_functions.rs | 8 ++++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/acvm-repo/acir/Cargo.toml b/acvm-repo/acir/Cargo.toml index 90d2c743a79..cd6e3bd45a8 100644 --- a/acvm-repo/acir/Cargo.toml +++ b/acvm-repo/acir/Cargo.toml @@ -19,11 +19,11 @@ serde.workspace = true thiserror.workspace = true flate2 = "1.0.24" bincode.workspace = true +strum = "0.24" +strum_macros = "0.24" [dev-dependencies] serde_json = "1.0" -strum = "0.24" -strum_macros = "0.24" serde-reflection = "0.3.6" serde-generate = "0.25.1" fxhash.workspace = true diff --git a/acvm-repo/acir/src/circuit/black_box_functions.rs b/acvm-repo/acir/src/circuit/black_box_functions.rs index 9129f44008c..08410b991f8 100644 --- a/acvm-repo/acir/src/circuit/black_box_functions.rs +++ b/acvm-repo/acir/src/circuit/black_box_functions.rs @@ -5,12 +5,12 @@ //! These are implemented inside the ACVM stdlib. use serde::{Deserialize, Serialize}; -#[cfg(test)] use strum_macros::EnumIter; +use strum::IntoEnumIterator; #[allow(clippy::upper_case_acronyms)] #[derive(Clone, Debug, Hash, Copy, PartialEq, Eq, Serialize, Deserialize)] -#[cfg_attr(test, derive(EnumIter))] +#[derive(EnumIter)] pub enum BlackBoxFunc { /// Bitwise AND. AND, @@ -99,6 +99,10 @@ impl BlackBoxFunc { pub fn is_valid_black_box_func_name(op_name: &str) -> bool { BlackBoxFunc::lookup(op_name).is_some() } + + pub fn all_blackbox_functions() -> Vec { + Self::iter().map(|x| x.name().to_string()).collect() + } } #[cfg(test)] From b6819f6261e63cea3e653a1b874727a2b5919f5e Mon Sep 17 00:00:00 2001 From: kevaundray Date: Wed, 25 Oct 2023 03:27:12 +0000 Subject: [PATCH 2/6] hack: when compiling we allow the user to specify no backend --- also a bit hacky to fix the width to 3 --- tooling/backend_interface/src/lib.rs | 17 +++++++++++++++++ tooling/nargo_cli/src/cli/compile_cmd.rs | 11 ++++++++++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/tooling/backend_interface/src/lib.rs b/tooling/backend_interface/src/lib.rs index 6c91c181a92..86bb8bf18fb 100644 --- a/tooling/backend_interface/src/lib.rs +++ b/tooling/backend_interface/src/lib.rs @@ -8,6 +8,7 @@ mod download; mod proof_system; mod smart_contract; +use acvm::acir::BlackBoxFunc; use acvm::acir::circuit::Opcode; use bb_abstraction_leaks::ACVM_BACKEND_BARRETENBERG; use bb_abstraction_leaks::BB_VERSION; @@ -141,6 +142,22 @@ pub struct BackendOpcodeSupport { } impl BackendOpcodeSupport { + pub fn all_opcodes_supported() -> Self { + BackendOpcodeSupport { + opcodes: vec![ + "arithmetic", + "directive", + "brillig", + "memory_init", + "memory_op", + ] + .into_iter() + .map(|s| s.to_string()) + .collect(), + black_box_functions: BlackBoxFunc::all_blackbox_functions().into_iter().collect(), + } + } + pub fn is_opcode_supported(&self, opcode: &Opcode) -> bool { match opcode { Opcode::Arithmetic(_) => self.opcodes.contains("arithmetic"), diff --git a/tooling/nargo_cli/src/cli/compile_cmd.rs b/tooling/nargo_cli/src/cli/compile_cmd.rs index 039fee5dbc4..a7c54d5629a 100644 --- a/tooling/nargo_cli/src/cli/compile_cmd.rs +++ b/tooling/nargo_cli/src/cli/compile_cmd.rs @@ -40,6 +40,10 @@ pub(crate) struct CompileCommand { #[arg(long)] include_keys: bool, + /// Compile without a backend + #[clap(long, default_value = "false", hide = true)] + no_backend: bool, + /// The name of the package to compile #[clap(long, conflicts_with = "workspace")] package: Option, @@ -70,7 +74,12 @@ pub(crate) fn run( .cloned() .partition(|package| package.is_binary()); - let (np_language, opcode_support) = backend.get_backend_info()?; + let (np_language, opcode_support) = if args.no_backend { + (Language::PLONKCSat{ width: 3 }, BackendOpcodeSupport::all_opcodes_supported()) + } else { + backend.get_backend_info()? + }; + let (_, compiled_contracts) = compile_workspace( &workspace, &binary_packages, From 5d6a2765c42d8703353e251954fcbaf5d7d3cd41 Mon Sep 17 00:00:00 2001 From: kevaundray Date: Wed, 25 Oct 2023 13:48:11 +0000 Subject: [PATCH 3/6] add no-backend flag to execute --- tooling/nargo_cli/src/cli/execute_cmd.rs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/tooling/nargo_cli/src/cli/execute_cmd.rs b/tooling/nargo_cli/src/cli/execute_cmd.rs index 1819c9a6f06..b894113e334 100644 --- a/tooling/nargo_cli/src/cli/execute_cmd.rs +++ b/tooling/nargo_cli/src/cli/execute_cmd.rs @@ -1,4 +1,6 @@ +use acvm::Language; use acvm::acir::native_types::WitnessMap; +use backend_interface::BackendOpcodeSupport; use clap::Args; use nargo::artifacts::debug::DebugArtifact; @@ -23,6 +25,10 @@ pub(crate) struct ExecuteCommand { /// Write the execution witness to named file witness_name: Option, + /// Compile without a backend + #[clap(long, default_value = "false", hide = true)] + no_backend: bool, + /// The name of the toml file which contains the inputs for the prover #[clap(long, short, default_value = PROVER_INPUT_FILE)] prover_name: String, @@ -51,7 +57,12 @@ pub(crate) fn run( let workspace = resolve_workspace_from_toml(&toml_path, selection)?; let target_dir = &workspace.target_directory_path(); - let (np_language, opcode_support) = backend.get_backend_info()?; + let (np_language, opcode_support) = if args.no_backend { + (Language::PLONKCSat{ width: 3 }, BackendOpcodeSupport::all_opcodes_supported()) + } else { + backend.get_backend_info()? + }; + for package in &workspace { let compiled_program = compile_bin_package( &workspace, From 44175669613b2d56911b1ce8f2a00e6a35429202 Mon Sep 17 00:00:00 2001 From: kevaundray Date: Wed, 25 Oct 2023 13:48:23 +0000 Subject: [PATCH 4/6] modify build script to work with no-backend --- tooling/nargo_cli/tests/rebuild.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tooling/nargo_cli/tests/rebuild.sh b/tooling/nargo_cli/tests/rebuild.sh index 9776745a1f7..4b573f45239 100755 --- a/tooling/nargo_cli/tests/rebuild.sh +++ b/tooling/nargo_cli/tests/rebuild.sh @@ -27,7 +27,7 @@ for dir in $base_path/*; do if [ -d ./target/ ]; then rm -r ./target/ fi - nargo compile && nargo execute witness + nargo compile --no-backend && nargo execute --no-backend witness # Rename witness.tr to witness.gz if [ -f ./target/witness.tr ]; then From 47f1bff23ba864a3f67e55a9e797724206c3b6c8 Mon Sep 17 00:00:00 2001 From: kevaundray Date: Tue, 31 Oct 2023 12:57:32 +0000 Subject: [PATCH 5/6] cargo fmt --- .../acir/src/circuit/black_box_functions.rs | 5 ++--- tooling/backend_interface/src/lib.rs | 16 +++++----------- tooling/nargo_cli/src/cli/compile_cmd.rs | 2 +- tooling/nargo_cli/src/cli/execute_cmd.rs | 6 +++--- 4 files changed, 11 insertions(+), 18 deletions(-) diff --git a/acvm-repo/acir/src/circuit/black_box_functions.rs b/acvm-repo/acir/src/circuit/black_box_functions.rs index 08410b991f8..7f8670036b3 100644 --- a/acvm-repo/acir/src/circuit/black_box_functions.rs +++ b/acvm-repo/acir/src/circuit/black_box_functions.rs @@ -5,12 +5,11 @@ //! These are implemented inside the ACVM stdlib. use serde::{Deserialize, Serialize}; -use strum_macros::EnumIter; use strum::IntoEnumIterator; +use strum_macros::EnumIter; #[allow(clippy::upper_case_acronyms)] -#[derive(Clone, Debug, Hash, Copy, PartialEq, Eq, Serialize, Deserialize)] -#[derive(EnumIter)] +#[derive(Clone, Debug, Hash, Copy, PartialEq, Eq, Serialize, Deserialize, EnumIter)] pub enum BlackBoxFunc { /// Bitwise AND. AND, diff --git a/tooling/backend_interface/src/lib.rs b/tooling/backend_interface/src/lib.rs index 86bb8bf18fb..83854e586da 100644 --- a/tooling/backend_interface/src/lib.rs +++ b/tooling/backend_interface/src/lib.rs @@ -8,8 +8,8 @@ mod download; mod proof_system; mod smart_contract; -use acvm::acir::BlackBoxFunc; use acvm::acir::circuit::Opcode; +use acvm::acir::BlackBoxFunc; use bb_abstraction_leaks::ACVM_BACKEND_BARRETENBERG; use bb_abstraction_leaks::BB_VERSION; use cli::VersionCommand; @@ -144,16 +144,10 @@ pub struct BackendOpcodeSupport { impl BackendOpcodeSupport { pub fn all_opcodes_supported() -> Self { BackendOpcodeSupport { - opcodes: vec![ - "arithmetic", - "directive", - "brillig", - "memory_init", - "memory_op", - ] - .into_iter() - .map(|s| s.to_string()) - .collect(), + opcodes: vec!["arithmetic", "directive", "brillig", "memory_init", "memory_op"] + .into_iter() + .map(|s| s.to_string()) + .collect(), black_box_functions: BlackBoxFunc::all_blackbox_functions().into_iter().collect(), } } diff --git a/tooling/nargo_cli/src/cli/compile_cmd.rs b/tooling/nargo_cli/src/cli/compile_cmd.rs index 1c360dc77e4..73aa3cac909 100644 --- a/tooling/nargo_cli/src/cli/compile_cmd.rs +++ b/tooling/nargo_cli/src/cli/compile_cmd.rs @@ -80,7 +80,7 @@ pub(crate) fn run( .partition(|package| package.is_binary()); let (np_language, opcode_support) = if args.no_backend { - (Language::PLONKCSat{ width: 3 }, BackendOpcodeSupport::all_opcodes_supported()) + (Language::PLONKCSat { width: 3 }, BackendOpcodeSupport::all_opcodes_supported()) } else { backend.get_backend_info()? }; diff --git a/tooling/nargo_cli/src/cli/execute_cmd.rs b/tooling/nargo_cli/src/cli/execute_cmd.rs index ebb3fe4583a..9eaf072e1ed 100644 --- a/tooling/nargo_cli/src/cli/execute_cmd.rs +++ b/tooling/nargo_cli/src/cli/execute_cmd.rs @@ -1,5 +1,5 @@ -use acvm::Language; use acvm::acir::native_types::WitnessMap; +use acvm::Language; use backend_interface::BackendOpcodeSupport; use clap::Args; @@ -62,11 +62,11 @@ pub(crate) fn run( let target_dir = &workspace.target_directory_path(); let (np_language, opcode_support) = if args.no_backend { - (Language::PLONKCSat{ width: 3 }, BackendOpcodeSupport::all_opcodes_supported()) + (Language::PLONKCSat { width: 3 }, BackendOpcodeSupport::all_opcodes_supported()) } else { backend.get_backend_info()? }; - + for package in &workspace { let compiled_program = compile_bin_package( &workspace, From 87cab45d5b26778fbd1066f0cf25b802f3a14b84 Mon Sep 17 00:00:00 2001 From: kevaundray Date: Tue, 31 Oct 2023 12:58:07 +0000 Subject: [PATCH 6/6] fix for loop statement --- compiler/noirc_frontend/src/hir/aztec_library.rs | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/compiler/noirc_frontend/src/hir/aztec_library.rs b/compiler/noirc_frontend/src/hir/aztec_library.rs index fa51a09d4f9..0eb550dd59a 100644 --- a/compiler/noirc_frontend/src/hir/aztec_library.rs +++ b/compiler/noirc_frontend/src/hir/aztec_library.rs @@ -16,8 +16,8 @@ use crate::{ UnresolvedType, UnresolvedTypeData, Visibility, }; use crate::{ - ForLoopStatement, FunctionDefinition, FunctionVisibility, ImportStatement, NoirStruct, - PrefixExpression, Signedness, StatementKind, StructType, Type, TypeImpl, UnaryOp, + ForLoopStatement, ForRange, FunctionDefinition, FunctionVisibility, ImportStatement, + NoirStruct, PrefixExpression, Signedness, StatementKind, StructType, Type, TypeImpl, UnaryOp, }; use fm::FileId; @@ -873,6 +873,7 @@ fn add_struct_to_hasher(identifier: &Ident) -> Statement { fn create_loop_over(var: Expression, loop_body: Vec) -> Statement { // If this is an array of primitive types (integers / fields) we can add them each to the hasher // casted to a field + let span = var.span.clone(); // `array.len()` let end_range_expression = method_call( @@ -887,12 +888,15 @@ fn create_loop_over(var: Expression, loop_body: Vec) -> Statement { // `for i in 0..{ident}.len()` make_statement(StatementKind::For(ForLoopStatement { + range: ForRange::Range( + expression(ExpressionKind::Literal(Literal::Integer(FieldElement::from(i128::from( + 0, + ))))), + end_range_expression, + ), identifier: ident("i"), - start_range: expression(ExpressionKind::Literal(Literal::Integer(FieldElement::from( - i128::from(0), - )))), - end_range: end_range_expression, block: for_loop_block, + span, })) }