Esempio n. 1
0
        /// <summary>
        /// Load the Y-matrix and right-hand side vector for frequency domain analysis.
        /// </summary>
        /// <param name="simulation">The frequency simulation.</param>
        public void Load(FrequencySimulation simulation)
        {
            simulation.ThrowIfNull(nameof(simulation));
            var omega = simulation.ComplexState.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;
        }
Esempio n. 2
0
        /// <summary>
        /// Load the Y-matrix and right-hand side vector for frequency domain analysis.
        /// </summary>
        /// <param name="simulation">The frequency simulation.</param>
        public void Load(FrequencySimulation simulation)
        {
            var laplace = simulation.ComplexState.Laplace;
            var factor  = Complex.Exp(-laplace * BaseParameters.Delay.Value);

            var admittance = BaseParameters.Admittance;

            CPos1Pos1Ptr.Value += admittance;
            CPos1Int1Ptr.Value -= admittance;
            CNeg1Ibr1Ptr.Value -= 1;
            CPos2Pos2Ptr.Value += admittance;
            CNeg2Ibr2Ptr.Value -= 1;
            CInt1Pos1Ptr.Value -= admittance;
            CInt1Int1Ptr.Value += admittance;
            CInt1Ibr1Ptr.Value += 1;
            CInt2Int2Ptr.Value += admittance;
            CInt2Ibr2Ptr.Value += 1;
            CIbr1Neg1Ptr.Value -= 1;
            CIbr1Pos2Ptr.Value -= factor;
            CIbr1Neg2Ptr.Value += factor;
            CIbr1Int1Ptr.Value += 1;
            CIbr1Ibr2Ptr.Value -= factor * BaseParameters.Impedance;
            CIbr2Pos1Ptr.Value -= factor;
            CIbr2Neg1Ptr.Value += factor;
            CIbr2Neg2Ptr.Value -= 1;
            CIbr2Int2Ptr.Value += 1;
            CIbr2Ibr1Ptr.Value -= factor * BaseParameters.Impedance;
            CPos2Int2Ptr.Value -= admittance;
            CInt2Pos2Ptr.Value -= admittance;
        }
Esempio n. 3
0
        /// <summary>
        /// Calculate AC parameters
        /// </summary>
        /// <param name="simulation"></param>
        public override void InitializeParameters(FrequencySimulation simulation)
        {
            if (simulation == null)
            {
                throw new ArgumentNullException(nameof(simulation));
            }

            var    state = simulation.RealState;
            double capd;
            double vd = state.Solution[_posPrimeNode] - state.Solution[_negNode];

            // charge storage elements
            var czero = _temp.TempJunctionCap * _bp.Area;

            if (vd < _temp.TempDepletionCap)
            {
                var arg  = 1 - vd / _mbp.JunctionPotential;
                var sarg = Math.Exp(-_mbp.GradingCoefficient * Math.Log(arg));
                capd = _mbp.TransitTime * _load.Conduct + czero * sarg;
            }
            else
            {
                var czof2 = czero / _modeltemp.F2;
                capd = _mbp.TransitTime * _load.Conduct + czof2 * (_modeltemp.F3 + _mbp.GradingCoefficient * vd / _mbp.JunctionPotential);
            }
            Capacitance = capd;
        }
Esempio n. 4
0
 /// <summary>
 /// Initializes the parameters.
 /// </summary>
 /// <param name="simulation">The frequency simulation.</param>
 public void InitializeParameters(FrequencySimulation simulation)
 {
     simulation.ThrowIfNull(nameof(simulation));
     CalculateBaseCapacitances();
     CalculateCapacitances(VoltageGs, VoltageDs, VoltageBs);
     CalculateMeyerCharges(VoltageGs, VoltageGs - VoltageDs);
 }
Esempio n. 5
0
        /// <summary>
        /// Initializes the parameters.
        /// </summary>
        /// <param name="simulation">The frequency simulation.</param>
        public void InitializeParameters(FrequencySimulation simulation)
        {
            simulation.ThrowIfNull(nameof(simulation));
            var vgs = Vgs;
            var vgd = Vgd;

            // Calculate charge storage elements
            var czgs   = TempCapGs * BaseParameters.Area;
            var czgd   = TempCapGd * BaseParameters.Area;
            var twop   = TempGatePotential + TempGatePotential;
            var czgsf2 = czgs / ModelTemperature.F2;
            var czgdf2 = czgd / ModelTemperature.F2;

            if (vgs < CorDepCap)
            {
                var sarg = Math.Sqrt(1 - vgs / TempGatePotential);
                CapGs = czgs / sarg;
            }
            else
            {
                CapGs = czgsf2 * (ModelTemperature.F3 + vgs / twop);
            }

            if (vgd < CorDepCap)
            {
                var sarg = Math.Sqrt(1 - vgd / TempGatePotential);
                CapGd = czgd / sarg;
            }
            else
            {
                CapGd = czgdf2 * (ModelTemperature.F3 + vgd / twop);
            }
        }
