2. 量子电路IR的数据模型

量子编译器IR的核心任务,是把一段量子程序从人类可读的源码,逐步降低为可被硬件或模拟器执行的指令序列。在这个过程中,IR必须精确表达六类基本对象:量子比特、经典寄存器、门指令、测量、屏障与条件操作。它们共同构成量子电路的数据模型,也是后续所有变换(如门融合、映射、调度)的语义基础。

一、六类基本对象的形式化表示

量子比特(Qubit)是IR中最基本的资源单位。形式化上,一个量子比特可表示为带唯一标识的变量 q[i],其中 i 是虚拟索引。虚拟量子比特与物理量子比特的分离,是IR支持映射变换的前提:前端只关心逻辑关系,后端才把 q[i] 绑定到具体物理比特。

经典寄存器(Classical Register)用于存放测量结果和条件判断的输入,通常表示为 c[k] 或位向量 c[n-1..0]。它与量子比特的关键区别在于:经典寄存器可读可写、可复制,而量子比特受不可克隆定理约束,不能随意复制。

门指令(Gate Instruction)是作用在量子比特上的酉操作,形式化表示为 G(params) q_args。例如 rx(π/2) q[0] 表示绕X轴旋转 π/2。门指令携带三个要素:门类型、参数(可为空)、作用比特列表。参数化门(如 rx、rz、u)是变分量子算法的关键,IR必须保留参数的符号表达式而非仅存数值。

测量(Measure)把量子态坍缩为经典结果,形式为 measure q[i] -> c[k]。它同时涉及量子侧和经典侧,是IR中少见的“跨域”指令。测量在IR中通常不可逆,且会破坏量子比特的叠加态,因此编译器必须谨慎处理测量前后的依赖关系。

屏障(Barrier)是同步标记,形式为 barrier q[0], q[1]。它不改变量子态,但禁止编译器跨越屏障重排门指令。屏障的语义价值在于:它显式声明了“这些比特在此刻必须处于同一阶段”,常用于保护硬件校准边界或用户指定的并行结构。

条件操作(Conditional Operation)根据经典寄存器的值决定是否执行某条量子指令,形式为 if (c==1) x q[0]。它是量子反馈和纠错电路的基础。条件操作在IR中引入控制依赖,使DAG不再只是纯数据依赖,还包含经典控制流。

量子电路IR数据模型:对象关系与DAG依赖 IR基本对象 量子比特 q[i] 虚拟/物理分离 经典寄存器 c[k] 可读可写可复制 门指令 G(p) q 酉操作+参数 测量 measure 跨域:量子→经典 屏障 barrier 禁止重排同步点 条件操作 if(c) 经典控制量子 DAG IR:节点=指令,边=依赖 H q[0] CNOT q[0],q[1] RZ q[1] M q[0]→c[0] if c[0]==1 X q[1] 实线:量子数据依赖 | 橙色:经典控制依赖 红色:测量跨域依赖 | 紫色:条件执行依赖 列表IR:线性指令序列 1. h q[0] 2. cx q[0],q[1] 3. rz(θ) q[1] 4. measure q[0]→c[0] 5. if(c[0]==1) x q[1] 6. barrier q[0],q[1] 顺序即语义 重排需显式分析 适合直接执行 优化空间受限 拓扑 排序

二、DAG IR与列表IR的取舍

列表IR把电路表示为有序指令序列,顺序即语义。它的优点是直观、易于直接执行、与文本格式(如OpenQASM)一一对应。缺点是优化空间受限:要判断两条指令能否交换,必须扫描它们之间的所有指令,复杂度随电路深度增长。

DAG IR把每条指令作为节点,把“同一量子比特上的先后操作”作为有向边。这样,无依赖的指令天然处于同一拓扑层,编译器可以并行调度、融合相邻门、消除冗余门。代价是:DAG丢失了原始书写顺序,某些依赖用户意图的顺序信息(如屏障保护的并行结构)需要额外标注;同时,DAG的构建与维护成本高于列表。

工程上的常见做法是双IR并存:前端解析为列表IR,便于语法检查和源码映射;中端转换为DAG IR做优化;后端再拓扑排序回列表IR,交给硬件执行。选择哪种IR,取决于当前阶段的目标——需要精确控制顺序时用列表,需要挖掘并行与融合时用DAG。

三、OpenQASM 3.0与QUIL的语义映射

OpenQASM 3.0和QUIL是两种主流量子汇编语言,它们的语义映射是IR互操作的关键。下表给出核心对象的对应关系(示例参数为教学假设,非实测数据):

IR对象OpenQASM 3.0QUIL语义差异
量子比特qubit[2] q;DECLARE q 2QASM用类型化数组,QUIL用声明
经典寄存器bit[2] c;DECLARE c BIT[2]QASM位宽显式,QUIL用类型标注
门指令h q[0];H 0QASM带分号,QUIL无分号
参数化门rz(pi/2) q[1];RZ(pi/2) 1参数表达式语法不同
测量c[0] = measure q[0];MEASURE 0 c[0]QASM赋值在前,QUIL目标在后
屏障barrier q[0],q[1];PRAGMA PRESERVE_BLOCKQUIL用pragma模拟
条件操作if(c==1) x q[0];JUMP-WHEN @label c[0]QASM内联条件,QUIL用跳转

映射时需注意三点。第一,OpenQASM 3.0的 if 是结构化条件,而QUIL用 JUMP-WHEN 加标签实现,转换时需要引入基本块和标签管理。第二,QUIL的 PRAGMA 是编译器指令而非量子操作,映射到QASM的 barrier 时需确认语义等价——PRAGMA PRESERVE_BLOCK 保护的是代码块,而 barrier 保护的是比特集合,二者不完全相同。第三,参数表达式在两种语言中的求值时机可能不同,跨语言转换时应先把参数化为符号常量,避免精度损失。

实践建议:在实现IR转换器时,先定义一份与语言无关的内部表示(如基于DAG的中间层),再分别实现OpenQASM 3.0和QUIL的前端解析与后端打印。这样,新增一种语言只需增加一对解析/打印器,而不必修改优化通道。

四、一个可执行的IR片段示例

下面给出一个同时包含六类对象的OpenQASM 3.0片段,可作为IR解析器的测试输入。该示例为教学构造,参数 theta 取 pi/4:

OPENQASM 3.0;
include "stdgates.inc";

qubit[2] q;
bit[2] c;
float theta = pi/4;

h q[0];
cx q[0], q[1];
rz(theta) q[1];
barrier q[0], q[1];
c[0] = measure q[0];
if (c[0] == 1) x q[1];
c[1] = measure q[1];

解析这段代码时,IR应生成7个节点:H、CX、RZ、barrier、measure、if、measure。其中 if 节点依赖 c[0] 的测量结果,形成经典控制边;barrier 节点禁止H/CX/RZ与后续测量之间的重排。若把这段代码转为DAG,可以看到H和CX之间存在量子数据依赖,而RZ只作用于q[1],与H无直接依赖,理论上可与H并行——但barrier的存在阻止了这种重排,这正是屏障的语义价值。

理解这六类对象及其在DAG与列表IR中的表达差异,是后续学习门融合、量子比特映射和调度算法的基础。下一阶段将进入具体的IR变换通道设计。