RISC-V 量子拡張の実装

RISC-V量子拡張は, 「RiscV.RV32IU」として @k_yamaz 蛙 が提案しています.
(詳しくは, 技術ブログ Qiita に投稿した RISC-Vの量子計算拡張 をご参照ください. )
思いつきなどをメモしていきます.

さて, そろそろ RISC-V 量子拡張の実装を進めて参りましょう.
計画時では, RISC-V 量子拡張の実装は, ユニバーサルゲートである H ゲート, T ゲート, CNOT ゲートのみを準備するだけにしようとしていましたが,
QPU シミュレータの中を試行錯誤的に色々と検討したいという事由もあり, 次の通りの構成としました.

なお, RISC-V 量子拡張 (2. カスタム拡張を考える[続き]) で検討していた内容から, さらに検討が進み, 変更した事項があります.

1
2
3
4
5
6
7
8
9
10
qmeas.k   rd rs1 rs2 qimm6 31=1 14..12=0 6..2=0x02 1..0=3  # quantum measurement
qtelep.k rd rs1 rs2 qimm6 31=0 14..12=0 6..2=0x02 1..0=3 # quantum teleportation
qtocx.k rd rs1 rs2 qimm6 31=1 14..12=4 6..2=0x02 1..0=3 # quantum two-qubit operator CX-gate
qootdg.k rd rs1 rs2 qimm6 31=0 14..12=1 6..2=0x02 1..0=3 # quantum one-qubit operator T^{\dag}-gate
qoosdg.k rd rs1 rs2 qimm6 31=0 14..12=2 6..2=0x02 1..0=3 # quantum one-qubit operator S^{\dag}-gate
qooz.k rd rs1 rs2 qimm6 31=0 14..12=3 6..2=0x02 1..0=3 # quantum one-qubit operator Z-gate
qoox.k rd rs1 rs2 qimm6 31=0 14..12=4 6..2=0x02 1..0=3 # quantum one-qubit operator X-gate
qoos.k rd rs1 rs2 qimm6 31=0 14..12=5 6..2=0x02 1..0=3 # quantum one-qubit operator S-gate
qoot.k rd rs1 rs2 qimm6 31=0 14..12=6 6..2=0x02 1..0=3 # quantum one-qubit operator T-gate
qooh.k rd rs1 rs2 qimm6 31=0 14..12=7 6..2=0x02 1..0=3 # quantum one-qubit operator H-gate
  • 量子ビット間の移動(qtelep.k)

量子レジスタ rs1 の rd で指定された位置の量子ビットの状態を, 量子レジスタ rs2 の qimm6 で指定された位置の量子ビットに量子テレポーテーションします.
qimm6(30) = 1 のときは, rd や qimm6(25-29) に関わらず, rs1 の全量子ビットの状態を rs2 に量子テレポーテーションします.

31 30 .. 25 24 .. 20 19 .. 15 14 .. 12 11 .. 7 6 .. 0
0 qimm6 rs2 rs1 000 rd 0001011
  • 量子レジスタの初期化(qtelep.k の特殊な命令)

量子レジスタ rs2 の qimm6 で指定された位置の量子ビットの状態を初期化します.
qimm6(30) = 1 のときは, qimm6(25-29) に関わらず, rs2 の全量子ビットの状態を初期化します.

31 30 .. 25 24 .. 20 19 .. 15 14 .. 12 11 .. 7 6 .. 0
0 qimm6 rs2 rs1(=q0) 000 rd 0001011
  • 1量子ビット演算

量子レジスタ rs1 に対して, qimm6 で指定したビット位置に, Unitray で示されたユニタリ行列を作用する命令です.

31 30 .. 25 24 .. 20 19 .. 15 14 .. 12 11 .. 7 6 .. 0
0 qimm6 rs2(=q0) rs1 Unitary rd 0001011
14 .. 12 Unitary opcode
001 $T^{\dagger}$ qootdg.k
010 $S^{\dagger}$ qoosdg.k
011 $Z$ qooz.k
100 $X$ qoox.k
101 $S$ qoos.k
110 $T$ qoot.k
111 $H$ qooh.k
  • 2量子ビット演算

量子レジスタ rs2 の qimm6[control] で指定したビット位置を制御ビット, 量子レジスタ rs1 の rd[target] で指定したビット位置を操作ビットとして 2量子ビットの Control Unitary を作用する命令です.

31 30 .. 25 24 .. 20 19 .. 15 14 .. 12 11 .. 7 6 .. 0
0 qimm6 rs2 rs1 Unitary rd 0001011
14 .. 12 Unitary opcode
100 CNOT qtocx.k
  • 1量子ビットの測定(qmeas.k)

量子レジスタ rs1 の qimm6 で指定された位置の量子ビットの状態を測定して, 古典レジスタ rd の qimm6 ビット位置に値を保持します.

31 30 .. 25 24 .. 20 19 .. 15 14 .. 12 11 .. 7 6 .. 0
1 qimm6 rs2(=q0) rs1 000 rd 0001011
  • 複数量子ビットの測定(qmeas.kの特殊な命令)

古典レジスタ rs2 の値で指定された量子ビット(マスクで指定)に対して, 量子レジスタ rs1 の状態を測定して, 古典レジスタ rd のビット位置に値を保持します.

31 30 .. 25 24 .. 20 19 .. 15 14 .. 12 11 .. 7 6 .. 0
1 qimm6(=000000) rs2( $\ne$ q0) rs1 000 rd 0001011