2010-09-08 22 views
15

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 del procesador. Me pregunto qué se necesitaría para crear un backend VHDL para LLVM. ¿Hay ejemplos de uso de LLVM para pasar de un lenguaje de nivel superior a otro?¿Crear un backend VHDL para LLVM?

Solo para aclarar: ¿hay ejemplos de traducción de LLVM IR a un lenguaje de nivel superior en lugar de a un lenguaje ensamblador? Por ejemplo: puedes leer en C con Clang, usar LLVM para hacer algo de optimización y luego escribir código en otro idioma como Java o quizás Fortran.

+1

¡Ay! Sé de SystemC. ¡Generar código "Silicio" a partir de un código imperativo es muy desafiante! Buena suerte, estoy atentos para ver qué tipo de sugerencias vienen :-) – jdehaan

+1

Sí, VHDL podría ser complicado. Tal vez debería decir que quiero averiguar cómo obtener la generación de código de back-end de LLVM para generar un lenguaje de alto nivel en lugar de un código de ensamblaje para un procesador. Por ejemplo, ¿qué pasaría si quisiera usar LLVM para traducir C a Java o quizás a Fortran? ¿Cómo podría uno hacer eso? – aneccodeal

Respuesta

12

Sí!

Hay muchos LLVM back-end de la orientación VHDL/Verilog en torno a:

Y Sé que hay muchos otros ...

Lo interesante de tales 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 se puede traducir al hardware de manera bastante directa, ya que se puede ver el SSA como un árbol de multiplexores ...

+0

Creo que C-to-Verilog está muerto. Sin embargo, hay algunas herramientas relacionadas mencionadas en la página [C-to-HDL Wikipedia] (https://en.wikipedia.org/wiki/C_to_HDL). – ahogen

2

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

Es posible que pueda aprovechar algunas optimizaciones frontend tales 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, ya que es lo más parecido a un IR estándar (bueno, GCC GIMPLE es un segundo cercano), fíjate si encaja con tus algoritmos y estilo y evalúa como una alternativa.

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

-1

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

llvm/lib/Target/CBackend/CBackend.cpp

1

No estoy seguro de entender cómo las partes de su pregunta relacionan uno con el otro.

Para enfocar LLVM en un lenguaje de alto nivel como C es muy posible y parece que ha encontrado un punto de referencia.

VHDL es todo un negocio. ¿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 ellas, pero no es una tarea fructífera. VHDL describe el hardware y por lo tanto convierte la LLVM IR en un problema muy difícil, a menos que, por supuesto, diseñe una CPU con un conjunto de instrucciones personalizadas en VHDL y traduzca LLVM IR en sus instrucciones.

+0

Sí, traducir a VHDL es un problema difícil porque está creando hardware. El enfoque de CPU que mencionas es una forma de hacerlo. Otros enfoques podrían ser más adecuados para usar un lenguaje de entrada declarativo (funcional) y generar el hardware para él (Bluespec y Atom toman este enfoque); esto funciona bien para los algoritmos DSP, por ejemplo. Sin embargo, usar ese enfoque probablemente no sea compatible con el uso de LLVM. – aneccodeal

+0

Debe definir el dominio de la aplicación para la que le gustaría crear vhdl. Si no son vergonzosamente paralelos, tienes una parte secuencial en ellos que tiene que funcionar en la CPU y tienes que hacer el signo del código hw-sw. La parte paralela se colocaría en FPGA y el resto en una CPU. Si desea implementar algo así con LLVM, piense en mover IR a la biblioteca de bgl boost porque tratará mucho con los gráficos y la partición adecuada del diseño. Una vez que encuentre la parte paralela adecuada, puede volver a escribir IR para eso. Yo diría que partir de CB no tiene sentido. – name

-1

tl, dr: No creo LLVM es la herramienta adecuada

Lo que estas buscando es manera de traducir el código LLVM a un lenguaje más alta que lo haga por emscripten Javascript.

Pero parece que echas un poco de menos el punto de LLVM, ya que está destinado a generar código estático con el fin de lograr que utilicen una construcción de lenguaje intermedio específica para ese fin.

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

Son varios los proyectos que tratan de lograr lo que era la pregunta original, como MyHDL que convierte python en VHDL o Verilog.

+0

En realidad, la idea era poder pasar de C++ a VHDL usando clang como en el extremo delantero y varios pasos de optimización en LLVM para extraer el paralelismo. – aneccodeal

1

Este tema fue una de las primeras cosas que encontré al buscar lo mismo.

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

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

TTA-Based Co-design Environment

También probé lo que se indica en la respuesta aceptada y un par más y encontraron que ellos no iban a trabajar para mí o no eran de muy alta calidad (generalmente dos). TCE es un sentimiento profesional, pero creo que es puramente académico. Muy agradable en todos los sentidos.

1

parece que la pregunta fue respondida parcialmente, por lo que me gustaría darle un tiro:

  • lo que se necesitaría para crear un backend VHDL para LLVM?

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

te daré algunos antecedentes de 2. Y ampliar en una fecha posterior en 1.

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

Debería tomar las instrucciones LLVM y abstraerlas en su código C equivalente. Luego necesita tomar las características restantes para las que LLVM no tiene un equivalente (como clases y abstracciones para C++) y escribir una rutina que encontraría esos patrones en el LLVM (como bloques reutilizados) y escribir C. Para las cosas básicas, es bastante sencillo. Pero, simplemente siga la línea de pensamiento y rápidamente se da cuenta de la verdadera dificultad del problema, después de todo, no todos escriben C. Para complicar aún más la dificultad, ¡puede que no obtenga el mismo LLVM IR al compilar la C generada!(Tenga en cuenta el ciclo de retroalimentación resultante)

En cuanto a Java, se enfrentará a una batalla aún más difícil directamente desde LLVM IR, y en ambos casos todavía tendrá el problema de que probablemente no obtenga el mismo código compilando LLVM IR , si uno puede hacer eso. Más bien, traducirías LLVM IR a JVM Bytecode. Entonces podrías usar un compilador inverso para obtener tu Java.

Aparentemente, un grupo de estudiantes chinos pudo hacer esto, pero se preguntaron por qué tan poco interés en su investigación. Diría que es porque no entienden completamente lo que han hecho los chicos de LLVM, y cómo es mejor que la JVM. (De hecho, LLVM podría decir que la JVM es obsoleta;)

Aunque esto parece útil porque se puede usar LLVM como intermediario entre C y Java para convertir bidireccionalmente, esta solución es de hecho de poca utilidad porque le estamos pidiendo al pregunta equivocada. Vea, la razón completa por la que desea que sea práctico es tener una base de código común y aumentar el rendimiento.

Pero el problema real es que necesitamos un lenguaje que haya abstraído las características comunes de los lenguajes modernos, y eso le brinda un lenguaje central desde el cual puede construir. http://julialang.org/ ha respondido la pregunta

+0

Sí, una Julia-> HDL sería increíble. Dado que Julia ya usa un servidor de LLVM y Julia tiene macros (lo que significa que puedes manipular directamente el AST) y está dirigido a HPC, parece que encaja perfectamente en este espacio. – aneccodeal