Esempio n. 6
0
 /// <summary>
 /// Calculate AC parameters
 /// </summary>
 /// <param name="simulation"></param>
 public void InitializeParameters(FrequencySimulation simulation)
 {
     simulation.ThrowIfNull(nameof(simulation));
     var state = simulation.RealState;
     var vd = state.Solution[PosPrimeNode] - state.Solution[NegNode];
     CalculateCapacitance(vd);
 }
        /// <summary>
        /// Execute behavior for AC analysis
        /// </summary>
        /// <param name="simulation">Frequency-based simulation</param>
        public override void Load(FrequencySimulation simulation)
        {
            if (simulation == null)
            {
                throw new ArgumentNullException(nameof(simulation));
            }

            var cstate = simulation.ComplexState;
            int xnrm, xrev;

            if (_load.Mode < 0)
            {
                xnrm = 0;
                xrev = 1;
            }
            else
            {
                xnrm = 1;
                xrev = 0;
            }

            // Meyer's model parameters
            var effectiveLength      = _bp.Length - 2 * _mbp.LateralDiffusion;
            var gateSourceOverlapCap = _mbp.GateSourceOverlapCapFactor * _bp.Width;
            var gateDrainOverlapCap  = _mbp.GateDrainOverlapCapFactor * _bp.Width;
            var gateBulkOverlapCap   = _mbp.GateBulkOverlapCapFactor * effectiveLength;
            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
            GateGatePtr.Value               += new Complex(0.0, xgd + xgs + xgb);
            BulkBulkPtr.Value               += new Complex(_load.CondBd + _load.CondBs, xgb + xbd + xbs);
            DrainPrimeDrainPrimePtr.Value   += new Complex(_temp.DrainConductance + _load.CondDs + _load.CondBd + xrev * (_load.Transconductance + _load.TransconductanceBs), xgd + xbd);
            SourcePrimeSourcePrimePtr.Value += new Complex(_temp.SourceConductance + _load.CondDs + _load.CondBs + xnrm * (_load.Transconductance + _load.TransconductanceBs), xgs + xbs);
            GateBulkPtr.Value               -= new Complex(0.0, xgb);
            GateDrainPrimePtrPtr.Value      -= new Complex(0.0, xgd);
            GateSourcePrimePtr.Value        -= new Complex(0.0, xgs);
            BulkGatePtr.Value               -= new Complex(0.0, xgb);
            BulkDrainPrimePtr.Value         -= new Complex(_load.CondBd, xbd);
            BulkSourcePrimePtr.Value        -= new Complex(_load.CondBs, xbs);
            DrainPrimeGatePtr.Value         += new Complex((xnrm - xrev) * _load.Transconductance, -xgd);
            DrainPrimeBulkPtr.Value         += new Complex(-_load.CondBd + (xnrm - xrev) * _load.TransconductanceBs, -xbd);
            SourcePrimeGatePtr.Value        -= new Complex((xnrm - xrev) * _load.Transconductance, xgs);
            SourcePrimeBulkPtr.Value        -= new Complex(_load.CondBs + (xnrm - xrev) * _load.TransconductanceBs, xbs);
            DrainDrainPtr.Value             += _temp.DrainConductance;
            SourceSourcePtr.Value           += _temp.SourceConductance;
            DrainDrainPrimePtr.Value        -= _temp.DrainConductance;
            SourceSourcePrimePtr.Value      -= _temp.SourceConductance;
            DrainPrimeDrainPtr.Value        -= _temp.DrainConductance;
            DrainPrimeSourcePrimePtr.Value  -= _load.CondDs + xnrm * (_load.Transconductance + _load.TransconductanceBs);
            SourcePrimeSourcePtr.Value      -= _temp.SourceConductance;
            SourcePrimeDrainPrimePtr.Value  -= _load.CondDs + xrev * (_load.Transconductance + _load.TransconductanceBs);
        }
