@@ -15,13 +15,40 @@ class ApplyAnyCallLowering(lowering.FromPythonCall["qubit.ApplyAny"]):
1515 def lower (
1616 self , stmt : type ["qubit.ApplyAny" ], state : lowering .State , node : ast .Call
1717 ):
18- if len (node .args ) < 2 :
18+ if len (node .args ) + len ( node . keywords ) < 2 :
1919 raise lowering .BuildError (
2020 "Apply requires at least one operator and one qubit as arguments!"
2121 )
22- op , * qubits = node .args
22+
23+ op , qubits = self .unpack_arguments (node )
24+
2325 op_ssa = state .lower (op ).expect_one ()
2426 qubits_lowered = [state .lower (qbit ).expect_one () for qbit in qubits ]
2527
2628 s = stmt (op_ssa , tuple (qubits_lowered ))
2729 return state .current_frame .push (s )
30+
31+ def unpack_arguments (self , node : ast .Call ) -> tuple [ast .expr , list [ast .expr ]]:
32+ if len (node .keywords ) == 0 :
33+ op , * qubits = node .args
34+ return op , qubits
35+
36+ kwargs = {kw .arg : kw .value for kw in node .keywords }
37+ if len (kwargs ) > 2 or "qubits" not in kwargs :
38+ raise lowering .BuildError (f"Got unsupported keyword argument { kwargs } " )
39+
40+ qubits = kwargs ["qubits" ]
41+ if len (kwargs ) == 1 :
42+ if len (node .args ) != 1 :
43+ raise lowering .BuildError ("Missing operator argument" )
44+ op = node .args [0 ]
45+ else :
46+ try :
47+ op = kwargs ["operator" ]
48+ except KeyError :
49+ raise lowering .BuildError (f"Got unsupported keyword argument { kwargs } " )
50+
51+ if isinstance (qubits , ast .List ):
52+ return op , qubits .elts
53+
54+ return op , [qubits ]
0 commit comments