quantrs2_circuit/scirs2_transpiler_enhanced/
hardware.rs

1//! Hardware specification types for transpiler
2
3use crate::routing::CouplingMap;
4use scirs2_core::ndarray::Array2;
5use serde::{Deserialize, Serialize};
6use std::collections::HashMap;
7
8/// Hardware backend types
9#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
10pub enum HardwareBackend {
11    Superconducting,
12    TrappedIon,
13    Photonic,
14    NeutralAtom,
15    SiliconDots,
16    Topological,
17    Hybrid,
18}
19
20/// Hardware specification with advanced capabilities
21#[derive(Debug, Clone, Serialize, Deserialize)]
22pub struct HardwareSpec {
23    /// Device name/identifier
24    pub name: String,
25
26    /// Hardware backend type
27    pub backend_type: HardwareBackend,
28
29    /// Maximum number of qubits
30    pub max_qubits: usize,
31
32    /// Qubit connectivity topology
33    pub coupling_map: CouplingMap,
34
35    /// Native gate set with fidelities
36    pub native_gates: NativeGateSet,
37
38    /// Gate error rates
39    pub gate_errors: HashMap<String, f64>,
40
41    /// Qubit coherence times (T1, T2)
42    pub coherence_times: HashMap<usize, (f64, f64)>,
43
44    /// Gate durations in nanoseconds
45    pub gate_durations: HashMap<String, f64>,
46
47    /// Readout fidelity per qubit
48    pub readout_fidelity: HashMap<usize, f64>,
49
50    /// Cross-talk parameters
51    pub crosstalk_matrix: Option<Array2<f64>>,
52
53    /// Calibration timestamp
54    pub calibration_timestamp: std::time::SystemTime,
55
56    /// Advanced hardware features
57    pub advanced_features: AdvancedHardwareFeatures,
58}
59
60impl Default for HardwareSpec {
61    fn default() -> Self {
62        Self {
63            name: "Generic Quantum Device".to_string(),
64            backend_type: HardwareBackend::Superconducting,
65            max_qubits: 27,
66            coupling_map: CouplingMap::grid(3, 9),
67            native_gates: NativeGateSet::default(),
68            gate_errors: HashMap::new(),
69            coherence_times: HashMap::new(),
70            gate_durations: HashMap::new(),
71            readout_fidelity: HashMap::new(),
72            crosstalk_matrix: None,
73            calibration_timestamp: std::time::SystemTime::now(),
74            advanced_features: AdvancedHardwareFeatures::default(),
75        }
76    }
77}
78
79/// Advanced hardware features
80#[derive(Debug, Clone, Serialize, Deserialize)]
81pub struct AdvancedHardwareFeatures {
82    /// Support for mid-circuit measurements
83    pub mid_circuit_measurement: bool,
84
85    /// Support for conditional operations
86    pub conditional_operations: bool,
87
88    /// Support for parameterized gates
89    pub parameterized_gates: bool,
90
91    /// Support for pulse-level control
92    pub pulse_control: bool,
93
94    /// Support for error mitigation
95    pub error_mitigation: ErrorMitigationSupport,
96
97    /// Quantum volume
98    pub quantum_volume: Option<u64>,
99
100    /// CLOPS (Circuit Layer Operations Per Second)
101    pub clops: Option<f64>,
102}
103
104impl Default for AdvancedHardwareFeatures {
105    fn default() -> Self {
106        Self {
107            mid_circuit_measurement: false,
108            conditional_operations: false,
109            parameterized_gates: true,
110            pulse_control: false,
111            error_mitigation: ErrorMitigationSupport::default(),
112            quantum_volume: None,
113            clops: None,
114        }
115    }
116}
117
118/// Error mitigation support levels
119#[derive(Debug, Clone, Serialize, Deserialize, Default)]
120pub struct ErrorMitigationSupport {
121    pub zero_noise_extrapolation: bool,
122    pub probabilistic_error_cancellation: bool,
123    pub symmetry_verification: bool,
124    pub virtual_distillation: bool,
125    pub clifford_data_regression: bool,
126}
127
128/// Native gate set with advanced properties
129#[derive(Debug, Clone, Serialize, Deserialize)]
130pub struct NativeGateSet {
131    /// Single-qubit gates with properties
132    pub single_qubit: HashMap<String, GateProperties>,
133
134    /// Two-qubit gates with properties
135    pub two_qubit: HashMap<String, GateProperties>,
136
137    /// Multi-qubit gates with properties
138    pub multi_qubit: HashMap<String, GateProperties>,
139
140    /// Basis gate decompositions
141    pub decompositions: HashMap<String, GateDecomposition>,
142}
143
144impl Default for NativeGateSet {
145    fn default() -> Self {
146        let mut single_qubit = HashMap::new();
147        single_qubit.insert("X".to_string(), GateProperties::default());
148        single_qubit.insert("Y".to_string(), GateProperties::default());
149        single_qubit.insert("Z".to_string(), GateProperties::default());
150        single_qubit.insert("H".to_string(), GateProperties::default());
151        single_qubit.insert("S".to_string(), GateProperties::default());
152        single_qubit.insert("T".to_string(), GateProperties::default());
153
154        let mut two_qubit = HashMap::new();
155        two_qubit.insert("CNOT".to_string(), GateProperties::default());
156        two_qubit.insert("CZ".to_string(), GateProperties::default());
157
158        Self {
159            single_qubit,
160            two_qubit,
161            multi_qubit: HashMap::new(),
162            decompositions: HashMap::new(),
163        }
164    }
165}
166
167/// Gate properties including noise characteristics
168#[derive(Debug, Clone, Serialize, Deserialize)]
169pub struct GateProperties {
170    pub fidelity: f64,
171    pub duration: f64,
172    pub error_rate: f64,
173    pub calibrated: bool,
174    pub pulse_sequence: Option<String>,
175}
176
177impl Default for GateProperties {
178    fn default() -> Self {
179        Self {
180            fidelity: 0.999,
181            duration: 20e-9,
182            error_rate: 0.001,
183            calibrated: true,
184            pulse_sequence: None,
185        }
186    }
187}
188
189/// Gate decomposition rules
190#[derive(Debug, Clone, Serialize, Deserialize)]
191pub struct GateDecomposition {
192    pub target_gate: String,
193    pub decomposition: Vec<DecomposedGate>,
194    pub cost: f64,
195}
196
197#[derive(Debug, Clone, Serialize, Deserialize)]
198pub struct DecomposedGate {
199    pub gate_type: String,
200    pub qubits: Vec<usize>,
201    pub parameters: Vec<f64>,
202}