3. 量子电路实验的标准化描述
在量子计算实验中,一个电路从“想法”到“在真实硬件上跑出结果”,中间要经过多次表达形式的转换。如果每次换后端都要重写电路,实验就不可复现。标准化描述的核心目标,是让同一份电路语义能够在不同后端上生成等价表达:逻辑等价、测量语义一致、参数含义可追溯。本节围绕四种常见描述层次展开:OpenQASM、QIR、脉冲级描述,以及把电路落盘保存的序列化格式。
一、四个描述层次各自解决什么问题
可以把它们理解为从“人类可读”到“硬件可执行”的一条谱系。OpenQASM 是面向电路结构的文本语言,适合描述门序列、寄存器、测量与条件操作;QIR 是面向编译与优化的中间表示,带有类型系统和 SSA 形式,便于做变换与跨平台传递;脉冲级描述(如 OpenPulse)描述的是控制通道上的波形、时序与帧,直接对应硬件控制信号;序列化则负责把上述任一层的对象持久化为文件,保证实验可存档、可回放。
关键区别在于“语义边界”。OpenQASM 描述的是门级语义,它不规定门如何被物理实现;QIR 描述的是程序级语义,它保留控制流与函数调用;脉冲级描述的是信号级语义,它规定波形如何驱动量子比特。三者不是替代关系,而是同一实验在不同抽象层的投影。等价表达的含义也随之分层:门级等价要求作用在量子态上的幺正变换一致;脉冲级等价则要求最终实现的物理操作一致。
二、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 优化是否改变了语义、脉冲校准是否漂移。这就是“等价表达”在工程上的落地方式——不是要求文本相同,而是要求可追溯、可验证、可复现。