A operação nativa do Bristlecone é a CZ, não os CNOTs. No entanto, você pode se transformar entre os dois com portões Hadamard, então essa é uma diferença trivial.
O Bristlecone pode executar uma CZ entre qualquer par adjacente de qubits em uma grade. Você pode ver a grade instalando cirq e imprimindo o dispositivo Bristlecone:
$ pip install cirq
$ python
>>> import cirq
>>> print(cirq.google.Bristlecone)
(0, 5)────(0, 6)
│ │
│ │
(1, 4)───(1, 5)────(1, 6)────(1, 7)
│ │ │ │
│ │ │ │
(2, 3)───(2, 4)───(2, 5)────(2, 6)────(2, 7)───(2, 8)
│ │ │ │ │ │
│ │ │ │ │ │
(3, 2)───(3, 3)───(3, 4)───(3, 5)────(3, 6)────(3, 7)───(3, 8)───(3, 9)
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
(4, 1)───(4, 2)───(4, 3)───(4, 4)───(4, 5)────(4, 6)────(4, 7)───(4, 8)───(4, 9)───(4, 10)
│ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │
(5, 0)───(5, 1)───(5, 2)───(5, 3)───(5, 4)───(5, 5)────(5, 6)────(5, 7)───(5, 8)───(5, 9)───(5, 10)───(5, 11)
│ │ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │
(6, 1)───(6, 2)───(6, 3)───(6, 4)───(6, 5)────(6, 6)────(6, 7)───(6, 8)───(6, 9)───(6, 10)
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
(7, 2)───(7, 3)───(7, 4)───(7, 5)────(7, 6)────(7, 7)───(7, 8)───(7, 9)
│ │ │ │ │ │
│ │ │ │ │ │
(8, 3)───(8, 4)───(8, 5)────(8, 6)────(8, 7)───(8, 8)
│ │ │ │
│ │ │ │
(9, 4)───(9, 5)────(9, 6)────(9, 7)
│ │
│ │
(10, 5)───(10, 6)
Aqui está como você pode obter um conjunto contendo as operações CZ permitidas:
qubits = cirq.google.Bristlecone.qubits
allowed = {cirq.CZ(a, b)
for a in qubits
for b in qubits
if a.is_adjacent(b)}
O conjunto possui 121 elementos, e é algo aleatório se você obtém CZ (x, y) ou CZ (y, x) no conjunto, então não incluirei uma impressão do conjunto aqui.
Uma restrição adicional a ter em mente é que você não pode executar duas CZs uma ao lado da outra ao mesmo tempo. O Cirq leva isso em consideração ao criar circuitos direcionados ao Bristlecone. Por exemplo:
import cirq
device = cirq.google.Bristlecone
a, b, c, d, e = device.col(6)[:5]
circuit = cirq.Circuit.from_ops(
cirq.CZ(a, b),
cirq.CZ(c, d),
cirq.CZ(a, b),
cirq.CZ(d, e),
device=device)
print(circuit)
# (0, 6): ───@───────@───
# │ │
# (1, 6): ───@───────@───
#
# (2, 6): ───────@───────
# │
# (3, 6): ───────@───@───
# │
# (4, 6): ───────────@───
As duas primeiras operações foram escalonadas porque são CZs adjacentes, mas as duas últimas não foram porque não são.