1use crate::{
19 error::KetError,
20 ir::{block::BasicBlock, gate::QuantumGate},
21};
22
23#[cfg(feature = "c_api")]
24pub mod c_api;
25mod decompose;
26pub mod error;
27pub mod execution;
28pub mod ir;
29mod mapping;
30mod matrix;
31pub mod process;
32
33#[cfg(test)]
34mod tests;
35
36pub fn controlled_gate(
42 gate: QuantumGate,
43 control: &[usize],
44 target: usize,
45) -> Result<BasicBlock, KetError> {
46 let mut quantum_code = BasicBlock::new();
47 quantum_code.append_gate(gate, target);
48 quantum_code.control(control)
49}
50
51pub fn swap_gate(a: usize, b: usize) -> Result<BasicBlock, KetError> {
57 let mut quantum_code = BasicBlock::new();
58 quantum_code.append_block(controlled_gate(QuantumGate::PauliX, &[a], b)?, None);
59 quantum_code.append_block(controlled_gate(QuantumGate::PauliX, &[b], a)?, None);
60 quantum_code.append_block(controlled_gate(QuantumGate::PauliX, &[a], b)?, None);
61 Ok(quantum_code)
62}
63
64pub fn compute_action_uncompute_gate<Fc, Fa>(
70 mut compute: Fc,
71 mut action: Fa,
72) -> Result<BasicBlock, KetError>
73where
74 Fc: FnMut(BasicBlock) -> Result<BasicBlock, KetError>,
75 Fa: FnMut(BasicBlock) -> Result<BasicBlock, KetError>,
76{
77 let mut quantum_code = BasicBlock::new();
78
79 let compute = compute(BasicBlock::new())?;
80 let uncompute = compute.inverse();
81
82 let action = action(BasicBlock::new())?;
83
84 quantum_code.append_block(compute, None);
85 quantum_code.append_block(action, None);
86 quantum_code.append_block(uncompute, None);
87
88 Ok(quantum_code)
89}