rust_hdl/docs/vcd2svg/
mod.rs

1use crate::docs::vcd2svg::display_metrics::DisplayMetrics;
2use crate::docs::vcd2svg::trace_collection::TraceCollection;
3use crate::docs::vcd2svg::vcd_style::VCDStyle;
4
5pub mod display_metrics;
6mod interval;
7mod renderable;
8pub mod symbols;
9pub mod text_frame;
10mod time_view;
11mod timed_value;
12pub mod trace_collection;
13mod utils;
14pub mod vcd_style;
15
16pub fn vcd_to_svg(
17    vcd_filename: &str,
18    svg_filename: &str,
19    signal_names: &[&str],
20    min_time_in_ps: u64,
21    max_time_in_ps: u64,
22) -> anyhow::Result<()> {
23    let vcd = std::fs::File::open(vcd_filename)?;
24    let traces = TraceCollection::parse(signal_names, vcd)?;
25    let mut metrics = DisplayMetrics::default();
26    metrics.style = VCDStyle::gtkwave();
27    metrics.min_time = min_time_in_ps;
28    metrics.max_time = max_time_in_ps;
29    let document = traces.as_svg(&metrics)?;
30    svg::save(svg_filename, &document)?;
31    Ok(())
32}
33
34pub fn vcd_to_txt(
35    vcd_filename: &str,
36    signal_names: &[&str],
37    min_time_in_ps: u64,
38    max_time_in_ps: u64,
39    max_columns: u64,
40) -> anyhow::Result<String> {
41    let vcd = std::fs::File::open(vcd_filename)?;
42    let traces = TraceCollection::parse(signal_names, vcd)?;
43    traces.as_string(min_time_in_ps, max_time_in_ps, max_columns as usize)
44}
45
46#[test]
47fn test_txt() {
48    let msg = vcd_to_txt(
49        &format!("{}/sims/ad868x.vcd", env!("CARGO_MANIFEST_DIR")),
50        &[
51            "uut.clock",
52            "uut.adc.spi_slave.state.q",
53            "uut.master.clock",
54            "uut.master.data_inbound",
55            "uut.master.transfer_done",
56            "uut.adc.spi_slave.bits_saved.d",
57        ],
58        0,
59        250,
60        140,
61    )
62    .unwrap();
63    println!("{}", msg);
64}