30个版本 (10个重大更新)

0.11.5 2024年6月26日
0.11.1 2024年5月4日
0.10.2 2024年2月24日
0.9.0 2023年12月19日
0.4.2 2023年7月15日

过程宏中排名第1641

Download history 178/week @ 2024-04-14 325/week @ 2024-04-21 532/week @ 2024-04-28 516/week @ 2024-05-05 653/week @ 2024-05-12 539/week @ 2024-05-19 503/week @ 2024-05-26 1445/week @ 2024-06-02 721/week @ 2024-06-09 481/week @ 2024-06-16 608/week @ 2024-06-23 352/week @ 2024-06-30 234/week @ 2024-07-07 230/week @ 2024-07-14 307/week @ 2024-07-21 395/week @ 2024-07-28

每月下载量1,188
2个crate中使用(通过melior

Apache-2.0

89KB
2.5K SLoC

Melior

GitHub Action Crate License

Melior是Rust的MLIR绑定。它旨在提供简单、安全且完整的API,用于MLIR,并通过Rust类型系统表示的合理所有权模型。

此crate是对MLIR C API的包装。

示例

构建一个用于整数加法函数

use melior::{
    Context,
    dialect::{arith, DialectRegistry, func},
    ir::{*, attribute::{StringAttribute, TypeAttribute}, r#type::FunctionType},
    utility::register_all_dialects,
};

let registry = DialectRegistry::new();
register_all_dialects(&registry);

let context = Context::new();
context.append_dialect_registry(&registry);
context.load_all_available_dialects();

let location = Location::unknown(&context);
let module = Module::new(location);

let index_type = Type::index(&context);

module.body().append_operation(func::func(
    &context,
    StringAttribute::new(&context, "add"),
    TypeAttribute::new(FunctionType::new(&context, &[index_type, index_type], &[index_type]).into()),
    {
        let block = Block::new(&[(index_type, location), (index_type, location)]);

        let sum = block.append_operation(arith::addi(
            block.argument(0).unwrap().into(),
            block.argument(1).unwrap().into(),
            location
        ));

        block.append_operation(func::r#return( &[sum.result(0).unwrap().into()], location));

        let region = Region::new();
        region.append_block(block);
        region
    },
    &[],
    location,
));

assert!(module.as_operation().verify());

安装

cargo add melior

依赖项

LLVM/MLIR 17 需要安装到您的系统上。在Linux和macOS上,您可以通过Homebrew进行安装。

brew install llvm@17

文档

GitHub Pages上。

贡献

欢迎贡献!但是,Melior仍然处于alpha阶段,MLIR C API也是如此。请注意,API是不稳定的,未来可能会有破坏性更改。

技术说明

  • 我们始终使用&T表示MLIR对象,而不是&mut T,以减轻在Rust中表示MLIR C API的松散所有权模型复杂性的需要。
  • 仅支持UTF-8作为字符串编码。
    • 大多数Rust和C之间的字符串转换都内部缓存。

命名约定

  • Mlir<X>对象如果没有析构函数,则命名为<X>。否则,对于拥有对象,它们命名为<X>,对于借用引用,则命名为<X>Ref
  • mlir<X>Create 函数被重命名为 <X>::new
  • mlir<X>Get<Y> 函数被重命名为以下名称
    • 如果生成的对象引用了 &self,它们被命名为 <X>::as_<Y>
    • 否则,它们仅被命名为 <X>::<Y>,并且可能包含如位置索引之类的参数。

安全性

尽管 Melior 旨在实现完全类型安全,但当前 API 的某些部分并不具备。

  • 访问属于未在上下文中加载的方言的操作、类型或属性可能导致运行时错误或最坏情况下的段错误。
    • 修复计划:在创建上下文时默认加载所有方言,并为高级用户提供不安全的上下文构造函数。
  • 从可能转移参数所有权的函数返回的 IR 对象引用可能在以后被取消有效性。
    • 这是因为我们需要借用 &self 而不是 &mut self 来返回此类引用。
    • 例如 Region::append_block()
    • 修复计划:对这些对象使用动态检查,如 RefCell

参考

许可证

Apache 2.0

依赖项

~6–9.5MB
~180K SLoC