diff --git a/Cargo.toml b/Cargo.toml index 384b48d..8c02248 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,6 +9,10 @@ build = "build.rs" [dependencies] libc = "0.2" +monostate = "0.1.9" +serde = "1.0.180" +serde-aux = "4.2.0" +serde_json = "1.0.104" [build-dependencies] cc = { version = "1.0", features = ["parallel"] } @@ -16,5 +20,7 @@ pkg-config = "0.3" bindgen = "0.53.1" [dev-dependencies] +pretty_assertions = "1.4.0" quil-rs = "0.19.0" +rstest = "0.18.1" diff --git a/examples/bell_state.rs b/examples/bell_state.rs index bf320e0..18f2c2e 100644 --- a/examples/bell_state.rs +++ b/examples/bell_state.rs @@ -1,3 +1,5 @@ +use std::ffi::CString; + use libquil_sys::{compile_program, get_chip, parse_program, print_program}; const PROGRAM: &str = r#" @@ -9,7 +11,7 @@ CNOT 0 1 "#; fn main() { - let parsed_program = parse_program(PROGRAM.to_string()); + let parsed_program = parse_program(CString::new(PROGRAM).unwrap()); let chip = get_chip(); let compiled_program = compile_program(&parsed_program, &chip); print_program(&compiled_program) diff --git a/src/chip/isa.rs b/src/chip/isa.rs new file mode 100644 index 0000000..174a9e4 --- /dev/null +++ b/src/chip/isa.rs @@ -0,0 +1,304 @@ +//! The supported Instruction Set Architecture for a chip specification + +use serde::{de::Deserializer, Deserialize, Serializer}; + +use std::collections::HashMap; + +#[derive(Debug, serde::Serialize, serde::Deserialize, PartialEq)] +pub struct Isa { + /// The degree-0 (i.e. single qubit) hardware objects and their + /// supported instructions. + #[serde(rename(deserialize = "1Q"))] + #[serde(rename(serialize = "1Q"))] + pub one_q: HashMap>, + /// The degree-1 (i.e. two qubit) hardware objects and their + /// supported instructions. + #[serde(rename(deserialize = "2Q"))] + #[serde(rename(serialize = "2Q"))] + pub two_q: HashMap>, + #[serde(skip_serializing_if = "Option::is_none")] + pub metadata: Option, +} + +#[derive(Debug, serde::Serialize, serde::Deserialize, PartialEq)] +pub struct Metadata {} + +#[derive(Debug, serde::Serialize, serde::Deserialize, PartialEq)] +#[serde(rename(serialize = "1Q"))] +#[serde(rename_all = "lowercase")] +#[serde(untagged)] +pub enum OneQ { + /// The set of supported gates + Gates { gates: Vec }, + /// DEPRECATED. A gateset identifier known to quilc + /// + /// In practice, the only supported identifier here is "Xhalves" + /// and this style of specifying gates in the ISA is deprecated. + Ty { + #[serde(rename(deserialize = "type"))] + #[serde(rename(serialize = "type"))] + ty: String, + }, + /// DEPRECATED. Define gates by their associated specs. + Specs { specs: crate::chip::specs::SpecsMap }, + /// Qubit exists physically but should not be used for computation + Dead { dead: bool }, + /// Use a set of (quilc-specified) default gates + Defaults {}, +} + +#[derive(Debug, serde::Serialize, serde::Deserialize, PartialEq)] +#[serde(rename(serialize = "1Q"))] +#[serde(rename_all = "lowercase")] +#[serde(untagged)] +pub enum TwoQ { + /// The set of supported gates + Gates { gates: Vec }, + /// See documentation for [`OneQ::Ty`]. + Ty { + #[serde(rename(deserialize = "type"))] + #[serde(rename(serialize = "type"))] + ty: Vec, + }, + /// See documentation for [`OneQ::Specs`]. + Specs { specs: crate::chip::specs::SpecsMap }, + /// Qubit exists physically but should not be used for computation + Dead { dead: bool }, + /// Use a set of (quilc-specified) default gates + Defaults {}, +} + +#[derive(Debug, serde::Serialize, serde::Deserialize, PartialEq)] +#[serde(rename = "lowercase")] +#[serde(untagged)] +pub enum Gate { + Measure { + operator: monostate::MustBe!("MEASURE"), + qubit: Qubit, + target: Option, + duration: f64, + fidelity: f64, + }, + Quantum { + operator: String, + parameters: Vec, + arguments: Vec, + duration: f64, + fidelity: f64, + }, +} + +#[derive(Debug, serde::Serialize, serde::Deserialize, PartialEq)] +#[serde(rename_all = "lowercase")] +#[serde(untagged)] +pub enum Qubit { + #[serde(deserialize_with = "deserialize_wildcard")] + #[serde(serialize_with = "serialize_wildcard")] + Wildcard, + Index(usize), +} + +#[derive(Debug, serde::Serialize, serde::Deserialize, PartialEq)] +#[serde(untagged)] +pub enum MeasurementTarget { + #[serde(deserialize_with = "deserialize_wildcard")] + #[serde(serialize_with = "serialize_wildcard")] + Wildcard, + MemoryReference(String), +} + +#[derive(Debug, serde::Serialize, serde::Deserialize, PartialEq)] +#[serde(untagged)] +pub enum Parameter { + #[serde(deserialize_with = "deserialize_wildcard")] + #[serde(serialize_with = "serialize_wildcard")] + Wildcard, + Numeric(f64), +} + +#[derive(Debug, serde::Serialize, serde::Deserialize, PartialEq)] +#[serde(untagged)] +pub enum Argument { + #[serde(deserialize_with = "deserialize_wildcard")] + #[serde(serialize_with = "serialize_wildcard")] + Wildcard, + Index(usize), +} + +fn deserialize_wildcard<'de, D>(deserializer: D) -> Result<(), D::Error> +where + D: Deserializer<'de>, +{ + let buf = String::deserialize(deserializer)?; + if &buf == "_" { + Ok(()) + } else { + Err(serde::de::Error::custom("input does not match wildcard")) + } +} + +fn serialize_wildcard(serializer: S) -> Result +where + S: Serializer, +{ + serializer.serialize_str("_") +} + +#[cfg(test)] +mod test { + use super::*; + use monostate::MustBe; + use serde_json::json; + + #[test] + fn deserialize_oneq() { + struct Test { + input: serde_json::Value, + expected: OneQ, + } + let tests = [ + Test { + input: json!({}), + expected: OneQ::Defaults {}, + }, + Test { + input: json!({"gates": []}), + expected: OneQ::Gates { gates: vec![] }, + }, + ]; + for test in tests { + let actual: OneQ = serde_json::from_value(test.input).unwrap(); + assert_eq!(actual, test.expected); + } + } + + #[test] + fn deserialize_gate() { + struct Test { + input: serde_json::Value, + expected: Gate, + } + let tests = [ + Test { + input: json!({"operator": "MEASURE", "qubit": 42, "target": "ro", "duration": 0.1, "fidelity": 0.9}), + expected: Gate::Measure { + operator: MustBe!("MEASURE"), + qubit: Qubit::Index(42), + target: Some(MeasurementTarget::MemoryReference("ro".to_string())), + duration: 0.1, + fidelity: 0.9, + }, + }, + Test { + input: json!({"operator": "RX", "parameters": [1.5], "arguments": [42], "duration": 0.1, "fidelity": 0.9}), + expected: Gate::Quantum { + operator: "RX".to_string(), + parameters: vec![Parameter::Numeric(1.5)], + arguments: vec![Argument::Index(42)], + duration: 0.1, + fidelity: 0.9, + }, + }, + ]; + + for test in tests { + let actual: Gate = serde_json::from_value(test.input).unwrap(); + assert_eq!(actual, test.expected); + } + } + + #[test] + fn deserialize_qubit() { + struct Test { + input: serde_json::Value, + expected: Qubit, + } + let tests = [ + Test { + input: json!("_"), + expected: Qubit::Wildcard, + }, + Test { + input: json!(42), + expected: Qubit::Index(42), + }, + ]; + + for test in tests { + let actual: Qubit = serde_json::from_value(test.input).unwrap(); + assert_eq!(actual, test.expected); + } + } + + #[test] + fn deserialize_argument() { + struct Test { + input: serde_json::Value, + expected: Argument, + } + + let tests = [ + Test { + input: json!("_"), + expected: Argument::Wildcard, + }, + Test { + input: json!(42), + expected: Argument::Index(42), + }, + ]; + + for test in tests { + let actual: Argument = serde_json::from_value(test.input).unwrap(); + assert_eq!(actual, test.expected); + } + } + + #[test] + fn deserialize_parameter() { + struct Test { + input: serde_json::Value, + expected: Parameter, + } + + let tests = [ + Test { + input: json!("_"), + expected: Parameter::Wildcard, + }, + Test { + input: json!(1.5), + expected: Parameter::Numeric(1.5), + }, + ]; + + for test in tests { + let actual: Parameter = serde_json::from_value(test.input).unwrap(); + assert_eq!(actual, test.expected); + } + } + + #[test] + fn deserialize_measurement_target() { + struct Test { + input: serde_json::Value, + expected: MeasurementTarget, + } + + let tests = [ + Test { + input: json!("_"), + expected: MeasurementTarget::Wildcard, + }, + Test { + input: json!("ro"), + expected: MeasurementTarget::MemoryReference("ro".to_string()), + }, + ]; + + for test in tests { + let actual: MeasurementTarget = serde_json::from_value(test.input).unwrap(); + assert_eq!(actual, test.expected); + } + } +} diff --git a/src/chip/mod.rs b/src/chip/mod.rs new file mode 100644 index 0000000..e36073e --- /dev/null +++ b/src/chip/mod.rs @@ -0,0 +1,45 @@ +//! Quilc-compatible chip specification +use serde::Serializer; +use serde_aux::prelude::deserialize_string_from_number; + +pub mod isa; +mod parity_test; +pub mod specs; + +/// A `ChipSpec` defines the various hardware objects that are available +/// when compiling a quantum program. +#[derive(Debug, serde::Serialize, serde::Deserialize)] +pub struct ChipSpec { + /// The "Instruction Set Architecture" of the chip; i.e. the + /// instructions (or "gates") that a particular hardware object + /// supports. + pub isa: isa::Isa, + /// The various operating characteristics of a hardware object (e.g + /// readout fidelity). + #[serde(skip_serializing_if = "Option::is_none")] + pub specs: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub metadata: Option, +} + +#[derive(Debug, serde::Serialize, serde::Deserialize)] +pub struct Metadata { + pub name: String, + #[serde(skip_serializing_if = "Option::is_none")] + pub timestamp: Option, + #[serde(deserialize_with = "deserialize_string_from_number")] + #[serde(serialize_with = "maybe_serialize_string_to_integer")] + pub version: String, +} + +/// Serialize the input to an `i32` if it can be parsed as such; otherwise +/// serialize it as a string. +fn maybe_serialize_string_to_integer(s: &str, serializer: S) -> Result +where + S: Serializer, +{ + match s.parse::() { + Ok(i) => serializer.serialize_i32(i), + Err(_) => serializer.serialize_str(s), + } +} diff --git a/src/chip/parity_test.rs b/src/chip/parity_test.rs new file mode 100644 index 0000000..4d77b98 --- /dev/null +++ b/src/chip/parity_test.rs @@ -0,0 +1,24 @@ +#[cfg(test)] +mod test { + use pretty_assertions::assert_eq; + use rstest::rstest; + + use std::fs::read_to_string; + use std::path::PathBuf; + + use crate::chip::ChipSpec; + + #[rstest] + fn test_chip_parity(#[files("test-data/*.qpu")] path: PathBuf) { + let original_json_str = read_to_string(&path) + .unwrap_or_else(|_| panic!("Should be able to load file: {:?}", path)); + let original_json_value: serde_json::Value = + serde_json::from_str(&original_json_str).unwrap(); + + let chip: ChipSpec = serde_json::from_str(&original_json_str).unwrap(); + let chip_str = serde_json::to_string(&chip).unwrap(); + let chip_value: serde_json::Value = serde_json::from_str(&chip_str).unwrap(); + + assert_eq!(chip_value, original_json_value); + } +} diff --git a/src/chip/specs.rs b/src/chip/specs.rs new file mode 100644 index 0000000..8bdfb19 --- /dev/null +++ b/src/chip/specs.rs @@ -0,0 +1,19 @@ +//! The instruction characteristics for a chip specification + +use std::collections::HashMap; + +#[derive(Debug, serde::Serialize, serde::Deserialize, PartialEq)] +pub struct Specs { + #[serde(rename(deserialize = "1Q"))] + #[serde(rename(serialize = "1Q"))] + #[serde(skip_serializing_if = "Option::is_none")] + pub one_q: Option>, + #[serde(rename(deserialize = "2Q"))] + #[serde(rename(serialize = "2Q"))] + #[serde(skip_serializing_if = "Option::is_none")] + pub two_q: Option>, +} + +/// Maps a characteristic's name to its value (e.g. `"T1": 1e-5`) +#[derive(Debug, serde::Serialize, serde::Deserialize, PartialEq)] +pub struct SpecsMap(HashMap); diff --git a/src/lib.rs b/src/lib.rs index bb449e4..2c1f227 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2,6 +2,8 @@ #![allow(non_camel_case_types)] #![allow(non_snake_case)] +pub mod chip; + use std::{ ffi::{CStr, CString}, sync::Once, diff --git a/test-data/20q.qpu b/test-data/20q.qpu new file mode 100644 index 0000000..c6cc93a --- /dev/null +++ b/test-data/20q.qpu @@ -0,0 +1,56 @@ +{ + "metadata": { + "name": "20Q chip", + "version": "0.0", + "timestamp": "20171128151400" + }, + "isa": { + "1Q": { + "0": {}, + "1": {}, + "2": {}, + "3": { "dead": true }, + "4": {}, + "5": {}, + "6": {}, + "7": {}, + "8": {}, + "9": {}, + "10": {}, + "11": {}, + "12": {}, + "13": {}, + "14": {}, + "15": {}, + "16": {}, + "17": {}, + "18": {}, + "19": {} + }, + "2Q": { + "0-5": {}, + "0-6": {}, + "1-6": {}, + "1-7": {}, + "2-7": {}, + "2-8": {}, + "3-8": {}, + "3-9": {}, + "4-9": {}, + "5-10": {}, + "6-11": {}, + "7-12": {}, + "8-13": {}, + "9-14": {}, + "10-15": {}, + "10-16": {}, + "11-16": {}, + "11-17": {}, + "12-17": {}, + "12-18": {}, + "13-18": {}, + "13-19": {}, + "14-19": {} + } + } +} diff --git a/test-data/3q.qpu b/test-data/3q.qpu new file mode 100644 index 0000000..0a4f648 --- /dev/null +++ b/test-data/3q.qpu @@ -0,0 +1,113 @@ +{ + "metadata": { + "name": "3Q example chip", + "version": 1, + "timestamp": "" + }, + "isa": { + "1Q": { + "0": { + "gates": [ + { + "operator": "RZ", + "parameters": [], + "arguments": [ + "_" + ], + "duration": 100.0, + "fidelity": 0.99 + }, + { + "operator": "RX", + "parameters": [ + "_" + ], + "arguments": [ + "_" + ], + "duration": 100.0, + "fidelity": 0.9 + } + ] + }, + "1": { + "gates": [ + { + "operator": "RZ", + "parameters": [], + "arguments": [ + "_" + ], + "duration": 100.0, + "fidelity": 0.99 + }, + { + "operator": "RX", + "parameters": [ + "_" + ], + "arguments": [ + "_" + ], + "duration": 100.0, + "fidelity": 0.9 + } + ] + }, + "2": { + "gates": [ + { + "operator": "RZ", + "parameters": [], + "arguments": [ + "_" + ], + "duration": 100.0, + "fidelity": 0.99 + }, + { + "operator": "RX", + "parameters": [ + "_" + ], + "arguments": [ + "_" + ], + "duration": 100.0, + "fidelity": 0.9 + } + ] + } + }, + "2Q": { + "0-1": { + "gates": [ + { + "operator": "CZ", + "parameters": [], + "arguments": [ + "_", + "_" + ], + "fidelity": 0.9, + "duration": 200.0 + } + ] + }, + "1-2": { + "gates": [ + { + "operator": "CZ", + "parameters": [], + "arguments": [ + "_", + "_" + ], + "fidelity": 0.999, + "duration": 200.0 + } + ] + } + } + } +} diff --git a/test-data/Aspen-4.qpu b/test-data/Aspen-4.qpu new file mode 100644 index 0000000..b11b5da --- /dev/null +++ b/test-data/Aspen-4.qpu @@ -0,0 +1,250 @@ +{ + "specs": { + "1Q": { + "10": { + "fActiveReset": 0.9945, + "fRO": 0.9586, + "T1": 1.58306084112603e-05, + "T2": 1.98642571210999e-05, + "f1QRB": 0.81861224883888 + }, + "0": { + "f1QRB": 0.820228743254253, + "T2": 2.61112890923118e-05, + "T1": 2.77597320654799e-05, + "fRO": 0.958, + "fActiveReset": 0.9921 + }, + "15": { + "f1QRB": 0.872599463832036, + "fRO": 0.9614, + "T1": 3.10908337020077e-05, + "fActiveReset": 0.9903, + "T2": 2.20421020440763e-05 + }, + "5": { + "T1": 2.0388768391215e-05, + "fActiveReset": 0.9029, + "T2": 2.30879610715538e-05, + "fRO": 0.9278, + "f1QRB": 0.933037056555542 + }, + "1": { + "T1": 2.29799738113989e-05, + "fActiveReset": 0.9789, + "T2": 1.380915978595e-05, + "f1QRB": 0.98937380562643, + "fRO": 0.9456 + }, + "6": { + "fActiveReset": 0.949, + "fRO": 0.9118, + "f1QRB": 0.98556200582083, + "T1": 1.0818732653019e-05, + "T2": 1.8694488964e-05 + }, + "7": { + "f1QRB": 0.973537134213145, + "T2": 1.9761154876845e-05, + "fRO": 0.931, + "T1": 2.4380020720889e-05, + "fActiveReset": 0.9384 + }, + "11": { + "f1QRB": 0.990774628666494, + "fActiveReset": 0.9799, + "T2": 2.10789607080031e-05, + "fRO": 0.9442, + "T1": 2.57059088619727e-05 + }, + "14": { + "fActiveReset": 0.9969, + "T2": 2.81267271475256e-05, + "fRO": 0.97, + "T1": 1.9908404362878e-05, + "f1QRB": -1.0 + }, + "9": { + "T1": 7.69696612626e-05, + "fRO": 0.939, + "f1QRB": 0.99957638620331, + "fActiveReset": 0.9423, + "T2": 3.0970130106722e-05 + }, + "2": { + "fRO": 0.964, + "f1QRB": 0.957122289366566, + "T1": 3.320550985908e-05, + "T2": 2.60362399544697e-05, + "fActiveReset": 0.9835 + }, + "13": { + "fActiveReset": 0.979, + "fRO": 0.9572, + "f1QRB": 0.99697095468577, + "T2": 1.92488875820812e-05, + "T1": 5.76902583264705e-05 + }, + "12": { + "fRO": 0.9452, + "fActiveReset": 0.9925, + "T1": 1.04239746880896e-05, + "T2": 1.36260411475448e-05, + "f1QRB": 0.932605084811073 + }, + "8": { + "T1": 2.6294975419634e-06, + "fRO": 0.9252, + "f1QRB": 0.9749022312993, + "fActiveReset": 0.933, + "T2": 2.99209929246669e-06 + }, + "4": { + "fRO": 0.984, + "T1": 5.37e-06, + "f1QRB": 0.933334597513405, + "fActiveReset": 0.8565 + }, + "3": { + "fActiveReset": 0.899, + "f1QRB": 0.91844319029471, + "fRO": 0.9148, + "T1": 1.955e-05 + } + }, + "2Q": { + "1-2": { + "fCZ": 0.95515473532973, + "fCZ_std_err": 0.0086325291288572, + "fBellState": 0.96809988657793 + }, + "0-7": { + "fCZ_std_err": 0.00437692569292231, + "fCZ": 0.98365568292676, + "fBellState": 0.949215481246391 + }, + "1-8": { + "fCZ": 0.628590904701973, + "fCZ_std_err": 0.013933182128604, + "fBellState": 0.62508930871531 + }, + "15-8": { + "fCZ_std_err": 0.00666638847495303, + "fCZ": 0.89791941404186, + "fBellState": 0.949799361208301 + }, + "3-4": { + "fCZ_std_err": 0.00312638887590677, + "fCZ": 0.921842504611078, + "fBellState": 0.91 + }, + "8-9": { + "fBellState": 0.787566847939079, + "fCZ": 0.91342865271875, + "fCZ_std_err": 0.00734521935809519 + }, + "4-5": { + "fBellState": 0.91 + }, + "14-15": { + "fCZ_std_err": 0.00196637710788285, + "fCZ": 0.966471909533911, + "fBellState": 0.968142186072194 + }, + "12-13": { + "fCZ_std_err": 0.00282103711390013, + "fCZ": 0.94303984708507, + "fBellState": 0.951385223441215 + }, + "2-3": { + "fCZ_std_err": 0.0024985681287, + "fCZ": 0.949328431841218, + "fBellState": 0.94 + }, + "2-15": { + "fCZ": 0.945213104276156, + "fCZ_std_err": 0.00322656685582057, + "fBellState": 0.986389854908411 + }, + "10-11": { + "fBellState": 0.970562108244728, + "fCZ": 0.93150333463791, + "fCZ_std_err": 0.0052869153965473 + }, + "5-6": { + "fBellState": 0.951875466600042, + "fCZ_std_err": 0.0110724132765306, + "fCZ": 0.888365400597756 + }, + "10-9": { + "fCZ": 0.953595975720279, + "fCZ_std_err": 0.00432150037527724, + "fBellState": 0.944636677795382 + }, + "6-7": { + "fBellState": 0.92822428971039, + "fCZ": 0.930586878504842, + "fCZ_std_err": 0.0040375703987723 + }, + "11-12": { + "fCZ_std_err": 0.0152904327858643, + "fBellState": 0.933604635469676, + "fCZ": 0.873671198533355 + }, + "13-14": { + "fCZ_std_err": 0.00185679273685527, + "fCZ": 0.961078240531344, + "fBellState": 0.84802918198037 + }, + "0-1": { + "fCZ": 0.752794483842745, + "fCZ_std_err": 0.0367243068455291, + "fBellState": 0.878434903780401 + } + } + }, + "isa": { + "1Q": { + "0": null, + "1": null, + "2": null, + "3": null, + "4": null, + "5": null, + "6": null, + "7": null, + "10": null, + "11": null, + "12": null, + "13": null, + "14": null, + "15": null, + "8": null, + "9": null + }, + "2Q": { + "0-1": null, + "0-7": null, + "1-2": null, + "2-3": null, + "3-4": null, + "4-5": { + "dead": true + }, + "5-6": null, + "6-7": null, + "1-8": { + "dead": true + }, + "2-15": null, + "10-11": null, + "10-9": null, + "11-12": null, + "12-13": null, + "13-14": null, + "14-15": null, + "15-8": null, + "8-9": null + } + } +} diff --git a/test-data/Aspen-7-28Q-A.qpu b/test-data/Aspen-7-28Q-A.qpu new file mode 100644 index 0000000..9269c58 --- /dev/null +++ b/test-data/Aspen-7-28Q-A.qpu @@ -0,0 +1,578 @@ +{ + "isa": { + "1Q": { + "0": { + "specs": { + "f1QRB_std_err": 0.00017293705604970455, + "T1": 4.303134574001888e-06, + "f1Q_simultaneous_RB": 0.9891284704208374, + "fRO": 0.9545000195503235, + "T2": 4.814612111658789e-06, + "f1QRB": 0.9984564185142517, + "fActiveReset": 0.9919999837875366, + "f1Q_simultaneous_RB_std_err": 0.0007981716771610081 + } + }, + "1": { + "specs": { + "f1QRB_std_err": 0.008104498498141766, + "T2": 3.767537418752909e-05, + "f1Q_simultaneous_RB_std_err": 0.0013491149293258786, + "fRO": 0.9829999804496765, + "f1QRB": 0.9729315042495728, + "f1Q_simultaneous_RB": 0.9876306653022766, + "T1": 6.457432027673349e-05, + "fActiveReset": 0.9890000224113464 + } + }, + "5": { + "specs": { + "f1Q_simultaneous_RB": 0.9909182786941528, + "T1": 2.499999936844688e-05, + "fRO": 0.9574999809265137, + "f1QRB_std_err": 0.010579530149698257, + "f1Q_simultaneous_RB_std_err": 0.0012568312231451273, + "T2": 4.8999998398358e-05, + "fActiveReset": 0.925000011920929, + "f1QRB": 0.9934272766113281 + } + }, + "6": { + "specs": { + "f1Q_simultaneous_RB_std_err": 0.0004653523792512715, + "T1": 1.691097168077249e-05, + "fRO": 0.9692500233650208, + "T2": 1.7442289390601218e-05, + "f1QRB_std_err": 0.001186952693387866, + "f1QRB": 0.992946445941925, + "f1Q_simultaneous_RB": 0.9925691485404968, + "fActiveReset": 0.8309999704360962 + } + }, + "7": { + "specs": { + "f1Q_simultaneous_RB_std_err": 0.0005568271153606474, + "f1Q_simultaneous_RB": 0.9906692504882812, + "fActiveReset": 0.9929999709129333, + "fRO": 0.9712499976158142, + "T2": 2.1564745111390948e-05, + "T1": 7.195195939857513e-05, + "f1QRB": 0.9972391724586487, + "f1QRB_std_err": 0.001212355331517756 + } + }, + "10": { + "specs": { + "f1QRB": 0.9995704889297485, + "T1": 2.9000000722589903e-05, + "f1QRB_std_err": 0.00054019910749048, + "T2": 2.700000004551839e-05, + "fActiveReset": 0.8889999985694885, + "fRO": 0.9409999847412109, + "f1Q_simultaneous_RB_std_err": 0.0006452348898164928, + "f1Q_simultaneous_RB": 0.9927878379821777 + } + }, + "11": { + "specs": { + "T2": 6.925736670382321e-05, + "T1": 5.298564792610705e-05, + "f1QRB_std_err": 0.0004603546403814107, + "f1Q_simultaneous_RB": 0.9956566095352173, + "fActiveReset": 0.996999979019165, + "f1QRB": 0.999216616153717, + "fRO": 0.9587500095367432, + "f1Q_simultaneous_RB_std_err": 0.00015340722166001797 + } + }, + "12": { + "specs": { + "f1QRB_std_err": 0.00015002948930487037, + "fRO": 0.8917499780654907, + "f1QRB": 0.9965479373931885, + "f1Q_simultaneous_RB": 0.9713965058326721, + "T1": 1.6723568478482775e-05, + "fActiveReset": 0.8669999837875366, + "T2": 1.2749967481795466e-06, + "f1Q_simultaneous_RB_std_err": 0.003483626525849104 + } + }, + "13": { + "specs": { + "f1QRB": 0.9997091293334961, + "f1Q_simultaneous_RB": 0.994899570941925, + "fRO": 0.9822499752044678, + "T1": 0.0008960311533883214, + "fActiveReset": 0.9990000128746033, + "f1Q_simultaneous_RB_std_err": 0.0004963726969435811, + "f1QRB_std_err": 0.0004095011099707335, + "T2": 4.2634710553102195e-05 + } + }, + "14": { + "specs": { + "f1QRB_std_err": 0.0006169663392938673, + "fActiveReset": 0.9919999837875366, + "f1Q_simultaneous_RB_std_err": 0.00020534616487566382, + "fRO": 0.9872499704360962, + "T2": 3.397206455701962e-05, + "f1QRB": 0.9995741844177246, + "T1": 4.167371298535727e-05, + "f1Q_simultaneous_RB": 0.9923243522644043 + } + }, + "15": { + "specs": { + "fActiveReset": 0.9580000042915344, + "T2": 5.880874959984794e-05, + "f1Q_simultaneous_RB_std_err": 0.0003008772328030318, + "f1QRB": 0.9968372583389282, + "f1Q_simultaneous_RB": 0.9944638013839722, + "fRO": 0.9760000109672546, + "T1": 6.636710895691067e-05, + "f1QRB_std_err": 0.0009492466924712062 + } + }, + "16": { + "specs": { + "f1Q_simultaneous_RB": 0.9855334758758545, + "fRO": 0.9392499923706055, + "f1Q_simultaneous_RB_std_err": 0.0006891388329677284, + "fActiveReset": 0.9940000176429749, + "f1QRB_std_err": 8.721793710719794e-05, + "f1QRB": 0.9981460571289062, + "T2": 2.6382494979770854e-05, + "T1": 1.8109385564457625e-05 + } + }, + "17": { + "specs": { + "f1Q_simultaneous_RB": 0.9948552250862122, + "f1QRB": 0.9938061833381653, + "T1": 0.0001260426070075482, + "T2": 1.9772949599428102e-05, + "f1QRB_std_err": 0.003601371543481946, + "f1Q_simultaneous_RB_std_err": 0.00017731459229253232, + "fRO": 0.9517499804496765, + "fActiveReset": 0.9959999918937683 + } + }, + "20": { + "specs": { + "fRO": 0.8097500205039978, + "T2": 5.850764864590019e-05, + "T1": 4.1986757423728704e-05, + "f1Q_simultaneous_RB_std_err": 0.0005056256195530295, + "fActiveReset": 0.9940000176429749, + "f1QRB_std_err": 0.00011440563685027882, + "f1QRB": 0.9980928301811218, + "f1Q_simultaneous_RB": 0.9919517636299133 + } + }, + "21": { + "specs": { + "f1QRB": 0.9967696070671082, + "f1Q_simultaneous_RB": 0.9785649180412292, + "T2": 4.280114080756903e-05, + "f1QRB_std_err": 0.0014486154541373253, + "fActiveReset": 0.9980000257492065, + "T1": 8.984797750599682e-05, + "fRO": 0.9727500081062317, + "f1Q_simultaneous_RB_std_err": 0.00393654452636838 + } + }, + "22": { + "specs": { + "fActiveReset": 0.9319999814033508, + "f1Q_simultaneous_RB_std_err": 0.025616813451051712, + "f1QRB_std_err": 0.00030721971415914595, + "f1Q_simultaneous_RB": 0.8980239629745483, + "f1QRB": 0.9960773587226868, + "T1": 5.967024662822951e-06, + "T2": 1.2841931493312586e-05, + "fRO": 0.9104999899864197 + } + }, + "23": { + "specs": { + "f1Q_simultaneous_RB_std_err": 0.00017698538431432098, + "f1Q_simultaneous_RB": 0.9954554438591003, + "f1QRB_std_err": 0.0004973316681571305, + "f1QRB": 0.9994686245918274, + "T2": 3.7999998312443495e-05, + "T1": 4.999999873689376e-05, + "fActiveReset": 0.972000002861023, + "fRO": 0.9470000267028809 + } + }, + "24": { + "specs": { + "fActiveReset": 0.9959999918937683, + "T2": 3.5000000934815034e-05, + "f1QRB": 0.9983113408088684, + "f1Q_simultaneous_RB_std_err": 0.0013095069443807006, + "f1QRB_std_err": 0.00017894002667162567, + "T1": 3.099999958067201e-05, + "f1Q_simultaneous_RB": 0.9887388348579407, + "fRO": 0.9462500214576721 + } + }, + "25": { + "specs": { + "fRO": 0.8697500228881836, + "f1Q_simultaneous_RB_std_err": 0.00043908972293138504, + "fActiveReset": 0.9549999833106995, + "f1QRB_std_err": 0.004365012515336275, + "T1": 6.452186789829284e-05, + "f1Q_simultaneous_RB": 0.9926782846450806, + "T2": 3.827656473731622e-05, + "f1QRB": 0.997951090335846 + } + }, + "27": { + "specs": { + "fRO": 0.9624999761581421, + "f1Q_simultaneous_RB": 0.9920800924301147, + "f1QRB": 0.9729942083358765, + "T1": 8.096126839518547e-05, + "f1QRB_std_err": 0.025966830551624298, + "T2": 1.6546848200960085e-05, + "f1Q_simultaneous_RB_std_err": 0.0009220769861713052, + "fActiveReset": 0.9850000143051147 + } + }, + "30": { + "specs": { + "f1Q_simultaneous_RB": 0.9581360220909119, + "fRO": 0.9639999866485596, + "f1Q_simultaneous_RB_std_err": 0.006433825008571148, + "f1QRB_std_err": 0.00012821592099498957, + "T1": 1.0813296285050455e-05, + "fActiveReset": 0.9959999918937683, + "T2": 2.288095492986031e-05, + "f1QRB": 0.9985546469688416 + } + }, + "31": { + "specs": { + "f1QRB_std_err": 0.00024069106439128518, + "fRO": 0.9869999885559082, + "f1Q_simultaneous_RB": 0.9928122162818909, + "f1Q_simultaneous_RB_std_err": 0.0004501989169511944, + "T2": 1.9325532775837928e-05, + "f1QRB": 0.9990898370742798, + "fActiveReset": 0.9990000128746033, + "T1": 8.986359898699448e-05 + } + }, + "32": { + "specs": { + "T1": 3.572835703380406e-05, + "fRO": 0.9259999990463257, + "f1QRB": 0.9979234933853149, + "T2": 3.4272150514880195e-05, + "fActiveReset": 0.9819999933242798, + "f1QRB_std_err": 0.0004013077705167234, + "f1Q_simultaneous_RB": 0.98907470703125, + "f1Q_simultaneous_RB_std_err": 0.000757723581045866 + } + }, + "33": { + "specs": { + "T1": 3.7401317968033254e-05, + "f1QRB_std_err": 0.0006021274602971971, + "f1Q_simultaneous_RB_std_err": 0.00035745915374718606, + "fActiveReset": 0.9929999709129333, + "T2": 2.7414507712819614e-05, + "f1QRB": 0.9989618062973022, + "f1Q_simultaneous_RB": 0.9921919703483582, + "fRO": 0.9745000004768372 + } + }, + "34": { + "specs": { + "fRO": 0.9502500295639038, + "f1Q_simultaneous_RB_std_err": 0.01831982284784317, + "f1QRB_std_err": 0.001641633571125567, + "fActiveReset": 0.9120000004768372, + "T2": 2.0129684344283305e-05, + "T1": 2.0460782252484933e-05, + "f1Q_simultaneous_RB": 0.9512971043586731, + "f1QRB": 0.9824779629707336 + } + }, + "35": { + "specs": { + "f1QRB_std_err": 0.00018664775416254997, + "fRO": 0.965749979019165, + "f1Q_simultaneous_RB_std_err": 0.0003006975748576224, + "T2": 3.3332926250295714e-05, + "f1Q_simultaneous_RB": 0.9932937622070312, + "f1QRB": 0.997628927230835, + "fActiveReset": 0.9929999709129333, + "T1": 3.284743434051052e-05 + } + }, + "36": { + "specs": { + "f1QRB": 0.9993141293525696, + "T1": 2.9687085771001875e-05, + "fActiveReset": 0.9919999837875366, + "f1Q_simultaneous_RB_std_err": 0.005356132984161377, + "f1Q_simultaneous_RB": 0.9201109409332275, + "f1QRB_std_err": 0.00017333024879917502, + "T2": 3.100156754953787e-05, + "fRO": 0.9767500162124634 + } + }, + "37": { + "specs": { + "f1QRB": 0.9970703125, + "f1Q_simultaneous_RB_std_err": 0.0007372662075795233, + "f1Q_simultaneous_RB": 0.9936832785606384, + "f1QRB_std_err": 0.0006339017418213189, + "T2": 5.444081762107089e-05, + "fRO": 0.9437500238418579, + "T1": 5.433543265098706e-05, + "fActiveReset": 0.9860000014305115 + } + } + }, + "2Q": { + "0-1": { + "specs": { + "fBellState": 0.42047303915023804, + "fCPHASE": 0.899399995803833, + "fCZ_std_err": 0.013909337110817432, + "fCZ": 0.8409780263900757 + } + }, + "0-7": { + "specs": { + "fBellState": 0.942411482334137, + "fCZ": 0.6438387036323547, + "fCPHASE": 0.652400016784668, + "fCZ_std_err": 0.029197582975029945 + } + }, + "5-6": { + "specs": { + "fCZ_std_err": 0.00829287152737379, + "fCPHASE": 0.7042999863624573, + "fCZ": 0.8902860283851624 + } + }, + "6-7": { + "specs": { + "fCPHASE": 0.8446000218391418, + "fCZ_std_err": 0.004814140498638153, + "fCZ": 0.9170880317687988, + "fBellState": 0.9295480847358704 + } + }, + "1-16": { + "specs": { + "fCZ_std_err": 0.012260755524039268, + "fCZ": 0.8164995908737183, + "fCPHASE": 0.7736999988555908, + "fBellState": 0.7176288962364197 + } + }, + "10-11": { + "specs": { + "fCPHASE": 0.9056000113487244, + "fCZ": 0.8731399774551392, + "fCZ_std_err": 0.009703322313725948 + } + }, + "10-17": { + "specs": { + "fCPHASE": 0.8216000199317932, + "fCZ_std_err": 0.010558712296187878, + "fCZ": 0.8816609978675842 + } + }, + "11-12": { + "specs": { + "fCZ": 0.896695077419281, + "fCPHASE": 0.6790000200271606, + "fCZ_std_err": 0.005688800942152739, + "fBellState": 0.9771144390106201 + } + }, + "12-13": { + "specs": { + "fCZ_std_err": 0.009040680713951588, + "fCZ": 0.8745826482772827, + "fCPHASE": 0.8950999975204468, + "fBellState": 0.9498032927513123 + } + }, + "12-25": { + "specs": { + "fBellState": 0.9142881631851196, + "fCPHASE": 0.7953000068664551, + "fCZ_std_err": 0.01764097809791565, + "fCZ": 0.7479802966117859 + } + }, + "13-14": { + "specs": { + "fBellState": 0.9535382390022278, + "fCZ_std_err": 0.004319460596889257, + "fCZ": 0.9254260659217834, + "fCPHASE": 0.6747000217437744 + } + }, + "14-15": { + "specs": { + "fCPHASE": 0.703499972820282, + "fBellState": 0.9800226092338562, + "fCZ": 0.9515792727470398, + "fCZ_std_err": 0.0024839111138135195 + } + }, + "15-16": { + "specs": { + "fCZ_std_err": 0.006297020241618156, + "fCPHASE": 0.8949000239372253, + "fBellState": 0.9352887868881226, + "fCZ": 0.9015080332756042 + } + }, + "16-17": { + "specs": { + "fCZ": 0.8222299218177795, + "fCPHASE": 0.713699996471405, + "fCZ_std_err": 0.011470090597867966, + "fBellState": 0.9454673528671265 + } + }, + "20-21": { + "specs": { + "fCZ": 0.8778629899024963, + "fCPHASE": 0.6859999895095825, + "fBellState": 0.935571014881134, + "fCZ_std_err": 0.008923460729420185 + } + }, + "20-27": { + "specs": { + "fCZ": 0.8574368357658386, + "fBellState": 0.9238875508308411, + "fCZ_std_err": 0.008997174911201, + "fCPHASE": 0.9340000152587891 + } + }, + "21-22": { + "specs": { + "fCZ_std_err": 0.010875231586396694, + "fCZ": 0.8350030779838562, + "fCPHASE": 0.9090999960899353, + "fBellState": 0.8095899820327759 + } + }, + "21-36": { + "specs": { + "fCZ": 0.8052946925163269, + "fBellState": 0.9865819811820984, + "fCPHASE": 0.815500020980835, + "fCZ_std_err": 0.017439676448702812 + } + }, + "22-23": { + "specs": { + "fCZ_std_err": 0.005692315753549337, + "fCPHASE": 0.690500020980835, + "fCZ": 0.8718615770339966 + } + }, + "22-35": { + "specs": { + "fCZ": 0.7546185255050659, + "fBellState": 0.4178013801574707, + "fCZ_std_err": 0.011613179929554462, + "fCPHASE": 0.7767000198364258 + } + }, + "23-24": { + "specs": { + "fCZ_std_err": 0.011188975535333157, + "fCZ": 0.7710665464401245, + "fCPHASE": 0.7019000053405762 + } + }, + "24-25": { + "specs": { + "fCZ": 0.8543276786804199, + "fCZ_std_err": 0.010292734950780869, + "fCPHASE": 0.7975999712944031 + } + }, + "30-31": { + "specs": { + "fCPHASE": 0.840499997138977, + "fCZ": 0.8755079507827759, + "fCZ_std_err": 0.005701713263988495, + "fBellState": 0.9069663882255554 + } + }, + "30-37": { + "specs": { + "fCZ_std_err": 0.006837419234216213, + "fCZ": 0.8720165491104126, + "fCPHASE": 0.7662000060081482, + "fBellState": 0.7278831005096436 + } + }, + "31-32": { + "specs": { + "fCZ_std_err": 0.005006214138120413, + "fCPHASE": 0.933899998664856, + "fBellState": 0.9770496487617493, + "fCZ": 0.9367471933364868 + } + }, + "32-33": { + "specs": { + "fCZ": 0.8582153916358948, + "fBellState": 0.7848339676856995, + "fCPHASE": 0.9114000201225281, + "fCZ_std_err": 0.010932709090411663 + } + }, + "33-34": { + "specs": { + "fCPHASE": 0.7398999929428101, + "fCZ": 0.8002843856811523, + "fCZ_std_err": 0.011797989718616009, + "fBellState": 0.9541736245155334 + } + }, + "34-35": { + "specs": { + "fBellState": 0.5509632229804993, + "fCZ": 0.7192884683609009, + "fCPHASE": 0.9316999912261963, + "fCZ_std_err": 0.02030104212462902 + } + }, + "35-36": { + "specs": { + "fCZ": 0.8503063321113586, + "fCPHASE": 0.84579998254776, + "fBellState": 0.68243008852005, + "fCZ_std_err": 0.011737599037587643 + } + }, + "36-37": { + "specs": { + "fCZ_std_err": 0.013592788018286228, + "fCZ": 0.8354878425598145, + "fBellState": 0.5008354187011719, + "fCPHASE": 0.8388000130653381 + } + } + } + } +} diff --git a/test-data/arch.qpu b/test-data/arch.qpu new file mode 100644 index 0000000..268b378 --- /dev/null +++ b/test-data/arch.qpu @@ -0,0 +1,31 @@ +{ + "metadata": { + "name": "Mixed architecture chip", + "version": "0.0", + "timestamp": "20180104103600" + }, + "isa": { + "1Q": { + "0": { "type": "Xhalves" }, + "1": {}, + "2": {} + }, + "2Q": { + "0-1": { "type": ["CZ"] }, + "1-2": { "type": ["ISWAP"] }, + "0-2": { "type": ["CPHASE"] } + } + }, + "specs": { + "1Q": { + "0": { "f1QRB": 0.9 }, + "1": { "f1QRB": 0.8 }, + "2": { "f1QRB": 0.85 } + }, + "2Q": { + "0-1": { "fBellState": 0.6 }, + "1-2": { "fBellState": 0.5 }, + "0-2": { "fBellState": 0.3 } + } + } +} diff --git a/test-data/readout-a.qpu b/test-data/readout-a.qpu new file mode 100644 index 0000000..f57443d --- /dev/null +++ b/test-data/readout-a.qpu @@ -0,0 +1,179 @@ +{ + "isa": { + "1Q": { + "0": { + "gates": [ + { + "operator": "MEASURE", + "qubit": 0, + "target": "_", + "duration": 2000.0, + "fidelity": 0.999 + }, + { + "operator": "MEASURE", + "qubit": 0, + "target": null, + "duration": 2000.0, + "fidelity": 0.0009 + }, + { + "operator": "RZ", + "parameters": [ + "_" + ], + "arguments": [ + 0 + ], + "fidelity": 0.99, + "duration": 0.01 + }, + { + "operator": "RX", + "parameters": [ + 0.0 + ], + "arguments": [ + 0 + ], + "fidelity": 1.0, + "duration": 50.0 + }, + { + "operator": "RX", + "parameters": [ + 3.141592653589793 + ], + "arguments": [ + 0 + ], + "fidelity": 0.995048041389577, + "duration": 50.0 + }, + { + "operator": "RX", + "parameters": [ + -3.141592653589793 + ], + "arguments": [ + 0 + ], + "fidelity": 0.995048041389577, + "duration": 50.0 + }, + { + "operator": "RX", + "parameters": [ + 1.5707963267948966 + ], + "arguments": [ + 0 + ], + "fidelity": 0.995048041389577, + "duration": 50.0 + }, + { + "operator": "RX", + "parameters": [ + -1.5707963267948966 + ], + "arguments": [ + 0 + ], + "fidelity": 0.995048041389577, + "duration": 50.0 + } + ] + }, + "1": { + "gates": [ + { + "operator": "MEASURE", + "qubit": 1, + "target": "_", + "duration": 2000.0, + "fidelity": 0.09 + }, + { + "operator": "MEASURE", + "qubit": 1, + "target": null, + "duration": 2000.0, + "fidelity": 0.09 + }, + { + "operator": "RZ", + "parameters": [ + "_" + ], + "arguments": [ + 1 + ], + "fidelity": 0.999, + "duration": 0.01 + }, + { + "operator": "RX", + "parameters": [ + 0.0 + ], + "arguments": [ + 1 + ], + "fidelity": 1.0, + "duration": 50.0 + }, + { + "operator": "RX", + "parameters": [ + 3.141592653589793 + ], + "arguments": [ + 1 + ], + "fidelity": 0.999592016493133, + "duration": 50.0 + }, + { + "operator": "RX", + "parameters": [ + -3.141592653589793 + ], + "arguments": [ + 1 + ], + "fidelity": 0.999592016493133, + "duration": 50.0 + }, + { + "operator": "RX", + "parameters": [ + 1.5707963267948966 + ], + "arguments": [ + 1 + ], + "fidelity": 0.999592016493133, + "duration": 50.0 + }, + { + "operator": "RX", + "parameters": [ + -1.5707963267948966 + ], + "arguments": [ + 1 + ], + "fidelity": 0.999592016493133, + "duration": 50.0 + } + ] + } + }, + "2Q": { + "0-1": {} + } + }, + "specs": { + } +} diff --git a/test-data/readout-b.qpu b/test-data/readout-b.qpu new file mode 100644 index 0000000..68563f5 --- /dev/null +++ b/test-data/readout-b.qpu @@ -0,0 +1,179 @@ +{ + "isa": { + "1Q": { + "0": { + "gates": [ + { + "operator": "MEASURE", + "qubit": 0, + "target": "_", + "duration": 2000.0, + "fidelity": 0.999 + }, + { + "operator": "MEASURE", + "qubit": 0, + "target": null, + "duration": 2000.0, + "fidelity": 0.999 + }, + { + "operator": "RZ", + "parameters": [ + "_" + ], + "arguments": [ + 0 + ], + "fidelity": 0.99, + "duration": 0.01 + }, + { + "operator": "RX", + "parameters": [ + 0.0 + ], + "arguments": [ + 0 + ], + "fidelity": 1.0, + "duration": 50.0 + }, + { + "operator": "RX", + "parameters": [ + 3.141592653589793 + ], + "arguments": [ + 0 + ], + "fidelity": 0.995048041389577, + "duration": 50.0 + }, + { + "operator": "RX", + "parameters": [ + -3.141592653589793 + ], + "arguments": [ + 0 + ], + "fidelity": 0.995048041389577, + "duration": 50.0 + }, + { + "operator": "RX", + "parameters": [ + 1.5707963267948966 + ], + "arguments": [ + 0 + ], + "fidelity": 0.995048041389577, + "duration": 50.0 + }, + { + "operator": "RX", + "parameters": [ + -1.5707963267948966 + ], + "arguments": [ + 0 + ], + "fidelity": 0.995048041389577, + "duration": 50.0 + } + ] + }, + "1": { + "gates": [ + { + "operator": "MEASURE", + "qubit": 1, + "target": "_", + "duration": 2000.0, + "fidelity": 0.999 + }, + { + "operator": "MEASURE", + "qubit": 1, + "target": null, + "duration": 2000.0, + "fidelity": 0.999 + }, + { + "operator": "RZ", + "parameters": [ + "_" + ], + "arguments": [ + 1 + ], + "fidelity": 0.999, + "duration": 0.01 + }, + { + "operator": "RX", + "parameters": [ + 0.0 + ], + "arguments": [ + 1 + ], + "fidelity": 1.0, + "duration": 50.0 + }, + { + "operator": "RX", + "parameters": [ + 3.141592653589793 + ], + "arguments": [ + 1 + ], + "fidelity": 0.999592016493133, + "duration": 50.0 + }, + { + "operator": "RX", + "parameters": [ + -3.141592653589793 + ], + "arguments": [ + 1 + ], + "fidelity": 0.999592016493133, + "duration": 50.0 + }, + { + "operator": "RX", + "parameters": [ + 1.5707963267948966 + ], + "arguments": [ + 1 + ], + "fidelity": 0.999592016493133, + "duration": 50.0 + }, + { + "operator": "RX", + "parameters": [ + -1.5707963267948966 + ], + "arguments": [ + 1 + ], + "fidelity": 0.999592016493133, + "duration": 50.0 + } + ] + } + }, + "2Q": { + "0-1": {} + } + }, + "specs": { + } +} diff --git a/test-data/swap.qpu b/test-data/swap.qpu new file mode 100644 index 0000000..621783d --- /dev/null +++ b/test-data/swap.qpu @@ -0,0 +1,16 @@ +{ + "metadata": { + "name": "Chip with swap", + "version": "0.0" + }, + "isa": { + "metadata": {}, + "1Q": { + "0": { "type": "Xhalves" }, + "1": { "type": "Xhalves" } + }, + "2Q": { + "0-1": { "type": ["SWAP", "CZ"] } + } + } +}