Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions build/helper/metadata_add_all.py
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,12 @@ def _add_complex_type(parameter):
parameter['complex_type'] = None


def _add_array_dimension(parameter):
'''Adds a array_dimension parameter to the metadata for multi dimensional arrays'''
if 'array_dimension' not in parameter:
parameter['array_dimension'] = 1


def _add_numpy_info(parameter, parameters, config):
'''Adds the following numpy-related information:

Expand Down Expand Up @@ -457,6 +463,7 @@ def add_all_function_metadata(functions, config):
_add_ctypes_variable_name(p)
_add_ctypes_type(p, config)
_add_complex_type(p)
_add_array_dimension(p)
_add_numpy_info(p, functions[f]['parameters'], config)
_add_default_value_name(p)
_add_default_value_name_for_docs(p, config['module_name'])
Expand Down
8 changes: 6 additions & 2 deletions build/templates/_library_interpreter.py.mako
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,12 @@ def _get_ctypes_pointer_for_buffer(value=None, library_type=None, size=None):
% if are_complex_parameters_used:
if library_type in (_complextype.NIComplexI16, _complextype.NIComplexNumberF32, _complextype.NIComplexNumber):
complex_dtype = numpy.dtype(library_type)
structured_array = value.view(complex_dtype)
return structured_array.ctypes.data_as(ctypes.POINTER(library_type))
if value.ndim > 1:
# we create a flattened view of the multi-dimensional numpy array
restructured_array_view = value.ravel().view(complex_dtype)
else:
restructured_array_view = value.view(complex_dtype)
Comment thread
rahulr-NI marked this conversation as resolved.
return restructured_array_view.ctypes.data_as(ctypes.POINTER(library_type))
else:
return numpy.ctypeslib.as_ctypes(value)
% else:
Expand Down
2 changes: 2 additions & 0 deletions build/templates/session.py/numpy_write_method.py.mako
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@
raise TypeError('${parameter['python_name']} must be in C-order')
if ${parameter['python_name']}.dtype is not numpy.dtype('${parameter['numpy_type']}'):
raise TypeError('${parameter['python_name']} must be numpy.ndarray of dtype=${parameter['numpy_type']}, is ' + str(${parameter['python_name']}.dtype))
if ${parameter['python_name']}.ndim != ${parameter['array_dimension']}:
raise TypeError('${parameter['python_name']} must be numpy.ndarray of dimension=${parameter['array_dimension']}, is ' + str(${parameter['python_name']}.ndim))
% endfor
% for p in helper.filter_parameters(parameters, helper.ParameterUsageOptions.INTERPRETER_METHOD_CALL):
% if 'python_api_converter_name' in p:
Expand Down
14 changes: 14 additions & 0 deletions build/unit_tests/test_metadata_add_all.py
Original file line number Diff line number Diff line change
Expand Up @@ -260,6 +260,7 @@ def _compare_dicts(actual, expected):
'use_in_python_api': True,
'python_name_or_default_for_init': 'vi',
'complex_type': None,
'array_dimension': 1,
},
{
'ctypes_method_call_snippet': 'name_ctype',
Expand Down Expand Up @@ -294,6 +295,7 @@ def _compare_dicts(actual, expected):
'use_in_python_api': True,
'python_name_or_default_for_init': 'name',
'complex_type': None,
'array_dimension': 1,
},
{
'ctypes_method_call_snippet': 'pin_data_buffer_size_ctype',
Expand Down Expand Up @@ -331,6 +333,7 @@ def _compare_dicts(actual, expected):
'use_in_python_api': False,
'python_name_or_default_for_init': 'pin_data_buffer_size',
'complex_type': None,
'array_dimension': 1,
},
{
'ctypes_method_call_snippet': 'python_code_input_ctype',
Expand Down Expand Up @@ -368,6 +371,7 @@ def _compare_dicts(actual, expected):
'use_in_python_api': True,
'python_name_or_default_for_init': 'python_code_input',
'complex_type': None,
'array_dimension': 1,
},
{
'ctypes_method_call_snippet': 'None if actual_num_pin_data_ctype is None else (ctypes.pointer(actual_num_pin_data_ctype))',
Expand Down Expand Up @@ -405,6 +409,7 @@ def _compare_dicts(actual, expected):
'use_in_python_api': False,
'python_name_or_default_for_init': 'actual_num_pin_data',
'complex_type': None,
'array_dimension': 1,
},
{
'ctypes_method_call_snippet': 'expected_pin_states_ctype',
Expand Down Expand Up @@ -444,6 +449,7 @@ def _compare_dicts(actual, expected):
'use_in_python_api': True,
'python_name_or_default_for_init': 'expected_pin_states',
'complex_type': None,
'array_dimension': 1,
},
{
'ctypes_method_call_snippet': 'custom_type_input_ctype',
Expand Down Expand Up @@ -481,6 +487,7 @@ def _compare_dicts(actual, expected):
'use_in_python_api': True,
'python_name_or_default_for_init': 'custom_type_input',
'complex_type': None,
'array_dimension': 1,
},
{
'ctypes_method_call_snippet': 'None if custom_type_output_ctype is None else (ctypes.pointer(custom_type_output_ctype))',
Expand Down Expand Up @@ -518,6 +525,7 @@ def _compare_dicts(actual, expected):
'use_in_python_api': True,
'python_name_or_default_for_init': 'custom_type_output',
'complex_type': None,
'array_dimension': 1,
},
{
'ctypes_method_call_snippet': 'custom_type_without_struct_prefix_input_ctype',
Expand Down Expand Up @@ -555,6 +563,7 @@ def _compare_dicts(actual, expected):
'use_in_python_api': True,
'python_name_or_default_for_init': 'custom_type_without_struct_prefix_input',
'complex_type': None,
'array_dimension': 1,
},
{
'ctypes_method_call_snippet': 'None if custom_type_without_struct_prefix_output_ctype is None else (ctypes.pointer(custom_type_without_struct_prefix_output_ctype))',
Expand Down Expand Up @@ -592,6 +601,7 @@ def _compare_dicts(actual, expected):
'use_in_python_api': True,
'python_name_or_default_for_init': 'custom_type_without_struct_prefix_output',
'complex_type': None,
'array_dimension': 1,
},
],
'python_name': 'make_a_foo',
Expand Down Expand Up @@ -640,6 +650,7 @@ def _compare_dicts(actual, expected):
'use_in_python_api': True,
'python_name_or_default_for_init': 'vi',
'complex_type': None,
'array_dimension': 1,
},
{
'ctypes_method_call_snippet': 'status_ctype',
Expand Down Expand Up @@ -677,6 +688,7 @@ def _compare_dicts(actual, expected):
'use_in_python_api': True,
'python_name_or_default_for_init': 'status',
'complex_type': None,
'array_dimension': 1,
},
{
'ctypes_method_call_snippet': 'data_buffer_size_ctype',
Expand Down Expand Up @@ -714,6 +726,7 @@ def _compare_dicts(actual, expected):
'use_in_python_api': False,
'python_name_or_default_for_init': 'data_buffer_size',
'complex_type': None,
'array_dimension': 1,
},
{
'ctypes_method_call_snippet': 'data_ctype',
Expand Down Expand Up @@ -752,6 +765,7 @@ def _compare_dicts(actual, expected):
'use_in_python_api': True,
'python_name_or_default_for_init': 'data',
'complex_type': None,
'array_dimension': 1,
},
],
'documentation': {
Expand Down
3 changes: 3 additions & 0 deletions generated/nifake/nifake/_grpc_stub_interpreter.py
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,9 @@ def fetch_waveform(self, number_of_samples): # noqa: N802
def fetch_waveform_into(self, number_of_samples): # noqa: N802
raise NotImplementedError('numpy-specific methods are not supported over gRPC')

def function_with_3d_numpy_array_of_numpy_complex128_input_parameter(self, multidimensional_array): # noqa: N802
raise NotImplementedError('numpy-specific methods are not supported over gRPC')

def function_with_intflag_parameter(self, flag): # noqa: N802
self._invoke(
self._client.FunctionWithIntflagParameter,
Expand Down
9 changes: 9 additions & 0 deletions generated/nifake/nifake/_library.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ def __init__(self, ctypes_library):
self.niFake_EnumInputFunctionWithDefaults_cfunc = None
self.niFake_ExportAttributeConfigurationBuffer_cfunc = None
self.niFake_FetchWaveform_cfunc = None
self.niFake_FunctionWith3dNumpyArrayOfNumpyComplex128InputParameter_cfunc = None
self.niFake_FunctionWithIntflagParameter_cfunc = None
self.niFake_FunctionWithRepeatedCapabilityType_cfunc = None
self.niFake_GetABoolean_cfunc = None
Expand Down Expand Up @@ -188,6 +189,14 @@ def niFake_FetchWaveform(self, vi, number_of_samples, waveform_data, actual_numb
self.niFake_FetchWaveform_cfunc.restype = ViStatus # noqa: F405
return self.niFake_FetchWaveform_cfunc(vi, number_of_samples, waveform_data, actual_number_of_samples)

def niFake_FunctionWith3dNumpyArrayOfNumpyComplex128InputParameter(self, vi, multidimensional_array): # noqa: N802
with self._func_lock:
if self.niFake_FunctionWith3dNumpyArrayOfNumpyComplex128InputParameter_cfunc is None:
self.niFake_FunctionWith3dNumpyArrayOfNumpyComplex128InputParameter_cfunc = self._get_library_function('niFake_FunctionWith3dNumpyArrayOfNumpyComplex128InputParameter')
self.niFake_FunctionWith3dNumpyArrayOfNumpyComplex128InputParameter_cfunc.argtypes = [ViSession, ctypes.POINTER(NIComplexNumber)] # noqa: F405
self.niFake_FunctionWith3dNumpyArrayOfNumpyComplex128InputParameter_cfunc.restype = ViStatus # noqa: F405
return self.niFake_FunctionWith3dNumpyArrayOfNumpyComplex128InputParameter_cfunc(vi, multidimensional_array)

def niFake_FunctionWithIntflagParameter(self, vi, flag): # noqa: N802
with self._func_lock:
if self.niFake_FunctionWithIntflagParameter_cfunc is None:
Expand Down
15 changes: 13 additions & 2 deletions generated/nifake/nifake/_library_interpreter.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,12 @@ def _get_ctypes_pointer_for_buffer(value=None, library_type=None, size=None):
import numpy
if library_type in (_complextype.NIComplexI16, _complextype.NIComplexNumberF32, _complextype.NIComplexNumber):
complex_dtype = numpy.dtype(library_type)
structured_array = value.view(complex_dtype)
return structured_array.ctypes.data_as(ctypes.POINTER(library_type))
if value.ndim > 1:
# we create a flattened view of the multi-dimensional numpy array
restructured_array_view = value.ravel().view(complex_dtype)
else:
restructured_array_view = value.view(complex_dtype)
return restructured_array_view.ctypes.data_as(ctypes.POINTER(library_type))
else:
return numpy.ctypeslib.as_ctypes(value)
elif isinstance(value, bytes):
Expand Down Expand Up @@ -218,6 +222,13 @@ def fetch_waveform_into(self, waveform_data): # noqa: N802
errors.handle_error(self, error_code, ignore_warnings=False, is_error_handling=False)
return

def function_with_3d_numpy_array_of_numpy_complex128_input_parameter(self, multidimensional_array): # noqa: N802
vi_ctype = _visatype.ViSession(self._vi) # case S110
multidimensional_array_ctype = _get_ctypes_pointer_for_buffer(value=multidimensional_array, library_type=_complextype.NIComplexNumber) # case B510
error_code = self._library.niFake_FunctionWith3dNumpyArrayOfNumpyComplex128InputParameter(vi_ctype, multidimensional_array_ctype)
errors.handle_error(self, error_code, ignore_warnings=False, is_error_handling=False)
return

def function_with_intflag_parameter(self, flag): # noqa: N802
vi_ctype = _visatype.ViSession(self._vi) # case S110
flag_ctype = _visatype.ViUInt64(flag.value) # case S130
Expand Down
29 changes: 29 additions & 0 deletions generated/nifake/nifake/session.py
Original file line number Diff line number Diff line change
Expand Up @@ -945,6 +945,27 @@ def fetch_waveform_into(self, waveform_data):
raise TypeError('waveform_data must be numpy.ndarray of dtype=float64, is ' + str(waveform_data.dtype))
self._interpreter.fetch_waveform_into(waveform_data)

def function_with_3d_numpy_array_of_numpy_complex128_input_parameter(self, multidimensional_array):
r'''function_with_3d_numpy_array_of_numpy_complex128_input_parameter

