1 个不稳定版本
0.1.0 | 2023年6月18日 |
---|
#297 在 可视化
在 mdbook-wavedrom-rs 中使用
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_json5
或 Figure::from_json
方法来实现。
2. 将 Figure
组装成 AssembledFigure
需要将 Figure
进行组装。这会形成信号波形,移除任何无效的组和边缘。组装是通过 Figure::assemble
和 Figure::assemble_with_options
方法完成的。
3. 将 AssembledFigure
渲染为 SVG
可以通过调用 AssembledFigure::write_svg
或 AssembledFigure::write_svg_with_options
方法来渲染 AssembledFigure
。这将把 SVG 写入到一个 io::Write
缓冲区中。如果写入 io::Write
的成本很高,建议将 io::Write
包装在一个 std::io::BufWriter
中。
依赖项
~2.3–3.5MB
~70K SLoC