Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 23 additions & 5 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,16 +26,18 @@ jobs:
- name: Checkout code
uses: actions/checkout@v4

- name: Use beta toolchain
run: |
rustup toolchain install beta --component rustfmt clippy
rustup default beta
- name: Install Rust toolchain
uses: actions-rs/toolchain@v1
with:
toolchain: stable
components: rustfmt, clippy
override: true

- name: Check format
run: cargo fmt --check

- name: Run test
run: cargo test
run: cargo test --release

- name: Install required cargo
run: cargo install clippy-sarif sarif-fmt
Expand All @@ -44,6 +46,7 @@ jobs:
run:
cargo clippy
--all-features
--all-targets
--message-format=json | clippy-sarif | tee rust-clippy-results.sarif | sarif-fmt
continue-on-error: true

Expand All @@ -52,3 +55,18 @@ jobs:
with:
sarif_file: rust-clippy-results.sarif
wait-for-processing: true

- name: Install required cargo
run: cargo install cargo-tarpaulin

- name: Generate code coverage
run:
cargo tarpaulin
--all-features
--workspace --timeout 120 --out xml

- name: Upload to codecov.io
uses: codecov/codecov-action@v5
with:
token: ${{secrets.CODECOV_TOKEN}}
fail_ci_if_error: true
113 changes: 112 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,115 @@
![GitHub contributors](https://img.shields.io/github/contributors/InfiniTensor/digit-layout)
![GitHub commit activity](https://img.shields.io/github/commit-activity/m/InfiniTensor/digit-layout)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

可以参照rcrw那个库,再添加一个coverage的标签


This crate provides a unified data type definition across various libraries, efficiently encodes types in a compact layout, thus avoiding the redundancy of enumerating definitions for data types.
这个库提供了一个统一的数据类型定义,可以高效地编码类型信息,避免重复定义数据类型。

## 特性

- 支持无符号整数类型
- 支持浮点数类型
- 支持自定义命名类型
- 紧凑的内存布局
- 无标准库依赖(no_std)
- 可选的 half 浮点数支持

## 安装

在 Cargo.toml 中添加:

```toml
[dependencies]
digit-layout = "0.3.0"
```

## 使用示例

### 基本用法

```rust
use digit_layout::{DigitLayout, LayoutContent};

// 创建无符号整数类型布局
let u8_layout = DigitLayout::unsigned(8, 1);
assert_eq!(u8_layout.to_string(), "u8");

// 创建浮点数类型布局
let f32_layout = DigitLayout::real(8, 23, 1);
assert_eq!(f32_layout.to_string(), "f32_e8m23");

// 创建自定义类型布局
let custom_layout = DigitLayout::named("custom", 1, 4);
assert_eq!(custom_layout.to_string(), "custom");
```

### 数组类型

```rust
use digit_layout::DigitLayout;

// 创建无符号整数数组布局
let u8_array = DigitLayout::unsigned(8, 4);
assert_eq!(u8_array.to_string(), "[u8; 4]");

// 创建浮点数数组布局
let f32_array = DigitLayout::real(8, 23, 4);
assert_eq!(f32_array.to_string(), "[f32_e8m23; 4]");
```

### 解码布局

```rust
use digit_layout::{DigitLayout, LayoutContent};

// 解码无符号整数布局
let u8_layout = DigitLayout::unsigned(8, 1);
match u8_layout.decode() {
LayoutContent::Unsigned { width } => {
assert_eq!(width, 8);
}
_ => panic!("Expected unsigned layout"),
}

// 解码浮点数布局
let f32_layout = DigitLayout::real(8, 23, 1);
match f32_layout.decode() {
LayoutContent::Real { exponent, mantissa } => {
assert_eq!(exponent, 8);
assert_eq!(mantissa, 23);
}
_ => panic!("Expected real layout"),
}
```

## 性能测试

项目包含一个性能测试示例,可以测量各种操作的执行时间。运行性能测试:

```bash
cargo run --example benchmark
```

性能测试会测量以下操作的执行时间:

1. 创建布局
- 创建无符号整数布局
- 创建浮点数布局
- 创建自定义布局

2. 解码布局
- 解码无符号整数布局
- 解码浮点数布局
- 解码自定义布局

测试结果会显示每个操作的平均执行时间。

## 文档

完整的 API 文档可以在 [docs.rs](https://docs.rs/digit-layout) 上找到。

## 贡献

欢迎提交 Issue 和 Pull Request!

## 许可证

本项目采用 MIT 许可证 - 详见 [LICENSE](LICENSE) 文件。
34 changes: 34 additions & 0 deletions examples/basic.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
use digit_layout::DigitLayout;

fn main() {
let u8_layout = DigitLayout::unsigned(8, 1);
let u16_layout = DigitLayout::unsigned(16, 1);
let u32_layout = DigitLayout::unsigned(32, 1);
let u64_layout = DigitLayout::unsigned(64, 1);

println!("Unsigned Integer Types:");
println!("u8: {}", u8_layout);
println!("u16: {}", u16_layout);
println!("u32: {}", u32_layout);
println!("u64: {}", u64_layout);

let f16_layout = DigitLayout::real(5, 10, 1);
let f32_layout = DigitLayout::real(8, 23, 1);
let f64_layout = DigitLayout::real(11, 52, 1);

println!("\nFloating Point Types:");
println!("f16: {}", f16_layout);
println!("f32: {}", f32_layout);
println!("f64: {}", f64_layout);

let u8_array = DigitLayout::unsigned(8, 4);
let f32_array = DigitLayout::real(8, 23, 4);

println!("\nArray Types:");
println!("[u8; 4]: {}", u8_array);
println!("[f32; 4]: {}", f32_array);

let custom_layout = DigitLayout::named("custom", 1, 4);
println!("\nCustom Type:");
println!("custom: {}", custom_layout);
}
62 changes: 62 additions & 0 deletions examples/benchmark.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
use digit_layout::DigitLayout;
use std::hint::black_box;
use std::time::Instant;

fn main() {
println!("Starting performance test...\n");

println!("Testing layout creation:");

let start = Instant::now();
for _ in 0..5 {
black_box(DigitLayout::unsigned(8, 1));
black_box(DigitLayout::unsigned(16, 1));
black_box(DigitLayout::unsigned(32, 1));
black_box(DigitLayout::unsigned(64, 1));
}
let duration = start.elapsed();
println!("Creating unsigned integer layouts: {:?}", duration / 20);

let start = Instant::now();
for _ in 0..5 {
black_box(DigitLayout::real(5, 10, 1));
black_box(DigitLayout::real(8, 23, 1));
black_box(DigitLayout::real(11, 52, 1));
}
let duration = start.elapsed();
println!("Creating floating point layouts: {:?}", duration / 15);

let start = Instant::now();
for _ in 0..5 {
black_box(DigitLayout::named("custom", 1, 4));
}
let duration = start.elapsed();
println!("Creating custom layouts: {:?}", duration / 5);

println!("\nTesting layout decoding:");

let u8_layout = DigitLayout::unsigned(8, 1);
let f32_layout = DigitLayout::real(8, 23, 1);
let custom_layout = DigitLayout::named("custom", 1, 4);

let start = Instant::now();
for _ in 0..5 {
black_box(u8_layout.decode());
}
let duration = start.elapsed();
println!("Decoding unsigned integer layouts: {:?}", duration / 5);

let start = Instant::now();
for _ in 0..5 {
black_box(f32_layout.decode());
}
let duration = start.elapsed();
println!("Decoding floating point layouts: {:?}", duration / 5);

let start = Instant::now();
for _ in 0..5 {
black_box(custom_layout.decode());
}
let duration = start.elapsed();
println!("Decoding custom layouts: {:?}", duration / 5);
}
Loading