use std::path::Path;
use crate::openqasm::{
parse_openqasm,
semantic_analysis::{GateOperation, Operation},
};
use openqasm_parser::openqasm::{self, BasicOp};
fn main() {
let example_dir = Path::new(file!()).parent().unwrap();
let qasm_path = example_dir.join(Path::new("example.qasm"));
println!("{:?}", qasm_path);
let program = parse_openqasm(&qasm_path).unwrap();
println!("Quantum registers:");
for (name, reg_size) in program.qregs.iter() {
println!(" {}[{}]", name, reg_size);
}
println!("Classical registers:");
for (name, reg_size) in program.cregs.iter() {
println!(" {}[{}]", name, reg_size);
}
println!("Gates:");
for (name, gate) in program.gates.iter() {
println!(
" {} | parameters: {}, arguments: {}",
name, gate.num_arguments, gate.num_targets
);
for op in gate.operations.iter() {
let gate_name = match op {
GateOperation::U(_, _, _, _) => "U".to_string(),
GateOperation::CX(_, _) => "CX".to_string(),
GateOperation::Custom(gate_name, _, _) => gate_name.clone(),
};
println!(" {}", gate_name);
}
}
println!("Operations:");
for (cond, operation) in program.operations.iter() {
print!(" ");
if let Some(cond) = cond {
print!("if({} == {}) ", cond.0, cond.1);
}
match operation {
Operation::U(p1, p2, p3, qbit) => {
println!("U({},{},{}) {}[{}]", p1, p2, p3, qbit.0, qbit.1)
}
Operation::CX(q1, q2) => println!("CX {}[{}], {}[{}]", q1.0, q1.1, q2.0, q2.1),
Operation::Custom(name, ps, qs) => println!("{}({:?}) {:?}", name, ps, qs),
Operation::Measure(q, c) => println!("measure {}[{}] -> {}[{}]", q.0, q.1, c.0, c.1),
Operation::ResetQ(q) => println!("reset {}[{}]", q.0, q.1),
Operation::ResetC(c) => println!("reset {}[{}]", c.0, c.1),
}
}
println!("Basic operations:");
for (cond, operation) in program.get_basic_operations().iter() {
print!(" ");
if let Some(cond) = cond {
print!("if({} == {}) ", cond.0, cond.1);
}
match operation {
BasicOp::U(p1, p2, p3, qbit) => {
println!("U({},{},{}) {}[{}]", p1, p2, p3, qbit.0, qbit.1)
}
BasicOp::CX(q1, q2) => println!("CX {}[{}], {}[{}]", q1.0, q1.1, q2.0, q2.1),
BasicOp::Measure(q, c) => println!("measure {}[{}] -> {}[{}]", q.0, q.1, c.0, c.1),
BasicOp::ResetQ(q) => println!("reset {}[{}]", q.0, q.1),
BasicOp::ResetC(c) => println!("reset {}[{}]", c.0, c.1),
}
}
}