miden-stdlib 0.19.1

Miden VM standard library
Documentation
# ===== SYSTEM PROCEDURES ==========================================================================

#! Removes elements deep in the stack until the depth of the stack is exactly 16. The elements
#! are removed in such a way that the top 16 elements of the stack remain unchanged. If the stack
#! would otherwise contain more than 16 elements at the end of execution, then adding a call to this
#! function at the end will reduce the size of the public inputs that are shared with the verifier.
#!
#! Input: Stack with 16 or more elements.
#! Output: Stack with only the original top 16 elements.
#!
#! Cycles: 17 + 11 * overflow_words, where `overflow_words` is the number of words needed to drop.
export.truncate_stack.4
    # save the first word to memory and bring elements to be dropped to the top of the stack
    loc_storew_be.0 dropw movupw.3
    # => [X, B, C, D, ...]

    # until stack depth greater than 16, keep dropping extra elements
    sdepth neq.16
    while.true
        dropw movupw.3
        # => [X, B, C, D, ...]

        sdepth neq.16
    end
    # => [X, B, C, D, ...]

    # bring the previously saved word back onto the stack
    loc_loadw_be.0
    # => [A, B, C, D, ...]
end

#! Drop 16 values from the stack.
export.drop_stack_top
    dropw dropw dropw dropw
end

#! Logs a precompile commitment and removes the helper words produced by `log_precompile`.
#!
#! Input: `[COMM, TAG, ...]`
#! Output: Stack without the three helper words `[R1, R0, CAP_NEXT]`.
#! Cycles: 1 (plus cost of the underlying `log_precompile` instruction).
export.log_precompile_request
    padw movdnw.2
    # => [COMM, TAG, PAD, ...]
    log_precompile
    # => [R1, R0, CAP_NEXT, ...]
    dropw dropw dropw
end