#diagram #timing #signal #digital #svg #graphics

wavedrom

基于 WaveDrom-JS 的纯 Rust 数字时序图生成器

1 个不稳定版本

0.1.0 2023年6月18日

#297可视化


mdbook-wavedrom-rs 中使用

MIT/Apache

205KB
4.5K SLoC

WaveDrom 允许在 Rust 中程序化创建美观的 时序图。这是为包括 编辑器命令行界面mdbook 预处理器 在内的所有 wavedrom 工具提供动力的 crate。

此 crate 可以以两种方式使用。它可以接收 [WaveJson][wavejson],这是一种 JSON 格式,用于描述 时序图。或者,您可以通过使用 Figure 结构体来程序化定义一个图形。

入门

使用此 crate 很简单。这里有两个示例。首先是如何将 [WaveJson][wavejson] 作为图形的输入,其次是如何程序化定义图形。

WaveJson

结果

程序化定义一个图形

use std::fs::File;
use wavedrom::{Figure, Signal};

let figure = Figure::new()
                 .header_text("Timing Schema")
                 .add_signals([
                     Signal::with_cycle_str("p........").name("clk"),
                     Signal::with_cycle_str("010......").name("req"),
                     Signal::with_cycle_str("0......10").name("done"),
                     Signal::with_cycle_str("0......10").name("done"),
                     Signal::with_cycle_str("==.=.=.=.").name("state")
                        .add_data_fields([
                            "Idle", "Fetch", "Calculate", "Return", "Idle",
                        ]),
                 ]);
let assembled_figure = figure.assemble();

let path = "path/to/file.svg";
let mut file = File::create(path)?;

assembled_figure.write_svg(&mut file)?;

结果

Cargo 功能

有一组 cargo 功能,其中大部分默认启用。

  • serde. 默认启用。添加了 wavejson 模块,该模块定义了波形的序列化和反序列化格式。
  • embed_font. 默认启用。向库中添加了嵌入的 Helvetica 字体,用于查找某些文本的尺寸。当此功能禁用时,它被替换为只对 ASCII 精确且对其他 UTF-8 字符高估宽度的宽度查找表。
  • json5. 默认启用。JSON 的人类友好版本,可用于与 serde 功能一起反序列化 WaveJson 文件。
  • serde_json. 默认禁用。JSON 的正式版本,可用于与 serde 功能一起反序列化 WaveJson 文件。
  • skins. 默认启用。添加了 skin 模块,该模块定义了 WaveDrom 皮肤的序列化和反序列化格式。还添加了将皮肤合并到现有选项集的逻辑。

渲染过程

该包的渲染过程分为3个步骤。

1. 创建 Figure

Figure 可以通过两种方式创建。首先,可以使用 Figure 的构造方法和构建器模式方法来程序化地构建一个 Figure。其次,可以通过加载 [WaveJson][wavejson] 文件来构建一个 Figure。这可以通过使用 Figure::from_json5Figure::from_json 方法来实现。

2. 将 Figure 组装成 AssembledFigure

需要将 Figure 进行组装。这会形成信号波形,移除任何无效的组和边缘。组装是通过 Figure::assembleFigure::assemble_with_options 方法完成的。

3. 将 AssembledFigure 渲染为 SVG

可以通过调用 AssembledFigure::write_svgAssembledFigure::write_svg_with_options 方法来渲染 AssembledFigure。这将把 SVG 写入到一个 io::Write 缓冲区中。如果写入 io::Write 的成本很高,建议将 io::Write 包装在一个 std::io::BufWriter 中。

依赖项

~2.3–3.5MB
~70K SLoC