1mod const_val;
4mod control_flow;
5mod float;
6mod int;
7pub mod qubit;
8
9pub use const_val::ConstArray;
10pub use control_flow::{ControlFlowOp, FuncOp, SwitchOp};
11pub use float::{FloatArrayOp, FloatOp};
12pub use int::{IntArrayOp, IntOp};
13pub use qubit::{GateOp, GateOpType, QubitOp, QubitRegisterOp, WellKnownGate};
14
15use crate::jeff_capnp;
16use crate::reader::value::ValueTable;
17
18use super::string_table::StringTable;
19
20#[derive(Clone, Debug)]
22#[non_exhaustive]
23pub enum OpType<'a> {
25 QubitOp(QubitOp<'a>),
27 QubitRegisterOp(QubitRegisterOp),
29 IntOp(IntOp),
31 IntArrayOp(IntArrayOp<'a>),
33 FloatOp(FloatOp),
35 FloatArrayOp(FloatArrayOp<'a>),
37 ControlFlowOp(Box<ControlFlowOp<'a>>),
41 FuncOp(FuncOp),
43}
44
45impl<'a> OpType<'a> {
46 pub(crate) fn read_capnp(
48 op: jeff_capnp::op::instruction::Reader<'a>,
49 strings: StringTable<'a>,
50 values: ValueTable<'a>,
51 ) -> Self {
52 match op.which() {
53 Ok(jeff_capnp::op::instruction::Which::Qubit(qubit_op)) => OpType::QubitOp(
54 QubitOp::read_capnp(qubit_op.expect("Qubit op should be valid"), strings),
55 ),
56 Ok(jeff_capnp::op::instruction::Which::Qureg(qubit_reg_op)) => {
57 OpType::QubitRegisterOp(QubitRegisterOp::read_capnp(
58 qubit_reg_op.expect("Qubit register op should be valid"),
59 ))
60 }
61 Ok(jeff_capnp::op::instruction::Which::Int(int_op)) => {
62 OpType::IntOp(IntOp::read_capnp(int_op.expect("Int op should be valid")))
63 }
64 Ok(jeff_capnp::op::instruction::Which::IntArray(int_array_op)) => OpType::IntArrayOp(
65 IntArrayOp::read_capnp(int_array_op.expect("Int array op should be valid")),
66 ),
67 Ok(jeff_capnp::op::instruction::Which::Float(float_op)) => OpType::FloatOp(
68 FloatOp::read_capnp(float_op.expect("Float op should be valid")),
69 ),
70 Ok(jeff_capnp::op::instruction::Which::FloatArray(float_array_op)) => {
71 OpType::FloatArrayOp(FloatArrayOp::read_capnp(
72 float_array_op.expect("Float array op should be valid"),
73 ))
74 }
75 Ok(jeff_capnp::op::instruction::Which::Scf(control_flow_op)) => {
76 OpType::ControlFlowOp(Box::new(ControlFlowOp::read_capnp(
77 control_flow_op.expect("Control flow op should be valid"),
78 strings,
79 values,
80 )))
81 }
82 Ok(jeff_capnp::op::instruction::Which::Func(func_op)) => OpType::FuncOp(FuncOp {
83 func_idx: func_op.expect("Function should be valid").get_func_call(),
84 }),
85 Err(_) => panic!("Invalid operation type"),
86 }
87 }
88}