Ejemplo n.º 1
0
def test_gate_definition1():
    p = """
gate xy q {
    x q;
    y q;
}
""".strip()
    program = parse(p)
    assert program == Program(statements=[
        QuantumGateDefinition(
            Identifier("xy"),
            [],
            [Identifier("q")],
            [
                QuantumGate(
                    modifiers=[],
                    name=Identifier("x"),
                    arguments=[],
                    qubits=[Identifier(name="q")],
                ),
                QuantumGate(
                    modifiers=[],
                    name=Identifier("y"),
                    arguments=[],
                    qubits=[Identifier(name="q")],
                ),
            ],
        )
    ], )
    SpanGuard().visit(program)
    gate_declaration = program.statements[0]
    assert gate_declaration.span == Span(1, 0, 4, 0)
    assert gate_declaration.qubits[0].span == Span(1, 8, 1, 8)
Ejemplo n.º 2
0
def test_gate_definition2():
    p = """
gate majority a, b, c {
     cx c, b;
     cx c, a;
     ccx a, b, c;
}""".strip()
    program = parse(p)
    assert program == Program(statements=[
        QuantumGateDefinition(
            name=Identifier("majority"),
            arguments=[],
            qubits=[
                Identifier(name="a"),
                Identifier(name="b"),
                Identifier(name="c"),
            ],
            body=[
                QuantumGate(
                    modifiers=[],
                    name=Identifier("cx"),
                    arguments=[],
                    qubits=[Identifier(name="c"),
                            Identifier(name="b")],
                ),
                QuantumGate(
                    modifiers=[],
                    name=Identifier("cx"),
                    arguments=[],
                    qubits=[Identifier(name="c"),
                            Identifier(name="a")],
                ),
                QuantumGate(
                    modifiers=[],
                    name=Identifier("ccx"),
                    arguments=[],
                    qubits=[
                        Identifier(name="a"),
                        Identifier(name="b"),
                        Identifier(name="c"),
                    ],
                ),
            ],
        )
    ], )
    SpanGuard().visit(program)
    gate_declaration = program.statements[0]
    assert gate_declaration.span == Span(1, 0, 5, 0)
    assert gate_declaration.qubits[0].span == Span(1, 14, 1, 14)
Ejemplo n.º 3
0
 def visitQuantumGateDefinition(
         self, ctx: qasm3Parser.QuantumGateDefinitionContext):
     gate_name = self.visit(ctx.quantumGateSignature().quantumGateName())
     gate_arg_lists = ctx.quantumGateSignature().identifierList(
     )  # argument and qubit lists
     arguments = ([
         add_span(Identifier(arg.getText()), get_span(arg))
         for arg in gate_arg_lists[0].Identifier()
     ] if len(gate_arg_lists) == 2 else [])
     qubits = [
         add_span(Identifier(i.getText()), get_span(i))
         for i in gate_arg_lists[-1].Identifier()
     ]
     child_count = ctx.quantumBlock().getChildCount()
     body = [
         self.visit(ctx.quantumBlock().getChild(i))
         for i in range(1, child_count - 1)
     ]
     return QuantumGateDefinition(gate_name, arguments, qubits, body)
Ejemplo n.º 4
0
def test_gate_definition3():
    p = """
gate rz(λ) a { gphase(-λ/2); U(0, 0, λ) a; }
    """.strip()
    program = parse(p)
    assert program == Program(statements=[
        QuantumGateDefinition(
            name=Identifier("rz"),
            arguments=[Identifier(name="λ")],
            qubits=[Identifier(name="a")],
            body=[
                QuantumPhase(
                    quantum_gate_modifiers=[],
                    argument=BinaryExpression(
                        op=BinaryOperator["/"],
                        lhs=UnaryExpression(op=UnaryOperator["-"],
                                            expression=Identifier(name="λ")),
                        rhs=IntegerLiteral(value=2),
                    ),
                    qubits=[],
                ),
                QuantumGate(
                    modifiers=[],
                    name=Identifier("U"),
                    arguments=[
                        IntegerLiteral(value=0),
                        IntegerLiteral(value=0),
                        Identifier(name="λ"),
                    ],
                    qubits=[Identifier(name="a")],
                ),
            ],
        )
    ])
    SpanGuard().visit(program)
    gate_declaration = program.statements[0]
    assert gate_declaration.span == Span(1, 0, 1, 43)
    assert gate_declaration.arguments[0].span == Span(1, 8, 1, 8)
    assert gate_declaration.qubits[0].span == Span(1, 11, 1, 11)
Ejemplo n.º 5
0
def test_gate_defs():
    p = """
    gate xyz q {
        x q;
        y q;
        z q;
    }
    """.strip()

    program = parse(p)
    assert program == Program(statements=[
        QuantumGateDefinition(
            name=Identifier("xyz"),
            arguments=[],
            qubits=[Identifier(name="q")],
            body=[
                QuantumGate(
                    modifiers=[],
                    name=Identifier("x"),
                    arguments=[],
                    qubits=[Identifier(name="q")],
                ),
                QuantumGate(
                    modifiers=[],
                    name=Identifier("y"),
                    arguments=[],
                    qubits=[Identifier(name="q")],
                ),
                QuantumGate(
                    modifiers=[],
                    name=Identifier("z"),
                    arguments=[],
                    qubits=[Identifier(name="q")],
                ),
            ],
        )
    ], )
    SpanGuard().visit(program)