Skip to main content

jeff/reader/
optype.rs

1//! Node operation definitions.
2
3mod 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/// The type of an operation.
21#[derive(Clone, Debug)]
22#[non_exhaustive]
23/// Represents different types of operations.
24pub enum OpType<'a> {
25    /// Operation on a single qubit.
26    QubitOp(QubitOp<'a>),
27    /// Operation on a register of qubits.
28    QubitRegisterOp(QubitRegisterOp),
29    /// Operation involving an integer.
30    IntOp(IntOp),
31    /// Operation involving an array of integers.
32    IntArrayOp(IntArrayOp<'a>),
33    /// Operation involving a floating-point number.
34    FloatOp(FloatOp),
35    /// Operation involving an array of floating-point numbers.
36    FloatArrayOp(FloatArrayOp<'a>),
37    /// Operation for control flow.
38    //
39    // Wrapped in a Box to reduce the size of the enum.
40    ControlFlowOp(Box<ControlFlowOp<'a>>),
41    /// Operation involving a function.
42    FuncOp(FuncOp),
43}
44
45impl<'a> OpType<'a> {
46    /// Create a new operation type from a capnp reader.
47    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}