@@ -78,6 +78,135 @@ def test_wire_1q():
7878 constructed_method .print ()
7979
8080
81+ def test_parallel_wire_1q_application ():
82+
83+ stmts : list [ir .Statement ] = [
84+ # Create qubit register
85+ (n_qubits := as_int (4 )),
86+ (qreg := qasm2 .core .QRegNew (n_qubits = n_qubits .result )),
87+ # Get qubits out
88+ (idx0 := as_int (0 )),
89+ (q0 := qasm2 .core .QRegGet (reg = qreg .result , idx = idx0 .result )),
90+ (idx1 := as_int (1 )),
91+ (q1 := qasm2 .core .QRegGet (reg = qreg .result , idx = idx1 .result )),
92+ (idx2 := as_int (2 )),
93+ (q2 := qasm2 .core .QRegGet (reg = qreg .result , idx = idx2 .result )),
94+ (idx3 := as_int (3 )),
95+ (q3 := qasm2 .core .QRegGet (reg = qreg .result , idx = idx3 .result )),
96+ # Unwrap to get wires
97+ (w0 := squin .wire .Unwrap (qubit = q0 .result )),
98+ (w1 := squin .wire .Unwrap (qubit = q1 .result )),
99+ (w2 := squin .wire .Unwrap (qubit = q2 .result )),
100+ (w3 := squin .wire .Unwrap (qubit = q3 .result )),
101+ # Apply with stim semantics
102+ (h_op := squin .op .stmts .H ()),
103+ (
104+ app_res := squin .wire .Apply (
105+ h_op .result , w0 .result , w1 .result , w2 .result , w3 .result
106+ )
107+ ),
108+ # Wrap everything back
109+ (squin .wire .Wrap (app_res .results [0 ], q0 .result )),
110+ (squin .wire .Wrap (app_res .results [1 ], q1 .result )),
111+ (squin .wire .Wrap (app_res .results [2 ], q2 .result )),
112+ (squin .wire .Wrap (app_res .results [3 ], q3 .result )),
113+ (ret_none := func .ConstantNone ()),
114+ (func .Return (ret_none )),
115+ ]
116+
117+ constructed_method = gen_func_from_stmts (stmts )
118+
119+ constructed_method .print ()
120+
121+ squin_to_stim = squin_passes .SquinToStim (constructed_method .dialects )
122+ squin_to_stim (constructed_method )
123+
124+ constructed_method .print ()
125+
126+
127+ def test_parallel_qubit_1q_application ():
128+
129+ stmts : list [ir .Statement ] = [
130+ # Create qubit register
131+ (n_qubits := as_int (4 )),
132+ (qreg := qasm2 .core .QRegNew (n_qubits = n_qubits .result )),
133+ # Get qubits out
134+ (idx0 := as_int (0 )),
135+ (q0 := qasm2 .core .QRegGet (reg = qreg .result , idx = idx0 .result )),
136+ (idx1 := as_int (1 )),
137+ (q1 := qasm2 .core .QRegGet (reg = qreg .result , idx = idx1 .result )),
138+ (idx2 := as_int (2 )),
139+ (q2 := qasm2 .core .QRegGet (reg = qreg .result , idx = idx2 .result )),
140+ (idx3 := as_int (3 )),
141+ (q3 := qasm2 .core .QRegGet (reg = qreg .result , idx = idx3 .result )),
142+ # create ilist of qubits
143+ (q_list := ilist .New (values = (q0 .result , q1 .result , q2 .result , q3 .result ))),
144+ # Apply with stim semantics
145+ (h_op := squin .op .stmts .H ()),
146+ (app_res := squin .qubit .Apply (h_op .result , q_list .result )), # noqa: F841
147+ # Measure everything out
148+ (meas_res := squin .qubit .Measure (q_list .result )), # noqa: F841
149+ (ret_none := func .ConstantNone ()),
150+ (func .Return (ret_none )),
151+ ]
152+
153+ constructed_method = gen_func_from_stmts (stmts )
154+
155+ constructed_method .print ()
156+
157+ squin_to_stim = squin_passes .SquinToStim (constructed_method .dialects )
158+ squin_to_stim (constructed_method )
159+
160+ constructed_method .print ()
161+
162+
163+ def test_parallel_control_gate_wire_application ():
164+
165+ stmts : list [ir .Statement ] = [
166+ # Create qubit register
167+ (n_qubits := as_int (4 )),
168+ (qreg := qasm2 .core .QRegNew (n_qubits = n_qubits .result )),
169+ # Get qubits out
170+ (idx0 := as_int (0 )),
171+ (q0 := qasm2 .core .QRegGet (reg = qreg .result , idx = idx0 .result )),
172+ (idx1 := as_int (1 )),
173+ (q1 := qasm2 .core .QRegGet (reg = qreg .result , idx = idx1 .result )),
174+ (idx2 := as_int (2 )),
175+ (q2 := qasm2 .core .QRegGet (reg = qreg .result , idx = idx2 .result )),
176+ (idx3 := as_int (3 )),
177+ (q3 := qasm2 .core .QRegGet (reg = qreg .result , idx = idx3 .result )),
178+ # Unwrap to get wires
179+ (w0 := squin .wire .Unwrap (qubit = q0 .result )),
180+ (w1 := squin .wire .Unwrap (qubit = q1 .result )),
181+ (w2 := squin .wire .Unwrap (qubit = q2 .result )),
182+ (w3 := squin .wire .Unwrap (qubit = q3 .result )),
183+ # Create and apply CX gate
184+ (x_op := squin .op .stmts .X ()),
185+ (ctrl_x_op := squin .op .stmts .Control (x_op .result , n_controls = 1 )),
186+ (
187+ app_res := squin .wire .Apply (
188+ ctrl_x_op .result , w0 .result , w1 .result , w2 .result , w3 .result
189+ )
190+ ),
191+ # measure it all out
192+ (meas_res_0 := squin .wire .Measure (app_res .results [0 ])), # noqa: F841
193+ (meas_res_1 := squin .wire .Measure (app_res .results [1 ])), # noqa: F841
194+ (meas_res_2 := squin .wire .Measure (app_res .results [2 ])), # noqa: F841
195+ (meas_res_3 := squin .wire .Measure (app_res .results [3 ])), # noqa: F841
196+ (ret_none := func .ConstantNone ()),
197+ (func .Return (ret_none )),
198+ ]
199+
200+ constructed_method = gen_func_from_stmts (stmts )
201+
202+ constructed_method .print ()
203+
204+ squin_to_stim = squin_passes .SquinToStim (constructed_method .dialects )
205+ squin_to_stim (constructed_method )
206+
207+ constructed_method .print ()
208+
209+
81210def test_wire_control ():
82211
83212 stmts : list [ir .Statement ] = [
@@ -255,7 +384,10 @@ def test_wire_measure_and_reset():
255384 constructed_method .print ()
256385
257386
258- test_wire_measure_and_reset ()
387+ # test_wire_measure_and_reset()
259388# test_qubit_measure_and_reset()
260389# test_wire_reset()
261- # test_qubit_reset()
390+
391+ # test_parallel_qubit_1q_application()
392+ # test_parallel_wire_1q_application()
393+ test_parallel_control_gate_wire_application ()
0 commit comments