

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# Braket 支持哪些 OpenQASM 功能？
<a name="braket-openqasm-supported-features"></a>

下节列出了 Braket 支持的 OpenQASM 3.0 数据类型、语句和编译指令。

**Topics**
+ [受支持的 OpenQASM 数据类型](#braket-openqasm-supported-features-datatypes)
+ [受支持的 OpenQASM 语句](#braket-openqasm-supported-features-statements)
+ [Braket OpenQASM 编译指示](#braket-openqasm-supported-features-pragmas)
+ [本地模拟器上对 OpenQASM 的高级功能支持](#braket-openqasm-supported-features-advanced-feature-local-simulator)
+ [支持的操作和语法 OpenPulse](#braket-openpulse-supported-operations-grammar)

## 受支持的 OpenQASM 数据类型
<a name="braket-openqasm-supported-features-datatypes"></a>

Amazon Braket 支持以下 OpenQASM 数据类型：
+ 非负整数用于（虚拟和物理）量子比特索引：
  +  `cnot q[0], q[1];` 
  +  `h $0;` 
+ 浮点数或常数可用于门旋转角度：
  +  `rx(-0.314) $0;` 
  +  `rx(pi/4) $0;` 

**注意**  
pi 是 OpenQASM 中的内置常量，不能用作参数名称。
+ 在用于定义一般哈密特量可观测值的结果类型编译指示和单一编译指示中，允许使用复数数组（虚数部分使用 OpenQASM `im` 表示法）：
  +  `#pragma braket unitary [[0, -1im], [1im, 0]] q[0]` 
  +  `#pragma braket result expectation hermitian([[0, -1im], [1im, 0]]) q[0]` 

## 受支持的 OpenQASM 语句
<a name="braket-openqasm-supported-features-statements"></a>

Amazon Braket 支持以下 OpenQASM 语句。
+  `Header: OPENQASM 3;` 
+ 经典位声明：
  +  `bit b1;` (equivalently, `creg b1;`)
  +  `bit[10] b2;` (equivalently, `creg b2[10];`)
+ 量子比特声明：
  +  `qubit b1;` (equivalently, `qreg b1;`)
  +  `qubit[10] b2;` (equivalently, `qreg b2[10];`)
+ 在数组内建立索引：`q[0]`
+ 输入：`input float alpha;`
+ 物理 qubits 的规格：`$0`
+ 设备上受支持的门和操作：
  +  `h $0;` 
  +  `iswap q[0], q[1];` 

**注意**  
设备支持的门可以在 OpenQASM 操作的设备属性中找到；使用这些门不需要任何门定义。
+ 逐字记录表声明。目前，我们不支持方框持续时间表示法。原生门和物理 qubits 必须放在逐字记录框中。

```
#pragma braket verbatim
box{
    rx(0.314) $0;
}
```
+ 在 qubits 或整个 qubit 寄存器上进行测量和测量分配。
  +  `measure $0;` 
  +  `measure q;` 
  +  `measure q[0];` 
  +  `b = measure q;` 
  +  `measure q → b;` 
+ Barrier 语句通过防止跨屏障边界的门重新排序和优化，提供对电路编译和执行的明确控制。它们还在执行期间强制执行严格的时间顺序，确保屏障之前的所有操作在后续操作开始之前完成。
  +  `barrier;` 
  +  `barrier q[0], q[1];` 
  +  `barrier $3, $6;` 

## Braket OpenQASM 编译指示
<a name="braket-openqasm-supported-features-pragmas"></a>

Amazon Braket 支持下列 OpenQASM 编译指示说明。
+ 噪声编译指示
  +  `#pragma braket noise bit_flip(0.2) q[0]` 
  +  `#pragma braket noise phase_flip(0.1) q[0]` 
  +  `#pragma braket noise pauli_channel` 
+ 逐字编译指示
  +  `#pragma braket verbatim` 
+ 结果类型编译指示
  + 基数不变结果类型：
    + 状态向量：`#pragma braket result state_vector`
    + 密度矩阵：`#pragma braket result density_matrix`
  + 梯度计算编译指示：
    + 伴随渐变：`#pragma braket result adjoint_gradient expectation(2.2 * x[0] @ x[1]) all`
  + Z 基准结果类型：
    + 振幅：`#pragma braket result amplitude "01"`
    + 概率：`#pragma braket result probability q[0], q[1]`
  + 基础轮换结果类型
    + 期望：`#pragma braket result expectation x(q[0]) @ y([q1])`
    + 方差：`#pragma braket result variance hermitian([[0, -1im], [1im, 0]]) $0`
    + 示例：`#pragma braket result sample h($1)`

**注意**  
由于 OpenQASM 3.0 向后兼容 OpenQASM 2.0，因而使用 2.0 编写的程序可以在 Braket 上运行。但是，Braket 支持的 OpenQASM 3.0 功能确实存在一些细微的语法差异，如 `qreg` vs `creg` 和 `qubit` vs `bit`。测量句法也有差异，需要用正确的语法来支持这些语法。

## 本地模拟器上对 OpenQASM 的高级功能支持
<a name="braket-openqasm-supported-features-advanced-feature-local-simulator"></a>

`LocalSimulator` 支持高级 OpenQASM 功能，这些功能不是作为 Braket 的 QPU 模拟器或按需模拟器的一部分提供的。在 `LocalSimulator` 中，仅支持下列功能：
+ 门修改器
+ OpenQASM 内置门
+ 经典变量
+ 经典运算
+ 定制门
+ 经典控制
+ QASM 文件
+ 子程序

有关每项高级功能的示例，请参阅此[样本 Notebook。](https://github.com/aws/amazon-braket-examples/blob/main/examples/braket_features/Simulating_Advanced_OpenQASM_Programs_with_the_Local_Simulator.ipynb)有关完整的 OpenQASM 规范，请访问 [OpenQASM 网站](https://openqasm.com/language/index.html)。

## 支持的操作和语法 OpenPulse
<a name="braket-openpulse-supported-operations-grammar"></a>

 **支持 OpenPulse 的数据类型** 

Cal 块：

```
cal {
    ...
}
```

Defcal 块：

```
// 1 qubit
defcal x $0 {
...
}

// 1 qubit w. input parameters as constants
defcal my_rx(pi) $0 {
...
}

// 1 qubit w. input parameters as free parameters
defcal my_rz(angle theta) $0 {
...
}

// 2 qubit (above gate args are also valid)
defcal cz $1, $0 {
...
}
```

帧:

```
frame my_frame = newframe(port_0, 4.5e9, 0.0);
```

波形：

```
// prebuilt
waveform my_waveform_1 = constant(1e-6, 1.0);

//arbitrary
waveform my_waveform_2 = {0.1 + 0.1im, 0.1 + 0.1im, 0.1, 0.1};
```

 **自定义门校准示例：**

```
cal {
    waveform wf1 = constant(1e-6, 0.25);
}

defcal my_x $0 {
   play(wf1, q0_rf_frame);
}

defcal my_cz $1, $0 {
    barrier q0_q1_cz_frame, q0_rf_frame;
    play(q0_q1_cz_frame, wf1);
    delay[300ns] q0_rf_frame
    shift_phase(q0_rf_frame, 4.366186381749424);
    delay[300ns] q0_rf_frame;
    shift_phase(q0_rf_frame.phase, 5.916747563126659);
    barrier q0_q1_cz_frame, q0_rf_frame;
    shift_phase(q0_q1_cz_frame, 2.183093190874712);
}

bit[2] ro;
my_x $0;
my_cz $1,$0;
c[0] = measure $0;
```

 **任意脉冲示例：**

```
bit[2] ro;
cal {
    waveform wf1 = {0.1 + 0.1im, 0.1 + 0.1im, 0.1, 0.1};
    barrier q0_drive, q0_q1_cross_resonance;
    play(q0_q1_cross_resonance, wf1);
    delay[300ns] q0_drive;
    shift_phase(q0_drive, 4.366186381749424);
    delay[300dt] q0_drive;
   barrier q0_drive, q0_q1_cross_resonance;
   play(q0_q1_cross_resonance, wf1);
    ro[0] = capture_v0(r0_measure);
    ro[1] = capture_v0(r1_measure);
}
```