Esempio n. 8
0
        /// <summary>
        /// Execute behavior for AC analysis
        /// </summary>
        /// <param name="simulation">Frequency-based simulation</param>
        public void Load(FrequencySimulation simulation)
        {
            simulation.ThrowIfNull(nameof(simulation));

            // Load the Y-matrix
            CPosControlBranchPtr.Value += BaseParameters.Coefficient.Value;
            CNegControlBranchPtr.Value -= BaseParameters.Coefficient.Value;
        }
Esempio n. 9
0
        /// <summary>
        /// Load the Y-matrix and right-hand side vector for frequency domain analysis.
        /// </summary>
        /// <param name="simulation">The frequency simulation.</param>
        /// <exception cref="ArgumentNullException">simulation</exception>
        public void Load(FrequencySimulation simulation)
        {
            simulation.ThrowIfNull(nameof(simulation));

            var cstate = simulation.ComplexState;
            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);
        }
Esempio n. 10
0
        /// <summary>
        /// Initialize parameters for AC analysis
        /// </summary>
        public virtual void InitializeParameters(FrequencySimulation simulation)
        {
            if (simulation == null)
            {
                throw new ArgumentNullException(nameof(simulation));
            }

            // Nothing to initialize by default
        }
Esempio n. 11
0
        /// <summary>
        /// Execute behavior for AC analysis
        /// </summary>
        /// <param name="simulation">Frequency-based simulation</param>
        public void Load(FrequencySimulation simulation)
        {
            var conductance = Conductance;

            CPosPosPtr.Value += conductance;
            CNegNegPtr.Value += conductance;
            CPosNegPtr.Value -= conductance;
            CNegPosPtr.Value -= conductance;
        }
Esempio n. 12
0
        /// <summary>
        /// Execute behavior for AC analysis
        /// </summary>
        /// <param name="simulation">Frequency-based simulation</param>
        public void Load(FrequencySimulation simulation)
        {
            var value = BaseParameters.Coefficient.Value;

            CPosControlPosPtr.Value += value;
            CPosControlNegPtr.Value -= value;
            CNegControlPosPtr.Value -= value;
            CNegControlNegPtr.Value += value;
        }
Esempio n. 13
0
        /// <summary>
        /// Execute behavior for AC analysis
        /// </summary>
        /// <param name="simulation">Frequency-based simulation</param>
        public void Load(FrequencySimulation simulation)
        {
            simulation.ThrowIfNull(nameof(simulation));

            // NOTE: Spice 3f5's documentation is IXXXX POS NEG VALUE but in the code it is IXXXX NEG POS VALUE
            // I solved it by inverting the current when loading the rhs vector
            CPosPtr.Value -= FrequencyParameters.Phasor;
            CNegPtr.Value += FrequencyParameters.Phasor;
        }
Esempio n. 14
0
 /// <summary>
 /// Initializes the parameters.
 /// </summary>
 /// <param name="simulation">The frequency simulation.</param>
 public void InitializeParameters(FrequencySimulation simulation)
 {
     if (simulation == null)
     {
         throw new ArgumentNullException(nameof(simulation));
     }
     CalculateBaseCapacitances();
     CalculateCapacitances(VoltageGs, VoltageDs, VoltageBs);
     CalculateMeyerCharges(VoltageGs, VoltageGs - VoltageDs);
 }
