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;
}
}