provekit_acir 1.0.0-beta.11-alpha.2

ACIR is the IR that the VM processes, it is analogous to LLVM IR
Documentation
syntax = "proto3";

package acvm.brillig;

import "acir/native.proto";

message BrilligBytecode { repeated BrilligOpcode bytecode = 1; }

message BrilligOpcode {
  oneof value {
    BinaryFieldOp binary_field_op = 1;
    BinaryIntOp binary_int_op = 2;
    Not not = 3;
    Cast cast = 4;
    JumpIfNot jump_if_not = 5;
    JumpIf jump_if = 6;
    Jump jump = 7;
    CalldataCopy calldata_copy = 8;
    Call call = 9;
    Const const = 10;
    IndirectConst indirect_const = 11;
    Return return = 12;
    ForeignCall foreign_call = 13;
    Mov mov = 14;
    ConditionalMov conditional_mov = 15;
    Load load = 16;
    Store store = 17;
    BlackBox black_box = 18;
    Trap trap = 19;
    Stop stop = 20;
  }
  message BinaryFieldOp {
    MemoryAddress destination = 1;
    BinaryFieldOpKind op = 2;
    MemoryAddress lhs = 3;
    MemoryAddress rhs = 4;
  }
  message BinaryIntOp {
    MemoryAddress destination = 1;
    BinaryIntOpKind op = 2;
    IntegerBitSize bit_size = 3;
    MemoryAddress lhs = 4;
    MemoryAddress rhs = 5;
  }
  message Not {
    MemoryAddress destination = 1;
    MemoryAddress source = 2;
    IntegerBitSize bit_size = 3;
  }
  message Cast {
    MemoryAddress destination = 1;
    MemoryAddress source = 2;
    BitSize bit_size = 3;
  }
  message JumpIfNot {
    MemoryAddress condition = 1;
    uint64 location = 2;
  }
  message JumpIf {
    MemoryAddress condition = 1;
    uint64 location = 2;
  }
  message Jump { uint64 location = 1; }
  message CalldataCopy {
    MemoryAddress destination_address = 1;
    MemoryAddress size_address = 2;
    MemoryAddress offset_address = 3;
  }
  message Call { uint64 location = 1; }
  message Const {
    MemoryAddress destination = 1;
    BitSize bit_size = 2;
    acir.native.Field value = 3;
  }
  message IndirectConst {
    MemoryAddress destination_pointer = 1;
    BitSize bit_size = 2;
    acir.native.Field value = 3;
  }
  message Return {}
  message ForeignCall {
    string function = 1;
    repeated ValueOrArray destinations = 2;
    repeated HeapValueType destination_value_types = 3;
    repeated ValueOrArray inputs = 4;
    repeated HeapValueType input_value_types = 5;
  }
  message Mov {
    MemoryAddress destination = 1;
    MemoryAddress source = 2;
  }
  message ConditionalMov {
    MemoryAddress destination = 1;
    MemoryAddress source_a = 2;
    MemoryAddress source_b = 3;
    MemoryAddress condition = 4;
  }
  message Load {
    MemoryAddress destination = 1;
    MemoryAddress source_pointer = 2;
  }
  message Store {
    MemoryAddress destination_pointer = 1;
    MemoryAddress source = 2;
  }
  message BlackBox { BlackBoxOp op = 1; }
  message Trap { HeapVector revert_data = 1; }
  message Stop { HeapVector return_data = 1; }
}

message MemoryAddress {
  oneof value {
    uint64 direct = 1;
    uint64 relative = 2;
  }
}

message ValueOrArray {
  oneof value {
    MemoryAddress memory_address = 1;
    HeapArray heap_array = 2;
    HeapVector heap_vector = 3;
  }
}

message HeapArray {
  MemoryAddress pointer = 1;
  uint64 size = 2;
}

message HeapVector {
  MemoryAddress pointer = 1;
  MemoryAddress size = 2;
}

message HeapValueType {
  oneof value {
    BitSize simple = 1;
    Array array = 2;
    Vector vector = 3;
  }
  message Array {
    repeated HeapValueType value_types = 1;
    uint64 size = 2;
  }
  message Vector { repeated HeapValueType value_types = 1; }
}

enum BinaryFieldOpKind {
  BFO_UNSPECIFIED = 0;
  BFO_ADD = 1;
  BFO_SUB = 2;
  BFO_MUL = 3;
  BFO_DIV = 4;
  BFO_INTEGER_DIV = 5;
  BFO_EQUALS = 6;
  BFO_LESS_THAN = 7;
  BFO_LESS_THAN_EQUALS = 8;
}

