Skip to Content

OpenQASM 与 Python 导入导出

线路可以在内存字符串、文件和 Python 重建代码之间转换。OpenQASM 适合与其他工具交换线路;Python 导出适合生成可读的 UnitaryLab 构造代码。

from unitarylab import Circuit qc = Circuit(2) qc.h(0) qc.cx(0, 1) qasm3 = qc.to_qasm() qasm2 = qc.to_qasm2() restored = Circuit.from_qasm(qasm3) qc.to_qasm_file("circuit.qasm") restored_from_file = Circuit.from_qasm_file("circuit.qasm")

to_qasm() 默认导出 OpenQASM 3.0,from_qasm() 根据版本声明解析 2.0 或 3.0。decompose 控制块门展开,transpile=True 在导出前转译基础门集。

公共接口

接口作用
to_qasm(...)返回 OpenQASM 3.0 字符串
to_qasm2(qreg_name="q", creg_name="c")返回 OpenQASM 2.0 字符串
from_qasm(code, gate_storage="python")解析版本声明并创建线路
from_qasm_file(path, gate_storage="python")从文件读取线路
to_qasm_file(path, ...)将 OpenQASM 3.0 写入文件
to_python(...) / to_python_file(...)生成重建线路的 Python 代码

decompose=True 等价于展开一层,也可以传入正整数指定层数。transpile_basis 和 gates_to_unroll 用于控制导出前的门基转译。

底层 unitarylab.backend.qasm 提供 gate_sequence_to_qasm*、qasm*_to_gate_sequence 和 circuit_from_gate_sequence,仅建议在直接处理 GateSequence 时使用。

支持范围

  • 覆盖常用单比特门、参数门、受控门、SWAP、测量和自定义 gate。
  • 参数必须是数值,不支持 if、while 等经典控制流。
  • 携带矩阵的 unitary 门使用 UnitaryLab 扩展格式,可由自身还原,但不是标准互操作格式。
  • 非连续块门可能内联展开,并非所有自定义门都能完整往返。
  • OpenQASM 输入应来自可信来源,并在使用前限制文件大小;解析线路不会执行其中的 Python 代码,但超大线路仍可能消耗大量内存。

Python 源码

to_python() 当前只覆盖 rx、ry、rz、p、cx。包含 h 等其他门时会抛出 RuntimeError,默认 transpile() 也不保证满足这一门集合限制。

import numpy as np codegen_qc = Circuit(2) codegen_qc.p(np.pi, 0) codegen_qc.ry(np.pi / 2, 0) codegen_qc.cx(0, 1) print(codegen_qc.to_python())

导出后建议执行一次往返验证:比较门数量、测量映射,并在小型无测量线路上比较矩阵。

相关页面

最后更新于