Esempio n. 15
0
        /// <summary>
        /// Execute behavior for AC analysis
        /// </summary>
        /// <param name="simulation">Frequency-based simulation</param>
        public void Load(FrequencySimulation simulation)
        {
            if (simulation == null)
            {
                throw new ArgumentNullException(nameof(simulation));
            }

            var     cstate = simulation.ComplexState;
            var     gcpr   = ModelTemperature.CollectorConduct * BaseParameters.Area;
            var     gepr   = ModelTemperature.EmitterConduct * BaseParameters.Area;
            var     gpi    = ConductancePi;
            var     gmu    = ConductanceMu;
            Complex gm     = Transconductance;
            var     go     = OutputConductance;
            var     td     = ModelTemperature.ExcessPhaseFactor;

            if (!td.Equals(0)) // Avoid computations
            {
                var arg = td * cstate.Laplace;

                gm = gm + go;
                gm = gm * Complex.Exp(-arg);
                gm = gm - go;
            }
            var gx    = ConductanceX;
            var xcpi  = CapBe * cstate.Laplace;
            var xcmu  = CapBc * cstate.Laplace;
            var xcbx  = CapBx * cstate.Laplace;
            var xccs  = CapCs * cstate.Laplace;
            var xcmcb = Geqcb * cstate.Laplace;

            CCollectorCollectorPtr.Value           += gcpr;
            CBaseBasePtr.Value                     += gx + xcbx;
            CEmitterEmitterPtr.Value               += gepr;
            CCollectorPrimeCollectorPrimePtr.Value += gmu + go + gcpr + xcmu + xccs + xcbx;
            CBasePrimeBasePrimePtr.Value           += gx + gpi + gmu + xcpi + xcmu + xcmcb;
            CEmitterPrimeEmitterPrimePtr.Value     += gpi + gepr + gm + go + xcpi;
            CCollectorCollectorPrimePtr.Value      += -gcpr;
            CBaseBasePrimePtr.Value                += -gx;
            CEmitterEmitterPrimePtr.Value          += -gepr;
            CCollectorPrimeCollectorPtr.Value      += -gcpr;
            CCollectorPrimeBasePrimePtr.Value      += -gmu + gm - xcmu;
            CCollectorPrimeEmitterPrimePtr.Value   += -gm - go;
            CBasePrimeBasePtr.Value                += -gx;
            CBasePrimeCollectorPrimePtr.Value      += -gmu - xcmu - xcmcb;
            CBasePrimeEmitterPrimePtr.Value        += -gpi - xcpi;
            CEmitterPrimeEmitterPtr.Value          += -gepr;
            CEmitterPrimeCollectorPrimePtr.Value   += -go + xcmcb;
            CEmitterPrimeBasePrimePtr.Value        += -gpi - gm - xcpi - xcmcb;
            CSubstrateSubstratePtr.Value           += xccs;
            CCollectorPrimeSubstratePtr.Value      += -xccs;
            CSubstrateCollectorPrimePtr.Value      += -xccs;
            CBaseCollectorPrimePtr.Value           += -xcbx;
            CCollectorPrimeBasePtr.Value           += -xcbx;
        }
Esempio n. 16
0
        /// <summary>
        /// Execute behavior for AC analysis
        /// </summary>
        /// <param name="simulation">Frequency-based simulation</param>
        public override void Load(FrequencySimulation simulation)
        {
            if (simulation == null)
            {
                throw new ArgumentNullException(nameof(simulation));
            }

            var     cstate = simulation.ComplexState;
            var     gcpr   = _modeltemp.CollectorConduct * _bp.Area;
            var     gepr   = _modeltemp.EmitterConduct * _bp.Area;
            var     gpi    = _load.ConductancePi;
            var     gmu    = _load.ConductanceMu;
            Complex gm     = _load.Transconductance;
            var     go     = _load.OutputConductance;
            var     td     = _modeltemp.ExcessPhaseFactor;

            if (!td.Equals(0)) // Avoid computations
            {
                Complex arg = td * cstate.Laplace;

                gm = gm + go;
                gm = gm * Complex.Exp(-arg);
                gm = gm - go;
            }
            var gx    = _load.ConductanceX;
            var xcpi  = CapBe * cstate.Laplace;
            var xcmu  = CapBc * cstate.Laplace;
            var xcbx  = CapBx * cstate.Laplace;
            var xccs  = CapCs * cstate.Laplace;
            var xcmcb = CondCb * cstate.Laplace;

            CollectorCollectorPtr.Value           += gcpr;
            BaseBasePtr.Value                     += gx + xcbx;
            EmitterEmitterPtr.Value               += gepr;
            CollectorPrimeCollectorPrimePtr.Value += gmu + go + gcpr + xcmu + xccs + xcbx;
            BasePrimeBasePrimePtr.Value           += gx + gpi + gmu + xcpi + xcmu + xcmcb;
            EmitterPrimeEmitterPrimePtr.Value     += gpi + gepr + gm + go + xcpi;
            CollectorCollectorPrimePtr.Value      += -gcpr;
            BaseBasePrimePtr.Value                += -gx;
            EmitterEmitterPrimePtr.Value          += -gepr;
            CollectorPrimeCollectorPtr.Value      += -gcpr;
            CollectorPrimeBasePrimePtr.Value      += -gmu + gm - xcmu;
            CollectorPrimeEmitterPrimePtr.Value   += -gm - go;
            BasePrimeBasePtr.Value                += -gx;
            BasePrimeCollectorPrimePtr.Value      += -gmu - xcmu - xcmcb;
            BasePrimeEmitterPrimePtr.Value        += -gpi - xcpi;
            EmitterPrimeEmitterPtr.Value          += -gepr;
            EmitterPrimeCollectorPrimePtr.Value   += -go + xcmcb;
            EmitterPrimeBasePrimePtr.Value        += -gpi - gm - xcpi - xcmcb;
            SubstrateSubstratePtr.Value           += xccs;
            CollectorPrimeSubstratePtr.Value      += -xccs;
            SubstrateCollectorPrimePtr.Value      += -xccs;
            BaseCollectorPrimePtr.Value           += -xcbx;
            CollectorPrimeBasePtr.Value           += -xcbx;
        }
