quipper-demos-0.9.0.0: Quipper/Demos/BoxExample.hs
import Quipper
-- Unboxed version of subroutine
my_sub :: (Qubit, Qubit, Qubit) -> Circ (Qubit, Qubit, Qubit)
my_sub (a,b,c) = do
hadamard_at a `controlled` b
hadamard_at a `controlled` c
hadamard_at b `controlled` c
return (a,b,c)
-- Boxed version of subroutine
boxed_sub :: (Qubit, Qubit, Qubit) -> Circ (Qubit, Qubit, Qubit)
boxed_sub = box "my_sub" my_sub
-- Unboxed version of circuit
my_circuit :: [Qubit] -> Circ [Qubit]
my_circuit [] = return []
my_circuit [a] = return [a]
my_circuit [a,b] = return [a,b]
my_circuit (a:b:c:rest) = do
(a,b,c) <- my_sub (a,b,c)
x <- my_circuit (b:c:rest)
return (a:x)
-- Boxed version of circuit
my_circuit_boxed :: [Qubit] -> Circ [Qubit]
my_circuit_boxed [] = return []
my_circuit_boxed [a] = return [a]
my_circuit_boxed [a,b] = return [a,b]
my_circuit_boxed (a:b:c:rest) = do
(a,b,c) <- boxed_sub (a,b,c)
x <- my_circuit_boxed (b:c:rest)
return (a:x)
main = do
print_generic Preview my_circuit_boxed (replicate 6 qubit)