sciforge-core 0.0.4

Shared engineering primitives: materials, fasteners, fluids, propulsion taxonomies, std components.
Documentation
use crate::moleculars::Material;
use sciforge_hub::prelude::physics::electronics::amplifiers as sf_amp;
use sciforge_hub::prelude::physics::electronics::semiconductor_devices as sf_semi;

#[derive(Debug, Clone, Copy)]
pub struct Bjt {
    pub material: Material,
    pub beta: f64,
    pub early_voltage_v: f64,
}

impl Bjt {
    pub fn new(material: Material, beta: f64, early_voltage_v: f64) -> Self {
        Self { material, beta, early_voltage_v }
    }

    pub fn collector_current_a(&self, base_current_a: f64) -> f64 {
        sf_semi::bjt_ic_active(self.beta, base_current_a)
    }

    pub fn emitter_current_a(&self, base_current_a: f64) -> f64 {
        let ic = self.collector_current_a(base_current_a);
        sf_semi::bjt_ie(ic, base_current_a)
    }

    pub fn alpha(&self) -> f64 {
        sf_semi::bjt_alpha(self.beta)
    }

    pub fn early_effect_a(&self, ic0: f64, vce: f64) -> f64 {
        sf_semi::early_effect(ic0, vce, self.early_voltage_v)
    }

    pub fn transconductance_s(&self, collector_current_a: f64, temperature_k: f64) -> f64 {
        sf_amp::transconductance(collector_current_a, sf_amp::thermal_voltage(temperature_k))
    }

    pub fn common_emitter_gain(&self, collector_current_a: f64, load_ohm: f64, temperature_k: f64) -> f64 {
        let gm = self.transconductance_s(collector_current_a, temperature_k);
        sf_amp::common_emitter_voltage_gain(gm, load_ohm)
    }
}

#[derive(Debug, Clone, Copy)]
pub struct Mosfet {
    pub material: Material,
    pub kn: f64,
    pub vth_v: f64,
}

impl Mosfet {
    pub fn new(material: Material, kn: f64, vth_v: f64) -> Self {
        Self { material, kn, vth_v }
    }

    pub fn drain_current_saturation_a(&self, vgs_v: f64) -> f64 {
        sf_semi::mosfet_drain_current_saturation(self.kn, vgs_v, self.vth_v)
    }

    pub fn drain_current_linear_a(&self, vgs_v: f64, vds_v: f64) -> f64 {
        sf_semi::mosfet_drain_current_linear(self.kn, vgs_v, self.vth_v, vds_v)
    }

    pub fn threshold_with_body_effect_v(&self, gamma: f64, vsb_v: f64, phi_v: f64) -> f64 {
        sf_semi::mosfet_threshold_body_effect(self.vth_v, gamma, vsb_v, phi_v)
    }

    pub fn dibl_threshold_v(&self, sigma: f64, vds_v: f64) -> f64 {
        sf_semi::drain_induced_barrier_lowering(self.vth_v, sigma, vds_v)
    }
}

#[derive(Debug, Clone, Copy)]
pub struct OpAmp {
    pub gain_bandwidth_hz: f64,
}

impl OpAmp {
    pub fn new(gain_bandwidth_hz: f64) -> Self {
        Self { gain_bandwidth_hz }
    }

    pub fn inverting_gain(&self, feedback_ohm: f64, input_ohm: f64) -> f64 {
        sf_amp::inverting_gain(feedback_ohm, input_ohm)
    }

    pub fn non_inverting_gain(&self, feedback_ohm: f64, input_ohm: f64) -> f64 {
        sf_amp::non_inverting_gain(feedback_ohm, input_ohm)
    }

    pub fn differential_gain(&self, feedback_ohm: f64, input_ohm: f64) -> f64 {
        sf_amp::differential_gain(feedback_ohm, input_ohm)
    }

    pub fn summing_output_v(&self, inputs_v: &[f64], input_resistors_ohm: &[f64], feedback_ohm: f64) -> f64 {
        sf_amp::summing_amplifier(inputs_v, input_resistors_ohm, feedback_ohm)
    }

    pub fn integrator_output_v(&self, input_v: f64, resistance_ohm: f64, capacitance_f: f64, time_s: f64) -> f64 {
        sf_amp::integrator_output(input_v, resistance_ohm, capacitance_f, time_s)
    }

    pub fn differentiator_output_v(&self, dv_dt: f64, resistance_ohm: f64, capacitance_f: f64) -> f64 {
        sf_amp::differentiator_output(dv_dt, resistance_ohm, capacitance_f)
    }

    pub fn bandwidth_hz(&self, gain: f64) -> f64 {
        self.gain_bandwidth_hz / gain
    }

    pub fn gain_at_bandwidth(&self, bandwidth_hz: f64) -> f64 {
        sf_amp::gain_bandwidth_product(self.gain_bandwidth_hz / bandwidth_hz, bandwidth_hz)
            / bandwidth_hz
    }
}

pub fn decibel_voltage(v_out: f64, v_in: f64) -> f64 {
    sf_amp::decibel_voltage(v_out, v_in)
}

pub fn decibel_power(p_out: f64, p_in: f64) -> f64 {
    sf_amp::decibel_power(p_out, p_in)
}

pub fn cascaded_gain_db(gains_db: &[f64]) -> f64 {
    sf_amp::cascaded_gain(gains_db)
}

pub fn noise_figure_db(snr_in: f64, snr_out: f64) -> f64 {
    sf_amp::noise_figure(snr_in, snr_out)
}

pub fn friis_noise_factor(factors: &[f64], gains: &[f64]) -> f64 {
    sf_amp::friis_noise_factor(factors, gains)
}