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__))