-
Notifications
You must be signed in to change notification settings - Fork 208
Expand file tree
/
Copy pathparse_stim.rs
More file actions
89 lines (81 loc) · 2.63 KB
/
Copy pathparse_stim.rs
File metadata and controls
89 lines (81 loc) · 2.63 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
use qsc_stim_parser::parser::{Circuit, Instruction, Item, Pauli, Target, TargetKind, parse};
use std::fs;
use std::io::Write;
fn write_circuit(out: &mut impl Write, circuit: &Circuit) {
writeln!(out, "(circuit").unwrap();
for item in &circuit.items {
write_item(out, item, 1);
}
writeln!(out, ")").unwrap();
}
fn write_item(out: &mut impl Write, item: &Item, indent: usize) {
let pad = " ".repeat(indent);
match item {
Item::Line(line) => {
write!(out, "{pad}(").unwrap();
write_instruction(out, &line.instruction);
writeln!(out, ")").unwrap();
}
Item::Block(block) => {
write!(out, "{pad}(").unwrap();
write_instruction(out, &block.block_instruction);
writeln!(out).unwrap();
for item in &block.items {
write_item(out, item, indent + 1);
}
writeln!(out, "{pad})").unwrap();
}
}
}
fn write_instruction(out: &mut impl Write, instr: &Instruction) {
write!(out, "{}", instr.name).unwrap();
if let Some(tag) = &instr.tag {
write!(out, "[{}]", tag).unwrap();
}
if !instr.args.is_empty() {
for arg in &instr.args {
write!(out, " {}", arg).unwrap();
}
}
for target in &instr.targets {
write!(out, " ").unwrap();
write_target(out, target);
}
}
fn write_target(out: &mut impl Write, target: &Target) {
match &target.kind {
TargetKind::Qubit { negated, value } => {
if *negated {
write!(out, "!").unwrap();
}
write!(out, "{}", value).unwrap();
}
TargetKind::MeasurementRecord { value } => write!(out, "rec[-{}]", value).unwrap(),
TargetKind::SweepBit { value } => write!(out, "sweep[{}]", value).unwrap(),
TargetKind::Pauli {
negated,
pauli,
value,
} => {
if *negated {
write!(out, "!").unwrap();
}
let p = match pauli {
Pauli::X => "X",
Pauli::Y => "Y",
Pauli::Z => "Z",
};
write!(out, "{}{}", p, value).unwrap();
}
TargetKind::Combiner => write!(out, "*").unwrap(),
}
}
fn main() {
let stim_code =
fs::read_to_string("examples/example.stim").expect("Failed to read examples/example.stim");
let circuit = parse(&stim_code);
let mut out =
fs::File::create("examples/parse_output.txt").expect("Failed to create output file");
write_circuit(&mut out, &circuit);
println!("Wrote examples/parse_output.txt");
}