

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

# 在不同的 Braket 设备上支持 OpenQASM
<a name="braket-openqasm-device-support"></a>

对于支持 OpenQASM 3.0 的设备，`action` 字段支持通过 `GetDevice` 响应执行新操作，如下列 Rigetti 和 IonQ 设备示例所示。

```
//OpenQASM as available with the Rigetti device capabilities
{
    "braketSchemaHeader": {
        "name": "braket.device_schema.rigetti.rigetti_device_capabilities",
        "version": "1"
    },
    "service": {...},
    "action": {
        "braket.ir.jaqcd.program": {...},
        "braket.ir.openqasm.program": {
            "actionType": "braket.ir.openqasm.program",
            "version": [
                "1"
            ],
            ….
        }
    }
}

//OpenQASM as available with the IonQ device capabilities
{
    "braketSchemaHeader": {
        "name": "braket.device_schema.ionq.ionq_device_capabilities",
        "version": "1"
    },
    "service": {...},
    "action": {
        "braket.ir.jaqcd.program": {...},
        "braket.ir.openqasm.program": {
            "actionType": "braket.ir.openqasm.program",
            "version": [
                "1"
            ],
            ….
        }
    }
}
```

对于支持脉冲控制的设备，`pulse` 字段显示在 `GetDevice` 响应中。以下示例显示了 Rigetti 设备的 `pulse` 字段。

```
// Rigetti
{
  "pulse": {
    "braketSchemaHeader": {
      "name": "braket.device_schema.pulse.pulse_device_action_properties",
      "version": "1"
    },
    "supportedQhpTemplateWaveforms": {
      "constant": {
        "functionName": "constant",
        "arguments": [
          {
            "name": "length",
            "type": "float",
            "optional": false
          },
          {
            "name": "iq",
            "type": "complex",
            "optional": false
          }
        ]
      },
      ...
    },
    "ports": {
      "q0_ff": {
        "portId": "q0_ff",
        "direction": "tx",
        "portType": "ff",
        "dt": 1e-9,
        "centerFrequencies": [
          375000000
        ]
      },
      ...
    },
    "supportedFunctions": {
      "shift_phase": {
        "functionName": "shift_phase",
        "arguments": [
          {
            "name": "frame",
            "type": "frame",
            "optional": false
          },
          {
            "name": "phase",
            "type": "float",
            "optional": false
          }
        ]
      },
     ...
    },
    "frames": {
      "q0_q1_cphase_frame": {
        "frameId": "q0_q1_cphase_frame",
        "portId": "q0_ff",
        "frequency": 462475694.24460185,
        "centerFrequency": 375000000,
        "phase": 0,
        "associatedGate": "cphase",
        "qubitMappings": [
          0,
          1
        ]
      },
      ...
    },
    "supportsLocalPulseElements": false,
    "supportsDynamicFrames": false,
    "supportsNonNativeGatesWithPulses": false,
    "validationParameters": {
      "MAX_SCALE": 4,
      "MAX_AMPLITUDE": 1,
      "PERMITTED_FREQUENCY_DIFFERENCE": 400000000
    }
  }
}
```

前面的字段详细说明了以下内容：

 **端口：**

描述了在 QPU 上声明的预制外部 (`extern`) 设备端口以及给定端口的相关属性。此结构中列出的所有端口都预先声明为用户提交的 `OpenQASM 3.0` 程序中的有效标识符。端口的其他属性包括：
+ 端口 ID (portId)
  + 在 OpenQASM 3.0 中声明为标识符的端口名称。
+ 方向 (direction)
  + 端口的方向。驱动端口传输脉冲（“tx”方向），而测量端口接收脉冲（“rx”方向）。
+ 端口类型 (portType)
  + 此端口负责的操作类型（例如，驱动、捕获或 ff - fast-flux）。
+ Dt (dt)
  + 表示给定端口上的单个采样时间步长，以秒为单位。
+ 量子比特映射 (qubitMappings)
  + 与给定端口关联的量子比特。
+ 中心频率 (centerFrequencies)
  + 端口上所有预先声明或用户定义的帧的相关中心频率列表。有关更多信息，请参阅“帧”。
+ QHP 特定属性 () qhpSpecificProperties
  + 一张可选地图，详细介绍有关 QHP 特定端口的现有属性。

 **帧：**

