Вызов функции C с типом C (фиксированная точка) из Python

Я пытаюсь вызвать функцию 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, поэтому чем меньше оберток, тем лучше.


person Christopher Baldwin    schedule 14.12.2020    source источник
comment
Ознакомьтесь с этой веткой: stackoverflow.com/questions/19897338/   -  person User2332    schedule 14.12.2020