diff --git a/quil-rs/src/instruction/calibration.rs b/quil-rs/src/instruction/calibration.rs index 88b5f3e0..bed48317 100644 --- a/quil-rs/src/instruction/calibration.rs +++ b/quil-rs/src/instruction/calibration.rs @@ -18,7 +18,7 @@ pub trait CalibrationSignature { fn has_signature(&self, signature: &Self::Signature<'_>) -> bool; } -#[derive(Clone, Debug, Default, PartialEq)] +#[derive(Clone, Debug, Default, PartialEq, Eq, Hash)] pub struct Calibration { pub instructions: Vec, pub modifiers: Vec, @@ -86,7 +86,7 @@ impl CalibrationSignature for Calibration { } } -#[derive(Clone, Debug, PartialEq)] +#[derive(Clone, Debug, PartialEq, Eq, Hash)] pub struct MeasureCalibrationDefinition { pub qubit: Option, pub parameter: String, diff --git a/quil-rs/src/instruction/circuit.rs b/quil-rs/src/instruction/circuit.rs index 90e4ccba..cdc98db7 100644 --- a/quil-rs/src/instruction/circuit.rs +++ b/quil-rs/src/instruction/circuit.rs @@ -2,7 +2,7 @@ use crate::quil::Quil; use super::Instruction; -#[derive(Clone, Debug, PartialEq)] +#[derive(Clone, Debug, Eq, PartialEq, Hash)] pub struct CircuitDefinition { pub name: String, pub parameters: Vec, diff --git a/quil-rs/src/instruction/classical.rs b/quil-rs/src/instruction/classical.rs index f1bd18b4..c2ca9a49 100644 --- a/quil-rs/src/instruction/classical.rs +++ b/quil-rs/src/instruction/classical.rs @@ -2,7 +2,7 @@ use crate::{hash::hash_f64, quil::Quil}; use super::MemoryReference; -#[derive(Clone, Debug, Hash, PartialEq)] +#[derive(Clone, Debug, Eq, Hash, PartialEq)] pub struct Arithmetic { pub operator: ArithmeticOperator, pub destination: ArithmeticOperand, @@ -44,6 +44,8 @@ pub enum ArithmeticOperand { MemoryReference(MemoryReference), } +impl std::cmp::Eq for ArithmeticOperand {} + impl std::hash::Hash for ArithmeticOperand { fn hash(&self, state: &mut H) { match self { @@ -191,7 +193,7 @@ impl Quil for Convert { } } -#[derive(Clone, Debug, Hash, PartialEq)] +#[derive(Clone, Debug, Hash, PartialEq, Eq)] pub struct Move { pub destination: MemoryReference, pub source: ArithmeticOperand, @@ -220,7 +222,7 @@ impl Quil for Move { } } -#[derive(Clone, Debug, Hash, PartialEq)] +#[derive(Clone, Debug, PartialEq, Eq, Hash)] pub struct Exchange { pub left: MemoryReference, pub right: MemoryReference, @@ -246,7 +248,7 @@ impl Exchange { } } -#[derive(Clone, Debug, Hash, PartialEq)] +#[derive(Clone, Debug, Eq, Hash, PartialEq)] pub struct Comparison { pub operator: ComparisonOperator, pub operands: (MemoryReference, MemoryReference, ComparisonOperand), @@ -285,6 +287,8 @@ pub enum ComparisonOperand { MemoryReference(MemoryReference), } +impl std::cmp::Eq for ComparisonOperand {} + impl Quil for ComparisonOperand { fn write( &self, diff --git a/quil-rs/src/instruction/control_flow.rs b/quil-rs/src/instruction/control_flow.rs index 40200f75..d1f7b5fe 100644 --- a/quil-rs/src/instruction/control_flow.rs +++ b/quil-rs/src/instruction/control_flow.rs @@ -108,7 +108,7 @@ impl PartialEq for TargetPlaceholder { } } -#[derive(Clone, Debug, PartialEq, Eq)] +#[derive(Clone, Debug, PartialEq, Eq, Hash)] pub struct Jump { pub target: Target, } @@ -131,7 +131,7 @@ impl Jump { } } -#[derive(Clone, Debug, PartialEq, Eq)] +#[derive(Clone, Debug, PartialEq, Eq, Hash)] pub struct JumpWhen { pub target: Target, pub condition: MemoryReference, @@ -156,7 +156,7 @@ impl Quil for JumpWhen { } } -#[derive(Clone, Debug, PartialEq, Eq)] +#[derive(Clone, Debug, PartialEq, Eq, Hash)] pub struct JumpUnless { pub target: Target, pub condition: MemoryReference, diff --git a/quil-rs/src/instruction/declaration.rs b/quil-rs/src/instruction/declaration.rs index 3b17d723..e8d0e253 100644 --- a/quil-rs/src/instruction/declaration.rs +++ b/quil-rs/src/instruction/declaration.rs @@ -254,7 +254,7 @@ impl Quil for Load { } } -#[derive(Clone, Debug, PartialEq, Hash)] +#[derive(Clone, Debug, PartialEq, Eq, Hash)] pub struct Store { pub destination: String, pub offset: MemoryReference, diff --git a/quil-rs/src/instruction/frame.rs b/quil-rs/src/instruction/frame.rs index e9ced8a2..72e446b3 100644 --- a/quil-rs/src/instruction/frame.rs +++ b/quil-rs/src/instruction/frame.rs @@ -48,6 +48,16 @@ impl FrameDefinition { } } +impl std::hash::Hash for FrameDefinition { + fn hash(&self, state: &mut H) { + self.identifier.hash(state); + for (k, v) in &self.attributes { + k.hash(state); + v.hash(state); + } + } +} + impl Quil for FrameDefinition { fn write( &self, @@ -104,7 +114,7 @@ impl FromStr for FrameIdentifier { } } -#[derive(Clone, Debug, PartialEq, Eq)] +#[derive(Clone, Debug, PartialEq, Eq, Hash)] pub struct Capture { pub blocking: bool, pub frame: FrameIdentifier, @@ -151,7 +161,7 @@ impl Quil for Capture { } } -#[derive(Clone, Debug, PartialEq, Eq)] +#[derive(Clone, Debug, PartialEq, Eq, Hash)] pub struct Pulse { pub blocking: bool, pub frame: FrameIdentifier, diff --git a/quil-rs/src/instruction/mod.rs b/quil-rs/src/instruction/mod.rs index 851b8c6e..38453ccb 100644 --- a/quil-rs/src/instruction/mod.rs +++ b/quil-rs/src/instruction/mod.rs @@ -72,7 +72,7 @@ pub enum ValidationError { GateError(#[from] GateError), } -#[derive(Clone, Debug, PartialEq)] +#[derive(Clone, Debug, PartialEq, Eq, Hash)] pub enum Instruction { Arithmetic(Arithmetic), BinaryLogic(BinaryLogic), diff --git a/quil-rs/src/instruction/waveform.rs b/quil-rs/src/instruction/waveform.rs index 9c85cf4c..5cdf20f0 100644 --- a/quil-rs/src/instruction/waveform.rs +++ b/quil-rs/src/instruction/waveform.rs @@ -93,6 +93,16 @@ impl WaveformInvocation { } } +impl std::hash::Hash for WaveformInvocation { + fn hash(&self, state: &mut H) { + self.name.hash(state); + for (k, v) in &self.parameters { + k.hash(state); + v.hash(state); + } + } +} + impl Quil for WaveformInvocation { fn write( &self,