Skip to content

Commit 91a220e

Browse files
committed
updating decomposition to use CZ gates
1 parent 5de37c7 commit 91a220e

File tree

1 file changed

+40
-15
lines changed

1 file changed

+40
-15
lines changed

src/bloqade/qasm2/rewrite/native_gates.py

Lines changed: 40 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -174,23 +174,48 @@ def rewrite_sx(self, node: uop.SX) -> abc.RewriteResult:
174174
)
175175

176176
def rewrite_ccx(self, node: uop.CCX) -> abc.RewriteResult:
177-
# from https://algassert.com/quirk#circuit={%22cols%22:[[%22QFT3%22],[%22inputA3%22,1,1,%22+=A3%22],[1,1,1,%22%E2%80%A2%22,%22%E2%80%A2%22,%22X%22],[1,1,1,%22%E2%80%A6%22,%22%E2%80%A6%22,%22%E2%80%A6%22],[1,1,1,1,1,%22H%22],[1,1,1,1,%22%E2%80%A2%22,%22X%22],[1,1,1,1,1,%22Z^-%C2%BC%22],[1,1,1,%22%E2%80%A2%22,1,%22X%22],[1,1,1,1,1,%22Z^%C2%BC%22],[1,1,1,1,%22%E2%80%A2%22,%22X%22],[1,1,1,1,%22Z^%C2%BC%22,%22Z^-%C2%BC%22],[1,1,1,%22%E2%80%A2%22,1,%22X%22],[1,1,1,%22%E2%80%A2%22,%22X%22],[1,1,1,%22Z^%C2%BC%22,%22Z^-%C2%BC%22,%22Z^%C2%BC%22],[1,1,1,%22%E2%80%A2%22,%22X%22],[1,1,1,1,1,%22H%22]]}
178-
179-
uop.H(node.qarg).insert_before(node)
180-
uop.CX(ctrl=node.ctrl1, qarg=node.qarg).insert_before(node)
181-
uop.Tdag(node.qarg).insert_before(node)
182-
uop.CX(ctrl=node.ctrl2, qarg=node.qarg).insert_before(node)
183-
uop.T(node.qarg).insert_before(node)
184-
uop.CX(ctrl=node.ctrl1, qarg=node.qarg).insert_before(node)
185-
uop.Tdag(node.qarg).insert_before(node)
177+
# from https://algassert.com/quirk#circuit=%7B%22cols%22:%5B%5B%22QFT3%22%5D,%5B%22inputA3%22,1,1,%22+=A3%22%5D,%5B1,1,1,%22%E2%80%A2%22,%22%E2%80%A2%22,%22X%22%5D,%5B1,1,1,%22%E2%80%A6%22,%22%E2%80%A6%22,%22%E2%80%A6%22%5D,%5B1,1,1,1,%22%E2%80%A2%22,%22Z%22%5D,%5B1,1,1,1,1,%22X%5E-%C2%BC%22%5D,%5B1,1,1,%22%E2%80%A2%22,1,%22Z%22%5D,%5B1,1,1,1,1,%22X%5E%C2%BC%22%5D,%5B1,1,1,1,%22%E2%80%A2%22,%22Z%22%5D,%5B1,1,1,1,1,%22X%5E-%C2%BC%22%5D,%5B1,1,1,%22Z%5E%C2%BC%22,%22Z%5E%C2%BC%22%5D,%5B1,1,1,1,%22H%22%5D,%5B1,1,1,%22%E2%80%A2%22,1,%22Z%22%5D,%5B1,1,1,%22%E2%80%A2%22,%22Z%22%5D,%5B1,1,1,1,%22X%5E-%C2%BC%22,%22X%5E%C2%BC%22%5D,%5B1,1,1,%22%E2%80%A2%22,%22Z%22%5D,%5B1,1,1,1,%22H%22%5D%5D%7D
178+
179+
# x^(1/4)
180+
lam1, theta1, phi1 = map(
181+
self.const_float,
182+
map(around, (1.5707963267948966, 0.7853981633974483, -1.5707963267948966)),
183+
)
184+
lam1.insert_before(node)
185+
theta1.insert_before(node)
186+
phi1.insert_before(node)
187+
188+
lam1 = lam1.result
189+
theta1 = theta1.result
190+
phi1 = phi1.result
191+
192+
# x^(-1/4)
193+
lam2, theta2, phi2 = map(
194+
self.const_float,
195+
map(around, (4.71238898038469, 0.7853981633974483, 1.5707963267948966)),
196+
)
197+
lam2.insert_before(node)
198+
theta2.insert_before(node)
199+
phi2.insert_before(node)
200+
lam2 = lam2.result
201+
theta2 = theta2.result
202+
phi2 = phi2.result
203+
204+
uop.CZ(ctrl=node.ctrl1, qarg=node.qarg).insert_before(node)
205+
uop.UGate(node.qarg, theta2, phi2, lam2).insert_before(node)
206+
uop.CZ(ctrl=node.ctrl2, qarg=node.qarg).insert_before(node)
207+
uop.UGate(node.qarg, theta1, phi1, lam1).insert_before(node)
208+
uop.CZ(ctrl=node.ctrl1, qarg=node.qarg).insert_before(node)
209+
uop.UGate(node.qarg, theta2, phi2, lam2).insert_before(node)
186210
uop.T(node.ctrl1).insert_before(node)
187-
uop.CX(ctrl=node.ctrl2, qarg=node.qarg).insert_before(node)
188-
uop.CX(ctrl=node.ctrl2, qarg=node.ctrl1).insert_before(node)
189211
uop.T(node.ctrl2).insert_before(node)
190-
uop.Tdag(node.ctrl1).insert_before(node)
191-
uop.T(node.qarg).insert_before(node)
192-
uop.CX(ctrl=node.ctrl2, qarg=node.ctrl1).insert_before(node)
193-
uop.H(node.qarg).insert_before(node)
212+
uop.H(node.ctrl1).insert_before(node)
213+
uop.CZ(ctrl=node.ctrl2, qarg=node.qarg).insert_before(node)
214+
uop.CZ(ctrl=node.ctrl2, qarg=node.ctrl1).insert_before(node)
215+
uop.UGate(node.ctrl1, theta2, phi2, lam2).insert_before(node)
216+
uop.UGate(node.qarg, theta2, phi2, lam2).insert_before(node)
217+
uop.CZ(ctrl=node.ctrl2, qarg=node.ctrl1).insert_before(node)
218+
uop.H(node.ctrl1).insert_before(node)
194219
node.delete() # delete the original CCX gate
195220

196221
return abc.RewriteResult(has_done_something=True)

0 commit comments

Comments
 (0)