Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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)
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
31 changes: 30 additions & 1 deletion 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,13 +1703,15 @@ 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
def write_waveform_numpy_complex128(self, waveform_data_array):
r'''write_waveform_numpy_complex128

A method that writes a waveform of numpy complex128 numbers
A method that writes a waveform of numpy complex128 numbers.

Args:
waveform_data_array (numpy.array(dtype=numpy.complex128)): Specifies the array of data to load into the waveform. Array should be numberOfSamples big.
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
Loading