Method that takes a 3D numpy array of numpy complex128 as an input parameter.

Args:
multidimensional_array (numpy.array(dtype=numpy.complex128)): Specifies the 3D array of numpy complex numbers to write.

'''
import numpy

if type(multidimensional_array) is not numpy.ndarray:
raise TypeError('multidimensional_array must be {0}, is {1}'.format(numpy.ndarray, type(multidimensional_array)))
if numpy.isfortran(multidimensional_array) is True:
raise TypeError('multidimensional_array must be in C-order')
if multidimensional_array.dtype is not numpy.dtype('complex128'):
raise TypeError('multidimensional_array must be numpy.ndarray of dtype=complex128, is ' + str(multidimensional_array.dtype))
if multidimensional_array.ndim != 3:
raise TypeError('multidimensional_array must be numpy.ndarray of dimension=3, is ' + str(multidimensional_array.ndim))
self._interpreter.function_with_3d_numpy_array_of_numpy_complex128_input_parameter(multidimensional_array)

@ivi_synchronized
def function_with_intflag_parameter(self, flag):
r'''function_with_intflag_parameter
Expand Down Expand Up @@ -1682,6 +1703,8 @@ def write_waveform_numpy(self, waveform):
raise TypeError('waveform must be in C-order')
if waveform.dtype is not numpy.dtype('float64'):
raise TypeError('waveform must be numpy.ndarray of dtype=float64, is ' + str(waveform.dtype))
if waveform.ndim != 1:
raise TypeError('waveform must be numpy.ndarray of dimension=1, is ' + str(waveform.ndim))
self._interpreter.write_waveform_numpy(waveform)