Esempio n. 17
0
        /// <summary>
        /// Execute behavior for AC analysis
        /// </summary>
        /// <param name="simulation">Frequency-based simulation</param>
        public void Load(FrequencySimulation simulation)
        {
            simulation.ThrowIfNull(nameof(simulation));

            // Load Y-matrix
            CPosBranchPtr.Value           += 1.0;
            CBranchPosPtr.Value           += 1.0;
            CNegBranchPtr.Value           -= 1.0;
            CBranchNegPtr.Value           -= 1.0;
            CBranchControlBranchPtr.Value -= BaseParameters.Coefficient.Value;
        }
Esempio n. 18
0
        /// <summary>
        /// Execute behavior for AC analysis
        /// </summary>
        /// <param name="simulation">Frequency-based simulation</param>
        public void Load(FrequencySimulation simulation)
        {
            if (simulation == null)
            {
                throw new ArgumentNullException(nameof(simulation));
            }

            // Load the Y-matrix
            CPosControlBranchPtr.Value += BaseParameters.Coefficient.Value;
            CNegControlBranchPtr.Value -= BaseParameters.Coefficient.Value;
        }
Esempio n. 19
0
        /// <summary>
        /// Calculate AC parameters
        /// </summary>
        /// <param name="simulation"></param>
        public void InitializeParameters(FrequencySimulation simulation)
        {
            if (simulation == null)
            {
                throw new ArgumentNullException(nameof(simulation));
            }
            var state = simulation.RealState;
            var vd    = state.Solution[PosPrimeNode] - state.Solution[NegNode];

            CalculateCapacitance(vd);
        }
Esempio n. 20
0
        /// <summary>
        /// Initialize AC parameters
        /// </summary>
        /// <param name="simulation">Frequency-based simulation</param>
        public void InitializeParameters(FrequencySimulation simulation)
        {
            simulation.ThrowIfNull(nameof(simulation));
            var state = simulation.RealState;
            var vbe   = VoltageBe;
            var vbc   = VoltageBc;
            var vbx   = ModelParameters.BipolarType * (state.Solution[BaseNode] - state.Solution[CollectorPrimeNode]);
            var vcs   = ModelParameters.BipolarType * (state.Solution[SubstrateNode] - state.Solution[CollectorPrimeNode]);

            CalculateCapacitances(vbe, vbc, vbx, vcs);
        }
Esempio n. 21
0
        /// <summary>
        /// Execute behavior for AC analysis
        /// </summary>
        /// <param name="simulation">Frequency-based simulation</param>
        public override void Load(FrequencySimulation simulation)
        {
            if (simulation == null)
            {
                throw new ArgumentNullException(nameof(simulation));
            }

            // Load the Y-matrix
            PosControlBranchPtr.Value += _bp.Coefficient.Value;
            NegControlBranchPtr.Value -= _bp.Coefficient.Value;
        }
Esempio n. 22
0
        /// <summary>
        /// Execute behavior for AC analysis
        /// </summary>
        /// <param name="simulation">Frequency-based simulation</param>
        public void Load(FrequencySimulation simulation)
        {
            simulation.ThrowIfNull(nameof(simulation));

            var state = simulation.ComplexState;
            var value = state.Laplace * Factor;

            // Load Y-matrix
            Branch1Branch2Ptr.Value -= value;
            Branch2Branch1Ptr.Value -= value;
        }
        /// <summary>
        /// Execute behavior for AC analysis
        /// </summary>
        /// <param name="simulation">Frequency-based simulation</param>
        public override void Load(FrequencySimulation simulation)
        {
            if (simulation == null)
            {
                throw new ArgumentNullException(nameof(simulation));
            }

            // NOTE: Spice 3f5's documentation is IXXXX POS NEG VALUE but in the code it is IXXXX NEG POS VALUE
            // I solved it by inverting the current when loading the rhs vector
            PosPtr.Value -= _ac;
            NegPtr.Value += _ac;
        }