描述了在 QPU 上声明的预制外部帧以及与这些帧相关的属性。此结构中列出的所有帧都预先声明为用户提交的 `OpenQASM 3.0` 程序中的有效标识符。帧的其他属性包括：
+ 帧编号 (frameId)
  + 在 OpenQASM 3.0 中声明为标识符的帧名称。
+ 端口 ID (portId)
  + 帧的关联硬件端口。
+ 频率 (frequency)
  + 帧的默认初始频率。
+ 中心频率 (centerFrequency)
  + 帧频率带宽的中心。通常，只能将帧调整到中心频率周围的特定带宽。因此，频率调整应保持在中心频率的给定增量之内。您可以在验证参数中找到带宽值。
+ 阶段 (phase)
  + 帧的默认初始阶段。
+ 关联门 (associatedGate)
  + 与给定帧关联的门。
+ 量子比特映射 (qubitMappings)
  + 与给定帧关联的量子比特。
+ QHP 特定属性 () qhpSpecificProperties
  + 一张可选地图，详细说明有关 QHP 特定帧的现有属性。

 **SupportsDynamicFrames:** 

描述了帧是否可以通过 OpenPulse `newframe` 函数在 `cal` 或 `defcal` 块中声明。如果该值为 false，则只能在程序中使用帧结构中列出的帧。

 **SupportedFunctions:** 

