Hi !
I wanted to know if it is possible to compose circuits of different size in Pennylane.
For example I have two circuit, one of size 2 (the small one), and one of size 4 (the large one).
I want to construct the large one based on multiple repetition of the small one, but put on different wires.
@qml.qnode(dev) ##2-qubits circuit
def small_circuit(phi):
qml.RZ(- np.pi, wires=1)
qml.CNOT([1, 0])
return [qml.expval(qml.PauliZ(j)) for j in range(2)]
@qml.qnode(dev) ##4-qubits circuit
def circuit(phi):
#small_circuit(phi[0])(wires=0)
#small_circuit(phi[0])(wires=3)
# ...
return [qml.expval(qml.PauliZ(j)) for j in range(4)]
So that the large circuit is a composition of the small one.
How is it possible ?
Thank you very much
You make two devices:
dev4 = qml.device("default.qubit", wires=4)
dev2 = qml.device("default.qubit", wires=2)
Then make output from 4 qubit gate go to the 2 qubit gate twice. This sould work, unless you are worry about 2 vs 4 qubit entangelment.
Hey @Maelle_T! Welcome to the forum 
You can totally do this in PennyLane, but how I would recommend doing it is slightly different. You can make use of quantum functions (basically python functions that aren’t decorated with @qml.qnode).
Here’s an example:
import pennylane as qml
def quantum_function(wires):
qml.Hadamard(wires[0])
qml.RX(0.1, wires[1])
I can then use quantum_function inside QNodes!
dev = qml.qnode("default.qubit", wires=4)
@qml.qnode(dev)
def qnode():
quantum_function([0, 1])
quantum_function([2, 3])
return [qml.expval(qml.PauliZ(i)) for i in range(4)]
Essentially, you can think of quantum functions as building blocks just like PennyLane gates, layers, templates, etc., but you define them how you want!
Hope this helps!
How this is awesome
!!
Thank you very much for your help !
Awesome! Glad I could help
. If you don’t mind, could you mark my post as the solution to your question? It helps future people on the forum get the answer they need a little quicker 
Thank you!
Have a great day!
Thank you, I did not know that this was possible.