2010-09-08 20 views
15

LLVM jest bardzo modułowy i pozwala dość łatwo definiować nowe backendy. Jednak większość dokumentacji/samouczków dotyczących tworzenia backendu LLVM skupia się na dodaniu nowego zestawu instrukcji procesora i rejestrów. Zastanawiam się, co by było, aby utworzyć backend VHDL dla LLVM? Czy istnieją przykłady użycia LLVM do przechodzenia z jednego języka wyższego poziomu do drugiego?Tworzenie backendu VHDL dla LLVM?

Wystarczy wyjaśnić: czy istnieją przykłady tłumaczenia LLVM IR na język wyższego poziomu zamiast na język asemblera? Na przykład: możesz przeczytać C z Clangiem, użyj LLVM, aby przeprowadzić optymalizację, a następnie wypisz kod w innym języku, takim jak Java czy może Fortran.

+1

Ouch! Wiem o SystemC. Generowanie kodu "Silicium" z imperatywnego kodu jest bardzo trudne! Życzymy powodzenia, czekam na podpowiedzi :-) – jdehaan

+1

Tak, VHDL może być trudne. Być może powinienem powiedzieć, że chcę dowiedzieć się, jak uzyskać generowanie kodu backend LLVM do wyprowadzenia języka wysokiego poziomu, zamiast kodu zespołu procesora? Na przykład, co jeśli chciałbym użyć LLVM do przetłumaczenia C na Javę lub może na Fortran - jak by to się stało? – aneccodeal

Odpowiedz

12

Tak!

Istnieje wiele LLVM back-end kierowania VHDL/Verilog wokół:

I Wiem, że jest wiele innych ...

Interesującą rzeczą w takich reprezentacjach niskiego poziomu, takich jak LLVM lub GIMPLE (zwane również RTL) jest to, że eksponują pojedyncze statyczne przypisania (SSA): można je przetłumaczyć bezpośrednio na sprzęt, tak jak widać SSA jako drzewo multiplekserów ...

+0

