我一直在使用两个程序llvm的opt和clifford的https://github.com/cliffordwolf/yosys都有类似的passes接口(它们使用共享库作为优化通行证)。
我想使用yosys.h中的某些数据结构和函数来构建一个设计模块(然后用verilog编写到文件),该模块基于我的llvm生成的数据。
问题:我想要使用函数,来自yosys.h的数据,在llvm的通行证中。如何编译(编辑:也可以在llvm或yosys或单独的二进制可执行文件上执行)这样的代码?单独地,它们可以作为单独的传递被编译和执行。
编译YOSYS
gcc `yosys-config --cxxflags --ldlibs --ldflags` --shared yosyspass.cpp -o yosyspass.so然后用
-m yosyspass.so verilogfile.v
编译LLVM通行证
gcc `llvm-config --cxxflags --ldlibs` --shared llvmpass.ccp -o llvmpass.so然后用
选择-load ./llvmpass.so -llvmpass Somefile.bc
但是如何从llvm,yosys构建同时包含两个组件的代码呢?以及如何执行?
我怎样才能做到这一点,而不改变你的源代码太多?所有这些都是为了避免为我的llvm传球编写verilog一代后端。
我的解决方案之一是:
元编程(Metaprogramming):即生成编译后作为yosys传递运行的代码。(基于llvm输入的verilog设计文件)
也许我在构建共享库时遗漏了一些基本的东西?我对这种事很陌生。欢迎任何意见。
这个项目(虽然不相关)可能类似于和univ of多伦多的legup工具。
发布于 2015-08-04 11:36:44
正如Krzysztof Kosiński所指出的,到目前为止,Yosy的核心功能还不能作为库使用。然而,这已经列在待办事项清单上很长时间了,我现在有了将此功能添加到Yosys git头中。
下面是一个用法示例:
// 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之间的接口。
https://stackoverflow.com/questions/31805432
复制相似问题