reda_sp/model/sources/
pwl.rs1use 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}