

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

# OpenQASM 故障排除
<a name="braket-troubleshooting-openqasm"></a>

本节提供了在使用 OpenQASM 3.0 的过程中遇到错误时可能有用的疑难解答指引。

**Topics**
+ [包含语句错误](#braket-troubleshooting-openqasm-include-statement-error)
+ [非连续 qubits 错误](#braket-troubleshooting-openqasm-non-contiguous-qubits-error)
+ [物理 qubits 与虚拟 qubits 混搭错误](#braket-troubleshooting-openqasm-mixing-physical-and-virtual-qubits-error)
+ [请求结果类型并在同一程序测量 qubits 错误](#braket-troubleshooting-openqasm-result-types-measuring-qubits-error)
+ [超出经典寄存器和 qubit 寄存器限值误差](#braket-troubleshooting-openqasm-register-limits-error)
+ [方框前面没有逐字编译指示错误](#braket-troubleshooting-openqasm-box-not-preceded-by-pragma-error)
+ [逐字记录框缺少原生门错误](#braket-troubleshooting-openqasm-verbatim-box-missing-native-gates-error)
+ [逐字记录框缺少物理 qubits 错误](#braket-troubleshooting-openqasm-verbatim-box-missing-physical-qubits-error)
+ [逐字编译指示缺少“braket”错误](#braket-troubleshooting-openqasm-pragma-naming-error)
+ [无法为单个 qubits 编制索引错误](#braket-troubleshooting-openqasm-qubit-index-error)
+ [双 qubit 门中的物理 qubits 未连接错误](#braket-troubleshooting-openqasm-disconnected-physical-qubits-error)
+ [本地模拟器支持警告](#braket-troubleshooting-openqasm-local-simulator-support-warning)

## 包含语句错误
<a name="braket-troubleshooting-openqasm-include-statement-error"></a>

Braket 目前没有标准的门库文件可以包含在 OpenQASM 程序中。例如，以下示例会引发解析器错误。

```
OPENQASM 3;
include "standardlib.inc";
```

该代码生成错误消息：`No terminal matches '"' in the current parser context, at line 2 col 17.`

## 非连续 qubits 错误
<a name="braket-troubleshooting-openqasm-non-contiguous-qubits-error"></a>

如果在设备功能中将 `requiresContiguousQubitIndices` 设置为 `true` 的设备上使用非连续 qubits，将会导致错误。

在模拟器和 IonQ 上运行量子任务时，以下程序会触发错误。

```
OPENQASM 3;

qubit[4] q;

h q[0];
cnot q[0], q[2];
cnot q[0], q[3];
```

该代码生成错误消息：`Device requires contiguous qubits. Qubit register q has unused qubits q[1], q[4].`

## 物理 qubits 与虚拟 qubits 混搭错误
<a name="braket-troubleshooting-openqasm-mixing-physical-and-virtual-qubits-error"></a>

不得在同一个程序中将物理 qubits 和虚拟 qubits 混搭，这会导致错误。以下代码会生成错误。

```
OPENQASM 3;

qubit[2] q;
cnot q[0], $1;
```

该代码生成错误消息：`[line 4] mixes physical qubits and qubits registers.`

## 请求结果类型并在同一程序测量 qubits 错误
<a name="braket-troubleshooting-openqasm-result-types-measuring-qubits-error"></a>

如果请求结果类型并在同一程序中明确测量 qubits，将会导致错误。以下代码会生成错误。

```
OPENQASM 3;

qubit[2] q;

h q[0];
cnot q[0], q[1];
measure q;

#pragma braket result expectation x(q[0]) @ z(q[1])
```

该代码生成错误消息：`Qubits should not be explicitly measured when result types are requested.`

## 超出经典寄存器和 qubit 寄存器限值误差
<a name="braket-troubleshooting-openqasm-register-limits-error"></a>

只允许使用一个经典寄存器和一个 qubit 寄存器。以下代码会生成错误。

```
OPENQASM 3;

qubit[2] q0;
qubit[2] q1;
```

该代码生成错误消息：`[line 4] cannot declare a qubit register. Only 1 qubit register is supported.`

## 方框前面没有逐字编译指示错误
<a name="braket-troubleshooting-openqasm-box-not-preceded-by-pragma-error"></a>

所有方框前面都必须有逐字编译指示。以下代码会生成错误。

```
box{
rx(0.5) $0;
}
```

该代码生成错误消息：`In verbatim boxes, native gates are required. x is not a device native gate.`

## 逐字记录框缺少原生门错误
<a name="braket-troubleshooting-openqasm-verbatim-box-missing-native-gates-error"></a>

逐字记录框应有原生门和物理 qubits。以下代码会生成原生门错误。

```
#pragma braket verbatim
box{
x $0;
}
```

该代码生成错误消息：`In verbatim boxes, native gates are required. x is not a device native gate.`

## 逐字记录框缺少物理 qubits 错误
<a name="braket-troubleshooting-openqasm-verbatim-box-missing-physical-qubits-error"></a>

逐字记录框必须有物理 qubits。以下代码会生成物理 qubits 缺失错误。

```
qubit[2] q;

#pragma braket verbatim
box{
rx(0.1) q[0];
}
```

该代码生成错误消息：`Physical qubits are required in verbatim box.`

## 逐字编译指示缺少“braket”错误
<a name="braket-troubleshooting-openqasm-pragma-naming-error"></a>

您必须在逐字记录编译指示中包含“braket”。以下代码会生成错误。

```
#pragma braket verbatim           // Correct
#pragma verbatim                  // wrong
```

该代码生成错误消息：`You must include “braket” in the verbatim pragma`

## 无法为单个 qubits 编制索引错误
<a name="braket-troubleshooting-openqasm-qubit-index-error"></a>

无法为单个 qubits 编制索引。以下代码会生成错误。

```
OPENQASM 3;

qubit q;
h q[0];
```

该代码生成错误：`[line 4] single qubit cannot be indexed.`

但是，可按如下方式对单个 qubit 数组编制索引：

```
OPENQASM 3;

qubit[1] q;
h q[0];   // This is valid
```

## 双 qubit 门中的物理 qubits 未连接错误
<a name="braket-troubleshooting-openqasm-disconnected-physical-qubits-error"></a>

要使用物理 qubits，请首先通过检查 `device.properties.action[DeviceActionType.OPENQASM].supportPhysicalQubits` 来确认设备使用的是物理 qubits，然后通过选中 `device.properties.paradigm.connectivity.connectivityGraph` 或 `device.properties.paradigm.connectivity.fullyConnected` 来验证连接图。

```
OPENQASM 3;

cnot $0, $14;
```

该代码生成错误消息：`[line 3] has disconnected qubits 0 and 14`

## 本地模拟器支持警告
<a name="braket-troubleshooting-openqasm-local-simulator-support-warning"></a>

`LocalSimulator`支持 OpenQasm 中的高级功能，这些功能可能无法在按需模拟 QPUs 器上使用。如果您的程序仅包含对 `LocalSimulator` 特定的语言功能（如以下示例所示），您将收到一条警告。

```
qasm_string = """
qubit[2] q;

h q[0];
ctrl @ x q[0], q[1];
"""
qasm_program = Program(source=qasm_string)
```

此代码生成警告：`此程序使用仅支持的 OpenQasm 语言功能。 LocalSimulator QPUs 或按需模拟器可能不支持其中一些功能。

有关受支持的 OpenQASM 功能的更多信息，请浏览[本地模拟器上对 OpenQASM 的高级功能支持](braket-openqasm-supported-features.md#braket-openqasm-supported-features-advanced-feature-local-simulator)页面。