Cirq — Google's Quantum Framework
Definition
Cirq is Google Quantum AI's open-source Python framework for designing, simulating, and running quantum circuits on NISQ (Noisy Intermediate-Scale Quantum) devices. First released in 2018, Cirq gives developers fine-grained control over qubit placement, gate timing, and device calibration — making it the preferred tool for hardware-level quantum research and experiment design.
Usage and Benefits
Usage
Cirq's design philosophy is qubit-first: you explicitly define qubits, their grid topology, and the moments (time slices) in which gates operate.
Basic example — creating a Bell state:
import cirq
q0, q1 = cirq.LineQubit.range(2)
circuit = cirq.Circuit([
cirq.H(q0),
cirq.CNOT(q0, q1),
cirq.measure(q0, q1, key='result')
])
sim = cirq.Simulator()
result = sim.run(circuit, repetitions=1000)
print(result.histogram(key='result'))
Benefits
- Explicit device topology — Qubits are placed on actual hardware grids; gates respect nearest-neighbour connectivity.
- Pulse-level access —
cirq.pulsemodule lets you design qubit drive pulses for calibration experiments. - NISQ-first design — Built-in noise models, device calibrations, and approximate compilation.
- Google Sycamore access — Run on Google's 53- and 72-qubit Sycamore processors via Quantum Computing Service.
- Serialisation with ProtoBuf — Circuits can be serialised and shared across teams or stored for reproducibility.
- Integration with TensorFlow Quantum — Hybrid quantum-classical machine learning workflows.
Comparison to Qiskit
| Aspect | Qiskit | Cirq |
|---|---|---|
| Abstraction level | Circuit + algorithm | Circuit + device |
| Qubit model | Virtual (transpiler maps) | Physical (developer places) |
| Pulse control | Qiskit Pulse (separate) | Built-in (cirq.pulse) |
| Simulator | Aer (high-performance) | Built-in (NumPy-backed) |
| Education focus | Heavy (textbook, courses) | Moderate (tutorials) |
Use Cases
| Domain | Application | Why Cirq |
|---|---|---|
| Research | NISQ device characterisation | Explicit topology + pulse control |
| Optimisation | QAOA on grid topologies | Native grid qubit placement |
| Machine Learning | Hybrid QML with TensorFlow | TF Quantum integration |
| Error correction | Surface code simulation | Lattice definitions built-in |
| Hardware calibration | Gate fidelity measurement | Pulse-level access to Sycamore |
How to Use Cirq
Installation
pip install cirq
Noise Simulation
import cirq
from cirq import NoiseModel
class DepolarizingNoise(NoiseModel):
def noisy_moment(self, moment, system_qubits):
return [
moment,
cirq.depolarize(0.01).on_each(*system_qubits)
]
noisy_circuit = cirq.Circuit(NoiseModel().noisy_moment(...))
Running on Google Hardware (via QCS)
import cirq_google
engine = cirq_google.Engine(project_id="my-project")
processor = engine.get_processor("rainbow")
sampler = processor.get_sampler()
results = sampler.run(circuit, repetitions=5000)
Defining Custom Qubit Topologies
import cirq
# 3x3 grid
qubits = cirq.GridQubit.rect(3, 3)
circuit = cirq.Circuit(cirq.CZ(qubits[0], qubits[1]) for q in qubits)
Resources and References
- Official site: quantumai.google/cirq
- Documentation: quantumai.google/cirq/howtos
- GitHub: github.com/quantumlib/Cirq
- Google Quantum AI: quantumai.google
- Tutorials: quantumai.google/cirq/tutorials
- Key paper: Developers, "Cirq: A Python framework for creating, editing, and invoking quantum circuits" (2021), arXiv:2103.13475