Beispiel #1
0
 def convert_to_instructions(self, stmt: Scope) -> list:
     if stmt.data == "block":
         instructions = []
         for s in stmt.children:
             instructions += self.convert_to_instructions(s)
         return instructions
     elif stmt.data == "function_call":
         cargs = [
             self.convert_classical_arg(c)
             for c in stmt.get_call_list().get_classical_arguments()
         ]
         qargs = [
             self.convert_quantum_arg(q)
             for q in stmt.get_call_list().get_quantum_arguments()
         ]
         # Is this in the standard library?
         if StandardLibrary.is_standard(stmt.get_name().name):
             return [
                 FunctionCall(
                     StandardLibrary.get_standard_name(
                         stmt.get_name().name), cargs, qargs)
             ]
         else:
             return [FunctionCall(stmt.get_name().name, cargs, qargs)]
     elif stmt.data == "if":
         arg1, arg2 = stmt.get_args()
         op = stmt.get_op().get_operation()
         arg1 = self.convert_classical_arg(arg1)
         arg2 = self.convert_classical_arg(arg2)
         comp = Comparison(arg1, arg2, op)
         sub_instructions = self.convert_to_instructions(stmt.get_block())
         return [IfInstruction(comp, sub_instructions)]
     elif stmt.data == "q_decl":
         name = stmt.get_name().name
         size = stmt.get_length()
         bits = stmt.get_bits()
         return [QuantumInitialization(name, size, bits)]
     elif stmt.data == "c_decl":
         name = stmt.get_name().name
         size = stmt.get_length()
         bits = stmt.get_bits()
         return [ClassicalInitialization(name, size, bits)]
     elif stmt.data == "measurement":
         expr = stmt.get_q_expr()
         r_name = stmt.get_r_name().name
         q_name = expr.get_name().name
         r_start = stmt.get_r_start().value
         if expr.data == "q_index":
             q_start = expr.get_pos()
             q_end = q_start
             return [
                 MeasurementInstruction(r_name, r_start, q_name, q_start,
                                        q_end)
             ]
         elif expr.data == "q_slice":
             q_start, q_end = expr.get_start_end()
             return [
                 MeasurementInstruction(r_name, r_start, q_name, q_start,
                                        q_end)
             ]
         else:
             raise Exception("Unimplemented")
     else:
         raise Exception("Unexpected statement type: " + str(stmt.__dict__))