Skip to content

Commit a91da01

Browse files
authored
Fixing extraction of global qubit ids (#237)
1 parent 127cc9b commit a91da01

File tree

3 files changed

+32
-15
lines changed

3 files changed

+32
-15
lines changed

src/bloqade/qasm2/passes/noise.py

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,32 @@ class NoisePass(Pass):
3434
def __post_init__(self):
3535
self.address_analysis = address.AddressAnalysis(self.dialects)
3636

37+
def get_qubit_values(self, mt: ir.Method):
38+
frame, _ = self.address_analysis.run_analysis(mt, no_raise=self.no_raise)
39+
qubit_ssa_values = {}
40+
# Traverse statements in block order to fine the first SSA value for each qubit
41+
for block in mt.callable_region.blocks:
42+
for stmt in block.stmts:
43+
if len(stmt.results) != 1:
44+
continue
45+
46+
addr = frame.entries.get(result := stmt.results[0])
47+
if (
48+
isinstance(addr, address.AddressQubit)
49+
and (index := addr.data) not in qubit_ssa_values
50+
):
51+
qubit_ssa_values[index] = result
52+
53+
return qubit_ssa_values, frame.entries
54+
3755
def unsafe_run(self, mt: ir.Method):
3856
result = LiftQubits(self.dialects).unsafe_run(mt)
39-
frame, _ = self.address_analysis.run_analysis(mt, no_raise=self.no_raise)
57+
qubit_ssa_value, address_analysis = self.get_qubit_values(mt)
4058
result = (
4159
Walk(
4260
NoiseRewriteRule(
43-
address_analysis=frame.entries,
61+
qubit_ssa_value=qubit_ssa_value,
62+
address_analysis=address_analysis,
4463
noise_model=self.noise_model,
4564
gate_noise_params=self.gate_noise_params,
4665
),
@@ -49,5 +68,6 @@ def unsafe_run(self, mt: ir.Method):
4968
.rewrite(mt.code)
5069
.join(result)
5170
)
71+
5272
result = Fixpoint(Walk(DeadCodeElimination())).rewrite(mt.code).join(result)
5373
return result

src/bloqade/qasm2/rewrite/heuristic_noise.py

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,22 +18,14 @@ class NoiseRewriteRule(rewrite_abc.RewriteRule):
1818
"""
1919

2020
address_analysis: Dict[ir.SSAValue, address.Address]
21+
qubit_ssa_value: Dict[int, ir.SSAValue]
2122
gate_noise_params: native.GateNoiseParams = field(
2223
default_factory=native.GateNoiseParams
2324
)
2425
noise_model: native.MoveNoiseModelABC = field(
2526
default_factory=native.TwoRowZoneModel
2627
)
2728

28-
def __post_init__(self):
29-
self.qubit_ssa_value: Dict[int, ir.SSAValue] = {}
30-
for ssa_value, addr in self.address_analysis.items():
31-
if (
32-
isinstance(addr, address.AddressQubit)
33-
and ssa_value not in self.qubit_ssa_value
34-
):
35-
self.qubit_ssa_value[addr.data] = ssa_value
36-
3729
def rewrite_Statement(self, node: ir.Statement) -> rewrite_abc.RewriteResult:
3830
if isinstance(node, uop.SingleQubitGate):
3931
return self.rewrite_single_qubit_gate(node)

test/qasm2/passes/test_heuristic_noise.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ def test_single_qubit_noise():
2929

3030
test_qubit = ir.TestValue(type=qasm2.QubitType)
3131
address_analysis = {test_qubit: address.AddressQubit(0)}
32-
rule = NoiseRewriteRule(address_analysis, noise_params, model)
32+
qubit_ssa_value = {0: test_qubit}
33+
rule = NoiseRewriteRule(address_analysis, qubit_ssa_value, noise_params, model)
3334
rule.qubit_ssa_value[0] = test_qubit
3435
block = ir.Block(
3536
[
@@ -70,7 +71,9 @@ def test_parallel_qubit_noise():
7071
test_qubit: address.AddressQubit,
7172
qubit_list.result: address.AddressTuple([address.AddressQubit(0)]),
7273
}
73-
rule = NoiseRewriteRule(address_analysis, noise_params, model)
74+
qubit_ssa_value = {0: test_qubit}
75+
76+
rule = NoiseRewriteRule(address_analysis, qubit_ssa_value, noise_params, model)
7477
rule.qubit_ssa_value[0] = test_qubit
7578
block = ir.Block(
7679
[
@@ -128,7 +131,8 @@ def test_cz_gate_noise():
128131
ctrl_qubit: address.AddressQubit(0),
129132
qarg_qubit: address.AddressQubit(1),
130133
}
131-
rule = NoiseRewriteRule(address_analysis, noise_params, model)
134+
qubit_ssa_value = {0: ctrl_qubit, 1: qarg_qubit}
135+
rule = NoiseRewriteRule(address_analysis, qubit_ssa_value, noise_params, model)
132136
rule.qubit_ssa_value[0] = ctrl_qubit
133137
rule.qubit_ssa_value[1] = qarg_qubit
134138
block = ir.Block(
@@ -206,7 +210,8 @@ def test_parallel_cz_gate_noise():
206210
ctrl_list.result: address.AddressTuple([address.AddressQubit(0)]),
207211
qarg_list.result: address.AddressTuple([address.AddressQubit(1)]),
208212
}
209-
rule = NoiseRewriteRule(address_analysis, noise_params, model)
213+
qubit_ssa_value = {0: ctrl_qubit, 1: qarg_qubit}
214+
rule = NoiseRewriteRule(address_analysis, qubit_ssa_value, noise_params, model)
210215
rule.qubit_ssa_value[0] = ctrl_qubit
211216
rule.qubit_ssa_value[1] = qarg_qubit
212217
block = ir.Block(

0 commit comments

Comments
 (0)