Skip to main content

quil/instruction/
timing.rs

1use quil_rs::expression::Expression;
2use quil_rs::instruction::{Delay, Fence, Qubit};
3
4use rigetti_pyo3::{
5    impl_hash, impl_repr, py_wrap_data_struct,
6    pyo3::{pymethods, types::PyString, Py, PyResult, Python},
7    PyTryFrom,
8};
9
10use super::PyQubit;
11use crate::impl_pickle_for_instruction;
12use crate::{expression::PyExpression, impl_copy_for_instruction, impl_eq, impl_to_quil};
13
14py_wrap_data_struct! {
15    #[derive(Debug, PartialEq, Eq)]
16    #[pyo3(subclass, module = "quil.instructions")]
17    PyDelay(Delay) as "Delay" {
18        duration: Expression => PyExpression,
19        frame_names: Vec<String> => Vec<Py<PyString>>,
20        qubits: Vec<Qubit> => Vec<PyQubit>
21    }
22}
23impl_repr!(PyDelay);
24impl_to_quil!(PyDelay);
25impl_copy_for_instruction!(PyDelay);
26impl_hash!(PyDelay);
27impl_eq!(PyDelay);
28impl_pickle_for_instruction!(PyDelay);
29
30#[pymethods]
31impl PyDelay {
32    #[new]
33    pub fn new(
34        py: Python<'_>,
35        duration: PyExpression,
36        frame_names: Vec<String>,
37        qubits: Vec<PyQubit>,
38    ) -> PyResult<Self> {
39        Ok(Self(Delay::new(
40            Expression::py_try_from(py, &duration)?,
41            frame_names,
42            Vec::<Qubit>::py_try_from(py, &qubits)?,
43        )))
44    }
45}
46
47py_wrap_data_struct! {
48    #[derive(Debug, PartialEq, Eq)]
49    #[pyo3(subclass, module = "quil.instructions")]
50    PyFence(Fence) as "Fence" {
51        qubits: Vec<Qubit> => Vec<PyQubit>
52    }
53}
54impl_repr!(PyFence);
55impl_to_quil!(PyFence);
56impl_copy_for_instruction!(PyFence);
57impl_hash!(PyFence);
58impl_eq!(PyFence);
59impl_pickle_for_instruction!(PyFence);
60
61#[pymethods]
62impl PyFence {
63    #[new]
64    pub fn new(py: Python<'_>, qubits: Vec<PyQubit>) -> PyResult<Self> {
65        Ok(Self(Fence::new(Vec::<Qubit>::py_try_from(py, &qubits)?)))
66    }
67}