Я работал с двумя программами 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.
Как отметил Кшиштоф Косински, до сих пор основные функции 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.