Skip to content

feat(cli): Add nargo interpret command#8700

Merged
aakoshh merged 5 commits intomasterfrom
af/nargo-interpret-ssa
May 28, 2025
Merged

feat(cli): Add nargo interpret command#8700
aakoshh merged 5 commits intomasterfrom
af/nargo-interpret-ssa

Conversation

@aakoshh
Copy link
Contributor

@aakoshh aakoshh commented May 28, 2025

Description

Problem*

@guipublic said he would like to use the SSA interpreter to evaluate the SSA at a certain point in the pipeline to debug some issue.

This is related to #8503 , but instead of working on a stand-alone SSA snippet where we would have to come up with some input format as well, it taps into the existing flow of nargo, dealing with Noir source code and TOML/JSON input, which I thought was a low hanging fruit and fits into our typical workflow.

Summary*

Adds a new nargo interpret command compiles the source code, looks for binary packages, parses their Prover.toml file, then uses the SSA Interpreter to evaluate the SSA after each pass, according to the --ssa-pass filter, which can accept multiple passes, similar to --show-ssa-pass.

At the moment it only considers the primary passes, it doesn't do the secondary like the normal flow.

Additional Context

I added a reference from nargo_cli to:

  • noirc_evaluator: so that I can access the interpreter
  • noir_ast_fuzzer: so that I can turn ABI inputs into SSA interpreter values

We could migrate some of the stuff from the AST fuzzer into the libraries, but I thought it could be done as a follow up, to keep the code churn to a minimum.

The new command also has quite a lot of boilerplate due to having to compile from source into monomorphized AST, which isn't exposed by the compiler library as a flow. In this it is similar to what I had to do in #8393

Example:

cargo run -q -p nargo_cli -- interpret --silence-warnings --ssa-pass Flattening --ssa-pass "Removing bit shifts" 
--- Interpreter result after Flattening (step 17):
Ok([Numeric(U8(78))])
---
--- Interpreter result after Removing Bit Shifts (step 18):
Err(Internal(ConstantDoesNotFitInType { constant: -409655725810913393472212215421341542392503380204074161341709628484773418406, typ: Unsigned { bit_size: 64 } }))
---

The options include all the CompileOptions, such as --force-brillig and --show-ssa, plus some from execute:

cargo run -q -p nargo_cli -- interpret --help
Compile the program and interpret the SSA after each pass, printing the results to the console

Usage: nargo interpret [OPTIONS]

Options:
      --package <PACKAGE>
          The name of the package to run the command on. By default run on the first one found moving up along the ancestors of the current directory

      --workspace
          Run on all packages in the workspace

      ...

  -p, --prover-name <PROVER_NAME>
          The name of the TOML file which contains the ABI encoded inputs
          
          [default: Prover]

      --ssa-pass <SSA_PASS>
          The name of the SSA passes we want to interpret the results at.
          
          When nothing is specified, the SSA is interpreted after all passes.

  -h, --help
          Print help (see a summary with '-h')

Options which only affect ACIR or Brillig generation are ignored.

The command itself is hidden, like the SSA options in general.

Documentation*

Check one:

  • No documentation needed.
  • Documentation included in this PR.
  • [For Experimental Features] Documentation to be submitted in a separate PR.

PR Checklist*

  • I have tested the changes locally.
  • I have formatted the changes with Prettier and/or cargo fmt on default settings.

@aakoshh aakoshh changed the title feat(cli) Add nargo interpret command feat(cli): Add nargo interpret command May 28, 2025
@aakoshh aakoshh requested a review from a team May 28, 2025 13:34
Copy link
Contributor

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Performance Alert ⚠️

Possible performance regression was detected for benchmark 'Test Suite Duration'.
Benchmark result of this commit is worse than the previous benchmark result exceeding threshold 1.20.

Benchmark suite Current: 9c02ffa Previous: 9e90bf4 Ratio
test_report_AztecProtocol_aztec-packages_noir-projects_noir-protocol-circuits_crates_blob 52 s 42 s 1.24

This comment was automatically generated by workflow using github-action-benchmark.

CC: @TomAFrench

Copy link
Collaborator

@asterite asterite left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good!

