rust_hdl/docs/vcd2svg/
time_view.rs

1use crate::docs::vcd2svg::interval::Interval;
2use crate::docs::vcd2svg::renderable::Renderable;
3use crate::docs::vcd2svg::timed_value::{SignalType, TimedValue};
4use substring::Substring;
5
6#[derive(Clone, Debug)]
7pub struct TimeView {
8    pub start_time: u64,
9    pub end_time: u64,
10    pub pixel_scale: f64,
11}
12
13impl TimeView {
14    pub fn map(&self, time: u64) -> f64 {
15        (self.start_time.max(time).min(self.end_time) - self.start_time) as f64 * self.pixel_scale
16    }
17    pub fn intervals<T: SignalType>(&self, vals: &[TimedValue<T>]) -> Vec<Interval<T>> {
18        vals.windows(2)
19            .map(|x| {
20                let end_x = self.map(x[1].time);
21                let start_x = self.map(x[0].time);
22                let label_max = ((end_x - start_x) / 6.0).round() as usize;
23                let mut label = x[0].value.render();
24                if label.len() > label_max {
25                    if label_max <= 3 {
26                        label = format!("!");
27                    } else {
28                        label = format!("{}+", label.substring(0, label_max - 1));
29                    }
30                }
31                Interval {
32                    start_time: x[0].time,
33                    end_time: x[1].time,
34                    value: x[0].value.clone(),
35                    start_x,
36                    end_x,
37                    label,
38                }
39            })
40            .collect()
41    }
42}