C++ 如何从LLVM通道执行yosys通道?
我一直在使用两个程序,llvm的opt和clifford wolf的都有相似的通行证接口(它们使用共享库作为优化) 我想使用yosys.h中的某些数据结构和函数,根据llvm opt pass生成的数据构建一个设计模块(然后用verilog写入文件) 问题: 我想在llvm opt的过程中使用来自yosys.h的函数和数据。 我如何编译(编辑:并在llvm opt或yosys或单独的二进制可执行文件上执行)这样的代码? 它们可以单独编译并作为单独的过程执行 编辑YOSYS通行证 并用 yosys-m yosyspass.so verilogfile.v 编译LLVM过程 并用 opt-load./llvmpass.so-llvmpass Somefile.bc 但是,如何从llvm、yosys构建包含这两个组件的代码呢? 如何执行它 我怎样才能在不太改变yosys源代码的情况下实现这一点? 所有这些都是为了避免为我的llvm opt pass编写verilog生成后端 我的解决方案之一: 元编程:即,生成代码,当编译并作为yosys过程运行时,会给出结果。(基于llvm opt输入的verilog设计文件) 也许我在构建共享库时遗漏了一些基本的东西?我对这类事情还不熟悉。欢迎任何意见C++ 如何从LLVM通道执行yosys通道?,c++,llvm,yosys,C++,Llvm,Yosys,我一直在使用两个程序,llvm的opt和clifford wolf的都有相似的通行证接口(它们使用共享库作为优化) 我想使用yosys.h中的某些数据结构和函数,根据llvm opt pass生成的数据构建一个设计模块(然后用verilog写入文件) 问题: 我想在llvm opt的过程中使用来自yosys.h的函数和数据。 我如何编译(编辑:并在llvm opt或yosys或单独的二进制可执行文件上执行)这样的代码? 它们可以单独编译并作为单独的过程执行 编辑YOSYS通行证 并用 yosys
这个项目(尽管不相关)可能类似于Rotems C-to-Verilog和多伦多大学的legup HLS工具。正如Krzysztof Kosiński指出的,直到现在Yosys的核心功能还没有作为库提供。然而,这在待办事项清单上已经有很长一段时间了,现在我已经有了 下面是一个使用示例:
// 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;
}
现在,您可以运行/example
将example.v
转换为example.blif
(由于这是一项全新的功能,因此关于如何使用libyosys构建程序或其他库的详细信息将来可能会发生变化。)
编辑:在当前git头中,Makefile选项ENABLE_LIBYOSYS必须设置为1才能启用LIBYOSYS.so的构建
<>附加反馈:您可能想考虑编写一个YOSIS插件,而不是实现一个使用LLVM库来加载.BC文件的YoSyS前端。如果您不打算在LLVM和Yosys之间来回切换,而只想执行一系列LLVM过程,然后执行一系列Yosys过程,那么此解决方案可能会在LLVM和Yosys之间提供一个更自然、更易于调试的接口。我删除了以前的答案,因为这似乎并不容易。您可能必须在LLVM过程中包含yosys source并对其进行广泛修改。@Krzysztof是否有这样的示例项目?只是看看它的复杂性与我自己编写的verilogwriter后端相比。我不知道,对不起。您必须连接到yosys的内部函数,基本上包括LLVM过程中的yosys源代码。相反,从yosys通行证执行LLVM通行证要容易得多,因为LLVM被设计成一个库。@KrzysztofKosiński,谢谢。我会看看从yosys执行LLVM通行证是否符合我的项目。谢谢。Verilog Writer已经参与了我的许多项目,这使它变得容易多了。:-)@keutoi供您参考:注意我对我的答案所做的编辑:现在Makefile选项ENABLE_LIBYOSYS必须设置为1才能启用LIBYOSYS.so的构建。感谢您的更新。我正在github上观看您的项目,以使我的构建保持最新。
gcc `llvm-config --cxxflags --ldlibs` --shared llvmpass.ccp -o llvmpass.so
// 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++