use crate::circuit::Parameter;
use crate::compile::knowledge::rule::Condition;
#[derive(Debug, Clone)]
pub struct RuleDef {
pub name: String,
pub match_ops: Vec<GatePattern>,
pub conditions: Vec<Condition>,
pub rewrite_ops: Vec<GatePattern>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum GateSpec {
Standard { gate_name: String },
MultiControlled {
base_gate_name: String,
added_controls: u8,
},
}
impl GateSpec {
pub fn display_name(&self) -> String {
match self {
Self::Standard { gate_name } => gate_name.clone(),
Self::MultiControlled {
base_gate_name,
added_controls,
} => format!("MC{base_gate_name}[{added_controls}]"),
}
}
}
#[derive(Debug, Clone)]
pub struct GatePattern {
pub gate: GateSpec,
pub params: Vec<Parameter>,
pub qubits: Vec<u32>,
}