Skip to main content

quil/instruction/
waveform.rs

1use indexmap::IndexMap;
2
3use quil_rs::{
4    expression::Expression,
5    instruction::{Waveform, WaveformDefinition, WaveformInvocation, WaveformParameters},
6};
7
8use rigetti_pyo3::{
9    impl_hash, impl_repr, py_wrap_data_struct,
10    pyo3::{pymethods, types::PyString, Py, PyResult, Python},
11    PyTryFrom,
12};
13
14use crate::{
15    expression::PyExpression, impl_copy_for_instruction, impl_eq, impl_pickle_for_instruction,
16    impl_to_quil,
17};
18
19py_wrap_data_struct! {
20    #[derive(Debug, PartialEq, Eq)]
21    #[pyo3(subclass)]
22    PyWaveform(Waveform) as "Waveform" {
23        matrix: Vec<Expression> => Vec<PyExpression>,
24        parameters: Vec<String> => Vec<Py<PyString>>
25    }
26}
27impl_repr!(PyWaveform);
28impl_hash!(PyWaveform);
29impl_eq!(PyWaveform);
30
31#[pymethods]
32impl PyWaveform {
33    #[new]
34    pub fn new(
35        py: Python<'_>,
36        matrix: Vec<PyExpression>,
37        parameters: Vec<String>,
38    ) -> PyResult<Self> {
39        Ok(Self(Waveform::new(
40            Vec::<Expression>::py_try_from(py, &matrix)?,
41            parameters,
42        )))
43    }
44}
45
46py_wrap_data_struct! {
47    #[derive(Debug, PartialEq, Eq)]
48    #[pyo3(subclass, module = "quil.instructions")]
49    PyWaveformDefinition(WaveformDefinition) as "WaveformDefinition" {
50        name: String => Py<PyString>,
51        definition: Waveform => PyWaveform
52    }
53}
54impl_repr!(PyWaveformDefinition);
55impl_to_quil!(PyWaveformDefinition);
56impl_copy_for_instruction!(PyWaveformDefinition);
57impl_hash!(PyWaveformDefinition);
58impl_eq!(PyWaveformDefinition);
59impl_pickle_for_instruction!(PyWaveformDefinition);
60
61#[pymethods]
62impl PyWaveformDefinition {
63    #[new]
64    pub fn new(py: Python<'_>, name: String, definition: PyWaveform) -> PyResult<Self> {
65        Ok(Self(WaveformDefinition::new(
66            name,
67            Waveform::py_try_from(py, &definition)?,
68        )))
69    }
70}
71
72pub type PyWaveformParameters = IndexMap<String, PyExpression>;
73
74py_wrap_data_struct! {
75    #[derive(Debug, PartialEq, Eq)]
76    #[pyo3(subclass)]
77    PyWaveformInvocation(WaveformInvocation) as "WaveformInvocation" {
78        name: String => Py<PyString>,
79        parameters: WaveformParameters => PyWaveformParameters
80    }
81}
82impl_repr!(PyWaveformInvocation);
83impl_to_quil!(PyWaveformInvocation);
84impl_eq!(PyWaveformInvocation);
85
86#[pymethods]
87impl PyWaveformInvocation {
88    #[new]
89    pub fn new(py: Python<'_>, name: String, parameters: PyWaveformParameters) -> PyResult<Self> {
90        Ok(Self(WaveformInvocation::new(
91            name,
92            WaveformParameters::py_try_from(py, &parameters)?,
93        )))
94    }
95}