# Why won't Qiskit ccx gate accept registers?

In Qiskit, they have the concept of a Toffoli gate (ccx). However, the following code throws an error:

from qiskit import QuantumCircuit, ClassicalRegister, QuantumRegister
from qiskit import execute, Aer

q1 = QuantumRegister(2)
qctrl = QuantumRegister(1)
c = ClassicalRegister(2)
qc = QuantumCircuit(q1, qctrl, c)

qc.x(q1)
qc.ccx(q1[0], q1[1], qctrl)
qc.measure(q1, c)

backend_sim = Aer.get_backend('qasm_simulator')
job_sim = execute(qc, backend_sim)
result_sim = job_sim.result()
print(result_sim.get_counts(qc))


According to my knowledge and research, this should produce the output 111 but instead I get an error message:

qiskit.qiskiterror.QiskitError: "QuantumRegister(1, 'q0') is not a tuple. A qubit should be formated as a tuple."

This seems like a bug with Qiskit to me. Am I wrong? And if so, how can I fix my code?

It is not a bug. Qiskit makes the difference between quantum registers and quantum bits. In your case, qctrl is a QuantumRegister (as shown in your error) whereas the ccx gate expect a qubit.

For Qiskit, a qubit is defined as a Tuple of a QuantumRegister and an index. You can get a qubit from a QuantumRegister by using the indexing notation: qtrl[0] represents the first qubit (and the only one) of the QuantumRegister qctrl.

In summary, replace

qc.ccx(q1[0], q1[1], qctrl)


by

qc.ccx(q1[0], q1[1], qctrl[0])


and your issue should be fixed.

Nelimee has provided the answer, but there's another point to note that is too big for a comment.

In Qiskit, it is possible to pass registers to gates instead of qubits. You do this in your example with

qc.x(q1)


This applied x to both qubits in the register q1, and so is equivalent to

for q in range(2):
qc.x(q1[n])


This should be regarded as a kind of shortcut notation. Providing single qubits is the 'proper way' to do it, and using registers is something that can be done to make your code a bit more elegant.

Like any shortcut, it should be used with care. Specifically, you have to remain consistent. So the problem in your case was supplying a single qubit for two arguments, and a single qubit register for the last. If you'd used single qubits for all, as in Nelimee's answer, then it would work. Using single qubit registers for all would also work. But mixing and matching does not.