From 0a2620220bc0475999b897391a8ba4224373d924 Mon Sep 17 00:00:00 2001 From: Rahul R Date: Wed, 25 Feb 2026 01:54:04 +0000 Subject: [PATCH 1/5] Initial version --- .../nirfsg/nirfsg/_library_interpreter.py | 16 ++++++++-- generated/nirfsg/nirfsg/session.py | 30 +++++-------------- src/nirfsg/metadata/functions.py | 12 ++++---- .../get_deembedding_sparameter.py.mako | 27 +++++++++++++++++ .../get_deembedding_sparameter.py.mako | 17 ----------- 5 files changed, 56 insertions(+), 46 deletions(-) create mode 100644 src/nirfsg/templates/_library_interpreter.py/get_deembedding_sparameter.py.mako delete mode 100644 src/nirfsg/templates/session.py/get_deembedding_sparameter.py.mako diff --git a/generated/nirfsg/nirfsg/_library_interpreter.py b/generated/nirfsg/nirfsg/_library_interpreter.py index 58a366dbb..f865dbebb 100644 --- a/generated/nirfsg/nirfsg/_library_interpreter.py +++ b/generated/nirfsg/nirfsg/_library_interpreter.py @@ -384,7 +384,17 @@ def get_attribute_vi_string(self, channel_name, attribute): # noqa: N802 errors.handle_error(self, error_code, ignore_warnings=False, is_error_handling=False) return value_ctype.value.decode(self._encoding) - def get_deembedding_sparameters(self, sparameters, sparameters_array_size): # noqa: N802 + def get_deembedding_sparameters(self): + import numpy as np + number_of_ports = self.get_deembedding_table_number_of_ports() + sparameters_array_size = number_of_ports ** 2 + sparameters = np.full((number_of_ports, number_of_ports), 0 + 0j, dtype=np.complex128) + if type(sparameters) is not np.ndarray: + raise TypeError('sparameters must be {0}, is {1}'.format(np.ndarray, type(sparameters))) + if np.isfortran(sparameters) is True: + raise TypeError('sparameters must be in C-order') + if sparameters.dtype is not np.dtype('complex128'): + raise TypeError('sparameters must be np.ndarray of dtype=complex128, is ' + str(sparameters.dtype)) vi_ctype = _visatype.ViSession(self._vi) # case S110 sparameters_ctype = _get_ctypes_pointer_for_buffer(value=sparameters, library_type=_complextype.NIComplexNumber) # case B510 sparameters_array_size_ctype = _visatype.ViInt32(sparameters_array_size) # case S150 @@ -392,7 +402,9 @@ def get_deembedding_sparameters(self, sparameters, sparameters_array_size): # n number_of_ports_ctype = _visatype.ViInt32() # case S220 error_code = self._library.niRFSG_GetDeembeddingSparameters(vi_ctype, sparameters_ctype, sparameters_array_size_ctype, None if number_of_sparameters_ctype is None else (ctypes.pointer(number_of_sparameters_ctype)), None if number_of_ports_ctype is None else (ctypes.pointer(number_of_ports_ctype))) errors.handle_error(self, error_code, ignore_warnings=False, is_error_handling=False) - return int(number_of_sparameters_ctype.value), int(number_of_ports_ctype.value) + number_of_ports = int(number_of_ports_ctype.value) + sparameters = sparameters.reshape((number_of_ports, number_of_ports)) + return sparameters def get_deembedding_table_number_of_ports(self): # noqa: N802 vi_ctype = _visatype.ViSession(self._vi) # case S110 diff --git a/generated/nirfsg/nirfsg/session.py b/generated/nirfsg/nirfsg/session.py index c6eaa90c8..8ccb1ae18 100644 --- a/generated/nirfsg/nirfsg/session.py +++ b/generated/nirfsg/nirfsg/session.py @@ -6362,7 +6362,7 @@ def create_deembedding_sparameter_table_array(self, port, table_name, frequencie raise TypeError("Unsupported datatype. Expected numpy array.") def get_deembedding_sparameters(self): - '''get_deembedding_sparameters + r'''get_deembedding_sparameters Returns the S-parameters used for de-embedding a measurement on the selected port. @@ -6378,12 +6378,7 @@ def get_deembedding_sparameters(self): sparameters (numpy.array(dtype=numpy.complex128)): Returns an array of S-parameters. The S-parameters are returned in the following order: s11, s12, s21, s22. ''' - import numpy as np - number_of_ports = self._get_deembedding_table_number_of_ports() - sparameter_array_size = number_of_ports ** 2 - sparameters = np.full((number_of_ports, number_of_ports), 0 + 0j, dtype=np.complex128) - _, number_of_ports = self._get_deembedding_sparameters(sparameters, sparameter_array_size) - sparameters = sparameters.reshape((number_of_ports, number_of_ports)) + sparameters = self._interpreter.get_deembedding_sparameters() return sparameters @ivi_synchronized @@ -6416,9 +6411,8 @@ def get_all_script_names(self): script_names = self._interpreter.get_all_script_names() return _converters.convert_comma_separated_string_to_list(script_names) - @ivi_synchronized - def _get_deembedding_sparameters(self, sparameters, sparameters_array_size): - r'''_get_deembedding_sparameters + def get_deembedding_sparameters(self, sparameters_array_size): + r'''get_deembedding_sparameters Returns the S-parameters used for de-embedding a measurement on the selected port. @@ -6431,8 +6425,6 @@ def _get_deembedding_sparameters(self, sparameters, sparameters_array_size): Note: The port orientation for the returned S-parameters is normalized to SparameterOrientation.PORT1_TOWARDS_DUT. Args: - sparameters (numpy.array(dtype=numpy.complex128)): Returns an array of S-parameters. The S-parameters are returned in the following order: s11, s12, s21, s22. - sparameters_array_size (int): Specifies the size of the array that is returned by the SPARAMETERS output. Note: @@ -6440,21 +6432,15 @@ def _get_deembedding_sparameters(self, sparameters, sparameters_array_size): Returns: + sparameters (list of NIComplexNumber): Returns an array of S-parameters. The S-parameters are returned in the following order: s11, s12, s21, s22. + number_of_sparameters (int): Returns the number of S-parameters. number_of_ports (int): Returns the number of S-parameter ports. The **sparameter** array is always *n* x *n*, where span *n* is the number of ports. ''' - import numpy - - if type(sparameters) is not numpy.ndarray: - raise TypeError('sparameters must be {0}, is {1}'.format(numpy.ndarray, type(sparameters))) - if numpy.isfortran(sparameters) is True: - raise TypeError('sparameters must be in C-order') - if sparameters.dtype is not numpy.dtype('complex128'): - raise TypeError('sparameters must be numpy.ndarray of dtype=complex128, is ' + str(sparameters.dtype)) - number_of_sparameters, number_of_ports = self._interpreter.get_deembedding_sparameters(sparameters, sparameters_array_size) - return number_of_sparameters, number_of_ports + sparameters, number_of_sparameters, number_of_ports = self._interpreter.get_deembedding_sparameters(sparameters_array_size) + return sparameters, number_of_sparameters, number_of_ports @ivi_synchronized def _get_deembedding_table_number_of_ports(self): diff --git a/src/nirfsg/metadata/functions.py b/src/nirfsg/metadata/functions.py index 64416372f..d1119f8c7 100644 --- a/src/nirfsg/metadata/functions.py +++ b/src/nirfsg/metadata/functions.py @@ -1513,7 +1513,7 @@ 'documentation_filename': 'default_method', 'library_interpreter_filename': 'none', 'method_python_name_suffix': '', - 'session_filename': 'get_deembedding_sparameter' + 'session_filename': 'default_method' } ], 'parameters': [ @@ -2053,10 +2053,10 @@ 'included_in_proto': True, 'method_templates': [ { - 'documentation_filename': 'numpy_method', - 'library_interpreter_filename': 'numpy_read_method', + 'documentation_filename': 'default_method', + 'library_interpreter_filename': 'get_deembedding_sparameter', 'method_python_name_suffix': '', - 'session_filename': 'numpy_read_method' + 'session_filename': 'default_method' } ], 'parameters': [ @@ -2113,7 +2113,9 @@ 'use_in_python_api': True } ], - 'returns': 'ViStatus' + 'python_name': 'get_deembedding_sparameters', + 'returns': 'ViStatus', + 'use_session_lock': False }, 'GetDeembeddingTableNumberOfPorts': { 'codegen_method': 'private', diff --git a/src/nirfsg/templates/_library_interpreter.py/get_deembedding_sparameter.py.mako b/src/nirfsg/templates/_library_interpreter.py/get_deembedding_sparameter.py.mako new file mode 100644 index 000000000..5e8e602d2 --- /dev/null +++ b/src/nirfsg/templates/_library_interpreter.py/get_deembedding_sparameter.py.mako @@ -0,0 +1,27 @@ +<%page args="f, config, method_template"/>\ +<% + '''Creates a numpy array based on number of ports queried from driver and passes it to "get_deembedding_sparameters" method.''' + import build.helper as helper +%>\ + + def ${f['python_name']}(self): + import numpy as np + number_of_ports = self.get_deembedding_table_number_of_ports() + sparameters_array_size = number_of_ports ** 2 + sparameters = np.full((number_of_ports, number_of_ports), 0 + 0j, dtype=np.complex128) + if type(sparameters) is not np.ndarray: + raise TypeError('sparameters must be {0}, is {1}'.format(np.ndarray, type(sparameters))) + if np.isfortran(sparameters) is True: + raise TypeError('sparameters must be in C-order') + if sparameters.dtype is not np.dtype('complex128'): + raise TypeError('sparameters must be np.ndarray of dtype=complex128, is ' + str(sparameters.dtype)) + vi_ctype = _visatype.ViSession(self._vi) # case S110 + sparameters_ctype = _get_ctypes_pointer_for_buffer(value=sparameters, library_type=_complextype.NIComplexNumber) # case B510 + sparameters_array_size_ctype = _visatype.ViInt32(sparameters_array_size) # case S150 + number_of_sparameters_ctype = _visatype.ViInt32() # case S220 + number_of_ports_ctype = _visatype.ViInt32() # case S220 + error_code = self._library.niRFSG_GetDeembeddingSparameters(vi_ctype, sparameters_ctype, sparameters_array_size_ctype, None if number_of_sparameters_ctype is None else (ctypes.pointer(number_of_sparameters_ctype)), None if number_of_ports_ctype is None else (ctypes.pointer(number_of_ports_ctype))) + errors.handle_error(self, error_code, ignore_warnings=False, is_error_handling=False) + number_of_ports = int(number_of_ports_ctype.value) + sparameters = sparameters.reshape((number_of_ports, number_of_ports)) + return sparameters diff --git a/src/nirfsg/templates/session.py/get_deembedding_sparameter.py.mako b/src/nirfsg/templates/session.py/get_deembedding_sparameter.py.mako deleted file mode 100644 index 1b4d6aa46..000000000 --- a/src/nirfsg/templates/session.py/get_deembedding_sparameter.py.mako +++ /dev/null @@ -1,17 +0,0 @@ -<%page args="f, config, method_template"/>\ -<% - '''Creates a numpy array based on number of ports queried from driver and passes it to "get_deembedding_sparameters" method.''' - import build.helper as helper -%>\ - def ${f['python_name']}(${helper.get_params_snippet(f, helper.ParameterUsageOptions.SESSION_METHOD_DECLARATION)}): - '''${f['python_name']} - - ${helper.get_function_docstring(f, False, config, indent=8)} - ''' - import numpy as np - number_of_ports = self._get_deembedding_table_number_of_ports() - sparameter_array_size = number_of_ports ** 2 - sparameters = np.full((number_of_ports, number_of_ports), 0 + 0j, dtype=np.complex128) - _, number_of_ports = self._get_deembedding_sparameters(sparameters, sparameter_array_size) - sparameters = sparameters.reshape((number_of_ports, number_of_ports)) - return sparameters From 5053274040a3f599a059e89abeba2a5f49f8e8da Mon Sep 17 00:00:00 2001 From: Rahul R Date: Wed, 25 Feb 2026 04:31:21 +0000 Subject: [PATCH 2/5] Updated --- docs/nirfsg/class.rst | 31 ------------ .../nirfsg/nirfsg/_library_interpreter.py | 2 +- generated/nirfsg/nirfsg/session.py | 24 +--------- src/nirfsg/metadata/functions.py | 48 +------------------ 4 files changed, 4 insertions(+), 101 deletions(-) diff --git a/docs/nirfsg/class.rst b/docs/nirfsg/class.rst index ccbe8656f..fb5faa14d 100644 --- a/docs/nirfsg/class.rst +++ b/docs/nirfsg/class.rst @@ -1211,37 +1211,6 @@ get_all_script_names -get_deembedding_sparameters ---------------------------- - - .. py:currentmodule:: nirfsg.Session - - .. py:method:: get_deembedding_sparameters() - - Returns the S-parameters used for de-embedding a measurement on the selected port. - - This includes interpolation of the parameters based on the configured carrier frequency. This method returns an empty array if no de-embedding is done. - - If you want to call this method just to get the required buffer size, you can pass 0 for **S-parameter Size** and VI_NULL for the **S-parameters** buffer. - - **Supported Devices** : PXIe-5830/5831/5832/5840/5841/5842/5860 - - - - .. note:: The port orientation for the returned S-parameters is normalized to :py:data:`~nirfsg.SparameterOrientation.PORT1_TOWARDS_DUT`. - - - - :rtype: numpy.array(dtype=numpy.complex128) - :return: - - - Returns an array of S-parameters. The S-parameters are returned in the following order: s11, s12, s21, s22. - - - - - get_error --------- diff --git a/generated/nirfsg/nirfsg/_library_interpreter.py b/generated/nirfsg/nirfsg/_library_interpreter.py index f865dbebb..01c02f2cc 100644 --- a/generated/nirfsg/nirfsg/_library_interpreter.py +++ b/generated/nirfsg/nirfsg/_library_interpreter.py @@ -384,7 +384,7 @@ def get_attribute_vi_string(self, channel_name, attribute): # noqa: N802 errors.handle_error(self, error_code, ignore_warnings=False, is_error_handling=False) return value_ctype.value.decode(self._encoding) - def get_deembedding_sparameters(self): + def _get_deembedding_sparameters(self): import numpy as np number_of_ports = self.get_deembedding_table_number_of_ports() sparameters_array_size = number_of_ports ** 2 diff --git a/generated/nirfsg/nirfsg/session.py b/generated/nirfsg/nirfsg/session.py index 8ccb1ae18..c6f0b7fbb 100644 --- a/generated/nirfsg/nirfsg/session.py +++ b/generated/nirfsg/nirfsg/session.py @@ -6361,26 +6361,6 @@ def create_deembedding_sparameter_table_array(self, port, table_name, frequencie else: raise TypeError("Unsupported datatype. Expected numpy array.") - def get_deembedding_sparameters(self): - r'''get_deembedding_sparameters - - Returns the S-parameters used for de-embedding a measurement on the selected port. - - This includes interpolation of the parameters based on the configured carrier frequency. This method returns an empty array if no de-embedding is done. - - If you want to call this method just to get the required buffer size, you can pass 0 for **S-parameter Size** and VI_NULL for the **S-parameters** buffer. - - **Supported Devices** : PXIe-5830/5831/5832/5840/5841/5842/5860 - - Note: The port orientation for the returned S-parameters is normalized to SparameterOrientation.PORT1_TOWARDS_DUT. - - Returns: - sparameters (numpy.array(dtype=numpy.complex128)): Returns an array of S-parameters. The S-parameters are returned in the following order: s11, s12, s21, s22. - - ''' - sparameters = self._interpreter.get_deembedding_sparameters() - return sparameters - @ivi_synchronized def get_all_named_waveform_names(self): r'''get_all_named_waveform_names @@ -6411,8 +6391,8 @@ def get_all_script_names(self): script_names = self._interpreter.get_all_script_names() return _converters.convert_comma_separated_string_to_list(script_names) - def get_deembedding_sparameters(self, sparameters_array_size): - r'''get_deembedding_sparameters + def _get_deembedding_sparameters(self, sparameters_array_size): + r'''_get_deembedding_sparameters Returns the S-parameters used for de-embedding a measurement on the selected port. diff --git a/src/nirfsg/metadata/functions.py b/src/nirfsg/metadata/functions.py index d1119f8c7..504a1126d 100644 --- a/src/nirfsg/metadata/functions.py +++ b/src/nirfsg/metadata/functions.py @@ -1500,52 +1500,6 @@ 'returns': 'ViStatus', 'use_session_lock': False }, - 'FancyGetDeembeddingSparameters': { - 'codegen_method': 'python-only', - 'documentation': { - 'description': '\nReturns the S-parameters used for de-embedding a measurement on the selected port.\n\nThis includes interpolation of the parameters based on the configured carrier frequency. This function returns an empty array if no de-embedding is done.\n\nIf you want to call this function just to get the required buffer size, you can pass 0 for **S-parameter Size** and VI_NULL for the **S-parameters** buffer.\n\n**Supported Devices** : PXIe-5830/5831/5832/5840/5841/5842/5860', - 'note': 'The port orientation for the returned S-parameters is normalized to NIRFSG_VAL_PORT1_TOWARDS_DUT.' - }, - 'included_in_proto': True, - 'method_name_for_documentation': 'get_deembedding_sparameters', - 'method_templates': [ - { - 'documentation_filename': 'default_method', - 'library_interpreter_filename': 'none', - 'method_python_name_suffix': '', - 'session_filename': 'default_method' - } - ], - 'parameters': [ - { - 'direction': 'in', - 'documentation': { - 'description': 'Identifies your instrument session. The ViSession handle is obtained from the nirfsg_Init function or the nirfsg_InitWithOptions function and identifies a particular instrument session.' - }, - 'name': 'vi', - 'type': 'ViSession', - 'use_array': False, - 'use_in_python_api': True - }, - { - 'array_dimensions': 2, - 'complex_array_representation': 'complex_number_array', - 'direction': 'out', - 'documentation': { - 'description': 'Returns an array of S-parameters. The S-parameters are returned in the following order: s11, s12, s21, s22.' - }, - 'name': 'sparameters', - 'numpy': True, - 'type': 'NIComplexNumber[]', - 'type_in_documentation': 'numpy.array(dtype=numpy.complex128)', - 'use_array': False, - 'use_in_python_api': True - } - ], - 'python_name': 'get_deembedding_sparameters', - 'returns': None, - 'use_session_lock': False - }, 'GetAllNamedWaveformNames': { 'codegen_method': 'public', 'documentation': { @@ -2113,7 +2067,7 @@ 'use_in_python_api': True } ], - 'python_name': 'get_deembedding_sparameters', + 'python_name': '_get_deembedding_sparameters', 'returns': 'ViStatus', 'use_session_lock': False }, From e18655b394cca2b063beb375f27ab7637fcb538e Mon Sep 17 00:00:00 2001 From: Rahul R Date: Wed, 25 Feb 2026 09:15:55 +0000 Subject: [PATCH 3/5] codegen: handle S160 multidimensional input size using array.size --- build/helper/codegen_helper.py | 8 ++++++-- build/unit_tests/test_codegen_helper.py | 8 ++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/build/helper/codegen_helper.py b/build/helper/codegen_helper.py index 1f1c01fd8..e79442a27 100644 --- a/build/helper/codegen_helper.py +++ b/build/helper/codegen_helper.py @@ -337,7 +337,7 @@ def _get_ctype_variable_definition_snippet_for_scalar(parameter, parameters, ivi S120. Input is size of buffer with mechanism is python-code: visatype.ViInt32() S130. Input enum: visatype.ViInt32(parameter_name.value) S150. Input scalar: visatype.ViInt32(parameter_name) - S160. Input is size of input buffer: visatype.ViInt32(0 if list is None else len(list)) + S160. Input is size of input buffer: visatype.ViInt32(0 if list is None else len(list)) or visatype.ViInt32(0 if array is None else array.size) S170. Input is size of output buffer with mechanism ivi-dance, QUERY_SIZE: visatype.ViInt32() S180. Input is size of output buffer with mechanism ivi-dance, GET_DATA: visatype.ViInt32(error_code) S190. Input is size of output buffer with mechanism ivi-dance-with-a-twist, QUERY_SIZE: visatype.ViInt32() @@ -371,7 +371,11 @@ def _get_ctype_variable_definition_snippet_for_scalar(parameter, parameters, ivi if corresponding_buffer_parameters[0].get('complex_array_representation') == 'interleaved_real_number_array': definitions.append(parameter['ctypes_variable_name'] + ' = {0}.{1}(0 if {2} is None else len({2}) // 2) # case S160'.format(module_name, parameter['ctypes_type'], corresponding_buffer_parameters[0]['python_name'])) else: - definitions.append(parameter['ctypes_variable_name'] + ' = {0}.{1}(0 if {2} is None else len({2})) # case S160'.format(module_name, parameter['ctypes_type'], corresponding_buffer_parameters[0]['python_name'])) + array_dimensions = corresponding_buffer_parameters[0].get('array_dimensions') + if isinstance(array_dimensions, int) and array_dimensions > 1: + definitions.append(parameter['ctypes_variable_name'] + ' = {0}.{1}(0 if {2} is None else {2}.size) # case S160'.format(module_name, parameter['ctypes_type'], corresponding_buffer_parameters[0]['python_name'])) + else: + definitions.append(parameter['ctypes_variable_name'] + ' = {0}.{1}(0 if {2} is None else len({2})) # case S160'.format(module_name, parameter['ctypes_type'], corresponding_buffer_parameters[0]['python_name'])) else: if corresponding_buffer_parameters[0]['size']['mechanism'] == 'ivi-dance': # We are only looking at the first one. Assumes all are the same here, assert below if not # Verify all corresponding_buffer_parameters are 'out' and 'ivi-dance' diff --git a/build/unit_tests/test_codegen_helper.py b/build/unit_tests/test_codegen_helper.py index e6b28ff27..28078553f 100644 --- a/build/unit_tests/test_codegen_helper.py +++ b/build/unit_tests/test_codegen_helper.py @@ -1149,6 +1149,14 @@ def test_get_ctype_variable_declaration_snippet_case_s160(): assert actual == ["input_array_size_ctype = _visatype.ViInt32(0 if input_array is None else len(input_array)) # case S160"] +def test_get_ctype_variable_declaration_snippet_case_s160_multidimensional_array_dimensions(): + size_parameter = parameters_for_testing[11] + buffer_parameter = dict(parameters_for_testing[10]) + buffer_parameter['array_dimensions'] = 3 + snippet = get_ctype_variable_declaration_snippet(size_parameter, [size_parameter, buffer_parameter], IviDanceStep.NOT_APPLICABLE, config_for_testing, use_numpy_array=False) + assert snippet == ["input_array_size_ctype = _visatype.ViInt32(0 if input_array is None else input_array.size) # case S160"] + + def test_get_ctype_variable_declaration_snippet_case_s170(): snippet = get_ctype_variable_declaration_snippet(parameters_for_testing[12], parameters_for_testing, IviDanceStep.QUERY_SIZE, config_for_testing, use_numpy_array=False) assert snippet == ["string_size_ctype = _visatype.ViInt32() # case S170"] From 9b4c9c4946c84bdafb658a522825754c41fbc9bb Mon Sep 17 00:00:00 2001 From: Rahul R Date: Wed, 25 Feb 2026 09:38:12 +0000 Subject: [PATCH 4/5] Removed unintended files --- docs/nirfsg/class.rst | 31 ++++++++++ .../nirfsg/nirfsg/_library_interpreter.py | 16 +----- generated/nirfsg/nirfsg/session.py | 44 +++++++++++++-- src/nirfsg/metadata/functions.py | 56 +++++++++++++++++-- .../get_deembedding_sparameter.py.mako | 27 --------- .../get_deembedding_sparameter.py.mako | 17 ++++++ 6 files changed, 139 insertions(+), 52 deletions(-) delete mode 100644 src/nirfsg/templates/_library_interpreter.py/get_deembedding_sparameter.py.mako create mode 100644 src/nirfsg/templates/session.py/get_deembedding_sparameter.py.mako diff --git a/docs/nirfsg/class.rst b/docs/nirfsg/class.rst index fb5faa14d..ccbe8656f 100644 --- a/docs/nirfsg/class.rst +++ b/docs/nirfsg/class.rst @@ -1211,6 +1211,37 @@ get_all_script_names +get_deembedding_sparameters +--------------------------- + + .. py:currentmodule:: nirfsg.Session + + .. py:method:: get_deembedding_sparameters() + + Returns the S-parameters used for de-embedding a measurement on the selected port. + + This includes interpolation of the parameters based on the configured carrier frequency. This method returns an empty array if no de-embedding is done. + + If you want to call this method just to get the required buffer size, you can pass 0 for **S-parameter Size** and VI_NULL for the **S-parameters** buffer. + + **Supported Devices** : PXIe-5830/5831/5832/5840/5841/5842/5860 + + + + .. note:: The port orientation for the returned S-parameters is normalized to :py:data:`~nirfsg.SparameterOrientation.PORT1_TOWARDS_DUT`. + + + + :rtype: numpy.array(dtype=numpy.complex128) + :return: + + + Returns an array of S-parameters. The S-parameters are returned in the following order: s11, s12, s21, s22. + + + + + get_error --------- diff --git a/generated/nirfsg/nirfsg/_library_interpreter.py b/generated/nirfsg/nirfsg/_library_interpreter.py index 01c02f2cc..58a366dbb 100644 --- a/generated/nirfsg/nirfsg/_library_interpreter.py +++ b/generated/nirfsg/nirfsg/_library_interpreter.py @@ -384,17 +384,7 @@ def get_attribute_vi_string(self, channel_name, attribute): # noqa: N802 errors.handle_error(self, error_code, ignore_warnings=False, is_error_handling=False) return value_ctype.value.decode(self._encoding) - def _get_deembedding_sparameters(self): - import numpy as np - number_of_ports = self.get_deembedding_table_number_of_ports() - sparameters_array_size = number_of_ports ** 2 - sparameters = np.full((number_of_ports, number_of_ports), 0 + 0j, dtype=np.complex128) - if type(sparameters) is not np.ndarray: - raise TypeError('sparameters must be {0}, is {1}'.format(np.ndarray, type(sparameters))) - if np.isfortran(sparameters) is True: - raise TypeError('sparameters must be in C-order') - if sparameters.dtype is not np.dtype('complex128'): - raise TypeError('sparameters must be np.ndarray of dtype=complex128, is ' + str(sparameters.dtype)) + def get_deembedding_sparameters(self, sparameters, sparameters_array_size): # noqa: N802 vi_ctype = _visatype.ViSession(self._vi) # case S110 sparameters_ctype = _get_ctypes_pointer_for_buffer(value=sparameters, library_type=_complextype.NIComplexNumber) # case B510 sparameters_array_size_ctype = _visatype.ViInt32(sparameters_array_size) # case S150 @@ -402,9 +392,7 @@ def _get_deembedding_sparameters(self): number_of_ports_ctype = _visatype.ViInt32() # case S220 error_code = self._library.niRFSG_GetDeembeddingSparameters(vi_ctype, sparameters_ctype, sparameters_array_size_ctype, None if number_of_sparameters_ctype is None else (ctypes.pointer(number_of_sparameters_ctype)), None if number_of_ports_ctype is None else (ctypes.pointer(number_of_ports_ctype))) errors.handle_error(self, error_code, ignore_warnings=False, is_error_handling=False) - number_of_ports = int(number_of_ports_ctype.value) - sparameters = sparameters.reshape((number_of_ports, number_of_ports)) - return sparameters + return int(number_of_sparameters_ctype.value), int(number_of_ports_ctype.value) def get_deembedding_table_number_of_ports(self): # noqa: N802 vi_ctype = _visatype.ViSession(self._vi) # case S110 diff --git a/generated/nirfsg/nirfsg/session.py b/generated/nirfsg/nirfsg/session.py index c6f0b7fbb..c6eaa90c8 100644 --- a/generated/nirfsg/nirfsg/session.py +++ b/generated/nirfsg/nirfsg/session.py @@ -6361,6 +6361,31 @@ def create_deembedding_sparameter_table_array(self, port, table_name, frequencie else: raise TypeError("Unsupported datatype. Expected numpy array.") + def get_deembedding_sparameters(self): + '''get_deembedding_sparameters + + Returns the S-parameters used for de-embedding a measurement on the selected port. + + This includes interpolation of the parameters based on the configured carrier frequency. This method returns an empty array if no de-embedding is done. + + If you want to call this method just to get the required buffer size, you can pass 0 for **S-parameter Size** and VI_NULL for the **S-parameters** buffer. + + **Supported Devices** : PXIe-5830/5831/5832/5840/5841/5842/5860 + + Note: The port orientation for the returned S-parameters is normalized to SparameterOrientation.PORT1_TOWARDS_DUT. + + Returns: + sparameters (numpy.array(dtype=numpy.complex128)): Returns an array of S-parameters. The S-parameters are returned in the following order: s11, s12, s21, s22. + + ''' + import numpy as np + number_of_ports = self._get_deembedding_table_number_of_ports() + sparameter_array_size = number_of_ports ** 2 + sparameters = np.full((number_of_ports, number_of_ports), 0 + 0j, dtype=np.complex128) + _, number_of_ports = self._get_deembedding_sparameters(sparameters, sparameter_array_size) + sparameters = sparameters.reshape((number_of_ports, number_of_ports)) + return sparameters + @ivi_synchronized def get_all_named_waveform_names(self): r'''get_all_named_waveform_names @@ -6391,7 +6416,8 @@ def get_all_script_names(self): script_names = self._interpreter.get_all_script_names() return _converters.convert_comma_separated_string_to_list(script_names) - def _get_deembedding_sparameters(self, sparameters_array_size): + @ivi_synchronized + def _get_deembedding_sparameters(self, sparameters, sparameters_array_size): r'''_get_deembedding_sparameters Returns the S-parameters used for de-embedding a measurement on the selected port. @@ -6405,6 +6431,8 @@ def _get_deembedding_sparameters(self, sparameters_array_size): Note: The port orientation for the returned S-parameters is normalized to SparameterOrientation.PORT1_TOWARDS_DUT. Args: + sparameters (numpy.array(dtype=numpy.complex128)): Returns an array of S-parameters. The S-parameters are returned in the following order: s11, s12, s21, s22. + sparameters_array_size (int): Specifies the size of the array that is returned by the SPARAMETERS output. Note: @@ -6412,15 +6440,21 @@ def _get_deembedding_sparameters(self, sparameters_array_size): Returns: - sparameters (list of NIComplexNumber): Returns an array of S-parameters. The S-parameters are returned in the following order: s11, s12, s21, s22. - number_of_sparameters (int): Returns the number of S-parameters. number_of_ports (int): Returns the number of S-parameter ports. The **sparameter** array is always *n* x *n*, where span *n* is the number of ports. ''' - sparameters, number_of_sparameters, number_of_ports = self._interpreter.get_deembedding_sparameters(sparameters_array_size) - return sparameters, number_of_sparameters, number_of_ports + import numpy + + if type(sparameters) is not numpy.ndarray: + raise TypeError('sparameters must be {0}, is {1}'.format(numpy.ndarray, type(sparameters))) + if numpy.isfortran(sparameters) is True: + raise TypeError('sparameters must be in C-order') + if sparameters.dtype is not numpy.dtype('complex128'): + raise TypeError('sparameters must be numpy.ndarray of dtype=complex128, is ' + str(sparameters.dtype)) + number_of_sparameters, number_of_ports = self._interpreter.get_deembedding_sparameters(sparameters, sparameters_array_size) + return number_of_sparameters, number_of_ports @ivi_synchronized def _get_deembedding_table_number_of_ports(self): diff --git a/src/nirfsg/metadata/functions.py b/src/nirfsg/metadata/functions.py index 504a1126d..64416372f 100644 --- a/src/nirfsg/metadata/functions.py +++ b/src/nirfsg/metadata/functions.py @@ -1500,6 +1500,52 @@ 'returns': 'ViStatus', 'use_session_lock': False }, + 'FancyGetDeembeddingSparameters': { + 'codegen_method': 'python-only', + 'documentation': { + 'description': '\nReturns the S-parameters used for de-embedding a measurement on the selected port.\n\nThis includes interpolation of the parameters based on the configured carrier frequency. This function returns an empty array if no de-embedding is done.\n\nIf you want to call this function just to get the required buffer size, you can pass 0 for **S-parameter Size** and VI_NULL for the **S-parameters** buffer.\n\n**Supported Devices** : PXIe-5830/5831/5832/5840/5841/5842/5860', + 'note': 'The port orientation for the returned S-parameters is normalized to NIRFSG_VAL_PORT1_TOWARDS_DUT.' + }, + 'included_in_proto': True, + 'method_name_for_documentation': 'get_deembedding_sparameters', + 'method_templates': [ + { + 'documentation_filename': 'default_method', + 'library_interpreter_filename': 'none', + 'method_python_name_suffix': '', + 'session_filename': 'get_deembedding_sparameter' + } + ], + 'parameters': [ + { + 'direction': 'in', + 'documentation': { + 'description': 'Identifies your instrument session. The ViSession handle is obtained from the nirfsg_Init function or the nirfsg_InitWithOptions function and identifies a particular instrument session.' + }, + 'name': 'vi', + 'type': 'ViSession', + 'use_array': False, + 'use_in_python_api': True + }, + { + 'array_dimensions': 2, + 'complex_array_representation': 'complex_number_array', + 'direction': 'out', + 'documentation': { + 'description': 'Returns an array of S-parameters. The S-parameters are returned in the following order: s11, s12, s21, s22.' + }, + 'name': 'sparameters', + 'numpy': True, + 'type': 'NIComplexNumber[]', + 'type_in_documentation': 'numpy.array(dtype=numpy.complex128)', + 'use_array': False, + 'use_in_python_api': True + } + ], + 'python_name': 'get_deembedding_sparameters', + 'returns': None, + 'use_session_lock': False + }, 'GetAllNamedWaveformNames': { 'codegen_method': 'public', 'documentation': { @@ -2007,10 +2053,10 @@ 'included_in_proto': True, 'method_templates': [ { - 'documentation_filename': 'default_method', - 'library_interpreter_filename': 'get_deembedding_sparameter', + 'documentation_filename': 'numpy_method', + 'library_interpreter_filename': 'numpy_read_method', 'method_python_name_suffix': '', - 'session_filename': 'default_method' + 'session_filename': 'numpy_read_method' } ], 'parameters': [ @@ -2067,9 +2113,7 @@ 'use_in_python_api': True } ], - 'python_name': '_get_deembedding_sparameters', - 'returns': 'ViStatus', - 'use_session_lock': False + 'returns': 'ViStatus' }, 'GetDeembeddingTableNumberOfPorts': { 'codegen_method': 'private', diff --git a/src/nirfsg/templates/_library_interpreter.py/get_deembedding_sparameter.py.mako b/src/nirfsg/templates/_library_interpreter.py/get_deembedding_sparameter.py.mako deleted file mode 100644 index 5e8e602d2..000000000 --- a/src/nirfsg/templates/_library_interpreter.py/get_deembedding_sparameter.py.mako +++ /dev/null @@ -1,27 +0,0 @@ -<%page args="f, config, method_template"/>\ -<% - '''Creates a numpy array based on number of ports queried from driver and passes it to "get_deembedding_sparameters" method.''' - import build.helper as helper -%>\ - - def ${f['python_name']}(self): - import numpy as np - number_of_ports = self.get_deembedding_table_number_of_ports() - sparameters_array_size = number_of_ports ** 2 - sparameters = np.full((number_of_ports, number_of_ports), 0 + 0j, dtype=np.complex128) - if type(sparameters) is not np.ndarray: - raise TypeError('sparameters must be {0}, is {1}'.format(np.ndarray, type(sparameters))) - if np.isfortran(sparameters) is True: - raise TypeError('sparameters must be in C-order') - if sparameters.dtype is not np.dtype('complex128'): - raise TypeError('sparameters must be np.ndarray of dtype=complex128, is ' + str(sparameters.dtype)) - vi_ctype = _visatype.ViSession(self._vi) # case S110 - sparameters_ctype = _get_ctypes_pointer_for_buffer(value=sparameters, library_type=_complextype.NIComplexNumber) # case B510 - sparameters_array_size_ctype = _visatype.ViInt32(sparameters_array_size) # case S150 - number_of_sparameters_ctype = _visatype.ViInt32() # case S220 - number_of_ports_ctype = _visatype.ViInt32() # case S220 - error_code = self._library.niRFSG_GetDeembeddingSparameters(vi_ctype, sparameters_ctype, sparameters_array_size_ctype, None if number_of_sparameters_ctype is None else (ctypes.pointer(number_of_sparameters_ctype)), None if number_of_ports_ctype is None else (ctypes.pointer(number_of_ports_ctype))) - errors.handle_error(self, error_code, ignore_warnings=False, is_error_handling=False) - number_of_ports = int(number_of_ports_ctype.value) - sparameters = sparameters.reshape((number_of_ports, number_of_ports)) - return sparameters diff --git a/src/nirfsg/templates/session.py/get_deembedding_sparameter.py.mako b/src/nirfsg/templates/session.py/get_deembedding_sparameter.py.mako new file mode 100644 index 000000000..1b4d6aa46 --- /dev/null +++ b/src/nirfsg/templates/session.py/get_deembedding_sparameter.py.mako @@ -0,0 +1,17 @@ +<%page args="f, config, method_template"/>\ +<% + '''Creates a numpy array based on number of ports queried from driver and passes it to "get_deembedding_sparameters" method.''' + import build.helper as helper +%>\ + def ${f['python_name']}(${helper.get_params_snippet(f, helper.ParameterUsageOptions.SESSION_METHOD_DECLARATION)}): + '''${f['python_name']} + + ${helper.get_function_docstring(f, False, config, indent=8)} + ''' + import numpy as np + number_of_ports = self._get_deembedding_table_number_of_ports() + sparameter_array_size = number_of_ports ** 2 + sparameters = np.full((number_of_ports, number_of_ports), 0 + 0j, dtype=np.complex128) + _, number_of_ports = self._get_deembedding_sparameters(sparameters, sparameter_array_size) + sparameters = sparameters.reshape((number_of_ports, number_of_ports)) + return sparameters From 1df23c1d1bd0e0b8be56941c6812d8d0474ca998 Mon Sep 17 00:00:00 2001 From: Rahul R Date: Wed, 25 Feb 2026 12:47:24 +0000 Subject: [PATCH 5/5] Renaning unit test --- build/unit_tests/test_codegen_helper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/unit_tests/test_codegen_helper.py b/build/unit_tests/test_codegen_helper.py index 28078553f..1d74870e3 100644 --- a/build/unit_tests/test_codegen_helper.py +++ b/build/unit_tests/test_codegen_helper.py @@ -1149,7 +1149,7 @@ def test_get_ctype_variable_declaration_snippet_case_s160(): assert actual == ["input_array_size_ctype = _visatype.ViInt32(0 if input_array is None else len(input_array)) # case S160"] -def test_get_ctype_variable_declaration_snippet_case_s160_multidimensional_array_dimensions(): +def test_get_ctype_variable_declaration_snippet_case_s160_multidimensional_array(): size_parameter = parameters_for_testing[11] buffer_parameter = dict(parameters_for_testing[10]) buffer_parameter['array_dimensions'] = 3