如何从 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++
现在您可以 运行 ./example
将 example.v
转换为 example.blif
。
(由于这是一个全新的功能,关于如何使用 libyosys 构建程序或其他库的详细信息将来可能会发生变化。)
编辑:在当前 git 头中,Makefile 选项 ENABLE_LIBYOSYS 必须设置为 1 才能启用 libyosys.so.
的构建
其他反馈:您可能需要考虑编写一个 Yosys 插件,而不是实现一个使用 LLVM 库加载 .bc 文件的 Yosys 前端。如果您不打算在 LLVM 和 Yosys 之间来回切换,而只想执行一系列 LLVM pass,然后执行一系列 Yosys pass,那么此解决方案可能会在 LLVM 和 Yosys 之间提供更自然且更易于调试的接口。
我一直在使用两个程序 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++
现在您可以 运行 ./example
将 example.v
转换为 example.blif
。
(由于这是一个全新的功能,关于如何使用 libyosys 构建程序或其他库的详细信息将来可能会发生变化。)
编辑:在当前 git 头中,Makefile 选项 ENABLE_LIBYOSYS 必须设置为 1 才能启用 libyosys.so.
的构建其他反馈:您可能需要考虑编写一个 Yosys 插件,而不是实现一个使用 LLVM 库加载 .bc 文件的 Yosys 前端。如果您不打算在 LLVM 和 Yosys 之间来回切换,而只想执行一系列 LLVM pass,然后执行一系列 Yosys pass,那么此解决方案可能会在 LLVM 和 Yosys 之间提供更自然且更易于调试的接口。