quantrs2_circuit/scirs2_transpiler_enhanced/
hardware.rs1use crate::routing::CouplingMap;
4use scirs2_core::ndarray::Array2;
5use serde::{Deserialize, Serialize};
6use std::collections::HashMap;
7
8#[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#[derive(Debug, Clone, Serialize, Deserialize)]
22pub struct HardwareSpec {
23 pub name: String,
25
26 pub backend_type: HardwareBackend,
28
29 pub max_qubits: usize,
31
32 pub coupling_map: CouplingMap,
34
35 pub native_gates: NativeGateSet,
37
38 pub gate_errors: HashMap<String, f64>,
40
41 pub coherence_times: HashMap<usize, (f64, f64)>,
43
44 pub gate_durations: HashMap<String, f64>,
46
47 pub readout_fidelity: HashMap<usize, f64>,
49
50 pub crosstalk_matrix: Option<Array2<f64>>,
52
53 pub calibration_timestamp: std::time::SystemTime,
55
56 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#[derive(Debug, Clone, Serialize, Deserialize)]
81pub struct AdvancedHardwareFeatures {
82 pub mid_circuit_measurement: bool,
84
85 pub conditional_operations: bool,
87
88 pub parameterized_gates: bool,
90
91 pub pulse_control: bool,
93
94 pub error_mitigation: ErrorMitigationSupport,
96
97 pub quantum_volume: Option<u64>,
99
100 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#[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#[derive(Debug, Clone, Serialize, Deserialize)]
130pub struct NativeGateSet {
131 pub single_qubit: HashMap<String, GateProperties>,
133
134 pub two_qubit: HashMap<String, GateProperties>,
136
137 pub multi_qubit: HashMap<String, GateProperties>,
139
140 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#[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#[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}