From 30e129021854fe235fd41c97941d625d038a6a89 Mon Sep 17 00:00:00 2001 From: Atharva Satpute <55058959+atharva-satpute@users.noreply.github.com> Date: Sat, 8 Jun 2024 00:05:17 +0530 Subject: [PATCH] Remvove unused imports --- src/autoqasm/api.py | 84 ++++++++++++++++++++- test/unit_tests/autoqasm/test_parameters.py | 8 +- test/unit_tests/autoqasm/test_program.py | 4 +- test/unit_tests/autoqasm/test_types.py | 12 +-- 4 files changed, 95 insertions(+), 13 deletions(-) diff --git a/src/autoqasm/api.py b/src/autoqasm/api.py index ce5cb33..5132d64 100644 --- a/src/autoqasm/api.py +++ b/src/autoqasm/api.py @@ -35,6 +35,63 @@ from autoqasm.program.gate_calibrations import GateCalibration from autoqasm.types import QubitIdentifierType as Qubit +reserved_keywords = [ + "angle", + "array", + "barrier", + "bit", + "bool", + "box", + "cal", + "case", + "complex", + "const", + "creg", + "ctrl", + "default", + "defcal", + "defcalgrammar", + "delay", + "duration", + "durationof", + "end", + "euler", + "extern", + "false", + "float", + "frame", + "gate", + "gphase", + "im", + "include", + "input", + "int", + "inv", + "let", + "OPENQASM", + "measure", + "mutable", + "negctrl", + "output", + "pi", + "port", + "pragma", + "qreg", # For backward compatibility + "qubit", + "readonly", + "reset", + "return", + "sizeof", + "stretch", + "switch", + "tau", + "true", + "U", + "uint", + "void", + "waveform", +] + def main( func: Callable | None = None, @@ -400,6 +457,19 @@ def _convert_subroutine( return program_conversion_context.return_variable +def is_reserved_keyword(name: str) -> bool: + """ + Method to check whether or not 'name' is a reserved keyword + + Args: + name (str): Name of the variable to be checked + + Returns: + bool: True, if 'name' is a reserved keyword, False otherwise + """ + return name in reserved_keywords + + def _wrap_for_oqpy_subroutine(f: Callable, options: converter.ConversionOptions) -> Callable: """Wraps the given function into a callable expected by oqpy.subroutine. @@ -419,6 +489,12 @@ def _wrap_for_oqpy_subroutine(f: Callable, options: converter.ConversionOptions) def _func(*args, **kwargs) -> Any: inner_program: oqpy.Program = args[0] with aq_program.get_program_conversion_context().push_oqpy_program(inner_program): + # Bind args and kwargs to '_func' signature + sig = inspect.signature(_func) + bound_args = sig.bind(*args, **kwargs) + bound_args.apply_defaults() + args = bound_args.args + kwargs = bound_args.kwargs result = aq_transpiler.converted_call(f, args[1:], kwargs, options=options) inner_program.autodeclare() return result @@ -440,9 +516,15 @@ def _func(*args, **kwargs) -> Any: f'Parameter "{param.name}" for subroutine "{_func.__name__}" ' "is missing a required type hint." ) + # Check whether 'param.name' is a OpenQasm keyword + if is_reserved_keyword(param.name): + _name = f"{param.name}_" + _func.__annotations__.pop(param.name) + else: + _name = param.name new_param = inspect.Parameter( - name=param.name, + name=_name, kind=param.kind, annotation=aq_types.map_parameter_type(param.annotation), ) diff --git a/test/unit_tests/autoqasm/test_parameters.py b/test/unit_tests/autoqasm/test_parameters.py index a0e1d24..727513a 100644 --- a/test/unit_tests/autoqasm/test_parameters.py +++ b/test/unit_tests/autoqasm/test_parameters.py @@ -401,8 +401,8 @@ def sub(float[64] alpha, float[64] theta) { rx(theta) __qubits__[0]; rx(alpha) __qubits__[1]; } -def rx_alpha(int[32] qubit) { - rx(alpha) __qubits__[qubit]; +def rx_alpha(int[32] qubit_) { + rx(alpha) __qubits__[qubit_]; } float alpha = 0.5; float beta = 1.5; @@ -427,8 +427,8 @@ def parametric(alpha: float, beta: float): bound_prog = parametric.build().make_bound_program({"beta": np.pi}) expected = """OPENQASM 3.0; -def rx_alpha(int[32] qubit, float[64] theta) { - rx(theta) __qubits__[qubit]; +def rx_alpha(int[32] qubit_, float[64] theta) { + rx(theta) __qubits__[qubit_]; } input float alpha; float beta = 3.141592653589793; diff --git a/test/unit_tests/autoqasm/test_program.py b/test/unit_tests/autoqasm/test_program.py index 6f3d1b5..a0d96db 100644 --- a/test/unit_tests/autoqasm/test_program.py +++ b/test/unit_tests/autoqasm/test_program.py @@ -95,8 +95,8 @@ def zne() -> aq.BitVar: def expected(scale, angle): return ( """OPENQASM 3.0; -def circuit(float[64] angle) { - rx(angle) __qubits__[0]; +def circuit(float[64] angle_) { + rx(angle_) __qubits__[0]; cnot __qubits__[0], __qubits__[1]; } output bit return_value; diff --git a/test/unit_tests/autoqasm/test_types.py b/test/unit_tests/autoqasm/test_types.py index 28c56df..322aee8 100644 --- a/test/unit_tests/autoqasm/test_types.py +++ b/test/unit_tests/autoqasm/test_types.py @@ -309,7 +309,7 @@ def main(): annotation_test(True) expected = """OPENQASM 3.0; -def annotation_test(bool input) { +def annotation_test(bool input_) { } annotation_test(true);""" @@ -328,7 +328,7 @@ def main(): annotation_test(1) expected = """OPENQASM 3.0; -def annotation_test(int[32] input) { +def annotation_test(int[32] input_) { } annotation_test(1);""" @@ -347,7 +347,7 @@ def main(): annotation_test(1.0) expected = """OPENQASM 3.0; -def annotation_test(float[64] input) { +def annotation_test(float[64] input_) { } annotation_test(1.0);""" @@ -366,7 +366,7 @@ def main(): annotation_test(1) expected = """OPENQASM 3.0; -def annotation_test(qubit input) { +def annotation_test(qubit input_) { } qubit[2] __qubits__; annotation_test(__qubits__[1]);""" @@ -403,7 +403,7 @@ def main(): annotation_test(a) expected = """OPENQASM 3.0; -def annotation_test(bit input) { +def annotation_test(bit input_) { } bit a = 1; annotation_test(a);""" @@ -423,7 +423,7 @@ def main(): annotation_test(aq.BitVar(1)) expected = """OPENQASM 3.0; -def annotation_test(bit input) { +def annotation_test(bit input_) { } bit __bit_0__ = 1; annotation_test(__bit_0__);"""