use super::opcodes::BlockId;
use crate::native_types::{Expression, Witness};
use acir_field::AcirField;
use brillig::Opcode as BrilligOpcode;
use msgpack_tagged::MsgpackTagged;
use serde::{Deserialize, Serialize};
#[derive(Clone, PartialEq, Eq, Debug, Hash)]
#[derive(Serialize, Deserialize, MsgpackTagged)]
#[cfg_attr(feature = "arb", derive(proptest_derive::Arbitrary))]
pub enum BrilligInputs<F> {
#[tag(0)]
Single(Expression<F>),
#[tag(1)]
Array(Vec<Expression<F>>),
#[tag(2)]
MemoryArray(BlockId),
}
impl<F: AcirField> std::fmt::Display for BrilligInputs<F> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
BrilligInputs::Single(expr) => expr.fmt(f),
BrilligInputs::Array(exprs) => {
let joined = exprs.iter().map(|e| format!("{e}")).collect::<Vec<_>>().join(", ");
write!(f, "[{joined}]")
}
BrilligInputs::MemoryArray(block_id) => block_id.fmt(f),
}
}
}
#[derive(Clone, PartialEq, Eq, Debug, Hash)]
#[derive(Serialize, Deserialize, MsgpackTagged)]
#[cfg_attr(feature = "arb", derive(proptest_derive::Arbitrary))]
pub enum BrilligOutputs {
#[tag(0)]
Simple(Witness),
#[tag(1)]
Array(Vec<Witness>),
}
impl std::fmt::Display for BrilligOutputs {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
BrilligOutputs::Simple(witness) => write!(f, "{witness}"),
BrilligOutputs::Array(witnesses) => {
let joined =
witnesses.iter().map(|w| format!("{w}")).collect::<Vec<_>>().join(", ");
write!(f, "[{joined}]")
}
}
}
}
#[derive(Clone, PartialEq, Eq, Default, Debug, Hash)]
#[derive(Serialize, Deserialize, MsgpackTagged)]
#[cfg_attr(feature = "arb", derive(proptest_derive::Arbitrary))]
#[tagged(allow_unknown_tags)]
pub struct BrilligBytecode<F> {
#[serde(default)] #[tag(0)]
pub function_name: String,
#[tag(1)]
pub bytecode: Vec<BrilligOpcode<F>>,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash, Copy, Default, PartialOrd, Ord)]
#[derive(Serialize, Deserialize, MsgpackTagged)]
#[cfg_attr(feature = "arb", derive(proptest_derive::Arbitrary))]
#[serde(transparent)]
pub struct BrilligFunctionId(u32);
impl BrilligFunctionId {
pub const fn new(id: u32) -> Self {
BrilligFunctionId(id)
}
pub fn as_u32(&self) -> u32 {
self.0
}
pub fn as_usize(&self) -> usize {
self.0 as usize
}
}
impl std::fmt::Display for BrilligFunctionId {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.0)
}
}