Myślę, że C-do-Verilog nie żyje. Istnieje jednak kilka powiązanych narzędzi wymienionych na stronie [C-to-HDL Wikipedia] (https://en.wikipedia.org/wiki/C_to_HDL). – ahogen

2

W LLVM IR nie ma nic szczególnego. Jest to standardowy DAG o zmiennej arytmetyce. Dekompilacja LLVM IR jest bardzo podobna do dekompilacji języka maszyny.

Być może będziesz w stanie wykorzystać niektóre optymalizacje frontendu, takie jak stałe składanie, ale brzmi to dość nieznacznie w porównaniu do całego zadania.

Moje jedyne doświadczenie z LLVM to pisanie tłumacza binarnego dla projektu klasowego, od zabawkowego CISC do niestandardowego RISC.

Powiedziałbym, że jest to najbardziej zbliżona do standardowej podczerwieni (dobrze, GCC GIMPLE jest blisko sekundy), sprawdź, czy pasuje do twoich algorytmów i stylu i oceń ją jako jedną z alternatyw.

Należy pamiętać, że GCC również zaczęło priorytetowo przede wszystkim pod względem przenośności, a także wiele osiągnęło.

-1

Wygląda na to najlepszym miejscem do rozpoczęcia jest z CBackend w źródle LLVM:

LLVM/lib/docelowy/CBackend/CBackend.cpp

1

Nie jestem pewien, czy śledzić, jak częściach pytanie dotyczy jednego z drugim.

Aby skierować LLVM na język wysokiego poziomu, taki jak C, jest to bardzo możliwe i wydaje się, że znalazłeś jeden punkt odniesienia.

VHDL to jednak zupełnie inna firma. Czy uważasz VHDL za język wysokiego poziomu? Może być, ale opisuje sprzęt/logikę. Oczywiście VHDL ma pewne konstrukcje, które można wykorzystać do programowania, ale nie jest to owocne przedsięwzięcie. VHDL opisuje sprzęt i sprawia, że ​​tłumaczenie LLVM IR na to bardzo trudny problem, chyba że zaprojektujesz procesor z niestandardowym zestawem instrukcji w VHDL i przetłumaczysz LLVM IR na twoje instrukcje.

+0

Tak, przetłumaczenie na VHDL jest trudnym problemem, ponieważ tworzysz sprzęt. Podejście CPU, o którym wspomniałeś, jest jednym ze sposobów, aby to zrobić. Inne podejścia mogą być bardziej podatne na używanie deklaratywnego (funkcjonalnego) języka wprowadzania i generowania dla niego sprzętu (Bluespec i Atom stosują to podejście) - na przykład działa to dobrze w przypadku algorytmów DSP. Jednak korzystanie z tego podejścia prawdopodobnie nie jest zgodne z używaniem LLVM. – aneccodeal

+0

Musisz zdefiniować domenę aplikacji, dla której chcesz utworzyć vhdl. Jeśli nie są zawstydzająco równoległe, niż masz w nich sekwencyjną część, która musi działać na procesorze i musisz zrobić kodowanie hw-sw. Równoległa część zostanie umieszczona na FPGA, a reszta na CPU. Jeśli chcesz zaimplementować coś takiego z LLVM, pomyśl o przeniesieniu IR do biblioteki bgl boost, ponieważ dużo sobie poradzisz z wykresami i odpowiednim partycjonowaniem projektu. Po znalezieniu odpowiedniej równoległej części możesz przepisać IR na to. Powiedziałbym, że wychodzenie z CB nie ma sensu. – name

-1

tl, dr: Nie sądzę LLVM jest właściwym narzędziem

co twój szukasz jest sposób przetłumaczyć kod LLVM do wyższej języku to co emscripten zrobić dla JavaScript.

Wygląda jednak na to, że brakuje ci punktu LLVM, ponieważ ma on generować kod statyczny, aby osiągnąć to, że używa do tego celu określonej kompilacji języka pośredniego.

Jak widać, sposób działania emscripten polega na implementacji stosu, ale bez użycia javascriptu jako człowieka by to zrobił.

Jest to kilka projektów, które próbują osiągnąć to, na co masz oryginalne pytanie, np. MyHDL, które zmieniają pythona na VHDL lub Verilog.

+0

W rzeczywistości pomysł polegał na tym, aby móc przechodzić z języka C++ na język VHDL przy użyciu języka jak na początku i różnych kroków optymalizacji w LLVM, aby wyodrębnić równoległość. – aneccodeal

1

Ten wątek był jedną z pierwszych rzeczy, które znalazłem szukając tego samego.

Znalazłem projekt, który jest dość daleko od tego czysto kompiluje pod/z LVV 3.5. Całkiem fajnie. Pluje HDL i robi różne fajne rzeczy związane z FPGA. Chociaż jest przeznaczony do pracy z TTA i generowania obrazów dla FPGA (lub ich symulacji), prawdopodobnie można go również wykonać w trywialnym generowaniu HDL z funkcji c.

To było idealne dla moich celów, ponieważ chciałem przesłać na FPGA Altera, a przykład fpga_stdout wypluwa nawet skrypty budujące Quartus i pliki projektu.

TTA-Based Co-design Environment

Próbowałem również rzeczy, które są wymienione w przyjętym odpowiedź i kilka innych i okazało się, że nie będziemy pracować dla mnie, czy nie były bardzo wysokiej jakości (zazwyczaj oba). TCE jest zawodowym uczuciem, ale uważam, że czysto akademicki. Bardzo ładnie dookoła.

1

Wydaje się, że pytanie zostało częściowo odpowiedział, więc chciałbym, aby dać mu szansę:

  • Co trzeba zrobić, aby utworzyć backend VHDL dla LLVM?

  • Co trzeba by przetłumaczyć LLVM IR na język wyższego poziomu (prawdopodobnie z zamiarem konwersji między wysokimi poziomami językowymi)?

dam wam jakieś tło na 2. i rozszerzyć w późniejszym terminie na 1.

Jeśli chcesz przekonwertować LLVM IR do języka wysokiego poziomu, takich jak C lub Java:

Będziesz musiał wykonać instrukcje LLVM i przekształcić je w odpowiadający mu kod C. Następnie musisz wziąć pozostałe funkcje, których LLVM nie ma odpowiednika (jak klasy i abstrakcje dla C++) i napisać procedurę, która znajdowałaby te wzorce w LLVM (jak ponownie wykorzystane bloki) i napisać C. Dla podstawowych rzeczy, jest całkiem prosta. Ale po prostu podążaj za tokiem myślenia i szybko odkryjesz, że zdajesz sobie sprawę z prawdziwego problemu, w końcu nie wszyscy piszą proste C. Aby jeszcze bardziej zwiększyć trudność, możesz nie uzyskać tego samego LLVM IR podczas kompilowania wygenerowanego C!(Rozważmy wynikową pętlę sprzężenia zwrotnego)

Jeśli chodzi o Javę, czeka nas jeszcze trudniejsza walka, bezpośrednio z LLVM IR, aw każdym z tych przypadków nadal istnieje problem, że prawdopodobnie nie otrzymamy tego samego kodu kompilującego do LLVM IR , jeśli ktoś może to zrobić. Zamiast tego tłumaczyłbyś LLVM IR na kod JVM Bytecode. Następnie możesz użyć odwrotnego kompilatora, aby uzyskać Javę.

Grupa chińskich studentów najwyraźniej była w stanie to zrobić, ale zastanawiali się, dlaczego tak małe zainteresowanie ich badaniami. Powiedziałbym, że jego bc nie w pełni rozumieją, co zrobili faceci z LLVM i jak jest lepszy niż JVM. (W rzeczywistości LLVM prawdopodobnie czyni JVM przestarzałą;)

Nawet jeśli wydaje się to przydatne, można użyć LLVM jako pośrednika między C i Java do konwersji dwukierunkowej, to rozwiązanie jest w rzeczywistości mało przydatne, ponieważ pytamy złe pytanie. Widzisz, cały powód, dla którego chciałbyś, aby to było dla praktyczne mieć wspólną podstawę kodu i zwiększyć wydajność.

Ale prawdziwym problemem jest to, że potrzebujemy języka, który wyodrębniłby wspólne cechy współczesnych języków, i który daje centralny język, z którego można zbudować. http://julialang.org/ udzielił odpowiedzi na pytanie

+0

Tak, a Julia-> HDL byłaby niesamowita. Biorąc pod uwagę, że Julia używa już backendu LLVM _and_ Julia ma makra (co oznacza, że ​​możesz bezpośrednio manipulować AST) i jest skierowana na HPC, wydaje się, że świetnie pasuje do tej przestrzeni. – aneccodeal

Powiązane problemy