reda_sp/model/sources/
pwl.rs

1use reda_unit::{Time, Voltage};
2
3#[derive(Debug, Clone)]
4pub struct PwlVoltage {
5    pub points: Vec<(Time, Voltage)>,
6}
7
8impl PwlVoltage {
9    pub fn voltage_at(&self, time: Time) -> Voltage {
10        let n = self.points.len();
11        if n == 0 {
12            return 0.0.into();
13        }
14
15        if n == 1 {
16            return self.points[0].1;
17        }
18
19        for i in 0..n - 1 {
20            let (t0, v0) = self.points[i];
21            let (t1, v1) = self.points[i + 1];
22
23            if t0 <= time && time <= t1 {
24                let ratio = (time - t0) / (t1 - t0);
25                return v0 + ratio * (v1 - v0)
26            }
27        }
28
29        return self.points.last().unwrap().1
30    }
31
32    pub fn to_spice(&self) -> String {
33        let mut line = format!("PWL(");
34        for (i, (t, v)) in self.points.iter().enumerate() {
35            if i > 0 {
36                line.push(' ');
37            }
38            line.push_str(&format!("{} {}", t, v));
39        }
40        line.push(')');
41        line
42    }
43}