Ejemplo n.º 1
0
    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))
Ejemplo n.º 2
0
 def _quil_(self, formatter: 'protocols.QuilFormatter') -> Optional[str]:
     return protocols.quil(self.gate,
                           qubits=self.qubits,
                           formatter=formatter)
Ejemplo n.º 3
0
 def keep(op: 'cirq.Operation') -> bool:
     return protocols.quil(op, formatter=self.formatter) is not None