【问题标题】:How to execute yosys passes from an LLVM pass?如何从 LLVM 通行证执行 yosys 通行证?
【发布时间】:2015-08-04 09:23:47
【问题描述】:

我一直在使用两个程序 llvm 的 opt 和clifford wolf 的yosys 都具有相似的passes 接口。(它们使用共享库作为优化passes

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

问题: 我想在 llvm-opt 的 pass 中使用来自 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 PASS

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 和多伦多的 legup HLS 工具的 univ。

【问题讨论】:

  • 我删除了我以前的答案,因为这似乎并不容易。您可能必须在 LLVM 通行证中包含 yosys 源代码并对其进行大量修改。
  • @Krzysztof 任何可能已经完成类似事情的示例项目?只是看看它的复杂性 vs 编写我自己的 verilogwriter 后端。
  • 我不知道,抱歉。你将不得不挂钩到 yosys 的内部函数,基本上包括你的 LLVM pass 中的 yosys 源代码。相反,从 yosys pass 执行 LLVM pass 会容易得多,因为 LLVM 被设计为一个库。
  • @KrzysztofKosiński 谢谢。我会看看从 yosys 执行 LLVM pass 是否适合我的项目。

标签: c++ llvm yosys


【解决方案1】:

正如 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 head 中,Makefile 选项 ENABLE_LIBYOSYS 必须设置为 1 以启用 libyosys.so 的构建。


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

【讨论】:

  • 谢谢。 Verilog Writer 已经提交了很多我的项目,这让它变得容易多了。 :-)
  • @keutoi fyi:请注意我对答案所做的编辑:现在 Makefile 选项 ENABLE_LIBYOSYS 必须设置为 1 以启用 libyosys.so 的构建。
  • 感谢您的更新。我正在 github 上查看你的项目,以保持我的构建是最新的。
猜你喜欢
  • 1970-01-01
  • 2015-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多