@aakoshh aakoshh enabled auto-merge May 28, 2025 21:51
@aakoshh aakoshh added this pull request to the merge queue May 28, 2025
Merged via the queue into master with commit 1139bbc May 28, 2025
118 of 119 checks passed
@aakoshh aakoshh deleted the af/nargo-interpret-ssa branch May 28, 2025 22:28
defkit pushed a commit that referenced this pull request May 29, 2025
github-merge-queue bot pushed a commit to AztecProtocol/aztec-packages that referenced this pull request Jun 1, 2025
Automated pull of nightly from the
[noir](https://github.com/noir-lang/noir) programming language, a
dependency of Aztec.
BEGIN_COMMIT_OVERRIDE
fix(fmt): correctly format mixed secondary attributes and doc comments
(noir-lang/noir#8735)
fix!: require types for trait impl associated constants
(noir-lang/noir#8734)
fix!: Prevent returning references from if expressions
(noir-lang/noir#8731)
fix: cast signed to u1 follow-up
(noir-lang/noir#8730)
fix: cast signed to u1 (noir-lang/noir#8720)
fix: do not mutate arrays later copied inside other arrays
(noir-lang/noir#8701)
chore: box `AsTraitPath` and `TypePath` in `ExpressionKind`
(noir-lang/noir#8716)
fix: general solution for accessing associated constants
(noir-lang/noir#8417)
fix(ssa): Validate checked signed add/sub is followed by a truncate
(noir-lang/noir#8706)
chore: add pre- and post-check on `array_set` optimization pass
(noir-lang/noir#8714)
fix: merge expr bindings with instantiations bindings during
monomorphization (noir-lang/noir#8713)
fix: better way to do LSP file overrides
(noir-lang/noir#8702)
fix(fmt): correct indentation when formatting long struct patterns
(noir-lang/noir#8711)
fix(fuzz): Prevent breaking/continuing out from let blocks in the AST
fuzzer (noir-lang/noir#8708)
chore: remove override for zero length inputs
(noir-lang/noir#8709)
feat: Replace converging jmpif with empty block destinations with a
single jmp (noir-lang/noir#8613)
feat(cli): Add `nargo interpret` command
(noir-lang/noir#8700)
chore: more 1-tuple printing fixes
(noir-lang/noir#8699)
chore(fuzz): Fuzz the SSA parser
(noir-lang/noir#8647)
fix: (SSA parser) translate blocks in logical order rather than syntax
order (noir-lang/noir#8668)
fix(SSA): show and parse range_check's assert_message
(noir-lang/noir#8652)
chore: Show the step number in the SSA message
(noir-lang/noir#8698)
chore(docs): Add pointers to tests
(noir-lang/noir#8695)
chore(fuzz): Capture comptime print output
(noir-lang/noir#8635)
fix: nargo expand reexports correctly implemented
(noir-lang/noir#8693)
feat(cli): Show multiple SSA passes
(noir-lang/noir#8692)
chore(test): Add regression test for defunctionalize
(noir-lang/noir#8691)
chore: add an assertion when parsing SSA that all functions are
well-formed (noir-lang/noir#8671)
feat!: prevent compiling blake3 hashes which barretenberg cannot prove
(noir-lang/noir#8690)
fix(ssa): Remove the array cache from the function inserter
(noir-lang/noir#8607)
chore: bump external pinned commits
(noir-lang/noir#8684)
chore: reenable fuzzing tests in CI
(noir-lang/noir#8688)
fix: Handle `&mut function` in defunctionalize
(noir-lang/noir#8665)
fix(defunctionalize): Higher order functions (HOF) dynamic dispatch and
HOFs in arrays (noir-lang/noir#8672)
chore(ci): avoid running fuzzer tests in the merge queue
(noir-lang/noir#8664)
fix: Make casts in `comptime` consistent with runtime casts
(noir-lang/noir#8669)
fix: relax connectedness requirement on purity analysis pass
(noir-lang/noir#8667)
fix: always use `u32` for indexing arrays in SSA
(noir-lang/noir#8633)
chore: explicitly pull from `next` branch in aztec-packages
(noir-lang/noir#8660)
chore(fuzz): Build the dictionary from the SSA
(noir-lang/noir#8591)
chore(docs): Remove old versioned docs
(noir-lang/noir#8061)
chore: bump external pinned commits
(noir-lang/noir#8634)
fix(SSA): don't use string literal if byte is "form feed" ('\f')
(noir-lang/noir#8653)
chore(defunctionalize): Add regression test for missing lambda variants
panic (noir-lang/noir#8642)
chore(ci): Do not run ast_fuzzer orig vs. morph in ci
(noir-lang/noir#8646)
fix: disable underflow fix for fields
(noir-lang/noir#8631)
fix: revert "fix: error on unused generic in trait impl
(noir-lang/noir#8395)"
(noir-lang/noir#8636)
fix(ssa interpreter): Default to zero when we have an overflowing shl
(noir-lang/noir#8638)
fix: ensure that purity analysis pass explores all functions
(noir-lang/noir#8452)
feat: acir_formal_proofs (noir-lang/noir#8140)
fix: error on unused generic in trait impl
(noir-lang/noir#8395)
fix(expand): use re-exports for non-visibile items
(noir-lang/noir#8374)
END_COMMIT_OVERRIDE

---------

Co-authored-by: AztecBot <tech@aztecprotocol.com>
Co-authored-by: Tom French <15848336+TomAFrench@users.noreply.github.com>
Co-authored-by: Ary Borenszweig <asterite@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants