如何从LLVM传递执行yosys传递?

时间:2015-08-04 09:23:47

标签: c++ llvm yosys

我一直在使用两个程序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工具。

1 个答案:

答案 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++

现在,您可以运行./exampleexample.v转换为example.blif

(由于这是一个全新的功能,如何使用libyosys构建程序或其他库的细节将来可能会发生变化。)

编辑:在当前的git头中,Makefile选项ENABLE_LIBYOSYS必须设置为1以启用libyosys.so的构建。

其他反馈:你可能想考虑编写一个Yosys插件,而不是实现一个使用LLVM库来加载.bc文件的Yosys前端。如果您不打算在LLVM和Yosys之间来回切换,但只想执行一系列LLVM传递,然后执行一系列Yosys传递,那么此解决方案可能会在LLVM和Yosys之间提供更自然,更容易调试的接口。