1010from bloqade .qasm2 .dialects import uop , core , glob , parallel
1111
1212
13+ class InsertGetQubit (rewrite_abc .RewriteRule ):
14+
15+ def rewrite_Statement (self , node : ir .Statement ) -> rewrite_abc .RewriteResult :
16+ if (
17+ not isinstance (node , core .QRegNew )
18+ or not isinstance (n_qubits_stmt := node .n_qubits .owner , py .Constant )
19+ or not isinstance (n_qubits := n_qubits_stmt .value .unwrap (), int )
20+ or (block := node .parent_block ) is None
21+ ):
22+ return rewrite_abc .RewriteResult ()
23+
24+ n_qubits_stmt .detach ()
25+ node .detach ()
26+ if block .first_stmt is None :
27+ block .stmts .append (node )
28+ else :
29+ node .insert_before (block .first_stmt )
30+ n_qubits_stmt .insert_before (block .first_stmt )
31+
32+ for idx_val in range (n_qubits ):
33+ idx = py .constant .Constant (value = idx_val )
34+ qubit = core .QRegGet (node .result , idx = idx .result )
35+ qubit .insert_after (node )
36+ idx .insert_after (node )
37+
38+ return rewrite_abc .RewriteResult (has_done_something = True )
39+
40+
1341@dataclass
1442class NoiseRewriteRule (rewrite_abc .RewriteRule ):
1543 """
@@ -24,12 +52,18 @@ class NoiseRewriteRule(rewrite_abc.RewriteRule):
2452 noise_model : native .MoveNoiseModelABC = field (
2553 default_factory = native .TwoRowZoneModel
2654 )
27- qubit_ssa_value : Dict [int , ir .SSAValue ] = field (default_factory = dict , init = False )
55+
56+ def __post_init__ (self ):
57+ self .qubit_ssa_value : Dict [int , ir .SSAValue ] = {}
58+ for ssa_value , addr in self .address_analysis .items ():
59+ if (
60+ isinstance (addr , address .AddressQubit )
61+ and ssa_value not in self .qubit_ssa_value
62+ ):
63+ self .qubit_ssa_value [addr .data ] = ssa_value
2864
2965 def rewrite_Statement (self , node : ir .Statement ) -> rewrite_abc .RewriteResult :
30- if isinstance (node , core .QRegNew ):
31- return self .rewrite_qreg_new (node )
32- elif isinstance (node , uop .SingleQubitGate ):
66+ if isinstance (node , uop .SingleQubitGate ):
3367 return self .rewrite_single_qubit_gate (node )
3468 elif isinstance (node , uop .CZ ):
3569 return self .rewrite_cz_gate (node )
@@ -42,24 +76,6 @@ def rewrite_Statement(self, node: ir.Statement) -> rewrite_abc.RewriteResult:
4276 else :
4377 return rewrite_abc .RewriteResult ()
4478
45- def rewrite_qreg_new (self , node : core .QRegNew ):
46-
47- addr = self .address_analysis [node .result ]
48- if not isinstance (addr , address .AddressReg ):
49- return rewrite_abc .RewriteResult ()
50-
51- has_done_something = False
52- for idx_val , qid in enumerate (addr .data ):
53- if qid not in self .qubit_ssa_value :
54- has_done_something = True
55- idx = py .constant .Constant (value = idx_val )
56- qubit = core .QRegGet (node .result , idx = idx .result )
57- self .qubit_ssa_value [qid ] = qubit .result
58- qubit .insert_after (node )
59- idx .insert_after (node )
60-
61- return rewrite_abc .RewriteResult (has_done_something = has_done_something )
62-
6379 def insert_single_qubit_noise (
6480 self ,
6581 node : ir .Statement ,
0 commit comments