enum BinaryIntOpKind {
  BIO_UNSPECIFIED = 0;
  BIO_ADD = 1;
  BIO_SUB = 2;
  BIO_MUL = 3;
  BIO_DIV = 4;
  BIO_EQUALS = 5;
  BIO_LESS_THAN = 6;
  BIO_LESS_THAN_EQUALS = 7;
  BIO_AND = 8;
  BIO_OR = 9;
  BIO_XOR = 10;
  BIO_SHL = 11;
  BIO_SHR = 12;
}

enum IntegerBitSize {
  IBS_UNSPECIFIED = 0;
  IBS_U1 = 1;
  IBS_U8 = 8;
  IBS_U16 = 16;
  IBS_U32 = 32;
  IBS_U64 = 64;
  IBS_U128 = 128;
}

message BitSize {
  oneof value {
    Field field = 1;
    IntegerBitSize integer = 2;
  }
  message Field {}
}

message BlackBoxOp {
  oneof value {
    AES128Encrypt aes128_encrypt = 1;
    Blake2s blake2s = 2;
    Blake3 blake3 = 3;
    Keccakf1600 keccak_f1600 = 4;
    EcdsaSecp256k1 ecdsa_secp256k1 = 5;
    EcdsaSecp256r1 ecdsa_secp256r1 = 6;
    MultiScalarMul multi_scalar_mul = 7;
    EmbeddedCurveAdd embedded_curve_add = 8;
    BigIntAdd big_int_add = 9;
    BigIntSub big_int_sub = 10;
    BigIntMul big_int_mul = 11;
    BigIntDiv big_int_div = 12;
    BigIntFromLeBytes big_int_from_le_bytes = 13;
    BigIntToLeBytes big_int_to_le_bytes = 14;
    Poseidon2Permutation poseidon2_permutation = 15;
    Sha256Compression sha256_compression = 16;
    ToRadix to_radix = 17;
  }
  message AES128Encrypt {
    HeapVector inputs = 1;
    HeapArray iv = 2;
    HeapArray key = 3;
    HeapVector outputs = 4;
  }
  message Blake2s {
    HeapVector message = 1;
    HeapArray output = 2;
  }
  message Blake3 {
    HeapVector message = 1;
    HeapArray output = 2;
  }
  message Keccakf1600 {
    HeapArray input = 1;
    HeapArray output = 2;
  }
  message EcdsaSecp256k1 {
    HeapVector hashed_msg = 1;
    HeapArray public_key_x = 2;
    HeapArray public_key_y = 3;
    HeapArray signature = 4;
    MemoryAddress result = 5;
  }
  message EcdsaSecp256r1 {
    HeapVector hashed_msg = 1;
    HeapArray public_key_x = 2;
    HeapArray public_key_y = 3;
    HeapArray signature = 4;
    MemoryAddress result = 5;
  }

  message MultiScalarMul {
    HeapVector points = 1;
    HeapVector scalars = 2;
    HeapArray outputs = 3;
  }
  message EmbeddedCurveAdd {
    MemoryAddress input1_x = 1;
    MemoryAddress input1_y = 2;
    MemoryAddress input1_infinite = 3;
    MemoryAddress input2_x = 4;
    MemoryAddress input2_y = 5;
    MemoryAddress input2_infinite = 6;
    HeapArray result = 7;
  }
  message BigIntAdd {
    MemoryAddress lhs = 1;
    MemoryAddress rhs = 2;
    MemoryAddress output = 3;
  }
  message BigIntSub {
    MemoryAddress lhs = 1;
    MemoryAddress rhs = 2;
    MemoryAddress output = 3;
  }
  message BigIntMul {
    MemoryAddress lhs = 1;
    MemoryAddress rhs = 2;
    MemoryAddress output = 3;
  }
  message BigIntDiv {
    MemoryAddress lhs = 1;
    MemoryAddress rhs = 2;
    MemoryAddress output = 3;
  }
  message BigIntFromLeBytes {
    HeapVector inputs = 1;
    HeapVector modulus = 2;
    MemoryAddress output = 3;
  }
  message BigIntToLeBytes {
    MemoryAddress input = 1;
    HeapVector output = 2;
  }
  message Poseidon2Permutation {
    HeapVector message = 1;
    HeapArray output = 2;
    MemoryAddress len = 3;
  }
  message Sha256Compression {
    HeapArray input = 1;
    HeapArray hash_values = 2;
    HeapArray output = 3;
  }
  message ToRadix {
    MemoryAddress input = 1;
    MemoryAddress radix = 2;
    MemoryAddress output_pointer = 3;
    MemoryAddress num_limbs = 4;
    MemoryAddress output_bits = 5;
  }
}