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;

/// Zero Volt fixed voltage.
pub struct Ground {
    nets: Vec<NetRef>,
    connections: Vec<ConnectionRef>,
    equations: Vec<EquationRef>,
}

impl BasicComponent for Ground {
    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 zero voltage
        // 1 * net.V = 0
        matrix.clear_equation(self.equations[0]);
        *matrix.voltage_term(self.equations[0], self.nets[0]) = 1.0;

        // equation 0: 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 Ground {
    /// Create a ground at 0V, connected to `net`.
    pub fn create(circuit: &mut Circuit, net: NetRef) -> ComponentRef {
        let component = Self {
            nets: Vec::new(),
            connections: Vec::new(),
            equations: Vec::new(),
        };
        circuit.createBasicComponent(Box::new(component), vec![net])
    }
}