Skip to main content

lift_quantum/
dialect.rs

1use crate::gates::QuantumGate;
2use lift_core::dialect::Dialect;
3
4#[derive(Debug)]
5pub struct QuantumDialect;
6
7impl Dialect for QuantumDialect {
8    fn name(&self) -> &str {
9        "quantum"
10    }
11
12    fn verify_op(
13        &self,
14        op_name: &str,
15        num_inputs: usize,
16        _num_results: usize,
17    ) -> Result<(), String> {
18        let full_name = if op_name.starts_with("quantum.") {
19            op_name.to_string()
20        } else {
21            format!("quantum.{}", op_name)
22        };
23
24        match QuantumGate::from_name(&full_name) {
25            Some(gate) => {
26                let expected = gate.num_qubits();
27                if expected > 0 && num_inputs != expected {
28                    return Err(format!(
29                        "{} expects {} qubit(s), got {}",
30                        full_name, expected, num_inputs
31                    ));
32                }
33                Ok(())
34            }
35            None => Err(format!("Unknown quantum operation: {}", full_name)),
36        }
37    }
38}
39
40pub fn register_quantum_dialect(registry: &mut lift_core::dialect::DialectRegistry) {
41    registry.register(Box::new(QuantumDialect));
42}