qaiji.core.classical 源代码
# Copyright 2026 Qaiji-IR core developer: Ye Jun <yjmaxpayne@hotmail.com>
# SPDX-License-Identifier: Apache-2.0
"""用于测量与前馈控制的不可变经典值。"""
from dataclasses import dataclass
from qaiji.core.circuit import Gate
__all__ = [
"ClassicalBit",
"ClassicalRegister",
"Conditional",
"Measure",
]
[文档]
@dataclass(frozen=True)
class ClassicalRegister:
"""一个具名的定宽经典寄存器。"""
name: str
size: int
def __post_init__(self) -> None:
if not self.name or not self.name.isidentifier():
raise ValueError("Classical register name must be a non-empty identifier")
if self.size < 1:
raise ValueError("Classical register size must be at least one")
[文档]
@dataclass(frozen=True)
class ClassicalBit:
"""经典寄存器内按下标定位的一个比特。"""
register: ClassicalRegister
index: int
def __post_init__(self) -> None:
if self.index < 0 or self.index >= self.register.size:
raise ValueError(
f"Classical bit index {self.index} is outside register "
f"{self.register.name!r} of size {self.register.size}"
)
[文档]
@dataclass(frozen=True)
class Measure:
"""一次从单个量子比特到单个经典比特的测量。"""
qubit: int
target: ClassicalBit
def __post_init__(self) -> None:
if self.qubit < 0:
raise ValueError("Measurement qubit must be non-negative")
[文档]
@dataclass(frozen=True)
class Conditional:
"""当寄存器等于某个值时执行的门序列。"""
register: ClassicalRegister
value: int
body: tuple[Gate, ...]
def __post_init__(self) -> None:
body = tuple(self.body)
object.__setattr__(self, "body", body)
if self.value < 0:
raise ValueError("Conditional value must be non-negative")
if any(not isinstance(operation, Gate) for operation in body):
raise ValueError("Conditional body may only contain gates")