Source code for qiskit_quantuminspire.cqasm
from typing import Any
from opensquirrel import CircuitBuilder
from opensquirrel.ir import Bit, Qubit
from opensquirrel.writer import writer
from qiskit import QuantumCircuit
from qiskit.circuit import CircuitInstruction
from qiskit_quantuminspire.mapping.instruction_mapping import InstructionMapping
_INSTRUCTION_MAPPING = InstructionMapping()
def _add_instruction(builder: CircuitBuilder, circuit_instruction: Any) -> None:
operation = circuit_instruction.operation
name = operation.name
params = [param for param in operation.params]
qubit_operands = [Qubit(qubit._index) for qubit in circuit_instruction.qubits]
clbit_operands = [Bit(clbit._index) for clbit in circuit_instruction.clbits]
try:
# Get the gate's method in the CircuitBuilder class, call with operands
# All of the builder's methods follow the same pattern, first the qubit operands, then parameters
# Only method with classical bit operands is measure, which does not have parameters
getattr(builder, _INSTRUCTION_MAPPING.qiskit_to_opensquirrel(name))(*qubit_operands, *clbit_operands, *params)
except KeyError:
raise NotImplementedError(
f"Unsupported instruction: {name}. Please edit your circuit or use Qiskit transpilation to support "
+ "your selected backend."
)
[docs]
def dumps(circuit: QuantumCircuit) -> str:
"""Return the cQASM representation of the circuit."""
builder = CircuitBuilder(circuit.num_qubits, circuit.num_clbits)
for circuit_instruction in circuit.data:
operation = circuit_instruction.operation
name = operation.name
if name == "delay":
if circuit_instruction.operation.unit != "dt":
raise NotImplementedError(
f"Unsupported delay unit {circuit_instruction.operation.unit} in: {circuit_instruction}. Only 'dt'"
+ " is supported."
)
if name == "barrier":
# Opensquirrel does not support multi-qubit barriers.
for qubit in circuit_instruction.qubits:
_add_instruction(builder, CircuitInstruction(operation=operation, qubits=[qubit]))
elif name == "asm":
getattr(builder, name)(*operation.params)
else:
_add_instruction(builder, circuit_instruction)
cqasm: str = writer.circuit_to_string(builder.to_circuit())
return cqasm