【发布时间】: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 是否适合我的项目。