Как выполнить проходы yosys с прохода LLVM?

Я работал с двумя программами llvm’s выбирать и Клиффорд волк yosys оба имеют похожие интерфейсы для проходит.(они используют общие библиотеки в качестве оптимизации проходит)

Я хочу использовать определенные структуры данных и функции из yosys.h для создания модуля проектирования (который затем записывается в verilog в файл) на основе данных, сгенерированных моим проходом llvm opt.

ПРОБЛЕМА:
Я хочу использовать функции, данные из yosys.h в проходе для llvm-opt.
Как мне скомпилировать (отредактировать: и выполнить либо на llvm-opt, либо на yosys, либо на отдельном двоичном исполняемом файле) такой код?
индивидуально они могут быть скомпилированы и выполнены как отдельные проходы.

COMPILE YOSYS PASS

gcc `yosys-config --cxxflags --ldlibs --ldflags` --shared yosyspass.cpp -o yosyspass.so

и выполнить его с

yosys -m yosyspass.so verilogfile.v

COMPILE LLVM PASS

gcc  `llvm-config --cxxflags --ldlibs` --shared llvmpass.ccp -o llvmpass.so

и выполнить его с

opt -load ./llvmpass.so -llvmpass Somefile.bc

но как построить код, который имеет оба компонента из llvm, yosys?
и как это выполнить?

Как я могу сделать это, не меняя исходный код yosys слишком сильно?
Все это делается для того, чтобы избежать написания бэкэнда поколения verilog для моего прохода llvm-opt.

ОДИН ИЗ МОИХ РЕШЕНИЙ:

Метапрограммирование: то есть генерировать код, который при компиляции и запуске как проход yosys дает мне результат. (Файл дизайна verilog, основанный на вводе llvm opt)

Может быть, мне не хватает чего-то фундаментального в сборке общих библиотек? Я новичок в такого рода вещах. Любой вклад приветствуется.

Этот проект (хотя и не связанный) может быть похож на Rotems C-to-Verilog и Univ of Legron HLS Toronto.

2

Решение

Как отметил Кшиштоф Косински, до сих пор основные функции Yosys не были доступны в виде библиотеки. Тем не менее, это было в списке задач в течение длительного времени, и теперь я добавил эту функциональность в Yosys git head.

Вот пример использования:

// example.cc

#include <kernel/yosys.h>

int main()
{
Yosys::log_streams.push_back(&std::cout);
Yosys::log_error_stderr = true;

Yosys::yosys_setup();
Yosys::yosys_banner();

Yosys::run_pass("read_verilog example.v");
Yosys::run_pass("synth -noabc");
Yosys::run_pass("clean -purge");
Yosys::run_pass("write_blif example.blif");

Yosys::yosys_shutdown();
return 0;
}

Сборка двоичного файла:

yosys-config --exec --cxx -o example --cxxflags --ldflags example.cc -lyosys -lstdc++

Теперь вы можете запустить ./example преобразовать example.v в example.blif,

(Поскольку это совершенно новая функция, подробности того, как создавать программы или другие библиотеки с использованием libyosys, могут измениться в будущем.)

Редактировать: В текущей главе git для опции Makefile ENABLE_LIBYOSYS должно быть установлено значение 1, чтобы включить сборку libyosys.so.


Дополнительная обратная связь: вы можете захотеть написать вместо этого плагин Yosys, который реализует интерфейс Yosys, который использует библиотеки LLVM для загрузки файла .bc. Если вы не планируете переключаться между LLVM и Yosys, а хотите только выполнить последовательность проходов LLVM, за которой следует последовательность проходов Yosys, то это решение может обеспечить более естественный и простой в отладке интерфейс между LLVM и Yosys.

1

Другие решения


По вопросам рекламы [email protected]