quil/instruction/
waveform.rs1use 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, ¶meters)?,
93 )))
94 }
95}