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}