我一直在使用两个程序llvm&#39> opt 和clifford wolf yosys都有类似的传递接口。(他们使用共享库作为优化passes)
我想根据我的llvm opt pass生成的数据,使用yosys.h中的某些数据结构和函数来构建一个设计模块(然后用verilog写入文件)。
问题: 我想在llvm-opt的pass中使用yosys.h中的函数和数据。 我如何编译(编辑:并在llvm-opt或yosys或单独的二进制可执行文件上执行)这样的代码? 它们可以单独编辑和执行。
编制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的源代码的情况下实现这一目标? 所有这一切都是为了避免为我的llvm-opt传递编写verilog生成后端。
我的解决方案之一:
元编程:即生成代码,当编译并作为yosys pass运行时给出结果。(基于llvm opt输入的verilog设计文件)
也许我在构建共享库中缺少一些基本的东西?我对这类事情不熟悉。欢迎任何意见。
这个项目(尽管不相关)可能类似于Rotems C-to-Verilog和多伦多的legup HLS工具。
答案 0 :(得分:1)
正如KrzysztofKosiński指出的那样,到目前为止,Yosys的核心功能还没有作为库提供。但是,这很长一段时间都在todo列表上,我现在added this functionality to 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插件,而不是实现一个使用LLVM库来加载.bc文件的Yosys前端。如果您不打算在LLVM和Yosys之间来回切换,但只想执行一系列LLVM传递,然后执行一系列Yosys传递,那么此解决方案可能会在LLVM和Yosys之间提供更自然,更容易调试的接口。