@ivi_synchronized
Expand All @@ -1702,6 +1725,8 @@ def write_waveform_numpy_complex128(self, waveform_data_array):
raise TypeError('waveform_data_array must be in C-order')
if waveform_data_array.dtype is not numpy.dtype('complex128'):
raise TypeError('waveform_data_array must be numpy.ndarray of dtype=complex128, is ' + str(waveform_data_array.dtype))
if waveform_data_array.ndim != 1:
raise TypeError('waveform_data_array must be numpy.ndarray of dimension=1, is ' + str(waveform_data_array.ndim))
self._interpreter.write_waveform_numpy_complex128(waveform_data_array)

@ivi_synchronized
Expand All @@ -1722,6 +1747,8 @@ def write_waveform_numpy_complex64(self, waveform_data_array):
raise TypeError('waveform_data_array must be in C-order')
if waveform_data_array.dtype is not numpy.dtype('complex64'):
raise TypeError('waveform_data_array must be numpy.ndarray of dtype=complex64, is ' + str(waveform_data_array.dtype))
if waveform_data_array.ndim != 1:
raise TypeError('waveform_data_array must be numpy.ndarray of dimension=1, is ' + str(waveform_data_array.ndim))
self._interpreter.write_waveform_numpy_complex64(waveform_data_array)

