2010-09-08 10 views
15

LLVM ist sehr modular und erlaubt es Ihnen, ziemlich einfach neue Backends zu definieren. Die meisten Dokumentationen/Tutorials zum Erstellen eines LLVM-Backends konzentrieren sich jedoch auf das Hinzufügen eines neuen Prozessorbefehlssatzes und registrieren. Ich frage mich, was es braucht, um ein VHDL-Backend für LLVM zu erstellen? Gibt es Beispiele für die Verwendung von LLVM, um von einer höheren Sprache in eine andere zu wechseln?Erstellen eines VHDL-Backends für LLVM?

Nur zur Verdeutlichung: Gibt es Beispiele für die Übersetzung von LLVM IR in eine höhere Sprache statt in eine Assemblersprache? Zum Beispiel: Sie könnten C mit Clang einlesen, mit LLVM eine Optimierung durchführen und dann Code in einer anderen Sprache wie Java oder Fortran schreiben.

+1

Autsch! Ich kenne SystemC. Die Erzeugung von "Silizium" -Code aus Imperativ-Code ist sehr anspruchsvoll! Viel Glück, ich bleibe dran, um zu sehen, welche Art von Hinweisen kommen :-) – jdehaan

+1

Ja, VHDL könnte schwierig sein. Vielleicht sollte ich sagen, dass ich herausfinden möchte, wie man LLVMs Backend-Codegenerierung dazu bringt, eine höhere Sprache anstelle eines Assembler-Codes für einen Prozessor auszugeben? Was wäre zum Beispiel, wenn ich LLVM verwenden möchte, um C nach Java oder vielleicht Fortran zu übersetzen - wie würde man das tun? – aneccodeal

Antwort

12

Ja!

Es gibt viele LLVM Back-End-Targeting VHDL/Verilog um:

Und Ich weiß, dass es viele andere gibt ...

Das Interessante an solchen Low-Level-Repräsentationen wie LLVM oder GIMPLE (übrigens auch RTL genannt) ist, dass sie statische SSA-Formulare (Single-Single-Assignments) offen legen: Das kann man direkt in Hardware übersetzen, wie SSA zu sehen ist als Baum der Multiplexer ...

+0

