def _write_quil(self, output_func: Callable[[str], None]) -> None: output_func('# Created using Cirq.\n\n') if len(self.measurements) > 0: measurements_declared: Set[str] = set() for m in self.measurements: key = protocols.measurement_key(m) if key in measurements_declared: continue measurements_declared.add(key) output_func( f'DECLARE {self.measurement_id_map[key]} BIT[{len(m.qubits)}]\n' ) output_func('\n') def keep(op: 'cirq.Operation') -> bool: return protocols.quil(op, formatter=self.formatter) is not None def fallback(op): if len(op.qubits) not in [1, 2]: return NotImplemented mat = protocols.unitary(op, None) if mat is None: return NotImplemented # Following code is a safety measure # Could not find a gate that doesn't decompose into a gate # with a _quil_ implementation # coverage: ignore if len(op.qubits) == 1: return QuilOneQubitGate(mat).on(*op.qubits) return QuilTwoQubitGate(mat).on(*op.qubits) def on_stuck(bad_op): return ValueError(f'Cannot output operation as QUIL: {bad_op!r}') for main_op in self.operations: decomposed = protocols.decompose(main_op, keep=keep, fallback_decomposer=fallback, on_stuck_raise=on_stuck) for decomposed_op in decomposed: output_func( protocols.quil(decomposed_op, formatter=self.formatter))
def _quil_(self, formatter: 'protocols.QuilFormatter') -> Optional[str]: return protocols.quil(self.gate, qubits=self.qubits, formatter=formatter)
def keep(op: 'cirq.Operation') -> bool: return protocols.quil(op, formatter=self.formatter) is not None