Я пытаюсь вызвать функцию C из Python, которая принимает тип Vivado ap_fixed. Я могу передать число с плавающей запятой в качестве параметра, но это означает, что мне придется приводить типы к плавающим и обратно к фиксированным при каждом вызове, что неэффективно. Я также пытался передать void *, но я думаю, что у python есть проблема с попыткой преобразовать данные в тип void *. Есть ли способ, которым я мог бы вызвать функцию из Python без необходимости приведения функции к типу. Я думал об использовании ‹Python.h› для переноса функции на сторону C, но не пробовал. Ниже приведены фрагменты кода, которые я использовал для приведения к типу float.
py_fixed.py (преобразование в плавающее)
import random
import pathlib
import numpy as np
from fxpmath import Fxp
from numpy.ctypeslib import ndpointer
def py_start(x, y):
for i, x_val in enumerate(x):
y[i] = x_val + 2
# print(y)
if __name__ == "__main__":
print('------Starting Python------')
x = Fxp([1.1, 2.2, 3.3], n_word=16, n_frac=2)
y_py = Fxp([0, 0, 0], n_word=16, n_frac=2)
y_c = Fxp([0, 0, 0], n_word=16, n_frac=2)
print('--Running Python--')
py_start(x, y_py)
print('--Running C--')
print('CDLL')
c_lib = CDLL("./c_start.so")
print('Args')
c_lib.c_start_wrap.argtypes = [ndpointer(c_float), ndpointer(c_float)]
print('Function Parameters')
print( type(x()) )
x_ptr, y_ptr = np.array(x.astype(float), dtype=np.float32), np.array(y_c.astype(float), dtype=np.float32)
print(x_ptr)
print('Func Call')
c_lib.c_start_wrap(x_ptr, y_ptr)
y_c.equal(y_ptr)
print('End Func Call')
print('Python: ' + str(y_py))
print('C: ' + str(y_c))
print('------Finishing Python------')
c_start.cpp
#include <ap_fixed.h>
#define FLOAT_TEST 1
typedef ap_fixed<16, 2> data_t;
extern "C" void c_start(data_t *x, data_t *y){
for(int i=0; i<ARRAY_LEN; i++){
y[i] = x[i]+2;
}
}
extern "C" void c_start_wrap(float *x, float *y){
#if FLOAT_TEST
for(int i=0; i<ARRAY_LEN; i++){
y[i] = x[i]+2;
}
#else
c_start( (data_t*) x, (data_t*) y); // This is not correct but I will handle when passing gets fixed
#endif
}
int main(){
return 0;
}
Основная проблема, которую я вижу, заключается в том, что нет способа фактически передать тип Fxp функции C, и я не знаю, как передать тип ap_fixed из Python. Было бы предпочтительнее не иметь оберток и просто вызывать функцию напрямую. В конечном итоге этот код C будет использоваться в Vivado HLS для генерации RTL, поэтому чем меньше оберток, тем лучше.