Ich denke, C-to-Verilog ist tot. Auf der Seite [C-to-HDL Wikipedia] (https://en.wikipedia.org/wiki/C_to_HDL) werden jedoch einige verwandte Tools erwähnt. – ahogen

2

Es gibt nichts wirklich besonderes an der LLVM IR. Es ist eine Standard DAG mit variabler Arity. Das Dekompilieren von LLVM IR ist der dekompilierenden Maschinensprache sehr ähnlich.

Sie könnten einige Frontend-Optimierungen wie konstante Faltung nutzen, aber das klingt ziemlich gering im Vergleich zur gesamten Aufgabe.

Meine einzige Erfahrung mit LLVM war das Schreiben eines binären Übersetzers für ein Klassenprojekt, von einem Spielzeug CISC zu einem benutzerdefinierten RISC.

Ich würde sagen, da es einer Standard-IR am nächsten kommt (naja, GCC GIMPLE ist eine enge Sekunde), sehen Sie, ob es zu Ihren Algorithmen und Stil passt und bewerten Sie es als eine Alternative.

Beachten Sie, dass GCC begann auch die Portabilität vor allem Priorität, und hat auch viel erreicht.

-1

Sieht aus wie der beste Platz, um mit dem CBackend in der Quelle LLVM:

llvm/lib/Ziel/CBackend/CBackend.cpp

1

Ich bin mir nicht sicher, ob ich verfolgen, wie Teile des Frage beziehen sich aufeinander.

Es ist sehr möglich, LLVM in eine Hochsprache wie C zu bringen, und Sie scheinen einen Bezugspunkt gefunden zu haben.

VHDL ist ein ganz anderes Geschäft jedoch. Halten Sie VHDL für eine Hochsprache? Es kann sein, aber aber Hardware/Logik zu beschreiben. Sicher VHDL hat einige Konstrukte, die Sie verwenden können, um tatsächlich darin zu programmieren, aber es ist kaum ein fruchtbares Unterfangen. VHDL beschreibt Hardware und macht daher die Übersetzung von LLVM IR zu einem sehr schweren Problem, es sei denn, Sie entwerfen eine CPU mit einem benutzerdefinierten Befehl in VHDL und übersetzen LLVM IR in Ihre Anweisungen.

+0

Ja, die Konvertierung in VHDL ist ein schwieriges Problem, weil Sie Hardware erstellen. Der von Ihnen erwähnte CPU-Ansatz ist eine Möglichkeit, dies zu tun. Andere Ansätze sind möglicherweise besser geeignet, eine deklarative (funktionale) Eingabesprache zu verwenden und die Hardware dafür zu erzeugen (Bluespec und Atom nehmen diesen Ansatz an) - dies funktioniert beispielsweise gut für DSP-Algorithmen. Die Verwendung dieses Ansatzes ist jedoch wahrscheinlich nicht mit der Verwendung von LLVM kompatibel. – aneccodeal

+0

Sie müssen die Anwendungsdomäne definieren, für die Sie vhdl erstellen möchten. Wenn sie nicht peinlich parallel sind, haben Sie einen sequentiellen Teil in ihnen, der auf der CPU arbeiten muss und Sie müssen hw-sw codesign tun. Der parallele Teil würde auf FPGA und der Rest auf einer CPU platziert werden. Wenn Sie so etwas mit LLVM implementieren möchten, denken Sie daran, IR in die bgl boost-Bibliothek zu verschieben, da Sie viel mit Graphen arbeiten und das Design richtig partitionieren werden. Sobald Sie den richtigen parallelen Teil gefunden haben, können Sie IR für diesen Zweck neu schreiben. Ich würde sagen, dass ausgehend von CB nicht sens macht. – name

-1

tl, dr: Ich glaube nicht, LLVM das richtige Werkzeug ist

Was Ihr sucht ist Art und Weise LLVM-Code in eine höhere Sprache zu übersetzen, was emscripten für Javascript tun.

Aber es sieht so aus, als ob Sie den Punkt von LLVM etwas vermissen, da es statischen Code generieren soll, um zu erreichen, dass sie eine spezifische Zwischensprache für diesen Zweck verwenden.

Wie Sie sehen können, ist die Arbeitsweise von emscripten durch die Implementierung eines Stacks, aber ohne JavaScript zu verwenden, wie es ein Mensch getan hätte.

Sie sind mehrere Projekt, die versuchen zu erreichen, was Sie ursprüngliche Frage war, wie MyHDL, die Python zu VHDL oder Verilog macht.

+0

Eigentlich war die Idee, von C++ zu VHDL zu wechseln, indem man clang als Frontend und verschiedene Optimierungsschritte in LLVM benutzte, um Parallelität zu extrahieren. – aneccodeal

1

Dieser Thread war eines der ersten Dinge, die ich bei der Suche nach dem gleichen Ding gefunden habe.

Ich fand ein Projekt, das ziemlich weit ist, das unter/mit llvm 3.5 sauber baut. Es ist verdammt cool. Es spuckt HDL aus und macht verschiedene andere coole FPGA-bezogene Dinge. Es ist zwar dafür ausgelegt, mit TTAs zu arbeiten und Bilder für FPGA zu erzeugen (oder sie zu simulieren), aber es kann wahrscheinlich auch dazu gebracht werden, einige triviale HDL-Erzeugung von c-Funktionen zu machen.

Es war perfekt für meine Zwecke, weil ich auf ein Altera FPGA hochladen wollte, und das fpga_stdout Beispiel spuckt sogar Quartus Build-Skripte und Projektdateien aus.

TTA-Based Co-design Environment

Ich versuchte auch, die in der akzeptierten Antwort genannten Dinge und ein paar anderen, und fand heraus, dass sie nicht sehr hohe Qualität (in der Regel beide) nicht für mich zur Arbeit gehen oder waren. TCE ist professionelles Gefühl, aber rein akademisch glaube ich. Sehr schön herum.

1

Es scheint, wurde die Frage teilweise beantwortet, so würde Ich mag es eine Chance geben:

  • Was es dauern würde, ein VHDL-Backend für LLVM zu schaffen?

  • Was müsste man tun, um LLVM IR in eine höhere Sprache zu übersetzen (vermutlich mit der Absicht, zwischen High-Level-Sprachen zu konvertieren)?

Ich werde Ihnen einige Hintergrundinformationen über 2. geben und zu einem späteren Zeitpunkt erweitern auf 1.

Wenn Sie LLVM IR auf eine höhere Programmiersprache wie C oder Java umwandeln möchten:

Sie müssten die LLVM-Anweisungen nehmen und diese in ihren entsprechenden C-Code abstrahieren. Dann müssen Sie die verbleibenden Funktionen nehmen, für die LLVM keine Entsprechung hat (wie Klassen und Abstraktionen für C++) und eine Routine schreiben, die diese Muster im LLVM finden würde (wie wiederverwendbare Blöcke) und C schreiben. Es ist ziemlich einfach. Aber folgen Sie einfach dem Gedankengang und Sie merken schnell, dass Sie das wahre Schwierige des Problems erkennen, schließlich schreibt nicht jeder einfach C. Um die Schwierigkeit weiter zu verschärfen, erhalten Sie möglicherweise nicht das gleiche LLVM IR beim Kompilieren des generierten C!(Betrachten Sie die resultierende Rückkopplungsschleife)

Wie bei Java, sind Sie in einem noch härteren Kampf direkt aus LLVM IR, und in jedem Fall haben Sie immer noch das Problem, dass Sie wahrscheinlich nicht den gleichen Code kompilieren zu LLVM IR bekommen wenn man das überhaupt kann. Stattdessen würden Sie LLVM IR in JVM Bytecode übersetzen. Dann könnten Sie einen Reverse-Compiler verwenden, um Ihr Java zu erhalten.

Eine Gruppe chinesischer Studenten war anscheinend in der Lage, dies zu tun, aber sie wunderten sich, warum so wenig Interesse an ihrer Forschung. Ich würde sagen, sie wissen nicht genau, was die LLVM-Jungs gemacht haben und wie es besser ist als die JVM. (Tatsächlich macht LLVM die JVM obsolet;)

Auch wenn dies sinnvoll erscheint, da man LLVM als Vermittler zwischen C und Java bidirektional konvertieren kann, ist diese Lösung tatsächlich von geringem Nutzen, da wir die falsche Frage. Sehen Sie, der ganze Grund, warum Sie das für praktische Zwecke wünschen, ist, eine gemeinsame Codebasis zu haben und Leistung zu erhöhen.

Aber das wirkliche Problem ist, dass wir eine Sprache brauchen, die die Gemeinsamkeiten der modernen Sprachen abstrahiert hat und die Ihnen eine zentrale Sprache gibt, aus der Sie bauen können. http://julialang.org/ hat die Frage

beantwortet
+0

Ja, ein Julia-> HDL wäre genial. Da Julia bereits ein LLVM-Backend verwendet und Julia über Makros verfügt (was bedeutet, dass Sie den AST direkt manipulieren können), und es auf HPC ausgerichtet ist, scheint es in diesem Bereich eine gute Lösung zu sein. – aneccodeal