use crate::opbox::OpBox;
use crate::optype::OpType;
use serde::{Deserialize, Serialize};
#[derive(Deserialize, Serialize, Clone, Debug, PartialEq, Eq, Hash)]
pub struct Register(pub String, pub Vec<i64>);
#[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
pub struct CompositeGate {
name: String,
args: Vec<String>,
definition: Box<SerialCircuit>,
}
#[derive(Deserialize, Serialize, Clone, Debug, PartialEq, Eq, Hash)]
pub struct BitRegister {
name: String,
size: u32,
}
#[derive(Deserialize, Serialize, Clone, Debug, PartialEq, Eq, Hash)]
#[serde(transparent)]
pub struct Bitstring {
pub vec: Vec<bool>,
}
#[derive(Deserialize, Serialize, Clone, Debug, PartialEq, Eq, Hash)]
#[serde(transparent)]
pub struct Matrix<T = f32> {
pub data: Vec<Vec<(T, T)>>,
}
#[derive(Deserialize, Serialize, Clone, Debug, PartialEq, Eq, Hash)]
#[serde(untagged)]
pub enum ClassicalExpUnit {
U32(u32),
Register(Register),
BitRegister(BitRegister),
ClassicalExpUnit(ClassicalExp),
}
#[derive(Deserialize, Serialize, Clone, Debug, PartialEq, Eq, Hash)]
pub struct ClassicalExp {
args: Vec<ClassicalExpUnit>,
op: String,
}
#[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
pub struct Conditional {
op: Box<Operation>,
width: u32,
value: u32,
}
#[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
pub struct Operation<P = String> {
#[serde(rename = "type")]
pub op_type: OpType,
#[serde(skip_serializing_if = "Option::is_none")]
pub n_qb: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub params: Option<Vec<P>>,
#[serde(rename = "box")]
#[serde(skip_serializing_if = "Option::is_none")]
pub op_box: Option<OpBox>,
#[serde(skip_serializing_if = "Option::is_none")]
pub signature: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub conditional: Option<Conditional>,
}
#[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
pub struct Command<P = String> {
pub op: Operation<P>,
pub args: Vec<Register>,
#[serde(skip_serializing_if = "Option::is_none")]
pub opgroup: Option<String>,
}
#[derive(Deserialize, Serialize, Clone, Debug, PartialEq, Eq, Hash)]
pub struct Permutation(pub Register, pub Register);
#[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
pub struct SerialCircuit<P = String> {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
pub phase: P,
pub commands: Vec<Command<P>>,
pub qubits: Vec<Register>,
pub bits: Vec<Register>,
pub implicit_permutation: Vec<Permutation>,
}
impl<P> Operation<P> {
pub fn from_optype(op_type: OpType) -> Self {
Self {
op_type,
n_qb: None,
params: None,
op_box: None,
signature: None,
conditional: None,
}
}
}