fromtypingimportAnyfromopensquirrelimportCircuitBuilderfromopensquirrel.irimportBit,Qubitfromopensquirrel.writerimportwriterfromqiskitimportQuantumCircuitfromqiskit.circuitimportCircuitInstructionfromqiskit_quantuminspire.mapping.instruction_mappingimportInstructionMapping_INSTRUCTION_MAPPING=InstructionMapping()def_add_instruction(builder:CircuitBuilder,circuit_instruction:Any)->None:operation=circuit_instruction.operationname=operation.nameparams=[paramforparaminoperation.params]qubit_operands=[Qubit(qubit._index)forqubitincircuit_instruction.qubits]clbit_operands=[Bit(clbit._index)forclbitincircuit_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 parametersgetattr(builder,_INSTRUCTION_MAPPING.qiskit_to_opensquirrel(name))(*qubit_operands,*clbit_operands,*params)exceptKeyError:raiseNotImplementedError(f"Unsupported instruction: {name}. Please edit your circuit or use Qiskit transpilation to support "+"your selected backend.")
[docs]defdumps(circuit:QuantumCircuit)->str:"""Return the cQASM representation of the circuit."""builder=CircuitBuilder(circuit.num_qubits,circuit.num_clbits)forcircuit_instructionincircuit.data:operation=circuit_instruction.operationname=operation.nameifname=="delay":ifcircuit_instruction.operation.unit!="dt":raiseNotImplementedError(f"Unsupported delay unit {circuit_instruction.operation.unit} in: {circuit_instruction}. Only 'dt'"+" is supported.")ifname=="barrier":# Opensquirrel does not support multi-qubit barriers.forqubitincircuit_instruction.qubits:_add_instruction(builder,CircuitInstruction(operation=operation,qubits=[qubit]))else:_add_instruction(builder,circuit_instruction)cqasm:str=writer.circuit_to_string(builder.to_circuit())returncqasm