# 2026/04/17                                   A                                
# Joerg Gutschank                                                              
# full adder circuit can be found in                                           
# Feynman,R. P. (1996). Feynman Lectures on Computation. Boulder, Colorado: 
# Westview Press, p. 190, fig. 6.5
# and                                                                          
# Stolze, J. and D. Suter (2008). Quantum Computing, A short Course from   
# Theory to Experiment (2nd edition). Weinheim: Wiley-VHC, p. 80, fig. 6.3  
import os
import getpass
from qiskit import transpile
from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister
from iqm.qiskit_iqm import IQMProvider

token = getpass.getpass("input IQM API Token: ")
os.environ["IQM_TOKEN"] = token

provider = IQMProvider(
    url="https://resonance.meetiqm.com/",
    #quantum_computer="sirius"
    #quantum_computer="garnet"
    quantum_computer="emerald"
)

backend = provider.get_backend()

qubit_register = QuantumRegister(4, 'q')
bit_register = ClassicalRegister(2, 'c')
qcirc = QuantumCircuit(qubit_register, bit_register)

# setting the input values:
# applying Pauli-X to set a=1
qcirc.x(qubit_register[0])
# applying Pauli-X to set b=1
qcirc.x(qubit_register[1]) 

# applying quantum gates:
# Toffoli gate
qcirc.ccx(qubit_register[0], qubit_register[1], qubit_register[3])
# CNOT
qcirc.cx(qubit_register[0], qubit_register[1])
# Toffoli
qcirc.ccx(qubit_register[1], qubit_register[2], qubit_register[3])
# CNOT
qcirc.cx(qubit_register[1], qubit_register[2]) 

# measure qubits 2 and 3 and put results into classical bits 0 and 1
# to get the result as a two digit binary number
qcirc.measure(qubit_register[2],bit_register[0])
qcirc.measure(qubit_register[3],bit_register[1]) 

# visualize circuit on a text terminal, i.e. print
#print(qcirc)

# optimize the circuit for the backend hardware
qcirc_transpiled = transpile(qcirc, backend)
job = backend.run(qcirc_transpiled, shots=1024)

# print id
print("job id: ", job.job_id())
# get result
result = job.result()
counts = result.get_counts()

print("1 + 1 was measured 1024 times. The results are displayed as a binary number followed by the absolute frequency of the respective result.")
print(counts)
