microsoft/qdk

Public

mirrored from https://github.com/microsoft/qdkAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
brlackey/neutral-atom-models

Branches

Tags

  • No tags available.
0Branches0Tags
Go to file
Add file
Code

Clone

HTTPS

Download ZIP

source/pip/tests-integration/devices/test_atom_optimize.py

1988lines · modecode

1# Copyright (c) Microsoft Corporation.
2# Licensed under the MIT License.
3
4import pytest
5from expecttest import assert_expected_inline
6
7import qsharp
8from qsharp._device._atom._optimize import (
9 PruneUnusedFunctions,
10 OptimizeSingleQubitGates,
11)
12
13try:
14 import pyqir
15
16 PYQIR_AVAILABLE = True
17except ImportError:
18 PYQIR_AVAILABLE = False
19
20SKIP_REASON = "PyQIR is not available"
21
22
23@pytest.mark.skipif(not PYQIR_AVAILABLE, reason=SKIP_REASON)
24def test_prune_init_handled_by_unused_functions_pass() -> None:
25 qsharp.init(target_profile=qsharp.TargetProfile.Adaptive_RIF)
26 qir = qsharp.compile(
27 """
28 {
29 use q = Qubit();
30 X(q);
31 }
32 """
33 )
34
35 module = pyqir.Module.from_ir(pyqir.Context(), str(qir))
36 PruneUnusedFunctions().run(module)
37
38 assert_expected_inline(
39 str(module),
40 """\
41
42@0 = internal constant [4 x i8] c"0_t\\00"
43
44define i64 @ENTRYPOINT__main() #0 {
45block_0:
46 call void @__quantum__qis__x__body(ptr null)
47 call void @__quantum__rt__tuple_record_output(i64 0, ptr @0)
48 ret i64 0
49}
50
51declare void @__quantum__qis__x__body(ptr)
52
53declare void @__quantum__rt__tuple_record_output(i64, ptr)
54
55attributes #0 = { "entry_point" "output_labeling_schema" "qir_profiles"="adaptive_profile" "required_num_qubits"="1" "required_num_results"="0" }
56
57!llvm.module.flags = !{!0, !1, !2, !3, !4, !6}
58
59!0 = !{i32 1, !"qir_major_version", i32 1}
60!1 = !{i32 7, !"qir_minor_version", i32 0}
61!2 = !{i32 1, !"dynamic_qubit_management", i1 false}
62!3 = !{i32 1, !"dynamic_result_management", i1 false}
63!4 = !{i32 5, !"int_computations", !5}
64!5 = !{!"i64"}
65!6 = !{i32 5, !"float_computations", !7}
66!7 = !{!"double"}
67""",
68 )
69
70
71@pytest.mark.skipif(not PYQIR_AVAILABLE, reason=SKIP_REASON)
72def test_optimize_removes_h_h_gates() -> None:
73 qsharp.init(target_profile=qsharp.TargetProfile.Adaptive_RIF)
74 qir = qsharp.compile(
75 """
76 {
77 use q = Qubit();
78 H(q);
79 H(q);
80 X(q);
81 H(q);
82 H(q);
83 }
84 """
85 )
86
87 module = pyqir.Module.from_ir(pyqir.Context(), str(qir))
88 OptimizeSingleQubitGates().run(module)
89
90 assert_expected_inline(
91 str(module),
92 """\
93
94@0 = internal constant [4 x i8] c"0_t\\00"
95
96define i64 @ENTRYPOINT__main() #0 {
97block_0:
98 call void @__quantum__rt__initialize(ptr null)
99 call void @__quantum__qis__x__body(ptr null)
100 call void @__quantum__rt__tuple_record_output(i64 0, ptr @0)
101 ret i64 0
102}
103
104declare void @__quantum__rt__initialize(ptr)
105
106declare void @__quantum__qis__h__body(ptr)
107
108declare void @__quantum__qis__x__body(ptr)
109
110declare void @__quantum__rt__tuple_record_output(i64, ptr)
111
112declare void @__quantum__qis__sx__body(ptr)
113
114declare void @__quantum__qis__mresetz__body(ptr, ptr)
115
116attributes #0 = { "entry_point" "output_labeling_schema" "qir_profiles"="adaptive_profile" "required_num_qubits"="1" "required_num_results"="0" }
117
118!llvm.module.flags = !{!0, !1, !2, !3, !4, !6}
119
120!0 = !{i32 1, !"qir_major_version", i32 1}
121!1 = !{i32 7, !"qir_minor_version", i32 0}
122!2 = !{i32 1, !"dynamic_qubit_management", i1 false}
123!3 = !{i32 1, !"dynamic_result_management", i1 false}
124!4 = !{i32 5, !"int_computations", !5}
125!5 = !{!"i64"}
126!6 = !{i32 5, !"float_computations", !7}
127!7 = !{!"double"}
128""",
129 )
130
131
132@pytest.mark.skipif(not PYQIR_AVAILABLE, reason=SKIP_REASON)
133def test_optimize_removes_s_sadj_gates() -> None:
134 qsharp.init(target_profile=qsharp.TargetProfile.Adaptive_RIF)
135 qir = qsharp.compile(
136 """
137 {
138 use q = Qubit();
139 S(q);
140 Adjoint S(q);
141 X(q);
142 Adjoint S(q);
143 S(q);
144 }
145 """
146 )
147
148 module = pyqir.Module.from_ir(pyqir.Context(), str(qir))
149 OptimizeSingleQubitGates().run(module)
150
151 assert_expected_inline(
152 str(module),
153 """\
154
155@0 = internal constant [4 x i8] c"0_t\\00"
156
157define i64 @ENTRYPOINT__main() #0 {
158block_0:
159 call void @__quantum__rt__initialize(ptr null)
160 call void @__quantum__qis__x__body(ptr null)
161 call void @__quantum__rt__tuple_record_output(i64 0, ptr @0)
162 ret i64 0
163}
164
165declare void @__quantum__rt__initialize(ptr)
166
167declare void @__quantum__qis__s__body(ptr)
168
169declare void @__quantum__qis__s__adj(ptr)
170
171declare void @__quantum__qis__x__body(ptr)
172
173declare void @__quantum__rt__tuple_record_output(i64, ptr)
174
175declare void @__quantum__qis__sx__body(ptr)
176
177declare void @__quantum__qis__mresetz__body(ptr, ptr)
178
179attributes #0 = { "entry_point" "output_labeling_schema" "qir_profiles"="adaptive_profile" "required_num_qubits"="1" "required_num_results"="0" }
180
181!llvm.module.flags = !{!0, !1, !2, !3, !4, !6}
182
183!0 = !{i32 1, !"qir_major_version", i32 1}
184!1 = !{i32 7, !"qir_minor_version", i32 0}
185!2 = !{i32 1, !"dynamic_qubit_management", i1 false}
186!3 = !{i32 1, !"dynamic_result_management", i1 false}
187!4 = !{i32 5, !"int_computations", !5}
188!5 = !{!"i64"}
189!6 = !{i32 5, !"float_computations", !7}
190!7 = !{!"double"}
191""",
192 )
193
194
195@pytest.mark.skipif(not PYQIR_AVAILABLE, reason=SKIP_REASON)
196def test_optimize_removes_t_tadj_gates() -> None:
197 qsharp.init(target_profile=qsharp.TargetProfile.Adaptive_RIF)
198 qir = qsharp.compile(
199 """
200 {
201 use q = Qubit();
202 T(q);
203 Adjoint T(q);
204 X(q);
205 Adjoint T(q);
206 T(q);
207 }
208 """
209 )
210
211 module = pyqir.Module.from_ir(pyqir.Context(), str(qir))
212 OptimizeSingleQubitGates().run(module)
213
214 assert_expected_inline(
215 str(module),
216 """\
217
218@0 = internal constant [4 x i8] c"0_t\\00"
219
220define i64 @ENTRYPOINT__main() #0 {
221block_0:
222 call void @__quantum__rt__initialize(ptr null)
223 call void @__quantum__qis__x__body(ptr null)
224 call void @__quantum__rt__tuple_record_output(i64 0, ptr @0)
225 ret i64 0
226}
227
228declare void @__quantum__rt__initialize(ptr)
229
230declare void @__quantum__qis__t__body(ptr)
231
232declare void @__quantum__qis__t__adj(ptr)
233
234declare void @__quantum__qis__x__body(ptr)
235
236declare void @__quantum__rt__tuple_record_output(i64, ptr)
237
238declare void @__quantum__qis__sx__body(ptr)
239
240declare void @__quantum__qis__mresetz__body(ptr, ptr)
241
242attributes #0 = { "entry_point" "output_labeling_schema" "qir_profiles"="adaptive_profile" "required_num_qubits"="1" "required_num_results"="0" }
243
244!llvm.module.flags = !{!0, !1, !2, !3, !4, !6}
245
246!0 = !{i32 1, !"qir_major_version", i32 1}
247!1 = !{i32 7, !"qir_minor_version", i32 0}
248!2 = !{i32 1, !"dynamic_qubit_management", i1 false}
249!3 = !{i32 1, !"dynamic_result_management", i1 false}
250!4 = !{i32 5, !"int_computations", !5}
251!5 = !{!"i64"}
252!6 = !{i32 5, !"float_computations", !7}
253!7 = !{!"double"}
254""",
255 )
256
257
258@pytest.mark.skipif(not PYQIR_AVAILABLE, reason=SKIP_REASON)
259def test_optimize_combines_h_s_h_gates() -> None:
260 qsharp.init(target_profile=qsharp.TargetProfile.Adaptive_RIF)
261 qir = qsharp.compile(
262 """
263 {
264 use q = Qubit();
265 H(q);
266 S(q);
267 H(q);
268 }
269 """
270 )
271
272 module = pyqir.Module.from_ir(pyqir.Context(), str(qir))
273 OptimizeSingleQubitGates().run(module)
274
275 assert_expected_inline(
276 str(module),
277 """\
278
279@0 = internal constant [4 x i8] c"0_t\\00"
280
281define i64 @ENTRYPOINT__main() #0 {
282block_0:
283 call void @__quantum__rt__initialize(ptr null)
284 call void @__quantum__qis__sx__body(ptr null)
285 call void @__quantum__rt__tuple_record_output(i64 0, ptr @0)
286 ret i64 0
287}
288
289declare void @__quantum__rt__initialize(ptr)
290
291declare void @__quantum__qis__h__body(ptr)
292
293declare void @__quantum__qis__s__body(ptr)
294
295declare void @__quantum__rt__tuple_record_output(i64, ptr)
296
297declare void @__quantum__qis__sx__body(ptr)
298
299declare void @__quantum__qis__mresetz__body(ptr, ptr)
300
301attributes #0 = { "entry_point" "output_labeling_schema" "qir_profiles"="adaptive_profile" "required_num_qubits"="1" "required_num_results"="0" }
302
303!llvm.module.flags = !{!0, !1, !2, !3, !4, !6}
304
305!0 = !{i32 1, !"qir_major_version", i32 1}
306!1 = !{i32 7, !"qir_minor_version", i32 0}
307!2 = !{i32 1, !"dynamic_qubit_management", i1 false}
308!3 = !{i32 1, !"dynamic_result_management", i1 false}
309!4 = !{i32 5, !"int_computations", !5}
310!5 = !{!"i64"}
311!6 = !{i32 5, !"float_computations", !7}
312!7 = !{!"double"}
313""",
314 )
315
316
317@pytest.mark.skipif(not PYQIR_AVAILABLE, reason=SKIP_REASON)
318def test_optimize_removes_x_x_gates() -> None:
319 qsharp.init(target_profile=qsharp.TargetProfile.Adaptive_RIF)
320 qir = qsharp.compile(
321 """
322 {
323 use q = Qubit();
324 X(q);
325 X(q);
326 Z(q);
327 X(q);
328 X(q);
329 }
330 """
331 )
332
333 module = pyqir.Module.from_ir(pyqir.Context(), str(qir))
334 OptimizeSingleQubitGates().run(module)
335
336 assert_expected_inline(
337 str(module),
338 """\
339
340@0 = internal constant [4 x i8] c"0_t\\00"
341
342define i64 @ENTRYPOINT__main() #0 {
343block_0:
344 call void @__quantum__rt__initialize(ptr null)
345 call void @__quantum__qis__z__body(ptr null)
346 call void @__quantum__rt__tuple_record_output(i64 0, ptr @0)
347 ret i64 0
348}
349
350declare void @__quantum__rt__initialize(ptr)
351
352declare void @__quantum__qis__x__body(ptr)
353
354declare void @__quantum__qis__z__body(ptr)
355
356declare void @__quantum__rt__tuple_record_output(i64, ptr)
357
358declare void @__quantum__qis__sx__body(ptr)
359
360declare void @__quantum__qis__mresetz__body(ptr, ptr)
361
362attributes #0 = { "entry_point" "output_labeling_schema" "qir_profiles"="adaptive_profile" "required_num_qubits"="1" "required_num_results"="0" }
363
364!llvm.module.flags = !{!0, !1, !2, !3, !4, !6}
365
366!0 = !{i32 1, !"qir_major_version", i32 1}
367!1 = !{i32 7, !"qir_minor_version", i32 0}
368!2 = !{i32 1, !"dynamic_qubit_management", i1 false}
369!3 = !{i32 1, !"dynamic_result_management", i1 false}
370!4 = !{i32 5, !"int_computations", !5}
371!5 = !{!"i64"}
372!6 = !{i32 5, !"float_computations", !7}
373!7 = !{!"double"}
374""",
375 )
376
377
378@pytest.mark.skipif(not PYQIR_AVAILABLE, reason=SKIP_REASON)
379def test_optimize_removes_y_y_gates() -> None:
380 qsharp.init(target_profile=qsharp.TargetProfile.Adaptive_RIF)
381 qir = qsharp.compile(
382 """
383 {
384 use q = Qubit();
385 Y(q);
386 Y(q);
387 Z(q);
388 Y(q);
389 Y(q);
390 }
391 """
392 )
393
394 module = pyqir.Module.from_ir(pyqir.Context(), str(qir))
395 OptimizeSingleQubitGates().run(module)
396
397 assert_expected_inline(
398 str(module),
399 """\
400
401@0 = internal constant [4 x i8] c"0_t\\00"
402
403define i64 @ENTRYPOINT__main() #0 {
404block_0:
405 call void @__quantum__rt__initialize(ptr null)
406 call void @__quantum__qis__z__body(ptr null)
407 call void @__quantum__rt__tuple_record_output(i64 0, ptr @0)
408 ret i64 0
409}
410
411declare void @__quantum__rt__initialize(ptr)
412
413declare void @__quantum__qis__y__body(ptr)
414
415declare void @__quantum__qis__z__body(ptr)
416
417declare void @__quantum__rt__tuple_record_output(i64, ptr)
418
419declare void @__quantum__qis__sx__body(ptr)
420
421declare void @__quantum__qis__mresetz__body(ptr, ptr)
422
423attributes #0 = { "entry_point" "output_labeling_schema" "qir_profiles"="adaptive_profile" "required_num_qubits"="1" "required_num_results"="0" }
424
425!llvm.module.flags = !{!0, !1, !2, !3, !4, !6}
426
427!0 = !{i32 1, !"qir_major_version", i32 1}
428!1 = !{i32 7, !"qir_minor_version", i32 0}
429!2 = !{i32 1, !"dynamic_qubit_management", i1 false}
430!3 = !{i32 1, !"dynamic_result_management", i1 false}
431!4 = !{i32 5, !"int_computations", !5}
432!5 = !{!"i64"}
433!6 = !{i32 5, !"float_computations", !7}
434!7 = !{!"double"}
435""",
436 )
437
438
439@pytest.mark.skipif(not PYQIR_AVAILABLE, reason=SKIP_REASON)
440def test_optimize_removes_z_z_gates() -> None:
441 qsharp.init(target_profile=qsharp.TargetProfile.Adaptive_RIF)
442 qir = qsharp.compile(
443 """
444 {
445 use q = Qubit();
446 Z(q);
447 Z(q);
448 X(q);
449 Z(q);
450 Z(q);
451 }
452 """
453 )
454
455 module = pyqir.Module.from_ir(pyqir.Context(), str(qir))
456 OptimizeSingleQubitGates().run(module)
457
458 assert_expected_inline(
459 str(module),
460 """\
461
462@0 = internal constant [4 x i8] c"0_t\\00"
463
464define i64 @ENTRYPOINT__main() #0 {
465block_0:
466 call void @__quantum__rt__initialize(ptr null)
467 call void @__quantum__qis__x__body(ptr null)
468 call void @__quantum__rt__tuple_record_output(i64 0, ptr @0)
469 ret i64 0
470}
471
472declare void @__quantum__rt__initialize(ptr)
473
474declare void @__quantum__qis__z__body(ptr)
475
476declare void @__quantum__qis__x__body(ptr)
477
478declare void @__quantum__rt__tuple_record_output(i64, ptr)
479
480declare void @__quantum__qis__sx__body(ptr)
481
482declare void @__quantum__qis__mresetz__body(ptr, ptr)
483
484attributes #0 = { "entry_point" "output_labeling_schema" "qir_profiles"="adaptive_profile" "required_num_qubits"="1" "required_num_results"="0" }
485
486!llvm.module.flags = !{!0, !1, !2, !3, !4, !6}
487
488!0 = !{i32 1, !"qir_major_version", i32 1}
489!1 = !{i32 7, !"qir_minor_version", i32 0}
490!2 = !{i32 1, !"dynamic_qubit_management", i1 false}
491!3 = !{i32 1, !"dynamic_result_management", i1 false}
492!4 = !{i32 5, !"int_computations", !5}
493!5 = !{!"i64"}
494!6 = !{i32 5, !"float_computations", !7}
495!7 = !{!"double"}
496""",
497 )
498
499
500@pytest.mark.skipif(not PYQIR_AVAILABLE, reason=SKIP_REASON)
501def test_optimize_combines_rx_rotation_angles() -> None:
502 qsharp.init(target_profile=qsharp.TargetProfile.Adaptive_RIF)
503 qir = qsharp.compile(
504 """
505 {
506 import Std.Math.PI;
507 use q = Qubit();
508 Rx(PI() / 2.0, q);
509 Rx(PI() / 2.0, q);
510 X(q);
511 Rx(PI() / -2.0, q);
512 Rx(PI() / 2.0, q);
513 Y(q);
514 Rx(PI(), q);
515 Rx(PI(), q);
516 }
517 """
518 )
519
520 module = pyqir.Module.from_ir(pyqir.Context(), str(qir))
521 OptimizeSingleQubitGates().run(module)
522
523 assert_expected_inline(
524 str(module),
525 """\
526
527@0 = internal constant [4 x i8] c"0_t\\00"
528
529define i64 @ENTRYPOINT__main() #0 {
530block_0:
531 call void @__quantum__rt__initialize(ptr null)
532 call void @__quantum__qis__rx__body(double 0x400921FB54442D18, ptr null)
533 call void @__quantum__qis__x__body(ptr null)
534 call void @__quantum__qis__y__body(ptr null)
535 call void @__quantum__rt__tuple_record_output(i64 0, ptr @0)
536 ret i64 0
537}
538
539declare void @__quantum__rt__initialize(ptr)
540
541declare void @__quantum__qis__rx__body(double, ptr)
542
543declare void @__quantum__qis__x__body(ptr)
544
545declare void @__quantum__qis__y__body(ptr)
546
547declare void @__quantum__rt__tuple_record_output(i64, ptr)
548
549declare void @__quantum__qis__sx__body(ptr)
550
551declare void @__quantum__qis__mresetz__body(ptr, ptr)
552
553attributes #0 = { "entry_point" "output_labeling_schema" "qir_profiles"="adaptive_profile" "required_num_qubits"="1" "required_num_results"="0" }
554
555!llvm.module.flags = !{!0, !1, !2, !3, !4, !6}
556
557!0 = !{i32 1, !"qir_major_version", i32 1}
558!1 = !{i32 7, !"qir_minor_version", i32 0}
559!2 = !{i32 1, !"dynamic_qubit_management", i1 false}
560!3 = !{i32 1, !"dynamic_result_management", i1 false}
561!4 = !{i32 5, !"int_computations", !5}
562!5 = !{!"i64"}
563!6 = !{i32 5, !"float_computations", !7}
564!7 = !{!"double"}
565""",
566 )
567
568
569@pytest.mark.skipif(not PYQIR_AVAILABLE, reason=SKIP_REASON)
570def test_optimize_combines_ry_rotation_angles() -> None:
571 qsharp.init(target_profile=qsharp.TargetProfile.Adaptive_RIF)
572 qir = qsharp.compile(
573 """
574 {
575 import Std.Math.PI;
576 use q = Qubit();
577 Ry(PI() / 2.0, q);
578 Ry(PI() / 2.0, q);
579 X(q);
580 Ry(PI() / -2.0, q);
581 Ry(PI() / 2.0, q);
582 Y(q);
583 Ry(PI(), q);
584 Ry(PI(), q);
585 }
586 """
587 )
588
589 module = pyqir.Module.from_ir(pyqir.Context(), str(qir))
590 OptimizeSingleQubitGates().run(module)
591
592 assert_expected_inline(
593 str(module),
594 """\
595
596@0 = internal constant [4 x i8] c"0_t\\00"
597
598define i64 @ENTRYPOINT__main() #0 {
599block_0:
600 call void @__quantum__rt__initialize(ptr null)
601 call void @__quantum__qis__ry__body(double 0x400921FB54442D18, ptr null)
602 call void @__quantum__qis__x__body(ptr null)
603 call void @__quantum__qis__y__body(ptr null)
604 call void @__quantum__rt__tuple_record_output(i64 0, ptr @0)
605 ret i64 0
606}
607
608declare void @__quantum__rt__initialize(ptr)
609
610declare void @__quantum__qis__ry__body(double, ptr)
611
612declare void @__quantum__qis__x__body(ptr)
613
614declare void @__quantum__qis__y__body(ptr)
615
616declare void @__quantum__rt__tuple_record_output(i64, ptr)
617
618declare void @__quantum__qis__sx__body(ptr)
619
620declare void @__quantum__qis__mresetz__body(ptr, ptr)
621
622attributes #0 = { "entry_point" "output_labeling_schema" "qir_profiles"="adaptive_profile" "required_num_qubits"="1" "required_num_results"="0" }
623
624!llvm.module.flags = !{!0, !1, !2, !3, !4, !6}
625
626!0 = !{i32 1, !"qir_major_version", i32 1}
627!1 = !{i32 7, !"qir_minor_version", i32 0}
628!2 = !{i32 1, !"dynamic_qubit_management", i1 false}
629!3 = !{i32 1, !"dynamic_result_management", i1 false}
630!4 = !{i32 5, !"int_computations", !5}
631!5 = !{!"i64"}
632!6 = !{i32 5, !"float_computations", !7}
633!7 = !{!"double"}
634""",
635 )
636
637
638@pytest.mark.skipif(not PYQIR_AVAILABLE, reason=SKIP_REASON)
639def test_optimize_combines_rz_rotation_angles() -> None:
640 qsharp.init(target_profile=qsharp.TargetProfile.Adaptive_RIF)
641 qir = qsharp.compile(
642 """
643 {
644 import Std.Math.PI;
645 use q = Qubit();
646 Rz(PI() / 2.0, q);
647 Rz(PI() / 2.0, q);
648 X(q);
649 Rz(PI() / -2.0, q);
650 Rz(PI() / 2.0, q);
651 Y(q);
652 Rz(PI(), q);
653 Rz(PI(), q);
654 }
655 """
656 )
657
658 module = pyqir.Module.from_ir(pyqir.Context(), str(qir))
659 OptimizeSingleQubitGates().run(module)
660
661 assert_expected_inline(
662 str(module),
663 """\
664
665@0 = internal constant [4 x i8] c"0_t\\00"
666
667define i64 @ENTRYPOINT__main() #0 {
668block_0:
669 call void @__quantum__rt__initialize(ptr null)
670 call void @__quantum__qis__rz__body(double 0x400921FB54442D18, ptr null)
671 call void @__quantum__qis__x__body(ptr null)
672 call void @__quantum__qis__y__body(ptr null)
673 call void @__quantum__rt__tuple_record_output(i64 0, ptr @0)
674 ret i64 0
675}
676
677declare void @__quantum__rt__initialize(ptr)
678
679declare void @__quantum__qis__rz__body(double, ptr)
680
681declare void @__quantum__qis__x__body(ptr)
682
683declare void @__quantum__qis__y__body(ptr)
684
685declare void @__quantum__rt__tuple_record_output(i64, ptr)
686
687declare void @__quantum__qis__sx__body(ptr)
688
689declare void @__quantum__qis__mresetz__body(ptr, ptr)
690
691attributes #0 = { "entry_point" "output_labeling_schema" "qir_profiles"="adaptive_profile" "required_num_qubits"="1" "required_num_results"="0" }
692
693!llvm.module.flags = !{!0, !1, !2, !3, !4, !6}
694
695!0 = !{i32 1, !"qir_major_version", i32 1}
696!1 = !{i32 7, !"qir_minor_version", i32 0}
697!2 = !{i32 1, !"dynamic_qubit_management", i1 false}
698!3 = !{i32 1, !"dynamic_result_management", i1 false}
699!4 = !{i32 5, !"int_computations", !5}
700!5 = !{!"i64"}
701!6 = !{i32 5, !"float_computations", !7}
702!7 = !{!"double"}
703""",
704 )
705
706
707@pytest.mark.skipif(not PYQIR_AVAILABLE, reason=SKIP_REASON)
708def test_optimize_removes_adjoint_gates_after_removing_other_adjoint_gates() -> None:
709 qsharp.init(target_profile=qsharp.TargetProfile.Adaptive_RIF)
710 qir = qsharp.compile(
711 """
712 {
713 use q = Qubit();
714 S(q);
715 X(q);
716 H(q);
717
718 H(q);
719 X(q);
720 Adjoint S(q);
721 }
722 """
723 )
724
725 module = pyqir.Module.from_ir(pyqir.Context(), str(qir))
726 OptimizeSingleQubitGates().run(module)
727
728 assert_expected_inline(
729 str(module),
730 """\
731
732@0 = internal constant [4 x i8] c"0_t\\00"
733
734define i64 @ENTRYPOINT__main() #0 {
735block_0:
736 call void @__quantum__rt__initialize(ptr null)
737 call void @__quantum__rt__tuple_record_output(i64 0, ptr @0)
738 ret i64 0
739}
740
741declare void @__quantum__rt__initialize(ptr)
742
743declare void @__quantum__qis__s__body(ptr)
744
745declare void @__quantum__qis__x__body(ptr)
746
747declare void @__quantum__qis__h__body(ptr)
748
749declare void @__quantum__qis__s__adj(ptr)
750
751declare void @__quantum__rt__tuple_record_output(i64, ptr)
752
753declare void @__quantum__qis__sx__body(ptr)
754
755declare void @__quantum__qis__mresetz__body(ptr, ptr)
756
757attributes #0 = { "entry_point" "output_labeling_schema" "qir_profiles"="adaptive_profile" "required_num_qubits"="1" "required_num_results"="0" }
758
759!llvm.module.flags = !{!0, !1, !2, !3, !4, !6}
760
761!0 = !{i32 1, !"qir_major_version", i32 1}
762!1 = !{i32 7, !"qir_minor_version", i32 0}
763!2 = !{i32 1, !"dynamic_qubit_management", i1 false}
764!3 = !{i32 1, !"dynamic_result_management", i1 false}
765!4 = !{i32 5, !"int_computations", !5}
766!5 = !{!"i64"}
767!6 = !{i32 5, !"float_computations", !7}
768!7 = !{!"double"}
769""",
770 )
771
772
773@pytest.mark.skipif(not PYQIR_AVAILABLE, reason=SKIP_REASON)
774def test_optimize_leaves_gates_with_intervening_gates() -> None:
775 qsharp.init(target_profile=qsharp.TargetProfile.Adaptive_RIF)
776 qir = qsharp.compile(
777 """
778 {
779 use q = Qubit();
780 H(q);
781 S(q);
782 Adjoint S(q);
783 X(q);
784 H(q);
785 }
786 """
787 )
788
789 module = pyqir.Module.from_ir(pyqir.Context(), str(qir))
790 OptimizeSingleQubitGates().run(module)
791
792 assert_expected_inline(
793 str(module),
794 """\
795
796@0 = internal constant [4 x i8] c"0_t\\00"
797
798define i64 @ENTRYPOINT__main() #0 {
799block_0:
800 call void @__quantum__rt__initialize(ptr null)
801 call void @__quantum__qis__h__body(ptr null)
802 call void @__quantum__qis__x__body(ptr null)
803 call void @__quantum__qis__h__body(ptr null)
804 call void @__quantum__rt__tuple_record_output(i64 0, ptr @0)
805 ret i64 0
806}
807
808declare void @__quantum__rt__initialize(ptr)
809
810declare void @__quantum__qis__h__body(ptr)
811
812declare void @__quantum__qis__s__body(ptr)
813
814declare void @__quantum__qis__s__adj(ptr)
815
816declare void @__quantum__qis__x__body(ptr)
817
818declare void @__quantum__rt__tuple_record_output(i64, ptr)
819
820declare void @__quantum__qis__sx__body(ptr)
821
822declare void @__quantum__qis__mresetz__body(ptr, ptr)
823
824attributes #0 = { "entry_point" "output_labeling_schema" "qir_profiles"="adaptive_profile" "required_num_qubits"="1" "required_num_results"="0" }
825
826!llvm.module.flags = !{!0, !1, !2, !3, !4, !6}
827
828!0 = !{i32 1, !"qir_major_version", i32 1}
829!1 = !{i32 7, !"qir_minor_version", i32 0}
830!2 = !{i32 1, !"dynamic_qubit_management", i1 false}
831!3 = !{i32 1, !"dynamic_result_management", i1 false}
832!4 = !{i32 5, !"int_computations", !5}
833!5 = !{!"i64"}
834!6 = !{i32 5, !"float_computations", !7}
835!7 = !{!"double"}
836""",
837 )
838
839
840@pytest.mark.skipif(not PYQIR_AVAILABLE, reason=SKIP_REASON)
841def test_optimize_treats_rxx_as_barrier() -> None:
842 qsharp.init(target_profile=qsharp.TargetProfile.Adaptive_RIF)
843 qir = qsharp.compile(
844 """
845 {
846 use q1 = Qubit();
847 use q2 = Qubit();
848 X(q1);
849 Rxx(0.5, q1, q2);
850 X(q1);
851 }
852 """
853 )
854
855 module = pyqir.Module.from_ir(pyqir.Context(), str(qir))
856 OptimizeSingleQubitGates().run(module)
857
858 assert_expected_inline(
859 str(module),
860 """\
861
862@0 = internal constant [4 x i8] c"0_t\\00"
863
864define i64 @ENTRYPOINT__main() #0 {
865block_0:
866 call void @__quantum__rt__initialize(ptr null)
867 call void @__quantum__qis__x__body(ptr null)
868 call void @__quantum__qis__rxx__body(double 5.000000e-01, ptr null, ptr inttoptr (i64 1 to ptr))
869 call void @__quantum__qis__x__body(ptr null)
870 call void @__quantum__rt__tuple_record_output(i64 0, ptr @0)
871 ret i64 0
872}
873
874declare void @__quantum__rt__initialize(ptr)
875
876declare void @__quantum__qis__x__body(ptr)
877
878declare void @__quantum__qis__rxx__body(double, ptr, ptr)
879
880declare void @__quantum__rt__tuple_record_output(i64, ptr)
881
882declare void @__quantum__qis__sx__body(ptr)
883
884declare void @__quantum__qis__mresetz__body(ptr, ptr)
885
886attributes #0 = { "entry_point" "output_labeling_schema" "qir_profiles"="adaptive_profile" "required_num_qubits"="2" "required_num_results"="0" }
887
888!llvm.module.flags = !{!0, !1, !2, !3, !4, !6}
889
890!0 = !{i32 1, !"qir_major_version", i32 1}
891!1 = !{i32 7, !"qir_minor_version", i32 0}
892!2 = !{i32 1, !"dynamic_qubit_management", i1 false}
893!3 = !{i32 1, !"dynamic_result_management", i1 false}
894!4 = !{i32 5, !"int_computations", !5}
895!5 = !{!"i64"}
896!6 = !{i32 5, !"float_computations", !7}
897!7 = !{!"double"}
898""",
899 )
900
901
902@pytest.mark.skipif(not PYQIR_AVAILABLE, reason=SKIP_REASON)
903def test_optimize_treats_ryy_as_barrier() -> None:
904 qsharp.init(target_profile=qsharp.TargetProfile.Adaptive_RIF)
905 qir = qsharp.compile(
906 """
907 {
908 use q1 = Qubit();
909 use q2 = Qubit();
910 X(q1);
911 Ryy(0.5, q1, q2);
912 X(q1);
913 }
914 """
915 )
916
917 module = pyqir.Module.from_ir(pyqir.Context(), str(qir))
918 OptimizeSingleQubitGates().run(module)
919
920 assert_expected_inline(
921 str(module),
922 """\
923
924@0 = internal constant [4 x i8] c"0_t\\00"
925
926define i64 @ENTRYPOINT__main() #0 {
927block_0:
928 call void @__quantum__rt__initialize(ptr null)
929 call void @__quantum__qis__x__body(ptr null)
930 call void @__quantum__qis__ryy__body(double 5.000000e-01, ptr null, ptr inttoptr (i64 1 to ptr))
931 call void @__quantum__qis__x__body(ptr null)
932 call void @__quantum__rt__tuple_record_output(i64 0, ptr @0)
933 ret i64 0
934}
935
936declare void @__quantum__rt__initialize(ptr)
937
938declare void @__quantum__qis__x__body(ptr)
939
940declare void @__quantum__qis__ryy__body(double, ptr, ptr)
941
942declare void @__quantum__rt__tuple_record_output(i64, ptr)
943
944declare void @__quantum__qis__sx__body(ptr)
945
946declare void @__quantum__qis__mresetz__body(ptr, ptr)
947
948attributes #0 = { "entry_point" "output_labeling_schema" "qir_profiles"="adaptive_profile" "required_num_qubits"="2" "required_num_results"="0" }
949
950!llvm.module.flags = !{!0, !1, !2, !3, !4, !6}
951
952!0 = !{i32 1, !"qir_major_version", i32 1}
953!1 = !{i32 7, !"qir_minor_version", i32 0}
954!2 = !{i32 1, !"dynamic_qubit_management", i1 false}
955!3 = !{i32 1, !"dynamic_result_management", i1 false}
956!4 = !{i32 5, !"int_computations", !5}
957!5 = !{!"i64"}
958!6 = !{i32 5, !"float_computations", !7}
959!7 = !{!"double"}
960""",
961 )
962
963
964@pytest.mark.skipif(not PYQIR_AVAILABLE, reason=SKIP_REASON)
965def test_optimize_treats_rzz_as_barrier() -> None:
966 qsharp.init(target_profile=qsharp.TargetProfile.Adaptive_RIF)
967 qir = qsharp.compile(
968 """
969 {
970 use q1 = Qubit();
971 use q2 = Qubit();
972 X(q1);
973 Rzz(0.5, q1, q2);
974 X(q1);
975 }
976 """
977 )
978
979 module = pyqir.Module.from_ir(pyqir.Context(), str(qir))
980 OptimizeSingleQubitGates().run(module)
981
982 assert_expected_inline(
983 str(module),
984 """\
985
986@0 = internal constant [4 x i8] c"0_t\\00"
987
988define i64 @ENTRYPOINT__main() #0 {
989block_0:
990 call void @__quantum__rt__initialize(ptr null)
991 call void @__quantum__qis__x__body(ptr null)
992 call void @__quantum__qis__rzz__body(double 5.000000e-01, ptr null, ptr inttoptr (i64 1 to ptr))
993 call void @__quantum__qis__x__body(ptr null)
994 call void @__quantum__rt__tuple_record_output(i64 0, ptr @0)
995 ret i64 0
996}
997
998declare void @__quantum__rt__initialize(ptr)
999
1000declare void @__quantum__qis__x__body(ptr)
1001
1002declare void @__quantum__qis__rzz__body(double, ptr, ptr)
1003
1004declare void @__quantum__rt__tuple_record_output(i64, ptr)
1005
1006declare void @__quantum__qis__sx__body(ptr)
1007
1008declare void @__quantum__qis__mresetz__body(ptr, ptr)
1009
1010attributes #0 = { "entry_point" "output_labeling_schema" "qir_profiles"="adaptive_profile" "required_num_qubits"="2" "required_num_results"="0" }
1011
1012!llvm.module.flags = !{!0, !1, !2, !3, !4, !6}
1013
1014!0 = !{i32 1, !"qir_major_version", i32 1}
1015!1 = !{i32 7, !"qir_minor_version", i32 0}
1016!2 = !{i32 1, !"dynamic_qubit_management", i1 false}
1017!3 = !{i32 1, !"dynamic_result_management", i1 false}
1018!4 = !{i32 5, !"int_computations", !5}
1019!5 = !{!"i64"}
1020!6 = !{i32 5, !"float_computations", !7}
1021!7 = !{!"double"}
1022""",
1023 )
1024
1025
1026@pytest.mark.skipif(not PYQIR_AVAILABLE, reason=SKIP_REASON)
1027def test_optimize_treats_ccx_as_barrier() -> None:
1028 qsharp.init(target_profile=qsharp.TargetProfile.Adaptive_RIF)
1029 qir = qsharp.compile(
1030 """
1031 {
1032 use q1 = Qubit();
1033 use q2 = Qubit();
1034 use q3 = Qubit();
1035 X(q1);
1036 CCNOT(q1, q2, q3);
1037 X(q1);
1038 }
1039 """
1040 )
1041
1042 module = pyqir.Module.from_ir(pyqir.Context(), str(qir))
1043 OptimizeSingleQubitGates().run(module)
1044
1045 assert_expected_inline(
1046 str(module),
1047 """\
1048
1049@0 = internal constant [4 x i8] c"0_t\\00"
1050
1051define i64 @ENTRYPOINT__main() #0 {
1052block_0:
1053 call void @__quantum__rt__initialize(ptr null)
1054 call void @__quantum__qis__x__body(ptr null)
1055 call void @__quantum__qis__ccx__body(ptr null, ptr inttoptr (i64 1 to ptr), ptr inttoptr (i64 2 to ptr))
1056 call void @__quantum__qis__x__body(ptr null)
1057 call void @__quantum__rt__tuple_record_output(i64 0, ptr @0)
1058 ret i64 0
1059}
1060
1061declare void @__quantum__rt__initialize(ptr)
1062
1063declare void @__quantum__qis__x__body(ptr)
1064
1065declare void @__quantum__qis__ccx__body(ptr, ptr, ptr)
1066
1067declare void @__quantum__rt__tuple_record_output(i64, ptr)
1068
1069declare void @__quantum__qis__sx__body(ptr)
1070
1071declare void @__quantum__qis__mresetz__body(ptr, ptr)
1072
1073attributes #0 = { "entry_point" "output_labeling_schema" "qir_profiles"="adaptive_profile" "required_num_qubits"="3" "required_num_results"="0" }
1074
1075!llvm.module.flags = !{!0, !1, !2, !3, !4, !6}
1076
1077!0 = !{i32 1, !"qir_major_version", i32 1}
1078!1 = !{i32 7, !"qir_minor_version", i32 0}
1079!2 = !{i32 1, !"dynamic_qubit_management", i1 false}
1080!3 = !{i32 1, !"dynamic_result_management", i1 false}
1081!4 = !{i32 5, !"int_computations", !5}
1082!5 = !{!"i64"}
1083!6 = !{i32 5, !"float_computations", !7}
1084!7 = !{!"double"}
1085""",
1086 )
1087
1088
1089@pytest.mark.skipif(not PYQIR_AVAILABLE, reason=SKIP_REASON)
1090def test_optimize_treats_cx_as_barrier() -> None:
1091 qsharp.init(target_profile=qsharp.TargetProfile.Adaptive_RIF)
1092 qir = qsharp.compile(
1093 """
1094 {
1095 use q1 = Qubit();
1096 use q2 = Qubit();
1097 X(q1);
1098 CX(q1, q2);
1099 X(q1);
1100 }
1101 """
1102 )
1103
1104 module = pyqir.Module.from_ir(pyqir.Context(), str(qir))
1105 OptimizeSingleQubitGates().run(module)
1106
1107 assert_expected_inline(
1108 str(module),
1109 """\
1110
1111@0 = internal constant [4 x i8] c"0_t\\00"
1112
1113define i64 @ENTRYPOINT__main() #0 {
1114block_0:
1115 call void @__quantum__rt__initialize(ptr null)
1116 call void @__quantum__qis__x__body(ptr null)
1117 call void @__quantum__qis__cx__body(ptr null, ptr inttoptr (i64 1 to ptr))
1118 call void @__quantum__qis__x__body(ptr null)
1119 call void @__quantum__rt__tuple_record_output(i64 0, ptr @0)
1120 ret i64 0
1121}
1122
1123declare void @__quantum__rt__initialize(ptr)
1124
1125declare void @__quantum__qis__x__body(ptr)
1126
1127declare void @__quantum__qis__cx__body(ptr, ptr)
1128
1129declare void @__quantum__rt__tuple_record_output(i64, ptr)
1130
1131declare void @__quantum__qis__sx__body(ptr)
1132
1133declare void @__quantum__qis__mresetz__body(ptr, ptr)
1134
1135attributes #0 = { "entry_point" "output_labeling_schema" "qir_profiles"="adaptive_profile" "required_num_qubits"="2" "required_num_results"="0" }
1136
1137!llvm.module.flags = !{!0, !1, !2, !3, !4, !6}
1138
1139!0 = !{i32 1, !"qir_major_version", i32 1}
1140!1 = !{i32 7, !"qir_minor_version", i32 0}
1141!2 = !{i32 1, !"dynamic_qubit_management", i1 false}
1142!3 = !{i32 1, !"dynamic_result_management", i1 false}
1143!4 = !{i32 5, !"int_computations", !5}
1144!5 = !{!"i64"}
1145!6 = !{i32 5, !"float_computations", !7}
1146!7 = !{!"double"}
1147""",
1148 )
1149
1150
1151@pytest.mark.skipif(not PYQIR_AVAILABLE, reason=SKIP_REASON)
1152def test_optimize_treats_cy_as_barrier() -> None:
1153 qsharp.init(target_profile=qsharp.TargetProfile.Adaptive_RIF)
1154 qir = qsharp.compile(
1155 """
1156 {
1157 use q1 = Qubit();
1158 use q2 = Qubit();
1159 X(q1);
1160 CY(q1, q2);
1161 X(q1);
1162 }
1163 """
1164 )
1165
1166 module = pyqir.Module.from_ir(pyqir.Context(), str(qir))
1167 OptimizeSingleQubitGates().run(module)
1168
1169 assert_expected_inline(
1170 str(module),
1171 """\
1172
1173@0 = internal constant [4 x i8] c"0_t\\00"
1174
1175define i64 @ENTRYPOINT__main() #0 {
1176block_0:
1177 call void @__quantum__rt__initialize(ptr null)
1178 call void @__quantum__qis__x__body(ptr null)
1179 call void @__quantum__qis__cy__body(ptr null, ptr inttoptr (i64 1 to ptr))
1180 call void @__quantum__qis__x__body(ptr null)
1181 call void @__quantum__rt__tuple_record_output(i64 0, ptr @0)
1182 ret i64 0
1183}
1184
1185declare void @__quantum__rt__initialize(ptr)
1186
1187declare void @__quantum__qis__x__body(ptr)
1188
1189declare void @__quantum__qis__cy__body(ptr, ptr)
1190
1191declare void @__quantum__rt__tuple_record_output(i64, ptr)
1192
1193declare void @__quantum__qis__sx__body(ptr)
1194
1195declare void @__quantum__qis__mresetz__body(ptr, ptr)
1196
1197attributes #0 = { "entry_point" "output_labeling_schema" "qir_profiles"="adaptive_profile" "required_num_qubits"="2" "required_num_results"="0" }
1198
1199!llvm.module.flags = !{!0, !1, !2, !3, !4, !6}
1200
1201!0 = !{i32 1, !"qir_major_version", i32 1}
1202!1 = !{i32 7, !"qir_minor_version", i32 0}
1203!2 = !{i32 1, !"dynamic_qubit_management", i1 false}
1204!3 = !{i32 1, !"dynamic_result_management", i1 false}
1205!4 = !{i32 5, !"int_computations", !5}
1206!5 = !{!"i64"}
1207!6 = !{i32 5, !"float_computations", !7}
1208!7 = !{!"double"}
1209""",
1210 )
1211
1212
1213@pytest.mark.skipif(not PYQIR_AVAILABLE, reason=SKIP_REASON)
1214def test_optimize_treats_cz_as_barrier() -> None:
1215 qsharp.init(target_profile=qsharp.TargetProfile.Adaptive_RIF)
1216 qir = qsharp.compile(
1217 """
1218 {
1219 use q1 = Qubit();
1220 use q2 = Qubit();
1221 X(q1);
1222 CZ(q1, q2);
1223 X(q1);
1224 }
1225 """
1226 )
1227
1228 module = pyqir.Module.from_ir(pyqir.Context(), str(qir))
1229 OptimizeSingleQubitGates().run(module)
1230
1231 assert_expected_inline(
1232 str(module),
1233 """\
1234
1235@0 = internal constant [4 x i8] c"0_t\\00"
1236
1237define i64 @ENTRYPOINT__main() #0 {
1238block_0:
1239 call void @__quantum__rt__initialize(ptr null)
1240 call void @__quantum__qis__x__body(ptr null)
1241 call void @__quantum__qis__cz__body(ptr null, ptr inttoptr (i64 1 to ptr))
1242 call void @__quantum__qis__x__body(ptr null)
1243 call void @__quantum__rt__tuple_record_output(i64 0, ptr @0)
1244 ret i64 0
1245}
1246
1247declare void @__quantum__rt__initialize(ptr)
1248
1249declare void @__quantum__qis__x__body(ptr)
1250
1251declare void @__quantum__qis__cz__body(ptr, ptr)
1252
1253declare void @__quantum__rt__tuple_record_output(i64, ptr)
1254
1255declare void @__quantum__qis__sx__body(ptr)
1256
1257declare void @__quantum__qis__mresetz__body(ptr, ptr)
1258
1259attributes #0 = { "entry_point" "output_labeling_schema" "qir_profiles"="adaptive_profile" "required_num_qubits"="2" "required_num_results"="0" }
1260
1261!llvm.module.flags = !{!0, !1, !2, !3, !4, !6}
1262
1263!0 = !{i32 1, !"qir_major_version", i32 1}
1264!1 = !{i32 7, !"qir_minor_version", i32 0}
1265!2 = !{i32 1, !"dynamic_qubit_management", i1 false}
1266!3 = !{i32 1, !"dynamic_result_management", i1 false}
1267!4 = !{i32 5, !"int_computations", !5}
1268!5 = !{!"i64"}
1269!6 = !{i32 5, !"float_computations", !7}
1270!7 = !{!"double"}
1271""",
1272 )
1273
1274
1275@pytest.mark.skipif(not PYQIR_AVAILABLE, reason=SKIP_REASON)
1276def test_optimize_treats_swap_as_barrier() -> None:
1277 qsharp.init(target_profile=qsharp.TargetProfile.Adaptive_RIF)
1278 qir = qsharp.compile(
1279 """
1280 {
1281 use q1 = Qubit();
1282 use q2 = Qubit();
1283 X(q1);
1284 SWAP(q1, q2);
1285 X(q1);
1286 }
1287 """
1288 )
1289
1290 module = pyqir.Module.from_ir(pyqir.Context(), str(qir))
1291 OptimizeSingleQubitGates().run(module)
1292
1293 assert_expected_inline(
1294 str(module),
1295 """\
1296
1297@0 = internal constant [4 x i8] c"0_t\\00"
1298
1299define i64 @ENTRYPOINT__main() #0 {
1300block_0:
1301 call void @__quantum__rt__initialize(ptr null)
1302 call void @__quantum__qis__x__body(ptr null)
1303 call void @__quantum__qis__swap__body(ptr null, ptr inttoptr (i64 1 to ptr))
1304 call void @__quantum__qis__x__body(ptr null)
1305 call void @__quantum__rt__tuple_record_output(i64 0, ptr @0)
1306 ret i64 0
1307}
1308
1309declare void @__quantum__rt__initialize(ptr)
1310
1311declare void @__quantum__qis__x__body(ptr)
1312
1313declare void @__quantum__qis__swap__body(ptr, ptr)
1314
1315declare void @__quantum__rt__tuple_record_output(i64, ptr)
1316
1317declare void @__quantum__qis__sx__body(ptr)
1318
1319declare void @__quantum__qis__mresetz__body(ptr, ptr)
1320
1321attributes #0 = { "entry_point" "output_labeling_schema" "qir_profiles"="adaptive_profile" "required_num_qubits"="2" "required_num_results"="0" }
1322
1323!llvm.module.flags = !{!0, !1, !2, !3, !4, !6}
1324
1325!0 = !{i32 1, !"qir_major_version", i32 1}
1326!1 = !{i32 7, !"qir_minor_version", i32 0}
1327!2 = !{i32 1, !"dynamic_qubit_management", i1 false}
1328!3 = !{i32 1, !"dynamic_result_management", i1 false}
1329!4 = !{i32 5, !"int_computations", !5}
1330!5 = !{!"i64"}
1331!6 = !{i32 5, !"float_computations", !7}
1332!7 = !{!"double"}
1333""",
1334 )
1335
1336
1337@pytest.mark.skipif(not PYQIR_AVAILABLE, reason=SKIP_REASON)
1338def test_optimize_treats_m_as_barrier() -> None:
1339 qsharp.init(target_profile=qsharp.TargetProfile.Adaptive_RIF)
1340 qir = qsharp.compile(
1341 """
1342 {
1343 use q = Qubit();
1344 X(q);
1345 M(q);
1346 X(q);
1347 }
1348 """
1349 )
1350
1351 module = pyqir.Module.from_ir(pyqir.Context(), str(qir))
1352 OptimizeSingleQubitGates().run(module)
1353
1354 assert_expected_inline(
1355 str(module),
1356 """\
1357
1358@0 = internal constant [4 x i8] c"0_t\\00"
1359
1360define i64 @ENTRYPOINT__main() #0 {
1361block_0:
1362 call void @__quantum__rt__initialize(ptr null)
1363 call void @__quantum__qis__x__body(ptr null)
1364 call void @__quantum__qis__m__body(ptr null, ptr null)
1365 call void @__quantum__qis__x__body(ptr null)
1366 call void @__quantum__rt__tuple_record_output(i64 0, ptr @0)
1367 ret i64 0
1368}
1369
1370declare void @__quantum__rt__initialize(ptr)
1371
1372declare void @__quantum__qis__x__body(ptr)
1373
1374declare void @__quantum__qis__m__body(ptr, ptr) #1
1375
1376declare void @__quantum__rt__tuple_record_output(i64, ptr)
1377
1378declare void @__quantum__qis__sx__body(ptr)
1379
1380declare void @__quantum__qis__mresetz__body(ptr, ptr)
1381
1382attributes #0 = { "entry_point" "output_labeling_schema" "qir_profiles"="adaptive_profile" "required_num_qubits"="1" "required_num_results"="1" }
1383attributes #1 = { "irreversible" }
1384
1385!llvm.module.flags = !{!0, !1, !2, !3, !4, !6}
1386
1387!0 = !{i32 1, !"qir_major_version", i32 1}
1388!1 = !{i32 7, !"qir_minor_version", i32 0}
1389!2 = !{i32 1, !"dynamic_qubit_management", i1 false}
1390!3 = !{i32 1, !"dynamic_result_management", i1 false}
1391!4 = !{i32 5, !"int_computations", !5}
1392!5 = !{!"i64"}
1393!6 = !{i32 5, !"float_computations", !7}
1394!7 = !{!"double"}
1395""",
1396 )
1397
1398
1399@pytest.mark.skipif(not PYQIR_AVAILABLE, reason=SKIP_REASON)
1400def test_optimize_treats_mresetz_as_barrier() -> None:
1401 qsharp.init(target_profile=qsharp.TargetProfile.Adaptive_RIF)
1402 qir = qsharp.compile(
1403 """
1404 {
1405 use q = Qubit();
1406 X(q);
1407 MResetZ(q);
1408 X(q);
1409 }
1410 """
1411 )
1412
1413 module = pyqir.Module.from_ir(pyqir.Context(), str(qir))
1414 OptimizeSingleQubitGates().run(module)
1415
1416 assert_expected_inline(
1417 str(module),
1418 """\
1419
1420@0 = internal constant [4 x i8] c"0_t\\00"
1421
1422define i64 @ENTRYPOINT__main() #0 {
1423block_0:
1424 call void @__quantum__rt__initialize(ptr null)
1425 call void @__quantum__qis__x__body(ptr null)
1426 call void @__quantum__qis__mresetz__body(ptr null, ptr null)
1427 call void @__quantum__qis__x__body(ptr null)
1428 call void @__quantum__rt__tuple_record_output(i64 0, ptr @0)
1429 ret i64 0
1430}
1431
1432declare void @__quantum__rt__initialize(ptr)
1433
1434declare void @__quantum__qis__x__body(ptr)
1435
1436declare void @__quantum__qis__mresetz__body(ptr, ptr) #1
1437
1438declare void @__quantum__rt__tuple_record_output(i64, ptr)
1439
1440declare void @__quantum__qis__sx__body(ptr)
1441
1442attributes #0 = { "entry_point" "output_labeling_schema" "qir_profiles"="adaptive_profile" "required_num_qubits"="1" "required_num_results"="1" }
1443attributes #1 = { "irreversible" }
1444
1445!llvm.module.flags = !{!0, !1, !2, !3, !4, !6}
1446
1447!0 = !{i32 1, !"qir_major_version", i32 1}
1448!1 = !{i32 7, !"qir_minor_version", i32 0}
1449!2 = !{i32 1, !"dynamic_qubit_management", i1 false}
1450!3 = !{i32 1, !"dynamic_result_management", i1 false}
1451!4 = !{i32 5, !"int_computations", !5}
1452!5 = !{!"i64"}
1453!6 = !{i32 5, !"float_computations", !7}
1454!7 = !{!"double"}
1455""",
1456 )
1457
1458
1459@pytest.mark.skipif(not PYQIR_AVAILABLE, reason=SKIP_REASON)
1460def test_optimize_treats_reset_as_barrier() -> None:
1461 qsharp.init(target_profile=qsharp.TargetProfile.Adaptive_RIF)
1462 qir = qsharp.compile(
1463 """
1464 {
1465 use q = Qubit();
1466 X(q);
1467 Reset(q);
1468 X(q);
1469 }
1470 """
1471 )
1472
1473 module = pyqir.Module.from_ir(pyqir.Context(), str(qir))
1474 OptimizeSingleQubitGates().run(module)
1475
1476 assert_expected_inline(
1477 str(module),
1478 """\
1479
1480@0 = internal constant [4 x i8] c"0_t\\00"
1481
1482define i64 @ENTRYPOINT__main() #0 {
1483block_0:
1484 call void @__quantum__rt__initialize(ptr null)
1485 call void @__quantum__qis__x__body(ptr null)
1486 call void @__quantum__qis__reset__body(ptr null)
1487 call void @__quantum__qis__x__body(ptr null)
1488 call void @__quantum__rt__tuple_record_output(i64 0, ptr @0)
1489 ret i64 0
1490}
1491
1492declare void @__quantum__rt__initialize(ptr)
1493
1494declare void @__quantum__qis__x__body(ptr)
1495
1496declare void @__quantum__qis__reset__body(ptr) #1
1497
1498declare void @__quantum__rt__tuple_record_output(i64, ptr)
1499
1500declare void @__quantum__qis__sx__body(ptr)
1501
1502declare void @__quantum__qis__mresetz__body(ptr, ptr)
1503
1504attributes #0 = { "entry_point" "output_labeling_schema" "qir_profiles"="adaptive_profile" "required_num_qubits"="1" "required_num_results"="0" }
1505attributes #1 = { "irreversible" }
1506
1507!llvm.module.flags = !{!0, !1, !2, !3, !4, !6}
1508
1509!0 = !{i32 1, !"qir_major_version", i32 1}
1510!1 = !{i32 7, !"qir_minor_version", i32 0}
1511!2 = !{i32 1, !"dynamic_qubit_management", i1 false}
1512!3 = !{i32 1, !"dynamic_result_management", i1 false}
1513!4 = !{i32 5, !"int_computations", !5}
1514!5 = !{!"i64"}
1515!6 = !{i32 5, !"float_computations", !7}
1516!7 = !{!"double"}
1517""",
1518 )
1519
1520
1521@pytest.mark.skipif(not PYQIR_AVAILABLE, reason=SKIP_REASON)
1522def test_optimize_works_within_blocks_not_across_blocks() -> None:
1523 qsharp.init(target_profile=qsharp.TargetProfile.Adaptive_RIF)
1524 qir = qsharp.compile(
1525 """
1526 {
1527 use q = Qubit();
1528 X(q);
1529 if MResetZ(q) == One {
1530 H(q);
1531 H(q);
1532 X(q);
1533 } else {
1534 X(q);
1535 Z(q);
1536 Z(q);
1537 Y(q);
1538 X(q);
1539 }
1540 X(q);
1541 }
1542 """
1543 )
1544
1545 module = pyqir.Module.from_ir(pyqir.Context(), str(qir))
1546 OptimizeSingleQubitGates().run(module)
1547
1548 assert_expected_inline(
1549 str(module),
1550 """\
1551
1552@0 = internal constant [4 x i8] c"0_t\\00"
1553
1554define i64 @ENTRYPOINT__main() #0 {
1555block_0:
1556 call void @__quantum__rt__initialize(ptr null)
1557 call void @__quantum__qis__x__body(ptr null)
1558 call void @__quantum__qis__mresetz__body(ptr null, ptr null)
1559 %var_0 = call i1 @__quantum__rt__read_result(ptr null)
1560 br i1 %var_0, label %block_1, label %block_2
1561
1562block_1: ; preds = %block_0
1563 call void @__quantum__qis__x__body(ptr null)
1564 br label %block_3
1565
1566block_2: ; preds = %block_0
1567 call void @__quantum__qis__x__body(ptr null)
1568 call void @__quantum__qis__y__body(ptr null)
1569 call void @__quantum__qis__x__body(ptr null)
1570 br label %block_3
1571
1572block_3: ; preds = %block_2, %block_1
1573 call void @__quantum__qis__x__body(ptr null)
1574 call void @__quantum__rt__tuple_record_output(i64 0, ptr @0)
1575 ret i64 0
1576}
1577
1578declare void @__quantum__rt__initialize(ptr)
1579
1580declare void @__quantum__qis__x__body(ptr)
1581
1582declare void @__quantum__qis__mresetz__body(ptr, ptr) #1
1583
1584declare i1 @__quantum__rt__read_result(ptr)
1585
1586declare void @__quantum__qis__h__body(ptr)
1587
1588declare void @__quantum__qis__z__body(ptr)
1589
1590declare void @__quantum__qis__y__body(ptr)
1591
1592declare void @__quantum__rt__tuple_record_output(i64, ptr)
1593
1594declare void @__quantum__qis__sx__body(ptr)
1595
1596attributes #0 = { "entry_point" "output_labeling_schema" "qir_profiles"="adaptive_profile" "required_num_qubits"="1" "required_num_results"="1" }
1597attributes #1 = { "irreversible" }
1598
1599!llvm.module.flags = !{!0, !1, !2, !3, !4, !6}
1600
1601!0 = !{i32 1, !"qir_major_version", i32 1}
1602!1 = !{i32 7, !"qir_minor_version", i32 0}
1603!2 = !{i32 1, !"dynamic_qubit_management", i1 false}
1604!3 = !{i32 1, !"dynamic_result_management", i1 false}
1605!4 = !{i32 5, !"int_computations", !5}
1606!5 = !{!"i64"}
1607!6 = !{i32 5, !"float_computations", !7}
1608!7 = !{!"double"}
1609""",
1610 )
1611
1612
1613@pytest.mark.skipif(not PYQIR_AVAILABLE, reason=SKIP_REASON)
1614def test_optimize_combines_m_and_reset_into_mresetz() -> None:
1615 qsharp.init(target_profile=qsharp.TargetProfile.Adaptive_RIF)
1616 qir = qsharp.compile(
1617 """
1618 {
1619 use q = Qubit();
1620 X(q);
1621 M(q);
1622 Reset(q);
1623 X(q);
1624 }
1625 """
1626 )
1627
1628 module = pyqir.Module.from_ir(pyqir.Context(), str(qir))
1629 OptimizeSingleQubitGates().run(module)
1630
1631 assert_expected_inline(
1632 str(module),
1633 """\
1634
1635@0 = internal constant [4 x i8] c"0_t\\00"
1636
1637define i64 @ENTRYPOINT__main() #0 {
1638block_0:
1639 call void @__quantum__rt__initialize(ptr null)
1640 call void @__quantum__qis__x__body(ptr null)
1641 call void @__quantum__qis__mresetz__body(ptr null, ptr null)
1642 call void @__quantum__qis__x__body(ptr null)
1643 call void @__quantum__rt__tuple_record_output(i64 0, ptr @0)
1644 ret i64 0
1645}
1646
1647declare void @__quantum__rt__initialize(ptr)
1648
1649declare void @__quantum__qis__x__body(ptr)
1650
1651declare void @__quantum__qis__m__body(ptr, ptr) #1
1652
1653declare void @__quantum__qis__reset__body(ptr) #1
1654
1655declare void @__quantum__rt__tuple_record_output(i64, ptr)
1656
1657declare void @__quantum__qis__sx__body(ptr)
1658
1659declare void @__quantum__qis__mresetz__body(ptr, ptr)
1660
1661attributes #0 = { "entry_point" "output_labeling_schema" "qir_profiles"="adaptive_profile" "required_num_qubits"="1" "required_num_results"="1" }
1662attributes #1 = { "irreversible" }
1663
1664!llvm.module.flags = !{!0, !1, !2, !3, !4, !6}
1665
1666!0 = !{i32 1, !"qir_major_version", i32 1}
1667!1 = !{i32 7, !"qir_minor_version", i32 0}
1668!2 = !{i32 1, !"dynamic_qubit_management", i1 false}
1669!3 = !{i32 1, !"dynamic_result_management", i1 false}
1670!4 = !{i32 5, !"int_computations", !5}
1671!5 = !{!"i64"}
1672!6 = !{i32 5, !"float_computations", !7}
1673!7 = !{!"double"}
1674""",
1675 )
1676
1677
1678@pytest.mark.skipif(not PYQIR_AVAILABLE, reason=SKIP_REASON)
1679def test_optimize_removes_mresetz_and_reset_into_mresetz() -> None:
1680 qsharp.init(target_profile=qsharp.TargetProfile.Adaptive_RIF)
1681 qir = qsharp.compile(
1682 """
1683 {
1684 use q = Qubit();
1685 X(q);
1686 MResetZ(q);
1687 Reset(q);
1688 X(q);
1689 }
1690 """
1691 )
1692
1693 module = pyqir.Module.from_ir(pyqir.Context(), str(qir))
1694 OptimizeSingleQubitGates().run(module)
1695
1696 assert_expected_inline(
1697 str(module),
1698 """\
1699
1700@0 = internal constant [4 x i8] c"0_t\\00"
1701
1702define i64 @ENTRYPOINT__main() #0 {
1703block_0:
1704 call void @__quantum__rt__initialize(ptr null)
1705 call void @__quantum__qis__x__body(ptr null)
1706 call void @__quantum__qis__mresetz__body(ptr null, ptr null)
1707 call void @__quantum__qis__x__body(ptr null)
1708 call void @__quantum__rt__tuple_record_output(i64 0, ptr @0)
1709 ret i64 0
1710}
1711
1712declare void @__quantum__rt__initialize(ptr)
1713
1714declare void @__quantum__qis__x__body(ptr)
1715
1716declare void @__quantum__qis__mresetz__body(ptr, ptr) #1
1717
1718declare void @__quantum__qis__reset__body(ptr) #1
1719
1720declare void @__quantum__rt__tuple_record_output(i64, ptr)
1721
1722declare void @__quantum__qis__sx__body(ptr)
1723
1724attributes #0 = { "entry_point" "output_labeling_schema" "qir_profiles"="adaptive_profile" "required_num_qubits"="1" "required_num_results"="1" }
1725attributes #1 = { "irreversible" }
1726
1727!llvm.module.flags = !{!0, !1, !2, !3, !4, !6}
1728
1729!0 = !{i32 1, !"qir_major_version", i32 1}
1730!1 = !{i32 7, !"qir_minor_version", i32 0}
1731!2 = !{i32 1, !"dynamic_qubit_management", i1 false}
1732!3 = !{i32 1, !"dynamic_result_management", i1 false}
1733!4 = !{i32 5, !"int_computations", !5}
1734!5 = !{!"i64"}
1735!6 = !{i32 5, !"float_computations", !7}
1736!7 = !{!"double"}
1737""",
1738 )
1739
1740
1741@pytest.mark.skipif(not PYQIR_AVAILABLE, reason=SKIP_REASON)
1742def test_optimize_removes_reset_of_unused_qubits() -> None:
1743 qsharp.init(target_profile=qsharp.TargetProfile.Adaptive_RIF)
1744 qir = qsharp.compile(
1745 """
1746 {
1747 use q1 = Qubit();
1748 use q2 = Qubit();
1749 X(q1);
1750 Reset(q1);
1751 Reset(q2);
1752 X(q1);
1753 X(q2);
1754 }
1755 """
1756 )
1757
1758 module = pyqir.Module.from_ir(pyqir.Context(), str(qir))
1759 OptimizeSingleQubitGates().run(module)
1760
1761 assert_expected_inline(
1762 str(module),
1763 """\
1764
1765@0 = internal constant [4 x i8] c"0_t\\00"
1766
1767define i64 @ENTRYPOINT__main() #0 {
1768block_0:
1769 call void @__quantum__rt__initialize(ptr null)
1770 call void @__quantum__qis__x__body(ptr null)
1771 call void @__quantum__qis__reset__body(ptr null)
1772 call void @__quantum__qis__x__body(ptr null)
1773 call void @__quantum__qis__x__body(ptr inttoptr (i64 1 to ptr))
1774 call void @__quantum__rt__tuple_record_output(i64 0, ptr @0)
1775 ret i64 0
1776}
1777
1778declare void @__quantum__rt__initialize(ptr)
1779
1780declare void @__quantum__qis__x__body(ptr)
1781
1782declare void @__quantum__qis__reset__body(ptr) #1
1783
1784declare void @__quantum__rt__tuple_record_output(i64, ptr)
1785
1786declare void @__quantum__qis__sx__body(ptr)
1787
1788declare void @__quantum__qis__mresetz__body(ptr, ptr)
1789
1790attributes #0 = { "entry_point" "output_labeling_schema" "qir_profiles"="adaptive_profile" "required_num_qubits"="2" "required_num_results"="0" }
1791attributes #1 = { "irreversible" }
1792
1793!llvm.module.flags = !{!0, !1, !2, !3, !4, !6}
1794
1795!0 = !{i32 1, !"qir_major_version", i32 1}
1796!1 = !{i32 7, !"qir_minor_version", i32 0}
1797!2 = !{i32 1, !"dynamic_qubit_management", i1 false}
1798!3 = !{i32 1, !"dynamic_result_management", i1 false}
1799!4 = !{i32 5, !"int_computations", !5}
1800!5 = !{!"i64"}
1801!6 = !{i32 5, !"float_computations", !7}
1802!7 = !{!"double"}
1803""",
1804 )
1805
1806
1807@pytest.mark.skipif(not PYQIR_AVAILABLE, reason=SKIP_REASON)
1808def test_optimize_turns_final_m_into_mresetz() -> None:
1809 qsharp.init(target_profile=qsharp.TargetProfile.Adaptive_RIF)
1810 qir = qsharp.compile(
1811 """
1812 {
1813 use q = Qubit();
1814 X(q);
1815 M(q);
1816 }
1817 """
1818 )
1819
1820 module = pyqir.Module.from_ir(pyqir.Context(), str(qir))
1821 OptimizeSingleQubitGates().run(module)
1822
1823 assert_expected_inline(
1824 str(module),
1825 """\
1826
1827@0 = internal constant [4 x i8] c"0_t\\00"
1828
1829define i64 @ENTRYPOINT__main() #0 {
1830block_0:
1831 call void @__quantum__rt__initialize(ptr null)
1832 call void @__quantum__qis__x__body(ptr null)
1833 call void @__quantum__qis__mresetz__body(ptr null, ptr null)
1834 call void @__quantum__rt__tuple_record_output(i64 0, ptr @0)
1835 ret i64 0
1836}
1837
1838declare void @__quantum__rt__initialize(ptr)
1839
1840declare void @__quantum__qis__x__body(ptr)
1841
1842declare void @__quantum__qis__m__body(ptr, ptr) #1
1843
1844declare void @__quantum__rt__tuple_record_output(i64, ptr)
1845
1846declare void @__quantum__qis__sx__body(ptr)
1847
1848declare void @__quantum__qis__mresetz__body(ptr, ptr)
1849
1850attributes #0 = { "entry_point" "output_labeling_schema" "qir_profiles"="adaptive_profile" "required_num_qubits"="1" "required_num_results"="1" }
1851attributes #1 = { "irreversible" }
1852
1853!llvm.module.flags = !{!0, !1, !2, !3, !4, !6}
1854
1855!0 = !{i32 1, !"qir_major_version", i32 1}
1856!1 = !{i32 7, !"qir_minor_version", i32 0}
1857!2 = !{i32 1, !"dynamic_qubit_management", i1 false}
1858!3 = !{i32 1, !"dynamic_result_management", i1 false}
1859!4 = !{i32 5, !"int_computations", !5}
1860!5 = !{!"i64"}
1861!6 = !{i32 5, !"float_computations", !7}
1862!7 = !{!"double"}
1863""",
1864 )
1865
1866
1867@pytest.mark.skipif(not PYQIR_AVAILABLE, reason=SKIP_REASON)
1868def test_optimize_removes_reset_after_reset() -> None:
1869 qsharp.init(target_profile=qsharp.TargetProfile.Adaptive_RIF)
1870 qir = qsharp.compile(
1871 """
1872 {
1873 use q = Qubit();
1874 X(q);
1875 Reset(q);
1876 Reset(q);
1877 Y(q);
1878 }
1879 """
1880 )
1881
1882 module = pyqir.Module.from_ir(pyqir.Context(), str(qir))
1883 OptimizeSingleQubitGates().run(module)
1884
1885 assert_expected_inline(
1886 str(module),
1887 """\
1888
1889@0 = internal constant [4 x i8] c"0_t\\00"
1890
1891define i64 @ENTRYPOINT__main() #0 {
1892block_0:
1893 call void @__quantum__rt__initialize(ptr null)
1894 call void @__quantum__qis__x__body(ptr null)
1895 call void @__quantum__qis__reset__body(ptr null)
1896 call void @__quantum__qis__y__body(ptr null)
1897 call void @__quantum__rt__tuple_record_output(i64 0, ptr @0)
1898 ret i64 0
1899}
1900
1901declare void @__quantum__rt__initialize(ptr)
1902
1903declare void @__quantum__qis__x__body(ptr)
1904
1905declare void @__quantum__qis__reset__body(ptr) #1
1906
1907declare void @__quantum__qis__y__body(ptr)
1908
1909declare void @__quantum__rt__tuple_record_output(i64, ptr)
1910
1911declare void @__quantum__qis__sx__body(ptr)
1912
1913declare void @__quantum__qis__mresetz__body(ptr, ptr)
1914
1915attributes #0 = { "entry_point" "output_labeling_schema" "qir_profiles"="adaptive_profile" "required_num_qubits"="1" "required_num_results"="0" }
1916attributes #1 = { "irreversible" }
1917
1918!llvm.module.flags = !{!0, !1, !2, !3, !4, !6}
1919
1920!0 = !{i32 1, !"qir_major_version", i32 1}
1921!1 = !{i32 7, !"qir_minor_version", i32 0}
1922!2 = !{i32 1, !"dynamic_qubit_management", i1 false}
1923!3 = !{i32 1, !"dynamic_result_management", i1 false}
1924!4 = !{i32 5, !"int_computations", !5}
1925!5 = !{!"i64"}
1926!6 = !{i32 5, !"float_computations", !7}
1927!7 = !{!"double"}
1928""",
1929 )
1930
1931
1932@pytest.mark.skipif(not PYQIR_AVAILABLE, reason=SKIP_REASON)
1933def test_optimize_removes_final_reset() -> None:
1934 qsharp.init(target_profile=qsharp.TargetProfile.Adaptive_RIF)
1935 qir = qsharp.compile(
1936 """
1937 {
1938 use q = Qubit();
1939 X(q);
1940 Reset(q);
1941 }
1942 """
1943 )
1944
1945 module = pyqir.Module.from_ir(pyqir.Context(), str(qir))
1946 OptimizeSingleQubitGates().run(module)
1947
1948 assert_expected_inline(
1949 str(module),
1950 """\
1951
1952@0 = internal constant [4 x i8] c"0_t\\00"
1953
1954define i64 @ENTRYPOINT__main() #0 {
1955block_0:
1956 call void @__quantum__rt__initialize(ptr null)
1957 call void @__quantum__qis__x__body(ptr null)
1958 call void @__quantum__rt__tuple_record_output(i64 0, ptr @0)
1959 ret i64 0
1960}
1961
1962declare void @__quantum__rt__initialize(ptr)
1963
1964declare void @__quantum__qis__x__body(ptr)
1965
1966declare void @__quantum__qis__reset__body(ptr) #1
1967
1968declare void @__quantum__rt__tuple_record_output(i64, ptr)
1969
1970declare void @__quantum__qis__sx__body(ptr)
1971
1972declare void @__quantum__qis__mresetz__body(ptr, ptr)
1973
1974attributes #0 = { "entry_point" "output_labeling_schema" "qir_profiles"="adaptive_profile" "required_num_qubits"="1" "required_num_results"="0" }
1975attributes #1 = { "irreversible" }
1976
1977!llvm.module.flags = !{!0, !1, !2, !3, !4, !6}
1978
1979!0 = !{i32 1, !"qir_major_version", i32 1}
1980!1 = !{i32 7, !"qir_minor_version", i32 0}
1981!2 = !{i32 1, !"dynamic_qubit_management", i1 false}
1982!3 = !{i32 1, !"dynamic_result_management", i1 false}
1983!4 = !{i32 5, !"int_computations", !5}
1984!5 = !{!"i64"}
1985!6 = !{i32 5, !"float_computations", !7}
1986!7 = !{!"double"}
1987""",
1988 )
1989