Esempio n. 24
0
        /// <summary>
        /// Execute behavior for AC analysis
        /// </summary>
        /// <param name="simulation">Frequency-based simulation</param>
        public void Load(FrequencySimulation simulation)
        {
            simulation.ThrowIfNull(nameof(simulation));

            // Load Y-matrix
            CPosBranchPtr.Value += 1.0;
            CBranchPosPtr.Value += 1.0;
            CNegBranchPtr.Value -= 1.0;
            CBranchNegPtr.Value -= 1.0;

            // Load Rhs-vector
            CBranchPtr.Value += FrequencyParameters.Phasor;
        }
Esempio n. 25
0
        /// <summary>
        /// Execute behavior for AC analysis
        /// </summary>
        /// <param name="simulation">Frequency-based simulation</param>
        public override void Load(FrequencySimulation simulation)
        {
            simulation.ThrowIfNull(nameof(simulation));

            var state = simulation.ComplexState;
            var val   = state.Laplace * _bp.Inductance.Value;

            PosBranchPtr.Value    += 1.0;
            NegBranchPtr.Value    -= 1.0;
            BranchNegPtr.Value    -= 1.0;
            BranchPosPtr.Value    += 1.0;
            BranchBranchPtr.Value -= val;
        }
Esempio n. 26
0
        /// <summary>
        /// Execute behavior for AC analysis
        /// </summary>
        /// <param name="simulation">Frequency-based simulation</param>
        public void Load(FrequencySimulation simulation)
        {
            simulation.ThrowIfNull(nameof(simulation));

            var state = simulation.ComplexState;
            var val   = state.Laplace * Capacitance;

            // Load the Y-matrix
            PosPosPtr.Value += val;
            NegNegPtr.Value += val;
            PosNegPtr.Value -= val;
            NegPosPtr.Value -= val;
        }
Esempio n. 27
0
        /// <summary>
        /// Load the Y-matrix and right-hand side vector for frequency domain analysis.
        /// </summary>
        /// <param name="simulation">The frequency simulation.</param>
        public void Load(FrequencySimulation simulation)
        {
            var laplace = simulation.ComplexState.Laplace;
            var factor  = Complex.Exp(-laplace * BaseParameters.Delay);

            // Load the Y-matrix and RHS-vector
            CPosBranchPtr.Value        += 1.0;
            CNegBranchPtr.Value        -= 1.0;
            CBranchPosPtr.Value        += 1.0;
            CBranchNegPtr.Value        -= 1.0;
            CBranchControlPosPtr.Value -= factor;
            CBranchControlNegPtr.Value += factor;
        }
Esempio n. 28
0
        /// <summary>
        /// Execute behavior for AC analysis
        /// </summary>
        /// <param name="simulation">Frequency-based simulation</param>
        public void Load(FrequencySimulation simulation)
        {
            if (simulation == null)
            {
                throw new ArgumentNullException(nameof(simulation));
            }

            var state = simulation.ComplexState;
            var value = state.Laplace * Factor;

            // Load Y-matrix
            Branch1Branch2Ptr.Value -= value;
            Branch2Branch1Ptr.Value -= value;
        }
Esempio n. 29
0
        /// <summary>
        /// Load the Y-matrix and right-hand side vector for frequency domain analysis.
        /// </summary>
        /// <param name="simulation">The frequency simulation.</param>
        /// <exception cref="ArgumentNullException">simulation</exception>
        public void Load(FrequencySimulation simulation)
        {
            simulation.ThrowIfNull(nameof(simulation));

            // Get the current state
            var currentState = CurrentState;
            var gNow         = currentState ? ModelParameters.OnConductance : ModelParameters.OffConductance;

            // Load the Y-matrix
            PosPosPtr.Value += gNow;
            PosNegPtr.Value -= gNow;
            NegPosPtr.Value -= gNow;
            NegNegPtr.Value += gNow;
        }
        /// <summary>
        /// Execute behavior for AC analysis
        /// </summary>
        /// <param name="simulation">Frequency-based simulation</param>
        public override void Load(FrequencySimulation simulation)
        {
            if (simulation == null)
            {
                throw new ArgumentNullException(nameof(simulation));
            }

            // Load Y-matrix
            PosBranchPtr.Value        += 1.0;
            BranchPosPtr.Value        += 1.0;
            NegBranchPtr.Value        -= 1.0;
            BranchNegPtr.Value        -= 1.0;
            BranchControlPosPtr.Value -= _bp.Coefficient.Value;
            BranchControlNegPtr.Value += _bp.Coefficient.Value;
        }