2010-09-08 5 views
15

LLVM est très modulaire et vous permet de définir assez facilement de nouveaux backends. Cependant, la plupart des documentations/tutoriels sur la création d'un backend LLVM se concentrent sur l'ajout d'un nouveau jeu d'instructions de processeur et de registres. Je me demande ce qu'il faudrait pour créer un backend VHDL pour LLVM? Existe-t-il des exemples d'utilisation de LLVM pour passer d'une langue de niveau supérieur à une autre? Simplement pour clarifier: existe-t-il des exemples de traduction de LLVM IR vers un langage de niveau supérieur plutôt que vers un langage d'assemblage? Par exemple: vous pouvez lire en C avec Clang, utiliser LLVM pour faire une optimisation et ensuite écrire du code dans une autre langue comme Java ou peut-être Fortran.Création d'un backend VHDL pour LLVM?

+1

Aïe! Je connais SystemC. Générer du code "Silicium" à partir d'un code impératif est très difficile! Bonne chance, je reste à l'écoute pour voir quel genre d'indices entrent :-) – jdehaan

+1

Oui, VHDL pourrait être difficile. Peut-être devrais-je dire que je veux comprendre comment obtenir la génération de code backend LLVM pour sortir un langage de haut niveau au lieu d'un code d'assemblage pour un processeur? Par exemple, que se passerait-il si je voulais utiliser LLVM pour traduire C en Java ou peut-être Fortran - comment s'y prend-on? – aneccodeal

Répondre

12

Oui!

Il y a beaucoup de LLVM back-end ciblant VHDL/Verilog autour de:

Et Je sais qu'il y en a beaucoup d'autres ...

La chose intéressante à propos de ces représentations de bas niveau comme LLVM ou GIMPLE (aussi appelé RTL) est qu'elles exposent des formes d'assignations statiques simples (SSA): cela peut être traduit directement au matériel, comme SSA peut être vu comme un arbre de multiplexeurs ...

+0