@ivi_synchronized
Expand All @@ -1742,6 +1769,8 @@ def write_waveform_numpy_complex_interleaved_i16(self, waveform_data_array):
raise TypeError('waveform_data_array must be in C-order')
if waveform_data_array.dtype is not numpy.dtype('int16'):
raise TypeError('waveform_data_array must be numpy.ndarray of dtype=int16, is ' + str(waveform_data_array.dtype))
if waveform_data_array.ndim != 1:
raise TypeError('waveform_data_array must be numpy.ndarray of dimension=1, is ' + str(waveform_data_array.ndim))
self._interpreter.write_waveform_numpy_complex_interleaved_i16(waveform_data_array)

def _close(self):
Expand Down
9 changes: 9 additions & 0 deletions generated/nifake/nifake/unit_tests/_mock_helper.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@ def __init__(self):
self._defaults['FetchWaveform']['return'] = 0
self._defaults['FetchWaveform']['waveformData'] = None
self._defaults['FetchWaveform']['actualNumberOfSamples'] = None
self._defaults['FunctionWith3dNumpyArrayOfNumpyComplex128InputParameter'] = {}
self._defaults['FunctionWith3dNumpyArrayOfNumpyComplex128InputParameter']['return'] = 0
self._defaults['FunctionWithIntflagParameter'] = {}
self._defaults['FunctionWithIntflagParameter']['return'] = 0
self._defaults['FunctionWithRepeatedCapabilityType'] = {}
Expand Down Expand Up @@ -339,6 +341,11 @@ def niFake_FetchWaveform(self, vi, number_of_samples, waveform_data, actual_numb
actual_number_of_samples.contents.value = self._defaults['FetchWaveform']['actualNumberOfSamples']
return self._defaults['FetchWaveform']['return']

def niFake_FunctionWith3dNumpyArrayOfNumpyComplex128InputParameter(self, vi, multidimensional_array): # noqa: N802
if self._defaults['FunctionWith3dNumpyArrayOfNumpyComplex128InputParameter']['return'] != 0:
return self._defaults['FunctionWith3dNumpyArrayOfNumpyComplex128InputParameter']['return']
return self._defaults['FunctionWith3dNumpyArrayOfNumpyComplex128InputParameter']['return']

def niFake_FunctionWithIntflagParameter(self, vi, flag): # noqa: N802
if self._defaults['FunctionWithIntflagParameter']['return'] != 0:
return self._defaults['FunctionWithIntflagParameter']['return']
Expand Down Expand Up @@ -1043,6 +1050,8 @@ def set_side_effects_and_return_values(self, mock_library):
mock_library.niFake_ExportAttributeConfigurationBuffer.return_value = 0
mock_library.niFake_FetchWaveform.side_effect = MockFunctionCallError("niFake_FetchWaveform")
mock_library.niFake_FetchWaveform.return_value = 0
mock_library.niFake_FunctionWith3dNumpyArrayOfNumpyComplex128InputParameter.side_effect = MockFunctionCallError("niFake_FunctionWith3dNumpyArrayOfNumpyComplex128InputParameter")
mock_library.niFake_FunctionWith3dNumpyArrayOfNumpyComplex128InputParameter.return_value = 0
mock_library.niFake_FunctionWithIntflagParameter.side_effect = MockFunctionCallError("niFake_FunctionWithIntflagParameter")
mock_library.niFake_FunctionWithIntflagParameter.return_value = 0
mock_library.niFake_FunctionWithRepeatedCapabilityType.side_effect = MockFunctionCallError("niFake_FunctionWithRepeatedCapabilityType")
Expand Down
Loading