rspice 0.1.0

Pure-Rust circuit simulation backend
Documentation
use crate::BasicComponent;
use crate::Circuit;
use crate::ComponentRef;
use crate::ConnectionRef;
use crate::EquationRef;
use crate::NetRef;
use crate::TransientMatrix;

/// Arbitrary fixed voltage.
pub struct FixedVoltage {
    nets: Vec<NetRef>,
    connections: Vec<ConnectionRef>,
    equations: Vec<EquationRef>,
    value: f64,
}

impl BasicComponent for FixedVoltage {
    fn initCircuit(
        &mut self,
        nets: Vec<NetRef>,
        connections: Vec<ConnectionRef>,
        equations: Vec<EquationRef>,
    ) {
        self.nets = nets;
        self.connections = connections;
        self.equations = equations;
    }

    fn initTransient(&mut self, matrix: &mut TransientMatrix) {
        // equation 0: constant aribitrary voltage
        // 1 * net.V = V
        matrix.clear_equation(self.equations[0]);
        *matrix.voltage_term(self.equations[0], self.nets[0]) = 1.0;
        *matrix.constant_term(self.equations[0]) = self.value;

        // equation 1: constant zero voltage derivative
        // 1 * net.dV/dt = 0
        matrix.clear_equation(self.equations[1]);
        *matrix.voltage_derivative_term(self.equations[1], self.nets[0]) = 1.0;
    }
}

impl FixedVoltage {
    /// Create a fixed voltage providing `value` Volts, connected to `net`.
    pub fn create(circuit: &mut Circuit, net: NetRef, value: f64) -> ComponentRef {
        let component = Self {
            nets: Vec::new(),
            connections: Vec::new(),
            equations: Vec::new(),
            value: value,
        };
        circuit.createBasicComponent(Box::new(component), vec![net])
    }
}