LLZK 2.0.0
An open-source IR for Zero Knowledge (ZK) circuits
Loading...
Searching...
No Matches
Tool Guides

llzk-opt

llzk-opt is a version of the mlir-opt tool that supports passes on LLZK IR files. You can refer to the mlir-opt documentation for a general overview of the operation of *-opt tooling, but note that many options and passes available in mlir-opt are not available in llzk-opt. llzk-opt -h will show a list of all available flags and options.

LLZK-Specific Options

-I <directory> : Directory of include files

LLZK Pass Documentation

Analysis Passes

-llzk-print-call-graph

Print the LLZK module's call graph.

-llzk-print-call-graph-sccs

Print the SCCs from the LLZK module's call graph.

-llzk-print-constraint-dependency-graphs

Print constraint dependency graph for all LLZK structs.

Options
-intraprocedural : Whether to run the analysis intra-procedurally only (default is false).

-llzk-print-interval-analysis

Print interval analysis results for all LLZK structs.

Options
-field : The field to use for interval analysis. If supplied, this always overrides the module's detected field. If omitted, the pass first tries to detect a single field from the enclosing module's felt usage and otherwise falls back to bn128. Supported fields: bn128/bn254, babybear, goldilocks, koalabear, mersenne31
-propagate-input-constraints : Whether to propagate constraints on inputs from @constrain to @compute functions. This allows for tighter intervals to possibly be found for computed values, assuming that the witness generator would include constraints as assertions during the computation.
-print-solver-constraints : Whether to output SMT solver constraints along with intervals.
-print-compute-intervals : Whether to print compute function intervals (default only prints constrain function intervals).

-llzk-print-predecessors

Print the predecessors of all operations.

Options
-stream : Specifies the stream to which the pass prints.
-prerun : Whether to pre-run the required dataflow analyses (e.g., liveness analysis).

-llzk-print-symbol-def-tree

Print symbol definition tree.

Options
-stream : Specifies the stream to which the pass prints.
-saveDot : Whether to dump the graph to DOT format.

-llzk-print-symbol-use-graph

Print symbol use graph.

Options
-stream : Specifies the stream to which the pass prints.
-saveDot : Whether to dump the graph to DOT format.

General Transformation Passes

-llzk-compute-constrain-to-product

_Replace separate @compute and @constrain functions in a struct with a single @product function_

Replace separate @compute and @constrain functions in a struct with a single @product function

Options
-root-struct : Root struct at which to start alignment (default to `@Main`)

-llzk-duplicate-op-elim

Remove redundant operations

Remove llzk and arith dialect operations that produce the same results as previously executed operations.

Pass should be run after llzk-duplicate-read-write-elim for maximum effect.

-llzk-duplicate-read-write-elim

Remove redundant reads and writes

Remove read and write operations to struct members and arrays that are redundant or unnecessary.

-llzk-enforce-no-overwrite

Checks that every struct member is written exactly once

This pass currently reports an error if any struct member may not be written exactly once (i.e. overwritten or left uninitialized), and does not attempt to perform any repairs (e.g. SSA-ifying overwritten struct members, or default-initializing unwritten members). This pass overapproximates conditionals, and can result in false positives.

-llzk-fuse-product-loops

_Fuse matching witness/constraint loops in a @product function_

Fuse matching witness/constraint loops in a @product function

-llzk-inline-structs

Inlines nested structs (i.e., subcomponents).

This pass inlines nested structs (i.e., subcomponents) at struct-type members and at calls to the subcomponent compute/constrain functions. Inlining decisions are guided by the call graph of "constrain" functions.

The max-merge-complexity parameter can be used to limit the complexity of the resulting structs such that a potential inlining will not take place if doing so would push the sum of constraint and multiplications in the combined struct over the limit. The default value 0 indicates no limits which means all structs will be inlined into the Main struct.

This pass should be run after llzk-flatten to ensure structs do not have template parameters because structs with template parameters cannot (currently) be inlined. Inlining is also not (currently) supported for subcomponent structs stored in an array-type member.

This pass also assumes that all subcomponents that are created by calling a struct "@compute" function are ultimately written to exactly one member within the current struct.

Options
-max-merge-complexity : Maximum allowed constraint+multiplications in merged @constrain functions

-llzk-poly-lowering-pass

Lower the degree of all polynomial equations to a specified maximum

Rewrites constraint expressions into an (observationally) equivalent system where the degree of every polynomial is less than or equal to the specified maximum.

This pass is best used as part of the -llzk-full-poly-lowering pipeline, which includes additional cleanup passes to ensure correctness and optimal performance.

Options
-max-degree : Maximum degree of constraint polynomials (default 2, minimum 2)

-llzk-unused-declaration-elim

Remove unused member and struct declarations

Remove member and struct declarations that are unused within the current compilation unit. Note that this pass may cause linking issues with external modules that depend on any unused member and struct declarations from this compilation unit.

Pass should be run after llzk-duplicate-read-write-elim and llzk-duplicate-op-elim for maximum effect.

Options
-remove-structs : Whether to remove unused struct definitions as well. Requires module to declare a Main component, otherwise all components will appear unused.

'array' Dialect Transformation Passes

-llzk-array-to-scalar

Replace arrays with scalar values

Replace known-shape arrays with the proper number of scalar values

'polymorphic' Dialect Transformation Passes

-llzk-drop-empty-templates

Remove empty templates

Performs the following transformations:

  • Convert templates with no constant parameters or expressions into modules.
  • Remove templates with no struct or function definitions.

-llzk-flatten

Flatten structs and unroll loops

Performs the following transformations:

  • Instantiate affine_map parameters of StructType and ArrayType to constant values using the arguments at the instantiation site
  • Replace parameterized structs with flattened (i.e., no parameter) versions of those structs based on requested return type at calls to compute() functions and unroll loops
  • Unroll loops
Options
-max-iter : Maximum number of times the pass will run if a fixpoint is not reached earlier. Unrolling loops can provide more opportunities for instantiating structs but the converse is true as well. Thus, the pass will run multiple times until no further changes can be made or the upper limit provided in this option is reached.
-cleanup : Specifies the extent to which unused parameterized structs (i.e. structs within a `poly.template`) are removed during the flattening pass.

Validation Passes

-llzk-validate-member-writes

Detect multiple and missing writes to the same member of a component.

Detect multiple and missing writes to the same member of a component.

Note that this is overapproximate (i.e., some writes may erroneously be flagged as overwrites, and some members may erroneously be marked unwritten).

llzk-lsp-server

cmake --build <build dir> --target llzk-lsp-server will produce an LLZK-specific LSP server that can be used in an IDE to provide language information for LLZK. Refer to the MLIR LSP documentation for a more detailed explanation of the MLIR LSP tools and how to set them up in your IDE.

Previous Next
Setup Contribution Guide