除了给定函数的关联参数、参数类型和返回类型之外，还描述了设备支持的 OpenPulse 函数。要查看使用这些OpenPulse函数的示例，请参阅[OpenPulse规范](https://openqasm.com/language/openpulse.html)。目前，Braket 支持：
+ shift\$1phase
  + 按指定值移动帧的相位
+ set\$1phase
  + 将帧的相位设置为指定值
+ swap\$1phases
  + 在两帧之间交换相位。
+ shift\$1frequency
  + 按指定值移动帧的频率
+ set\$1frequency
  + 将帧频设置为指定值
+ play
  + 安排波形
+ capture\$1v0
  + 将捕获帧上的值返回到位寄存器

 **SupportedQhpTemplateWaveforms:** 

描述了设备上可用的预先构造的波形函数以及相关的参数和类型。默认情况下，Braket Pulse 在所有设备上提供预先构造的波形例程，它们是：

 ***Constant*** 

![\[显示参数为 t、tau 和 iq 的常数函数的数学表达式，其中：输出始终等于 iq。\]](http://docs.aws.amazon.com/zh_cn/braket/latest/developerguide/images/ConstantFunction.png)


 `τ` 是波形长度，`iq` 是一个复数。

```
def constant(length, iq)
```

 ***Gaussian*** 

![\[显示参数为 t、tau、sigma、A=1 和 zae=0 的高斯函数的数学方程。\]](http://docs.aws.amazon.com/zh_cn/braket/latest/developerguide/images/GaussianFunction.png)


 `τ` 是波形长度，`σ` 是高斯宽度，`A` 是振幅。如果将 `ZaE` 设置为 `True`，则对 Gaussian 进行偏移和重新缩放，使其在波形的开头和结尾处都等于零，且最大达到 `A`。

```
def gaussian(length, sigma, amplitude=1, zero_at_edges=False)
```

 ***DRAG Gaussian*** 

![\[参数为 t、tau、sigma、beta、A=1 和 zae=0 的阻力高斯分布的数学方程。\]](http://docs.aws.amazon.com/zh_cn/braket/latest/developerguide/images/DRAGGaussianFunction.png)


 `τ` 是波形长度，`σ` 是高斯宽度，`β` 是自由参数，`A` 是振幅。如果将 `ZaE` 设置为 `True`，则对绝热门导数去除（DRAG）Gaussian 进行偏移和重新缩放，使其在波形的开头和结尾处都等于零，实数部分最大达到 `A`。有关阻力波形的更多信息，请参阅论文 [Simple Pulses for Elimination of Leakage in Weakly Nonlinear Qubits](https://doi.org/10.1103/PhysRevLett.103.110501)。

```
def drag_gaussian(length, sigma, beta, amplitude=1, zero_at_edges=False)
```

 ***Erf Square*** 

![\[Erf Square 分布的数学方程，含参数 t、长度、宽度、sigma、A=1 和 zae=0。\]](http://docs.aws.amazon.com/zh_cn/braket/latest/developerguide/images/ErfSquareFunction.PNG)


其中：`L` 是长度，`W` 是波形宽度，`σ` 定义了边缘上升和下降的速度，`t1​=(L−W)/2` 和 `t22=(L+W)/2`，`A` 是振幅。如果将 `ZaE` 设置为 `True`，则对 Gaussian 进行偏移和重新缩放，使其在波形的开头和结尾处都等于零，且最大达到 `A`。以下方程是波形的重新缩放版本。

![\[参数为 zae=1 的重新缩放的 Erf Square 分布数学方程。\]](http://docs.aws.amazon.com/zh_cn/braket/latest/developerguide/images/RescaledErfSquareFunction.PNG)


其中：`a=erf(W/2σ)` 且 `b=erf(-t1​/σ)/2+erf(t2​/σ)/2`。

```
def erf_square(length, width, sigma, amplitude=1, zero_at_edges=False)
```

 **SupportsLocalPulseElements:** 

描述了脉冲元素（如端口、帧和波形）是否可以在 `defcal` 块中进行本地定义。如果值为 `false`，则必须以 `cal` 块形式定义元素。

 **SupportsNonNativeGatesWithPulses:** 

描述了我们是否可以将非原生门与脉冲程序结合使用。例如，如果不先通过 `defcal` 为所使用的量子比特定义门，就不能像程序中的 `H` 门一样使用非原生门。您可以在“设备功能”下方找到原生门 `nativeGateSet` 键列表。

 **ValidationParameters:** 

描述了脉冲元件验证边界，包括：
+ （任意及预先构造的）波形的最大扩展/最大振幅值
+ 所提供中心频率的最大频率带宽（单位为赫兹）
+  length/duration 以秒为单位的最小脉冲
+ 以秒为单位的最 length/duration 大脉冲

## OpenQASM 支持的操作、结果和结果类型
<a name="braket-openqasm-supported-operations-results-result-types"></a>

要了解每台设备支持哪些 OpenQASM 3.0 功能，可以参考设备功能输出 `action` 字段中的 `braket.ir.openqasm.program` 键。例如，以下是 Braket 状态向量模拟器 SV1 支持的操作和结果类型。

```
...
  "action": {
    "braket.ir.jaqcd.program": {
      ...
    },
 "braket.ir.openqasm.program": {
      "version": [
        "1.0"
      ],
      "actionType": "braket.ir.openqasm.program",
      "supportedOperations": [
        "ccnot",
        "cnot",
        "cphaseshift",
        "cphaseshift00",
        "cphaseshift01",
        "cphaseshift10",
        "cswap",
        "cy",
        "cz",
        "h",
        "i",
        "iswap",
        "pswap",
        "phaseshift",
        "rx",
        "ry",
        "rz",
        "s",
        "si",
        "swap",
        "t",
        "ti",
        "v",
        "vi",
        "x",
        "xx",
        "xy",
        "y",
        "yy",
        "z",
        "zz"
      ],
      "supportedPragmas": [
        "braket_unitary_matrix"
      ],
      "forbiddenPragmas": [],
      "maximumQubitArrays": 1,
      "maximumClassicalArrays": 1,
      "forbiddenArrayOperations": [
        "concatenation",
        "negativeIndex",
        "range",
        "rangeWithStep",
        "slicing",
        "selection"
      ],
      "requiresAllQubitsMeasurement": true,
      "supportsPhysicalQubits": false,
      "requiresContiguousQubitIndices": true,
      "disabledQubitRewiringSupported": false,
      "supportedResultTypes": [
        {
          "name": "Sample",
          "observables": [
            "x",
            "y",
            "z",
            "h",
            "i",
            "hermitian"
          ],
          "minShots": 1,
          "maxShots": 100000
        },
        {
          "name": "Expectation",
          "observables": [
            "x",
            "y",
            "z",
            "h",
            "i",
            "hermitian"
          ],
          "minShots": 0,
          "maxShots": 100000
        },
        {
          "name": "Variance",
          "observables": [
            "x",
            "y",
            "z",
            "h",
            "i",
            "hermitian"
          ],
          "minShots": 0,
          "maxShots": 100000
        },
        {
          "name": "Probability",
          "minShots": 1,
          "maxShots": 100000
        },
        {
          "name": "Amplitude",
          "minShots": 0,
          "maxShots": 0
        }
        {
          "name": "AdjointGradient",
          "minShots": 0,
          "maxShots": 0
        }
      ]
    }
  },
...
```