

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

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

下一節列出 Braket 支援的 OpenQASM 3.0 資料類型、陳述式和 pragma 指示。

**Topics**
+ [

## 支援的 OpenQASM 資料類型
](#braket-openqasm-supported-features-datatypes)
+ [

## 支援的 OpenQASM 陳述式
](#braket-openqasm-supported-features-statements)
+ [

## Braket OpenQASM pragmas
](#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 資料類型。
+ 非負整數用於 （虛擬和實體） qubit 索引：
  +  `cnot q[0], q[1];` 
  +  `h $0;` 
+ 浮點數或常數可用於閘道旋轉角度：
  +  `rx(-0.314) $0;` 
  +  `rx(pi/4) $0;` 

**注意**  
pi 是 OpenQASM 中的內建常數，無法用作參數名稱。
+ 複雜數字陣列 （具有虛構部分的 OpenQASM `im`表示法） 允許使用結果類型 pragmas 來定義一般疱疱可觀測值，並以單一 pragmas 表示：
  +  `#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;` （相當於 `creg b1;`)
  +  `bit[10] b2;` （相當於 `creg b2[10];`)
+ Qubit 宣告：
  +  `qubit b1;` （相當於 `qreg b1;`)
  +  `qubit[10] b2;` （相當於 `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 q[0], q[1];` 
  +  `barrier $3, $6;` 

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

Amazon Braket 支援下列 OpenQASM pragma 說明。
+ 雜訊微量
  +  `#pragma braket noise bit_flip(0.2) q[0]` 
  +  `#pragma braket noise phase_flip(0.1) q[0]` 
  +  `#pragma braket noise pauli_channel` 
+ 逐字 pragmas
  +  `#pragma braket verbatim` 
+ 結果類型 pragmas
  + 基礎不可變的結果類型：
    + 狀態向量： `#pragma braket result state_vector`
    + 密度矩陣： `#pragma braket result density_matrix`
  + 梯度運算 pragmas：
    + 聯結漸層： `#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 上執行。不過，Raket 支援的 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 檔案
+ 子例行程序

如需每個進階功能的範例，請參閱此[範例筆記本](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);
}
```