Herramientas para compilar punteros a matrices de tamaño estático

0

¿Existen herramientas de análisis de código estático para C que conviertan punteros en arreglos de un tamaño estático? Es un dolor marginal y simplemente pensé en consultar con la comunidad. Una búsqueda rápida en Google no encontró nada útil porque "a" en la frase "puntero a matriz" generalmente significa algo completamente diferente de lo que estoy buscando aquí ... Cualquier sugerencia o palabra clave sería útil.

P.s. Estoy tratando de convertir algo de código en C sintetizable para una implementación de hardware.

Por ejemplo, este código no es sintetizable:

void sum(float *a, int size, float *out) {
    int i;
    for (i=0;i<size;i++)
        *out += a+1;
}

No es sintetizable ya que el tamaño de a no se declara estáticamente en tiempo de ejecución. (Tenga en cuenta que debería estar bien ya que no es una matriz, aunque no estoy 100% seguro de eso). Sería fantástico si hubiera una herramienta para convertir el uso de matrices de tamaño variable en matrices cuyos tamaños se conocieran en tiempo de compilación.

Además, este código debe transformarse (actualmente de forma manual) a algo como esto:

// Not 100% sure if float * is still allowed.
void sum(float a[SIZE], float *out) {
    int i;
    for (i=0;i<SIZE;i++)
        *out += a[i]; // Not sure if this is necessary.
}

En este momento, tendría que hacer esto manualmente. Tengo que resolver todos los usos de matrices dinámicas. Así es como funciona HLS. Es un asunto serio. Es difícil (o al menos requiere mucho tiempo) hacerlo cuando no escribió el código original. Debe convertirse para que pueda sintetizar el código en hardware.

Todos los tamaños de matriz deben resolverse; es posible que no se hayan declarado explícitamente al principio. Luego, estos tamaños de matriz deben propagarse a todas las funciones / referencias afectadas.

Finalmente, para aquellos de ustedes confundidos por "sintetizable", siéntase libre de revisar estos dos enlaces que lo describen mucho mejor de lo que puedo ...

enlace enlace

    
pregunta eatonphil

3 respuestas

1

puede declarar una matriz de tamaño fijo y luego acceder a ella usando un puntero, Tomemos, por ejemplo, puedes declarar

float a[10];

y accede a él como

*(a+index)= <value>;

* a representa un [0].

para su función de suma, puede dejar intacta la siguiente función

'    void sum(float *a, int size, float *out) {
        int i;
        for (i=0;i<size;i++)
            *out += a+1;
    }

y hacer cambios en el programa de llamadas. directiva de preprocesador

#define size <yourchoice>

declaración de variable

float a[size];
float out[size];

llamada a función

sum((float*)a,int size,(float*)out);

No estoy seguro de cuál es su función que intenta lograr la adición de bloques o la suma de flotadores consecutivos ... pero espero que esto ayude

    
respondido por el Himanshu Sourav
0

En C, no pasa arrays por valor a las funciones, sino que simplemente pasa el puntero, es decir, una dirección de una ubicación de memoria que actúa como un almacenamiento válido para sus datos. Esta es la razón por la que se debe utilizar algún truco para pasar el tamaño (es decir, la cantidad de elementos accesibles). Esto se suele llamar como un parámetro "por referencia" que pasa en algunos idiomas de nivel superior. En tu pregunta parece que casi ignoras el puntero *out . De hecho, es importante que la persona que llama pase un puntero a una parte de memoria válida de ancho al menos size*sizeof(float) bytes. Tenga en cuenta que un +1 en un float * significa un incremento de sizeof(float) en el valor absoluto de la dirección (generalmente 4 bytes). No sé si esta es la respuesta que desea, pero esta es la esencia de C , el hecho de que hace de C un lenguaje generalmente rápido.

    
respondido por el Felice Pollano
0

Esto no es posible en el caso general.

podría ser posible en su caso específico, escribiendo una herramienta que toma la primera declaración de una matriz y fuerza ese tamaño en las funciones llamadas. ¿Pero qué sucede si se llama a una función con matrices de tamaños diferentes o variables?

En general, C-to-Verilog produce malos resultados, especialmente con código que no fue escrito para ser redirigido. ¿Qué tan grande es el código al que intentas apuntar y qué hace aproximadamente?

    
respondido por el pjc50

Lea otras preguntas en las etiquetas