Je pense que C-to-Verilog est mort. Il existe cependant quelques outils associés mentionnés sur la page [C-to-HDL Wikipedia] (https://en.wikipedia.org/wiki/C_to_HDL). – ahogen

2

L'IR LLVM n'a rien de spécial. C'est un DAG standard à arité variable. Décompiler LLVM IR ressemble beaucoup à la décompilation du langage machine.

Vous pourriez être en mesure de tirer parti de certaines optimisations frontales telles que le pliage constant, mais cela semble plutôt mineur par rapport à l'ensemble de la tâche. Ma seule expérience avec LLVM était d'écrire un traducteur binaire pour un projet de classe, d'un jouet CISC à un RISC personnalisé. Je dirais, puisque c'est la chose la plus proche d'un IR standard (bien, GCC GIMPLE est une seconde proche), voir si elle correspond à vos algorithmes et le style et l'évaluer comme une alternative.

Notez que GCC a également commencé par donner la priorité à la portabilité et a également accompli beaucoup de choses.

-1

On dirait que le meilleur endroit pour commencer est avec le CBackend dans la source LLVM:

LLVM/lib/Target/CBackend/CBackend.cpp

1

Je ne suis pas sûr que je suis comment les parties de votre question se rapportent l'un à l'autre.

Cibler LLVM dans un langage de haut niveau comme C est très possible et vous semblez avoir trouvé un point de référence.

VHDL est une toute autre affaire. Considérez-vous VHDL comme un langage de haut niveau? Peut-être, mais décrivant le matériel/la logique. Bien sûr, VHDL a quelques constructions que vous pouvez utiliser pour programmer, mais ce n'est pas une entreprise fructueuse. VHDL décrit le matériel et rend ainsi la traduction de LLVM IR en un problème très difficile, à moins bien sûr que vous ne conceviez un CPU avec une instruction personnalisée en VHDL et que vous traduisiez LLVM IR dans vos instructions.

+0

Oui, la traduction en VHDL est un problème difficile parce que vous créez du matériel. L'approche CPU que vous mentionnez est une façon de le faire. D'autres approches pourraient être plus favorables à l'utilisation d'un langage d'entrée déclaratif (fonctionnel) et générer le matériel pour cela (Bluespec et Atom adoptent cette approche) - cela fonctionne bien pour les algorithmes DSP, par exemple. Cependant, l'utilisation de cette approche n'est probablement pas compatible avec l'utilisation de LLVM. – aneccodeal

+0

Vous devez définir le domaine d'application pour lequel vous souhaitez créer vhdl. Si elles ne sont pas embarrassantes en parallèle que vous avez une partie séquentielle en eux qui doit travailler sur le processeur et vous devez faire codew hw-sw. La partie parallèle serait placée sur FPGA et le reste sur un CPU. Si vous voulez implémenter quelque chose comme ça avec LLVM, pensez à déplacer la bibliothèque IR vers bgl boost parce que vous aurez beaucoup à faire avec les graphes et le bon partitionnement du design. Une fois que vous trouverez la partie parallèle appropriée, vous pouvez réécrire IR pour cela. Je dirais que partir de CB ne fait pas sens. – name

-1

tl, dr: Je ne pense pas que LLVM est l'outil

Qu'est-ce que vous êtes à la recherche est moyen de traduire le code LLVM à une langue plus qui est ce emscripten faire pour Javascript.

Mais il semble que vous manquiez un peu le point de LLVM car il est destiné à générer du code statique afin de réaliser qu'ils utilisent un langage intermédiaire spécifique construit à cette fin. Comme vous pouvez voir la façon dont fonctionne emscripten en implémentant une pile, mais sans utiliser javascript comme un humain l'aurait fait.

Ils sont plusieurs projets qui tentent de répondre à votre question originale, comme MyHDL qui transforme python en VHDL ou Verilog.

+0

En fait, l'idée était de pouvoir passer de C++ à VHDL en utilisant clang comme à l'avant et diverses étapes d'optimisation dans LLVM pour extraire le parallélisme. – aneccodeal

1

Ce fil a été l'une des premières choses que j'ai trouvées en cherchant la même chose.

J'ai trouvé un projet assez long qui construit proprement sous/avec llvm 3.5. C'est sacrément cool. Il crache HDL et fait d'autres choses liées au FPGA cool. Bien qu'il soit conçu pour fonctionner avec les TTA et générer des images pour FPGA (ou les simuler), il peut probablement être également fait de faire une petite génération HDL à partir des fonctions c. Il était parfait pour mes besoins parce que je voulais télécharger vers un FPGA Altera, et l'exemple de fpga_stdout crache même des scripts de construction de Quartus et des fichiers de projet.

TTA-Based Co-design Environment

J'ai aussi essayé les choses énumérées dans la réponse acceptée et un couple d'autres et a constaté qu'ils ne vont pas travailler pour moi ou ne sont pas de très haute qualité (généralement deux). TCE est un sentiment professionnel, mais purement académique je crois. Très bien tout autour.

1

Il semble que la question a été partiellement répondu, donc je voudrais donner un coup de feu:

  • Qu'est-ce qu'il faudrait pour créer un back-end VHDL pour LLVM? Que faudrait-il pour traduire LLVM IR dans un langage de plus haut niveau (vraisemblablement avec l'intention de convertir des langages de haut niveau)?

je vais vous donner quelques informations générales sur 2. Et se développer à une date ultérieure sur 1.

Si vous voulez convertir LLVM IR à un langage de haut niveau tel que C ou Java:

Vous devrez prendre les instructions LLVM et extraire cela dans son code C équivalent. Ensuite, vous devez prendre les fonctionnalités restantes pour lesquelles LLVM n'a pas d'équivalent (comme les classes et abstractions pour C++) et écrire une routine qui trouverait ces patterns dans le LLVM (comme les blocs réutilisés) et écrire C. Pour les choses de base, C'est assez simple. Mais, suivez juste le fil de la pensée et vous vous apercevez rapidement la vraie difficulté du problème, après tout le monde n'écrit pas C. Pour aggraver la difficulté, vous ne pouvez pas obtenir le même LLVM IR lors de la compilation du C généré!(Considérons la boucle de retour qui en résulte)

En ce qui concerne Java, vous allez devoir livrer une bataille encore plus dure directement depuis LLVM IR, et dans les deux cas, vous aurez toujours le problème de ne pas obtenir le même code que LLVM IR , si l'on peut même faire cela. Au lieu de cela, vous traduiriez LLVM IR en JVM Bytecode. Ensuite, vous pouvez utiliser un compilateur inverse pour obtenir votre Java. Un groupe d'étudiants chinois était apparemment capable de faire cela, mais ils se demandaient pourquoi si peu d'intérêt pour leurs recherches. Je dirais qu'il ne comprend pas tout à fait ce que les gars du LLVM ont fait, et comment c'est mieux que la JVM. (En fait, LLVM rend la JVM obsolète;)

Même si cela semble utile car on peut utiliser LLVM comme intermédiaire entre C et Java pour convertir bidirectionnellement, cette solution est en fait peu utile parce que nous demandons à la mauvaise question. Voir, la raison pour laquelle vous voulez que pratique est d'avoir une base de code commune et d'augmenter les performances. Mais le vrai problème est que nous avons besoin d'un langage qui a abstrait les caractéristiques communes des langues modernes, et qui vous donne un langage central que vous pouvez construire à partir de. http://julialang.org/ a répondu à la question

+0

Oui, une Julia-> HDL serait génial. Étant donné que Julia utilise déjà un backend LLVM _and_ Julia a des macros (ce qui signifie que vous pouvez directement manipuler l'AST) et qu'il est destiné à HPC, il semble être un bon ajustement dans cet espace. – aneccodeal