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)
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)
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)
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)
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)