/// <summary> /// Load the Y-matrix and Rhs vector. /// </summary> void IFrequencyBehavior.Load() { var omega = _state.ThrowIfNotBound(this).Laplace.Imaginary; var gdpr = ModelParameters.DrainConductance * BaseParameters.Area; var gspr = ModelParameters.SourceConductance * BaseParameters.Area; var gm = Gm; var gds = Gds; var ggs = Ggs; var xgs = CapGs * omega; var ggd = Ggd; var xgd = CapGd * omega; CDrainDrainPtr.Value += gdpr; CGateGatePtr.Value += new Complex(ggd + ggs, xgd + xgs); CSourceSourcePtr.Value += gspr; CDrainPrimeDrainPrimePtr.Value += new Complex(gdpr + gds + ggd, xgd); CSourcePrimeSourcePrimePtr.Value += new Complex(gspr + gds + gm + ggs, xgs); CDrainDrainPrimePtr.Value -= gdpr; CGateDrainPrimePtr.Value -= new Complex(ggd, xgd); CGateSourcePrimePtr.Value -= new Complex(ggs, xgs); CSourceSourcePrimePtr.Value -= gspr; CDrainPrimeDrainPtr.Value -= gdpr; CDrainPrimeGatePtr.Value += new Complex(-ggd + gm, -xgd); CDrainPrimeSourcePrimePtr.Value += (-gds - gm); CSourcePrimeGatePtr.Value -= new Complex(ggs + gm, xgs); CSourcePrimeSourcePtr.Value -= gspr; CSourcePrimeDrainPrimePtr.Value -= gds; }
/// <summary> /// Load the Y-matrix and right-hand side vector for frequency domain analysis. /// </summary> void IFrequencyBehavior.Load() { var cstate = _state.ThrowIfNotBound(this); int xnrm, xrev; if (Mode < 0) { xnrm = 0; xrev = 1; } else { xnrm = 1; xrev = 0; } // Charge oriented model parameters var effectiveLength = BaseParameters.Length - 2 * ModelParameters.LateralDiffusion; var gateSourceOverlapCap = ModelParameters.GateSourceOverlapCapFactor * BaseParameters.Width; var gateDrainOverlapCap = ModelParameters.GateDrainOverlapCapFactor * BaseParameters.Width; var gateBulkOverlapCap = ModelParameters.GateBulkOverlapCapFactor * effectiveLength; // Meyer"s model parameters var capgs = CapGs + CapGs + gateSourceOverlapCap; var capgd = CapGd + CapGd + gateDrainOverlapCap; var capgb = CapGb + CapGb + gateBulkOverlapCap; var xgs = capgs * cstate.Laplace.Imaginary; var xgd = capgd * cstate.Laplace.Imaginary; var xgb = capgb * cstate.Laplace.Imaginary; var xbd = CapBd * cstate.Laplace.Imaginary; var xbs = CapBs * cstate.Laplace.Imaginary; // Load Y-matrix CGateGatePtr.Value += new Complex(0.0, xgd + xgs + xgb); CBulkBulkPtr.Value += new Complex(CondBd + CondBs, xgb + xbd + xbs); CDrainPrimeDrainPrimePtr.Value += new Complex(DrainConductance + CondDs + CondBd + xrev * (Transconductance + TransconductanceBs), xgd + xbd); CSourcePrimeSourcePrimePtr.Value += new Complex(SourceConductance + CondDs + CondBs + xnrm * (Transconductance + TransconductanceBs), xgs + xbs); CGateBulkPtr.Value -= new Complex(0.0, xgb); CGateDrainPrimePtr.Value -= new Complex(0.0, xgd); CGateSourcePrimePtr.Value -= new Complex(0.0, xgs); CBulkGatePtr.Value -= new Complex(0.0, xgb); CBulkDrainPrimePtr.Value -= new Complex(CondBd, xbd); CBulkSourcePrimePtr.Value -= new Complex(CondBs, xbs); CDrainPrimeGatePtr.Value += new Complex((xnrm - xrev) * Transconductance, -xgd); CDrainPrimeBulkPtr.Value += new Complex(-CondBd + (xnrm - xrev) * TransconductanceBs, -xbd); CSourcePrimeGatePtr.Value -= new Complex((xnrm - xrev) * Transconductance, xgs); CSourcePrimeBulkPtr.Value -= new Complex(CondBs + (xnrm - xrev) * TransconductanceBs, xbs); CDrainDrainPtr.Value += DrainConductance; CSourceSourcePtr.Value += SourceConductance; CDrainDrainPrimePtr.Value -= DrainConductance; CSourceSourcePrimePtr.Value -= SourceConductance; CDrainPrimeDrainPtr.Value -= DrainConductance; CDrainPrimeSourcePrimePtr.Value -= CondDs + xnrm * (Transconductance + TransconductanceBs); CSourcePrimeSourcePtr.Value -= SourceConductance; CSourcePrimeDrainPrimePtr.Value -= CondDs + xrev * (Transconductance + TransconductanceBs); }
public Complex GetComplexCurrent() => _state.ThrowIfNotBound(this).Solution[BranchEq];