C++ 如何从LLVM通道执行yosys通道?

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

我一直在使用两个程序,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设计文件)

也许我在构建共享库时遗漏了一些基本的东西?我对这类事情还不熟悉。欢迎任何意见


这个项目(尽管不相关)可能类似于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++