mod utils;
pub use self::utils::*;
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct Program {
pub decls: Vec<Span<Decl>>,
}
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum Decl {
Include {
file: Span<Symbol>,
},
QReg {
reg: Span<Reg>,
},
CReg {
reg: Span<Reg>,
},
Def {
name: Span<Symbol>,
params: Vec<Span<Symbol>>,
args: Vec<Span<Symbol>>,
body: Option<Vec<Span<Stmt>>>,
},
Stmt(Span<Stmt>),
}
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum Stmt {
U {
theta: Span<Expr>,
phi: Span<Expr>,
lambda: Span<Expr>,
reg: Span<Reg>,
},
CX { copy: Span<Reg>, xor: Span<Reg> },
Measure { from: Span<Reg>, to: Span<Reg> },
Reset { reg: Span<Reg> },
Barrier { regs: Vec<Span<Reg>> },
Gate {
name: Span<Symbol>,
params: Vec<Span<Expr>>,
args: Vec<Span<Reg>>,
},
Conditional {
reg: Span<Reg>,
val: Span<u64>,
then: Span<Stmt>,
},
}
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum Expr {
Pi,
Real(f32),
Int(u64),
Var(Symbol),
Add(Span<Expr>, Span<Expr>),
Sub(Span<Expr>, Span<Expr>),
Mul(Span<Expr>, Span<Expr>),
Div(Span<Expr>, Span<Expr>),
Pow(Span<Expr>, Span<Expr>),
Neg(Span<Expr>),
Sin(Span<Expr>),
Cos(Span<Expr>),
Tan(Span<Expr>),
Exp(Span<Expr>),
Ln(Span<Expr>),
Sqrt(Span<Expr>),
}
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct Reg {
pub name: Symbol,
pub index: Option<u64>,
}
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct Span<T> {
pub span: FileSpan,
pub inner: Box<T>,
}
impl<T> std::ops::Deref for Span<T> {
type Target = T;
fn deref(&self) -> &T {
&*self.inner
}
}