Создание бэкэнда VHDL для LLVM?

LLVM очень модульный и позволяет вам довольно легко определять новые серверы. Однако большая часть документации/учебников по созданию бэкэнда LLVM сосредоточена на добавлении набора и регистров новых процессоров. Мне интересно, что потребуется для создания VHDL-сервера для LLVM? Существуют ли примеры использования LLVM для перехода от одного языка более высокого уровня к другому?

Просто пояснить: есть ли примеры перевода LLVM IR на язык более высокого уровня, а не на язык ассемблера? Например: вы можете читать на C с Clang, использовать LLVM для оптимизации, а затем выписывать код на другом языке, таком как Java или, возможно, Fortran.

Ответ 1

Да!

Существует много LLVM-ориентированного таргетинга VHDL/Verilog:

И я знаю, что есть много других...

Интересно, что такие низкоуровневые представления, как LLVM или GIMPLE (также называемые RTL), заключаются в том, что они выставляют статические однонаправленные (SSA) формы: это можно перевести на аппаратное обеспечение совершенно напрямую, поскольку SSA может можно рассматривать как дерево мультиплексоров...

Ответ 2

В LLVM IR нет ничего особенного. Это стандартная DAG с переменным ясностью. Декомпиляция LLVM IR очень похожа на декомпилятор машинного языка.

Возможно, вы сможете использовать некоторые оптимизации интерфейса, такие как постоянное складывание, но это звучит довольно незначительно по сравнению со всей задачей.

Мой единственный опыт работы с LLVM заключался в написании бинарного переводчика для проекта класса, от игрушки CISC до пользовательского RISC.

Я бы сказал, так как это самое близкое к стандартным IR (ну, GCC GIMPLE - это вторая секунда), см., если он соответствует вашим алгоритмам и стилю и оценивает их как одну из альтернатив.

Обратите внимание, что GCC также начал уделять первоочередное внимание переносимости, прежде всего, и также многое сделал.

Ответ 3

Я не уверен, что следую тому, как части вашего вопроса относятся друг к другу.

Чтобы настроить LLVM на высокоуровневый язык, такой как C, очень возможно, и вы, кажется, нашли одну контрольную точку.

VHDL - это еще один бизнес. Считаете ли вы VHDL языком высокого уровня? Это может быть, но только описание аппаратного/логического. Уверенный VHDL имеет некоторые конструкции, которые вы можете использовать для фактического программирования в нем, но это вряд ли будет плодотворным делом. VHDL описывает аппаратное обеспечение и, следовательно, делает перевод LLVM IR в него очень сложной проблемой, если, конечно, вы не проектируете CPU с пользовательским набором команд в VHDL и не переводите LLVM IR в свои инструкции.

Ответ 4

Этот поток был одной из первых вещей, которые я нашел, ища то же самое.

Я нашел проект, который довольно далеко, что чисто строит под/с llvm 3.5. Это довольно круто. Он выплевывает HDL и делает другие интересные вещи, связанные с FPGA. Хотя он предназначен для работы с TTA и генерирует изображения для FPGA (или имитирует их), возможно, также возможно сделать некоторые тривиальные генерации HDL из c-функций.

Это было прекрасно для моих целей, потому что я хотел загрузить в FPGA Altera, а пример fpga_stdout даже выплескивает скрипты сборки Quartus и файлы проектов.

Сопутствующая среда с поддержкой TTA

Я также пробовал вещи, перечисленные в принятом ответе, и пару других, и обнаружил, что они не собираются работать для меня или не очень высокого качества (как правило, оба). TCE - профессиональное чувство, но чисто академическое, я считаю. Очень хорошо все вокруг.

Ответ 5

Кажется, вопрос частично ответил, поэтому Id хотел бы сделать снимок:

  • Что понадобится для создания VHDL-сервера для LLVM?

  • Что потребуется для перевода LLVM IR на язык более высокого уровня (предположительно с целью преобразования между языками высокого уровня)?

Я расскажу вам немного о 2. И разверните позднее на 1.

Если вы хотите конвертировать LLVM IR в язык высокого уровня, такой как C или Java:

Вам нужно будет взять инструкции LLVM и абстрагироваться от его эквивалентного кода C. Затем вам нужно взять остальные функции, которые LLVM не имеет эквивалента (например, классы и абстракции для С++) и написать процедуру, которая найдет эти шаблоны в LLVM (например, повторно используемые блоки) и напишет C. Для основных вещей, это довольно просто. Но просто следуйте за ходом мыслей, и вы быстро обнаруживаете, что понимаете истинно сложную проблему, ведь не все пишут простые буквы C. Чтобы усугубить сложность, вы не можете получить тот же LLVM IR при компиляции сгенерированного C! (Рассмотрим результирующий цикл обратной связи)

Как и для Java, вы участвуете в еще более жесткой битве, идущей прямо из LLVM IR, и в любом случае все еще есть проблема, которую вы, вероятно, не получите, чтобы тот же код компилировался в LLVM IR, если можно даже это сделать. Скорее, вы переводите LLVM IR в JVM Bytecode. Затем вы можете использовать обратный компилятор для получения Java.

Группа китайских студентов, видимо, могла это сделать, но они задавались вопросом, почему такой небольшой интерес к их исследованиям. Я бы сказал, что его bc они не полностью понимают, что сделали ребята LLVM, и как это лучше, чем JVM. (Фактически, LLVM, возможно, делает JVM устаревшим;)

Несмотря на то, что это кажется полезным, можно использовать LLVM в качестве посредника между C и Java для преобразования в двунаправленном направлении, это решение практически не используется, потому что мы задаем неправильный вопрос. Смотрите, вся причина, по которой вы хотите, чтобы в практических целях была иметь общую базу кода и повысить производительность.

Но реальная проблема заключается в том, что нам нужен язык, который абстрагировал общие черты современных языков и дает вам центральный язык, из которого вы можете построить. http://julialang.org/ ответил на вопрос 😉

Ответ 6

Похоже, что лучше всего начать с CBackend в источнике LLVM:

LLVM/Library/Target/CBackend/CBackend.cpp

Ответ 7

tl, dr: Я не думаю, что LLVM - правильный инструмент

То, что вы ищете, - это способ перевода кода LLVM на более высокий язык, что означает emscripten для Javascript.

Но похоже, что вы немного упустили точку LLVM, так как это означало генерировать статический код, чтобы достичь того, что для этой цели используется конкретная сборка промежуточного языка.

Как вы видите, как работает emscripten, путем реализации стека, но без использования javascript, как человек, сделал бы это.

Это несколько проектов, которые пытаются достичь того, что вы задали, например MyHDL, который превращает python в VHDL или Verilog.