"""Qiskit transpiler backend integration.
This module provides transpilation services using Qiskit's transpiler
for optimizing quantum circuits with configurable topology and gate sets.
"""
__all__ = ["transpile_qasm", "transpile_originir"]
import qiskit
from qiskit import QuantumCircuit
from qiskit.compiler import transpile
from qiskit.transpiler import CouplingMap
from qiskit.qasm2 import loads as qasm2_loads
from qiskit.qasm2 import dumps as qasm2_dumps
from qiskit.qasm2 import LEGACY_CUSTOM_INSTRUCTIONS
if __name__ == "__main__":
from _utils import CompilationFailedException
else:
from ._utils import CompilationFailedException
from typing import List, Tuple, Union, Optional
from .converter import convert_qasm_to_oir, convert_oir_to_qasm
[docs]
def transpile_qasm(
qasm_strings: List[str],
topology: List[Union[List[int], Tuple[int, int]]] = None,
optimization_level: int = 1,
basis_gates: Optional[List[str]] = None,
) -> List[str]:
"""
使用指定的拓扑、基本门和优化级别编译一组OPENQASM 2.0线路字符串。
Args:
qasm_strings: 包含 OPENQASM 2.0 线路描述的字符串列表。
topology: 定义硬件拓扑的耦合图列表。
例如: [[0, 1], [1, 2], [1, 3]] 表示 0<->1, 1<->2, 1<->3 的连接。
optimization_level: Qiskit transpile 的优化级别 (0 到 3)。
0: No optimization
1: Light optimization
2: Heavy optimization
3: Heaviest optimization
basis_gates: 用于编译的目标基本门集。如果为 None,则使用默认 ['cz', 'sx', 'rz']。
请确保您选择的门在 Qiskit 的标准库中或已被正确定义。
Returns:
一个字符串列表,包含编译后的 OPENQASM 2.0 线路。
Raises:
ImportError: 如果 Qiskit 未安装。
QiskitError: 如果输入的 QASM 字符串无效或编译过程中发生错误。
ValueError: 如果优化级别无效。
"""
if not qasm_strings:
return []
if isinstance(qasm_strings, str):
qasm_strings = [qasm_strings]
single_circuit = True
else:
single_circuit = False
try:
if basis_gates is None:
basis_gates = ['cz', 'sx', 'rz']
if optimization_level not in [0, 1, 2, 3]:
raise ValueError("Invalid optimization_level. Must be 0, 1, 2, or 3.")
coupling_map = CouplingMap(topology)
circuits = []
for i, qasm_str in enumerate(qasm_strings):
try:
circuit = qasm2_loads(qasm_str, custom_instructions=LEGACY_CUSTOM_INSTRUCTIONS)
circuits.append(circuit)
except Exception as e:
raise CompilationFailedException(f"Error loading QASM string at index {i}: {e}")
if not circuits:
print("Warning: No valid circuits were loaded.")
return []
transpiled_circuits = transpile(
circuits,
coupling_map=coupling_map,
basis_gates=basis_gates,
optimization_level=optimization_level
)
output_qasm_strings = []
for i, transpiled_circuit in enumerate(transpiled_circuits):
try:
output_qasm = qasm2_dumps(transpiled_circuit)
output_qasm_strings.append(output_qasm)
except Exception as e:
raise CompilationFailedException(f"Error dumping transpiled circuit at index {i} to QASM: {e}")
if single_circuit:
return output_qasm_strings[0]
else:
return output_qasm_strings
except CompilationFailedException as e:
raise e
except ImportError:
raise CompilationFailedException("Error: Qiskit is not installed. Please install it using 'pip install qiskit'")
except qiskit.exceptions.QiskitError as e:
raise CompilationFailedException(f"An error occurred during Qiskit operation: {e}")
except Exception as e:
raise CompilationFailedException(f"An unexpected error occurred: {e}")
[docs]
def transpile_originir(
originir_strings: List[str],
topology: List[Union[List[int], Tuple[int, int]]] = None,
optimization_level: int = 1,
basis_gates: Optional[List[str]] = None,
):
"""
使用指定的拓扑、基本门和优化级别编译一组 OriginIR 线路字符串。
Args:
originir_strings: 包含 OriginIR 线路描述的字符串列表。
topology: 定义硬件拓扑的耦合图列表。
例如: [[0, 1], [1, 2], [1, 3]] 表示 0<->1, 1<->2, 1<->3 的连接。
optimization_level: Qiskit transpile 的优化级别 (0 到 3)。
0: No optimization
1: Light optimization
2: Heavy optimization
3: Heaviest optimization
basis_gates: 用于编译的目标基本门集。如果为 None,则使用默认 ['cz', 'sx', 'rz']。
请确保您选择的门在 Qiskit 的标准库中或已被正确定义。
Returns:
一个字符串列表,包含编译后的 OriginIR 线路。
Raises:
ImportError: 如果 Qiskit 未安装。
QiskitError: 如果输入的 OriginIR 字符串无效或编译过程中发生错误。
ValueError: 如果优化级别无效。
"""
if not originir_strings:
return []
if isinstance(originir_strings, str):
originir_strings = [originir_strings]
single_circuit = True
else:
single_circuit = False
qasm_strs = []
for originir_str in originir_strings:
qasm_str = convert_oir_to_qasm(originir_str)
qasm_strs.append(qasm_str)
transpiled_qasm_strs = transpile_qasm(
qasm_strs,
topology=topology,
optimization_level=optimization_level,
basis_gates=basis_gates
)
output_originir_strs = []
for transpiled_qasm_str in transpiled_qasm_strs:
output_originir_str = convert_qasm_to_oir(transpiled_qasm_str)
output_originir_strs.append(output_originir_str)
if single_circuit:
return output_originir_strs[0]
else:
return output_originir_strs
# --- 示例用法 ---
if __name__ == "__main__":
# 1. 定义示例 OPENQASM 2.0 线路字符串列表
qasm_input_list = [
"""
OPENQASM 2.0;
include "qelib1.inc";
qreg q[3];
creg c[3];
h q[0];
cx q[0], q[1];
rz(pi/4) q[1];
cx q[1], q[2];
measure q[0] -> c[0];
measure q[1] -> c[1];
measure q[2] -> c[2];
""",
"""
OPENQASM 2.0;
include "qelib1.inc";
qreg q[2];
creg c[2];
h q[0];
cz q[0], q[1]; // 使用 CZ 门
sx q[1]; // 使用 SX 门
measure q -> c;
"""
]
# 2. 定义目标拓扑结构 (例如,一个简单的线性链)
# 0 -- 1 -- 2
custom_topology = [[0, 1], [1, 0], [1, 2], [2, 1]] # 需要双向连接
# 3. 调用包装函数
try:
print("--- Transpiling with optimization level 1 ---")
transpiled_qasm_list_opt1 = transpile_qasm(
qasm_strings=qasm_input_list,
topology=custom_topology,
optimization_level=1,
)
print("\n--- Transpiled QASM (Opt Level 1) ---")
for i, qasm_out in enumerate(transpiled_qasm_list_opt1):
print(f"--- Circuit {i+1} ---")
print(qasm_out)
print("-" * 20)
print("\n--- Transpiling with optimization level 3 ---")
transpiled_qasm_list_opt3 = transpile_qasm(
qasm_strings=qasm_input_list,
topology=custom_topology,
optimization_level=3 # 更高的优化级别
# 使用默认 basis_gates ['cz', 'sx', 'rz']
)
print("\n--- Transpiled QASM (Opt Level 3) ---")
for i, qasm_out in enumerate(transpiled_qasm_list_opt3):
print(f"--- Circuit {i+1} ---")
print(qasm_out)
print("-" * 20)
except Exception as e:
print(f"An error occurred during the example execution: {e}")