如何从 LLVM pass 执行 yosys passes?

How to execute yosys passes from an LLVM pass?

我一直在使用两个程序 llvm 的 opt 和 clifford wolf 的 yosys both have similar interfaces for passes.(they use shared libraries as optimization passes)

我想根据我的 llvm opt pass 生成的数据,使用 yosys.h 中的某些数据结构和函数来构建设计模块(然后用 verilog 写入文件)。

问题: 我想在 llvm-opt 的传递中使用来自 yosys.h 的函数和数据。 我如何编译(编辑:并在 llvm-opt 或 yosys 或单独的二进制可执行文件上执行)这样的代码? 它们可以单独编译并作为单独的通道执行。

编译 YOSYS 通行证

gcc `yosys-config --cxxflags --ldlibs --ldflags` --shared yosyspass.cpp -o yosyspass.so

并用

执行

yosys -m yosyspass.so verilogfile.v

编译 LLVM 通行证

gcc  `llvm-config --cxxflags --ldlibs` --shared llvmpass.ccp -o llvmpass.so

并用

执行

opt -load ./llvmpass.so -llvmpass Somefile.bc

但是如何构建包含来自 llvm 和 yosys 的两个组件的代码? 以及如何执行?

如何在不过多更改 yosys 源代码的情况下实现这一点? 所有这些都是为了避免为我的 llvm-opt pass 编写 verilog 生成后端。

我的解决方案之一:

元编程:即生成代码,编译后 运行 作为 yosys pass 给我结果。(基于 llvm opt 输入的 verilog 设计文件)

也许我在构建共享库时遗漏了一些基本的东西?我对这种事情很陌生。欢迎任何意见。

这个项目(虽然不相关)可能类似于 Rotems C-to-Verilog 和 univ of toronto's legup HLS tool.

正如 Krzysztof Kosiński 指出的那样,直到现在 Yosys 的核心功能还不能作为库使用。然而,这在待办事项列表上已经有很长时间了,我现在 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 pass,然后执行一系列 Yosys pass,那么此解决方案可能会在 LLVM 和 Yosys 之间提供更自然且更易于调试的接口。