use crate::builtin::BuiltinKind;
pub type Reg = usize;
pub type StateSlot = usize;
#[cfg(feature = "debug")]
pub type ProbeId = u32;
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum UnOp {
Neg,
Abs,
Sin,
Cos,
Tan,
Sqrt,
Exp,
Ln,
Tanh,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum BinArith {
Add,
Sub,
Mul,
Div,
Rem,
Min,
Max,
}
#[derive(Debug, Clone, PartialEq)]
pub enum Instr {
Const {
dst: Reg,
value: f64,
},
LoadInput {
dst: Reg,
index: usize,
},
ReadState {
dst: Reg,
slot: StateSlot,
},
ReadDelay {
dst: Reg,
line: usize,
},
Un {
dst: Reg,
op: UnOp,
src: Reg,
},
Bin {
dst: Reg,
op: BinArith,
a: Reg,
b: Reg,
},
Move {
dst: Reg,
src: Reg,
},
WriteState {
slot: StateSlot,
src: Reg,
},
WriteDelay {
line: usize,
src: Reg,
},
CallSample {
dst: Reg,
srcs: Vec<Reg>,
instance: usize,
},
CallBlock {
dst: Reg,
srcs: Vec<Reg>,
instance: usize,
},
ReadParam {
dst: Reg,
idx: usize,
},
ReadActorParam {
dst: Reg,
param_idx: usize,
},
#[cfg(feature = "debug")]
ProbePoint {
id: ProbeId,
src: Reg,
dst: Reg,
},
}
#[derive(Debug, Clone, Default, PartialEq)]
pub struct StateLayout {
pub state_slots: usize,
pub delay_lens: Vec<usize>,
pub num_outputs: usize,
}
#[derive(Debug, Clone, PartialEq)]
pub struct BuiltinInstance {
pub name: String,
pub params: Vec<f64>,
pub kind: BuiltinKind,
pub signal_ins: usize,
pub signal_outs: usize,
pub param_bindings: Vec<(usize, usize)>,
}
#[derive(Debug, Clone, PartialEq)]
pub struct ParamDef {
pub name: String,
pub default: f64,
pub min: f64,
pub max: f64,
}
#[derive(Debug, Clone, PartialEq)]
pub struct Ir {
pub instrs: Vec<Instr>,
pub num_regs: usize,
pub output_reg: Reg,
pub num_inputs: usize,
pub num_outputs: usize,
pub state: StateLayout,
pub builtins: Vec<BuiltinInstance>,
pub params: Vec<ParamDef>,
}