llvm vhdl

¿Creando un backend VHDL para LLVM?



(7)

LLVM es muy modular y le permite definir fácilmente nuevos backends. Sin embargo, la mayoría de la documentación / tutoriales sobre la creación de un backend LLVM se centran en agregar un nuevo conjunto de instrucciones y registros de procesador. Me pregunto qué se necesitaría para crear un backend VHDL para LLVM? ¿Hay ejemplos del uso de LLVM para pasar de un lenguaje de nivel superior a otro?

Solo para aclarar: ¿hay ejemplos de traducir LLVM IR a un lenguaje de nivel superior en lugar de a un lenguaje ensamblador? Por ejemplo: podría leer en C con Clang, usar LLVM para realizar una optimización y luego escribir el código en otro idioma como Java o tal vez Fortran.


Este hilo fue una de las primeras cosas que encontré mientras buscaba lo mismo.

Encontré un proyecto bastante avanzado que se construye limpiamente con / con llvm 3.5. Es bastante genial Escupe HDL y hace otras cosas interesantes relacionadas con FPGA. Si bien está diseñado para trabajar con TTA y generar imágenes para FPGA (o simularlas), probablemente también se puede hacer para hacer una generación trivial de HDL a partir de funciones c.

Fue perfecto para mis propósitos porque quería subir a un FPGA de Altera, y el ejemplo fpga_stdout incluso escupe los scripts de compilación de Quartus y los archivos de proyectos.

Entorno de co-diseño basado en TTA

También probé las cosas enumeradas en la respuesta aceptada y un par de otras y descubrí que no iban a funcionar para mí o que no eran de muy buena calidad (generalmente ambas). TCE es un sentimiento profesional, pero creo que puramente académico. Muy agradable en todos los sentidos.


No estoy seguro de que sigo cómo las partes de tu pregunta se relacionan unas con otras.

Dirigir LLVM a un lenguaje de alto nivel como C es muy posible y parece que has encontrado un punto de referencia.

VHDL es un asunto completamente distinto. ¿Consideras VHDL un lenguaje de alto nivel? Puede ser, pero describiendo hardware / lógica. Claro que VHDL tiene algunas construcciones que puede emplear para programar realmente en él, pero no es un esfuerzo fructífero. VHDL describe el hardware y, por lo tanto, hace que la traducción de LLVM IR sea un problema muy difícil, a menos que, por supuesto, diseñe una CPU con un conjunto de instrucciones personalizado en VHDL y traduzca LLVM IR en sus instrucciones.


No hay nada realmente especial en el LLVM IR. Es un DAG estándar con aridad variable. Descompilar LLVM IR es muy parecido a descompilar lenguaje de máquina.

Es posible que pueda aprovechar algunas optimizaciones frontales, como el plegado constante, pero eso suena bastante menor en comparación con toda la tarea.

Mi única experiencia con LLVM fue escribir un traductor binario para un proyecto de clase, desde un CISC de juguete hasta un RISC personalizado.

Yo diría que, dado que es lo más parecido a un IR estándar (bueno, GCC GIMPLE es el segundo más cercano), vea si encaja con sus algoritmos y estilo y evalúelo como una alternativa.

Tenga en cuenta que GCC también comenzó priorizando la portabilidad por encima de todo, y también ha logrado mucho.


Parece que el mejor lugar para comenzar es con CBackend en la fuente de LLVM:

llvm / lib / Target / CBackend / CBackend.cpp


Parece que la pregunta fue parcialmente respondida, así que me gustaría darle una oportunidad:

  • ¿Qué se necesitaría para crear un backend VHDL para LLVM?

  • ¿Qué se necesitaría para traducir LLVM IR a un lenguaje de nivel superior (presumiblemente con la intención de convertir entre idiomas de alto nivel)?

Le daré algunos antecedentes sobre 2. Y ampliaré en una fecha posterior en 1.

Si desea convertir LLVM IR a un lenguaje de alto nivel como C o Java:

Tendría que seguir las instrucciones de LLVM y abstraerlas en su código C equivalente. Luego, debe tomar las características restantes para las cuales LLVM no tiene un equivalente (como clases y abstracciones para C ++) y escribir una rutina que encuentre esos patrones en la LLVM (como bloques reutilizados) y escriba C. Para las cosas básicas, Es bastante sencillo. Pero, solo siga la línea de pensamiento y rápidamente se dará cuenta de la dificultad del problema, después de todo, no todos escriben la C. simple. ¡Para aumentar la dificultad, es posible que no obtenga el mismo LLVM IR al compilar la C generada! (Considere el bucle de retroalimentación resultante)

En cuanto a Java, te enfrentas a una batalla aún más difícil que va directamente desde LLVM IR y, en cualquier caso, todavía tienes el problema, es probable que no obtengas el mismo código compilando en LLVM IR, si es que uno puede hacerlo. En su lugar, usted traduciría LLVM IR a JVM Bytecode. Entonces podrías usar un compilador inverso para obtener tu Java.

Un grupo de estudiantes chinos aparentemente pudo hacer esto, pero se preguntaban por qué tan poco interés en su investigación. Yo diría que es porque no entienden completamente lo que han hecho los muchachos de LLVM, y cómo es mejor que la JVM. (De hecho, LLVM podría decirse que hace que la JVM sea obsoleta;)

A pesar de que esto parece útil ya que se puede usar LLVM como intermediario entre C y Java para convertir bidireccionalmente, esta solución en realidad es de poca utilidad porque estamos haciendo la pregunta incorrecta. Vea, la razón por la que querría que, por razones prácticas , sea tener una base de código común y aumentar el rendimiento.

Pero el problema real es que necesitamos un lenguaje que haya resumido las características comunes de los lenguajes modernos, y que le brinde un lenguaje central a partir del cual pueda construir. http://julialang.org/ ha respondido la pregunta 😉


Si si

Hay muchos back-end LLVM dirigidos a VHDL / Verilog en torno a:

Y sé que hay muchos otros ...

Lo interesante de representaciones de bajo nivel como LLVM o GIMPLE (también llamado RTL por cierto) es que exponen formularios de asignaciones estáticas-únicas (SSA): esto puede traducirse al hardware de manera bastante directa, ya que SSA puede verse como Un árbol de multiplexores ...


tl, dr : no creo que LLVM sea la herramienta correcta

Lo que estás buscando es una manera de traducir el código LLVM a un idioma superior que es lo que emscripten hace para Javascript.

Pero parece que se le escapa un poco el punto de LLVM ya que está destinado a generar código estático para lograr que utilicen un lenguaje intermedio específico para ese propósito.

Como puede ver, la forma en que funciona emscripten es mediante la implementación de una pila, pero sin usar javascript como lo hubiera hecho un ser humano.

Son varios proyectos que intentan lograr lo que tu pregunta original era, como MyHDL que convierte a Python en VHDL o Verilog.