Skip to content

Parallel

Passes for converting parallel gates into multiple single gates as well as converting multiple single gates to parallel gates.

ParallelToUOp dataclass

ParallelToUOp()

Bases: Pass

Pass to convert parallel gates into single gates.

This pass rewrites any parallel gates from the qasm2.parallel dialect into multiple single gates in the qasm2.uop dialect, bringing the program closer to conforming to standard QASM2 syntax.

Usage Examples

# Define kernel
@qasm2.extended
def main():
    q = qasm2.qreg(4)

    qasm2.parallel.cz(ctrls=[q[0], q[2]], qargs=[q[1], q[3]])

# Run rewrite
ParallelToUOp(main.dialects)(main)

The qasm2.parallel.cz statement has been rewritten to individual gates:

qasm2.uop.cz(ctrl=q[0], qarg=q[1])
qasm2.uop.cz(ctrl=q[2], qarg=q[3])

UOpToParallel dataclass

UOpToParallel()

Bases: Pass

Pass to convert single gates into parallel gates.

This pass looks for single gates from the qasm2.uop dialect that can be combined into parallel gates from the qasm2.parallel dialect and performs a rewrite to do so.

Usage Examples

# Define kernel
@qasm2.main
def test():
    q = qasm2.qreg(4)

    theta = 0.1
    phi = 0.2
    lam = 0.3

    qasm2.u(q[1], theta, phi, lam)
    qasm2.u(q[3], theta, phi, lam)
    qasm2.cx(q[1], q[3])
    qasm2.u(q[2], theta, phi, lam)
    qasm2.u(q[0], theta, phi, lam)
    qasm2.cx(q[0], q[2])

# Run rewrite
UOpToParallel(main.dialects)(main)

The individual qasm2.u statements have now been combined into a single qasm2.parallel.u statement.

qasm2.parallel.u(qargs = [q[0], q[1], q[2], q[3]], theta, phi, lam)
qasm2.uop.CX(q[1], q[3])
qasm2.uop.CX(q[0], q[2])