Skip to content

Commit 899da42

Browse files
MichaelBroughtonrht
authored andcommitted
Add metadata property for cirq_google devices. (quantumlib#4869)
Adds metadata properties to cirq_google devices. Part of quantumlib#4743 . Note for @dstrain115 and @verult : I don't expect these metadata properties to take this exact form forever and that we may end up changing things once we have a more firmed up plan for how DeviceSpec protos and serialization might change.
1 parent 6d74457 commit 899da42

File tree

6 files changed

+113
-1
lines changed

6 files changed

+113
-1
lines changed

cirq-google/cirq_google/devices/known_devices_test.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,14 @@
2121

2222

2323
def test_foxtail_qubits():
24-
with cirq.testing.assert_deprecated('Foxtail', deadline='v0.15'):
24+
with cirq.testing.assert_deprecated('Foxtail', deadline='v0.15', count=2):
2525
expected_qubits = []
2626
for i in range(0, 2):
2727
for j in range(0, 11):
2828
expected_qubits.append(cirq.GridQubit(i, j))
2929

3030
assert set(expected_qubits) == cirq_google.Foxtail.qubits
31+
assert len(cirq_google.Foxtail.metadata.qubit_pairs) == 31
3132

3233

3334
def test_foxtail_device_proto():
@@ -490,6 +491,22 @@ def test_sycamore_devices(device):
490491
assert device.duration_of(sqrt_iswap) == cirq.Duration(nanos=32)
491492

492493

494+
def test_sycamore_metadata():
495+
assert len(cirq_google.Sycamore.metadata.qubit_pairs) == 88
496+
assert len(cirq_google.Sycamore23.metadata.qubit_pairs) == 32
497+
assert cirq_google.Sycamore.metadata.gateset == cirq.Gateset(
498+
cirq.FSimGate,
499+
cirq.ISwapPowGate,
500+
cirq.PhasedXPowGate,
501+
cirq.XPowGate,
502+
cirq.YPowGate,
503+
cirq.ZPowGate,
504+
cirq.PhasedXZGate,
505+
cirq.MeasurementGate,
506+
cirq.WaitGate,
507+
)
508+
509+
493510
def test_sycamore_circuitop_device():
494511
circuitop_gateset = cirq_google.SerializableGateSet(
495512
gate_set_name='circuitop_gateset',

cirq-google/cirq_google/devices/serializable_device.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,25 @@ def __init__(
108108
"""
109109
self.qubits = qubits
110110
self.gate_definitions = gate_definitions
111+
self._metadata = cirq.GridDeviceMetadata(
112+
qubit_pairs=[
113+
(pair[0], pair[1])
114+
for gate_defs in gate_definitions.values()
115+
for gate_def in gate_defs
116+
if gate_def.number_of_qubits == 2
117+
for pair in gate_def.target_set
118+
if len(pair) == 2 and pair[0] < pair[1]
119+
],
120+
supported_gates=cirq.Gateset(
121+
*[g for g in gate_definitions.keys() if isinstance(g, (cirq.Gate, type(cirq.Gate)))]
122+
),
123+
gate_durations=None,
124+
)
125+
126+
@property
127+
def metadata(self) -> cirq.GridDeviceMetadata:
128+
"""Get metadata information for device."""
129+
return self._metadata
111130

112131
def qubit_set(self) -> FrozenSet[cirq.Qid]:
113132
return frozenset(self.qubits)

cirq-google/cirq_google/devices/serializable_device_test.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,35 @@ def test_repr_pretty(cycle, func):
7777
printer.text.assert_called_once_with(func(device))
7878

7979

80+
def test_metadata_correct():
81+
qubits = cirq.GridQubit.rect(2, 3, left=1, top=1)
82+
pairs = [
83+
(qubits[0], qubits[1]),
84+
(qubits[0], qubits[3]),
85+
(qubits[1], qubits[4]),
86+
(qubits[4], qubits[5]),
87+
]
88+
device_proto = cgdk.create_device_proto_for_qubits(
89+
qubits=qubits,
90+
pairs=pairs,
91+
gate_sets=[cg.FSIM_GATESET],
92+
)
93+
device = cgdk.SerializableDevice.from_proto(device_proto, gate_sets=[cg.FSIM_GATESET])
94+
assert device.metadata.qubit_pairs == frozenset(pairs)
95+
assert device.metadata.gateset == cirq.Gateset(
96+
cirq.FSimGate,
97+
cirq.ISwapPowGate,
98+
cirq.CZPowGate,
99+
cirq.PhasedXPowGate,
100+
cirq.XPowGate,
101+
cirq.YPowGate,
102+
cirq.ZPowGate,
103+
cirq.PhasedXZGate,
104+
cirq.MeasurementGate,
105+
cirq.WaitGate,
106+
)
107+
108+
80109
def test_gate_definition_equality():
81110
def1 = cg.devices.serializable_device._GateDefinition(
82111
duration=cirq.Duration(picos=4),

cirq-google/cirq_google/devices/xmon_device.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,23 @@ def __init__(
4545
self._exp_w_duration = cirq.Duration(exp_w_duration)
4646
self._exp_z_duration = cirq.Duration(exp_11_duration)
4747
self.qubits = frozenset(qubits)
48+
self._metadata = cirq.GridDeviceMetadata(
49+
[(q0, q1) for q0 in self.qubits for q1 in self.qubits if q0.is_adjacent(q1)],
50+
cirq.Gateset(
51+
cirq.CZPowGate,
52+
cirq.XPowGate,
53+
cirq.YPowGate,
54+
cirq.PhasedXPowGate,
55+
cirq.MeasurementGate,
56+
cirq.ZPowGate,
57+
),
58+
None,
59+
)
60+
61+
@property
62+
def metadata(self) -> cirq.GridDeviceMetadata:
63+
"""Return the metadata for this device"""
64+
return self._metadata
4865

4966
def qubit_set(self) -> FrozenSet[cirq.GridQubit]:
5067
return self.qubits

cirq-google/cirq_google/devices/xmon_device_test.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,35 @@ def qubits(self):
4444
raise NotImplementedError()
4545

4646

47+
@mock.patch.dict(os.environ, clear='CIRQ_TESTING')
48+
def test_device_metadata():
49+
d = square_device(3, 3)
50+
assert d.metadata.gateset == cirq.Gateset(
51+
cirq.CZPowGate,
52+
cirq.XPowGate,
53+
cirq.YPowGate,
54+
cirq.PhasedXPowGate,
55+
cirq.MeasurementGate,
56+
cirq.ZPowGate,
57+
)
58+
assert d.metadata.qubit_pairs == frozenset(
59+
{
60+
(cirq.GridQubit(0, 0), cirq.GridQubit(0, 1)),
61+
(cirq.GridQubit(0, 1), cirq.GridQubit(1, 1)),
62+
(cirq.GridQubit(2, 0), cirq.GridQubit(2, 1)),
63+
(cirq.GridQubit(0, 0), cirq.GridQubit(1, 0)),
64+
(cirq.GridQubit(0, 2), cirq.GridQubit(1, 2)),
65+
(cirq.GridQubit(1, 0), cirq.GridQubit(2, 0)),
66+
(cirq.GridQubit(1, 0), cirq.GridQubit(1, 1)),
67+
(cirq.GridQubit(1, 1), cirq.GridQubit(2, 1)),
68+
(cirq.GridQubit(1, 1), cirq.GridQubit(1, 2)),
69+
(cirq.GridQubit(0, 1), cirq.GridQubit(0, 2)),
70+
(cirq.GridQubit(2, 1), cirq.GridQubit(2, 2)),
71+
(cirq.GridQubit(1, 2), cirq.GridQubit(2, 2)),
72+
}
73+
)
74+
75+
4776
@mock.patch.dict(os.environ, clear='CIRQ_TESTING')
4877
def test_init():
4978
d = square_device(2, 2, holes=[cirq.GridQubit(1, 1)])

dev_tools/requirements/deps/pytest.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
pytest
44
pytest-asyncio
55
pytest-cov
6+
coverage<=6.2
67

78
# for parallel testing notebooks
89
pytest-xdist~=2.2.0

0 commit comments

Comments
 (0)