3. 量子电路实验的标准化描述

在量子计算实验中,一个电路从“想法”到“在真实硬件上跑出结果”,中间要经过多次表达形式的转换。如果每次换后端都要重写电路,实验就不可复现。标准化描述的核心目标,是让同一份电路语义能够在不同后端上生成等价表达:逻辑等价、测量语义一致、参数含义可追溯。本节围绕四种常见描述层次展开:OpenQASM、QIR、脉冲级描述,以及把电路落盘保存的序列化格式。

一、四个描述层次各自解决什么问题

可以把它们理解为从“人类可读”到“硬件可执行”的一条谱系。OpenQASM 是面向电路结构的文本语言,适合描述门序列、寄存器、测量与条件操作;QIR 是面向编译与优化的中间表示,带有类型系统和 SSA 形式,便于做变换与跨平台传递;脉冲级描述(如 OpenPulse)描述的是控制通道上的波形、时序与帧,直接对应硬件控制信号;序列化则负责把上述任一层的对象持久化为文件,保证实验可存档、可回放。

关键区别在于“语义边界”。OpenQASM 描述的是门级语义,它不规定门如何被物理实现;QIR 描述的是程序级语义,它保留控制流与函数调用;脉冲级描述的是信号级语义,它规定波形如何驱动量子比特。三者不是替代关系,而是同一实验在不同抽象层的投影。等价表达的含义也随之分层:门级等价要求作用在量子态上的幺正变换一致;脉冲级等价则要求最终实现的物理操作一致。

同一电路的多层等价表达与序列化路径 OpenQASM(门级) qreg / creg / h / cx / measure 人类可读 · 门序列语义 可跨后端解析 QIR(程序级) LLVM IR · 类型化 · SSA 保留控制流与函数调用 便于优化与跨平台传递 脉冲级(信号级) play / shift_phase / delay 波形 · 时序 · 帧 直接对应控制通道 编译 调度 序列化层:QASM 文本 / QIR 位码 / 脉冲 JSON / 电路 JSON 版本号 · 元数据 · 参数绑定 · 校验和 → 可存档、可回放、可对比 超导后端 transmon · 微波脉冲 CZ / SX / RZ 基门集 离子阱后端 激光 · 声光调制 MS / R 基门集 模拟器后端 状态向量 / 张量网络 无脉冲层,直接执行门 等价性校验:态向量保真度 / 过程层析 / 测量统计分布对比 同一 QASM 经不同编译路径到达不同后端,结果应在误差范围内一致

二、OpenQASM:门级描述的事实标准

OpenQASM 2.0 的语法非常简洁:用 qreg 声明量子寄存器,creg 声明经典寄存器,用门名加参数描述操作,用 measure 把量子比特映射到经典比特。下面是一个 3 比特 GHZ 态的示例,它同时包含参数化门和测量:

OPENQASM 2.0;
include "qelib1.inc";
qreg q[3];
creg c[3];
h q[0];
cx q[0], q[1];
cx q[1], q[2];
measure q -> c;

这段代码的语义是确定的:先对 q[0] 施加 Hadamard,再用两个 CNOT 建立纠缠,最后整体测量。任何支持 OpenQASM 的后端都应能解析它,并给出统计上一致的测量分布(理想情况下为 |000⟩ 与 |111⟩ 各约 50%)。OpenQASM 3.0 进一步引入了 input/output、时序 duration、box 以及脉冲级语句,使同一语言可以向下延伸到信号层。

三、QIR:为编译与优化而生的中间表示

QIR 建立在 LLVM IR 之上,把量子操作表示为对量子类型值的函数调用。它的价值在于:编译器可以在 QIR 上做内联、常量传播、循环展开、门合并等优化,而不必关心前端语言是 QASM、Python 还是其他 DSL。一个 QIR 片段大致长这样:

%q = call %Qubit* @__quantum__rt__qubit_allocate()
call void @__quantum__qis__h(%Qubit* %q)
%r = call %Result* @__quantum__qis__mz(%Qubit* %q)
call void @__quantum__rt__result_record_output(%Result* %r)

与 OpenQASM 相比,QIR 保留了类型信息与控制流,因此更适合做跨后端的等价变换。例如把 h; h 合并为空操作,或把 rz(θ); rz(φ) 合并为 rz(θ+φ),这些优化在 QIR 层完成后再降级到目标后端,能显著减少门数。需要注意的是,QIR 的等价性判断依赖运行时语义,不能只看文本是否相同。

四、脉冲级描述:当门不够用时

当实验需要精细控制(如校准门、抑制泄漏、实现非标准操作)时,门级描述就不够了。脉冲级描述直接给出控制通道上的波形。以 OpenPulse 风格为例:

play(drive(0), gaussian(duration=160, amp=0.3, sigma=40));
shift_phase(drive(0), 1.5708);
play(drive(0), gaussian(duration=160, amp=0.3, sigma=40));
delay(qubit(1), 320);

这里 drive(0) 是控制通道,gaussian 是波形包络,shift_phase 改变后续脉冲的相位。脉冲级等价不能简单比较波形文本,而要看最终作用在量子比特上的有效幺正变换是否一致。因此,脉冲级实验通常需要配合过程层析或随机基准测试来验证。

五、序列化:让实验可存档、可回放

无论用哪一层描述,最终都要落盘。序列化格式需要携带足够信息以重建电路:版本号、寄存器声明、门序列、参数绑定、测量映射、后端元数据。常见做法包括:QASM 文本直接保存、QIR 保存为 LLVM 位码、脉冲与电路保存为 JSON。一个可复现的序列化文件至少应包含以下字段:

字段含义示例
format_version序列化格式版本"qasm2" / "qir-1.0"
num_qubits量子比特数3
num_clbits经典比特数3
operations门序列与参数[{"gate":"h","qubits":[0]}, ...]
measure_map测量映射[[0,0],[1,1],[2,2]]
backend目标后端标识"simulator_statevector"
shots采样次数4096

有了这些字段,同一份电路可以在模拟器上先验证,再提交到真实硬件;如果结果不一致,可以逐层对比:QASM 是否被正确解析、QIR 优化是否改变了语义、脉冲校准是否漂移。这就是“等价表达”在工程上的落地方式——不是要求文本相同,而是要求可追溯、可验证、可复现。

在实际项目中,建议把 OpenQASM 作为“源文件”保存,把 QIR 作为“编译产物”保存,把脉冲配置作为“校准快照”保存。三者用同一实验 ID 关联,任何一次结果都能回溯到具体的电路版本与硬件状态。
注意:不同后端对同一 OpenQASM 的编译结果可能不同,尤其是门分解与量子比特映射。比较结果时,应优先比较测量统计分布或态保真度,而不是直接比较编译后的门序列。