rust_hdl/docs/vcd2svg/
time_view.rs1use 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}