예제 #1
0
        /// <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;
        }
예제 #2
0
        /// <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);
        }
예제 #3
0
 public Complex GetComplexCurrent() => _state.ThrowIfNotBound(this).Solution[BranchEq];