use crate::black_box::BlackBoxOp;
use acir_field::FieldElement;
use serde::{Deserialize, Serialize};
pub type Label = usize;
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
pub struct MemoryAddress(pub usize);
impl MemoryAddress {
pub fn to_usize(self) -> usize {
self.0
}
}
impl From<usize> for MemoryAddress {
fn from(value: usize) -> Self {
MemoryAddress(value)
}
}
#[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize)]
pub enum HeapValueType {
Simple(u32),
Array { value_types: Vec<HeapValueType>, size: usize },
Vector { value_types: Vec<HeapValueType> },
}
impl HeapValueType {
pub fn all_simple(types: &[HeapValueType]) -> bool {
types.iter().all(|typ| matches!(typ, HeapValueType::Simple(_)))
}
pub fn field() -> HeapValueType {
HeapValueType::Simple(FieldElement::max_num_bits())
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Copy)]
pub struct HeapArray {
pub pointer: MemoryAddress,
pub size: usize,
}
impl Default for HeapArray {
fn default() -> Self {
Self { pointer: MemoryAddress(0), size: 0 }
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Copy)]
pub struct HeapVector {
pub pointer: MemoryAddress,
pub size: MemoryAddress,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Copy)]
pub enum ValueOrArray {
MemoryAddress(MemoryAddress),
HeapArray(HeapArray),
HeapVector(HeapVector),
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum BrilligOpcode {
BinaryFieldOp {
destination: MemoryAddress,
op: BinaryFieldOp,
lhs: MemoryAddress,
rhs: MemoryAddress,
},
BinaryIntOp {
destination: MemoryAddress,
op: BinaryIntOp,
bit_size: u32,
lhs: MemoryAddress,
rhs: MemoryAddress,
},
Cast {
destination: MemoryAddress,
source: MemoryAddress,
bit_size: u32,
},
JumpIfNot {
condition: MemoryAddress,
location: Label,
},
JumpIf {
condition: MemoryAddress,
location: Label,
},
Jump {
location: Label,
},
CalldataCopy {
destination_address: MemoryAddress,
size: usize,
offset: usize,
},
Call {
location: Label,
},
Const {
destination: MemoryAddress,
bit_size: u32,
value: FieldElement,
},
Return,
ForeignCall {
function: String,
destinations: Vec<ValueOrArray>,
destination_value_types: Vec<HeapValueType>,
inputs: Vec<ValueOrArray>,
input_value_types: Vec<HeapValueType>,
},
Mov {
destination: MemoryAddress,
source: MemoryAddress,
},
ConditionalMov {
destination: MemoryAddress,
source_a: MemoryAddress,
source_b: MemoryAddress,
condition: MemoryAddress,
},
Load {
destination: MemoryAddress,
source_pointer: MemoryAddress,
},
Store {
destination_pointer: MemoryAddress,
source: MemoryAddress,
},
BlackBox(BlackBoxOp),
Trap {
revert_data: HeapArray,
},
Stop {
return_data_offset: usize,
return_data_size: usize,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum BinaryFieldOp {
Add,
Sub,
Mul,
Div,
IntegerDiv,
Equals,
LessThan,
LessThanEquals,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum BinaryIntOp {
Add,
Sub,
Mul,
Div,
Equals,
LessThan,
LessThanEquals,
And,
Or,
Xor,
Shl,
Shr,
}