예제 #1
0
        private CurrentSwitch CreateCurrentSwitch(string name, string pos, string neg, string contSource, string model)
        {
            var vsw = new CurrentSwitch(name, pos, neg, contSource)
            {
                Model = model
            };

            return(vsw);
        }
예제 #2
0
        /// <summary>
        /// Create a voltage switch
        /// </summary>
        /// <param name="name">Name</param>
        /// <param name="pos">Positive node</param>
        /// <param name="neg">Negative node</param>
        /// <param name="contSource">Controlling source</param>
        /// <param name="modelName">Model name</param>
        /// <param name="modelParameters">Model parameters</param>
        /// <returns></returns>
        CurrentSwitch CreateCurrentSwitch(Identifier name, Identifier pos, Identifier neg, Identifier contSource, Identifier modelName, string modelParameters)
        {
            CurrentSwitchModel model = new CurrentSwitchModel(modelName);

            ApplyParameters(model, modelParameters);

            CurrentSwitch vsw = new CurrentSwitch(name, pos, neg, contSource);

            vsw.SetModel(model);
            return(vsw);
        }
예제 #3
0
        /// <summary>
        /// Create a voltage switch
        /// </summary>
        /// <param name="name">Name</param>
        /// <param name="pos">Positive node</param>
        /// <param name="neg">Negative node</param>
        /// <param name="contSource">Controlling source</param>
        /// <param name="modelName">Model name</param>
        /// <param name="modelParameters">Model parameters</param>
        /// <returns></returns>
        CurrentSwitch CreateCurrentSwitch(string name, string pos, string neg, string contSource, string modelName, string modelParameters)
        {
            var model = new CurrentSwitchModel(modelName);

            ApplyParameters(model, modelParameters);

            var vsw = new CurrentSwitch(name, pos, neg, contSource);

            vsw.SetModel(model);
            return(vsw);
        }
예제 #4
0
        public void When_VSWBooleanParameter_Expect_DirectAccess()
        {
            // Create voltage source
            CurrentSwitch s = new CurrentSwitch("SW 1");
            var           p = s.ParameterSets.Get <SpiceSharp.Components.CurrentSwitchBehaviors.BaseParameters>();

            // Check on
            s.ParameterSets.SetParameter("on");
            Assert.AreEqual(true, p.ZeroState);

            // Check off
            s.ParameterSets.SetParameter("off");
            Assert.AreEqual(false, p.ZeroState);
        }
예제 #5
0
        public void When_BooleanParameter_Expect_DirectAccess()
        {
            // Create voltage source
            var s = new CurrentSwitch("SW 1");
            var p = s.Parameters;

            // Check on
            s.SetParameter("on", true);
            Assert.AreEqual(true, p.ZeroState);

            // Check off
            s.SetParameter("off", true);
            Assert.AreEqual(false, p.ZeroState);
        }
예제 #6
0
        /// <summary>
        /// Generate a current switch
        /// </summary>
        /// <param name="name">The name</param>
        /// <param name="parameters">Parameters</param>
        /// <param name="netlist">Netlist</param>
        /// <returns></returns>
        protected ICircuitObject GenerateCSW(CircuitIdentifier name, List <Token> parameters, Netlist netlist)
        {
            CurrentSwitch csw = new CurrentSwitch(name);

            csw.ReadNodes(netlist.Path, parameters);
            switch (parameters.Count)
            {
            case 2: throw new ParseException(parameters[1], "Voltage source expected", false);

            case 3: throw new ParseException(parameters[2], "Model expected", false);
            }

            // Get the controlling voltage source
            switch (parameters[2].kind)
            {
            case WORD:
                csw.CSWcontName = new CircuitIdentifier(parameters[2].image);
                break;

            default:
                throw new ParseException(parameters[2], "Voltage source name expected");
            }

            // Get the model
            csw.SetModel(netlist.FindModel <CurrentSwitchModel>(parameters[3]));

            // Optional on or off
            if (parameters.Count > 4)
            {
                switch (parameters[4].image.ToLower())
                {
                case "on":
                    csw.SetOn();
                    break;

                case "off":
                    csw.SetOff();
                    break;

                default:
                    throw new ParseException(parameters[4], "ON or OFF expected");
                }
            }
            return(csw);
        }
        /// <summary>
        /// Generates a current switch.
        /// </summary>
        /// <param name="name">Name of current switch.</param>
        /// <param name="parameters">Parameters of current switch.</param>
        /// <param name="context">Reading context.</param>
        /// <returns>
        /// A new instance of current switch.
        /// </returns>
        private IEntity GenerateCurrentSwitch(string name, ParameterCollection parameters, ICircuitContext context)
        {
            if (parameters.Count < 4)
            {
                context.Result.Validation.Add(new ValidationEntry(ValidationEntrySource.Reader, ValidationEntryLevel.Warning, "Wrong parameter count for current switch", parameters.LineInfo));
                return(null);
            }

            string modelName = parameters.Get(3).Image;
            var    model     = context.ModelsRegistry.FindModel(modelName);

            if (model.Entity is ISwitchModel)
            {
                BehavioralResistor resistor = new BehavioralResistor(name);
                Model resistorModel         = model;
                context.CreateNodes(resistor, parameters.Take(2));
                var ic = $"i({parameters.Get(2)})";
                var iswitchModelParameters = resistorModel.Parameters as ISwitchModelParameters;

                double iOff = iswitchModelParameters.OffCurrent;
                double rOff = iswitchModelParameters.OffResistance;
                double iOn  = iswitchModelParameters.OnCurrent;
                double rOn  = iswitchModelParameters.OnResistance;

                double lm            = Math.Log(Math.Sqrt(rOn * rOff));
                double lr            = Math.Log(rOn / rOff);
                double im            = (iOn + iOff) / 2.0;
                double id            = iOn - iOff;
                var    resExpression = GetISwitchExpression(iOff, rOff, iOn, rOn, ic, lm, lr, im, id);
                resistor.Parameters.Expression  = resExpression;
                resistor.Parameters.ParseAction = (expression) =>
                {
                    var parser = new ExpressionParser(context.Evaluator.GetEvaluationContext(null), false, context.CaseSensitivity);
                    return(parser.Resolve(expression));
                };

                context.SimulationPreparations.ExecuteActionAfterSetup(
                    (simulation) =>
                {
                    if (context.ModelsRegistry is StochasticModelsRegistry stochasticModelsRegistry)
                    {
                        resistorModel = stochasticModelsRegistry.ProvideStochasticModel(name, simulation, model);

                        if (!context.Result.FindObject(resistorModel.Name, out _))
                        {
                            stochasticModelsRegistry.RegisterModelInstance(resistorModel);
                        }
                    }

                    iOff = iswitchModelParameters.OffCurrent;
                    rOff = iswitchModelParameters.OffResistance;
                    iOn  = iswitchModelParameters.OnCurrent;
                    rOn  = iswitchModelParameters.OnResistance;

                    lm            = Math.Log(Math.Sqrt(rOn * rOff));
                    lr            = Math.Log(rOn / rOff);
                    im            = (iOn + iOff) / 2.0;
                    id            = iOn - iOff;
                    resExpression = GetISwitchExpression(iOff, rOff, iOn, rOn, ic, lm, lr, im, id);
                    resistor.Parameters.Expression  = resExpression;
                    resistor.Parameters.ParseAction = (expression) =>
                    {
                        var parser = new ExpressionParser(context.Evaluator.GetEvaluationContext(simulation), false, context.CaseSensitivity);
                        return(parser.Resolve(expression));
                    };
                });
                return(resistor);
            }

            CurrentSwitch csw = new CurrentSwitch(name);

            context.CreateNodes(csw, parameters);

            // Get the controlling voltage source
            if (parameters[2] is WordParameter || parameters[2] is IdentifierParameter)
            {
                csw.ControllingSource = context.NameGenerator.GenerateObjectName(parameters.Get(2).Image);
            }
            else
            {
                context.Result.Validation.Add(new ValidationEntry(ValidationEntrySource.Reader, ValidationEntryLevel.Warning, "Voltage source name expected", parameters.LineInfo));
                return(null);
            }

            // Get the model
            context.SimulationPreparations.ExecuteActionBeforeSetup((simulation) =>
            {
                context.ModelsRegistry.SetModel(
                    csw,
                    simulation,
                    parameters.Get(3),
                    $"Could not find model {parameters.Get(3)} for current switch {name}",
                    (Context.Models.Model switchModel) => csw.Model = switchModel.Name,
                    context.Result);
            });

            // Optional on or off
            if (parameters.Count > 4)
            {
                switch (parameters.Get(4).Image.ToLower())
                {
                case "on":
                    csw.SetParameter("on", true);
                    break;

                case "off":
                    csw.SetParameter("off", true);
                    break;

                default:
                    context.Result.Validation.Add(new ValidationEntry(ValidationEntrySource.Reader, ValidationEntryLevel.Warning, "ON or OFF expected", parameters.LineInfo));
                    return(csw);
                }
            }

            return(csw);
        }
        /// <summary>
        /// Generates a current switch.
        /// </summary>
        /// <param name="name">Name of current switch.</param>
        /// <param name="parameters">Parameters of current switch.</param>
        /// <param name="context">Reading context.</param>
        /// <returns>
        /// A new instance of current switch.
        /// </returns>
        protected SpiceSharp.Components.Component GenerateCurrentSwitch(string name, ParameterCollection parameters, ICircuitContext context)
        {
            if (parameters.Count < 4)
            {
                context.Result.Validation.Add(new ValidationEntry(ValidationEntrySource.Reader, ValidationEntryLevel.Warning, "Wrong parameter count for current switch", parameters.LineInfo));
                return(null);
            }

            string modelName = parameters.Get(3).Image;

            if (context.ModelsRegistry.FindModel <Model>(modelName) is ISwitchModel s)
            {
                Resistor resistor      = new Resistor(name);
                Model    resistorModel = s;
                context.CreateNodes(resistor, parameters.Take(2));
                context.SimulationPreparations.ExecuteTemperatureBehaviorBeforeLoad(resistor);

                context.SimulationPreparations.ExecuteActionBeforeSetup(
                    (simulation) =>
                {
                    if (context.ModelsRegistry is StochasticModelsRegistry stochasticModelsRegistry)
                    {
                        resistorModel = stochasticModelsRegistry.ProvideStochasticModel(name, simulation, s);

                        if (!context.Result.FindObject(resistorModel.Name, out _))
                        {
                            stochasticModelsRegistry.RegisterModelInstance(resistorModel);
                            context.Result.Circuit.Add(resistorModel);
                        }
                    }

                    double rOff = resistorModel.ParameterSets.GetParameter <double>("roff");

                    string resExpression = $"pos(table(i({parameters.Get(2)}), @{resistorModel.Name}[ioff], @{resistorModel.Name}[roff] , @{resistorModel.Name}[ion], @{resistorModel.Name}[ron]), {rOff.ToString(CultureInfo.InvariantCulture)})";
                    context.SetParameter(resistor, "resistance", resExpression, beforeTemperature: true, onload: true);
                });
                return(resistor);
            }
            else
            {
                CurrentSwitch csw = new CurrentSwitch(name);
                context.CreateNodes(csw, parameters);

                // Get the controlling voltage source
                if (parameters[2] is WordParameter || parameters[2] is IdentifierParameter)
                {
                    csw.ControllingName = context.NameGenerator.GenerateObjectName(parameters.Get(2).Image);
                }
                else
                {
                    context.Result.Validation.Add(new ValidationEntry(ValidationEntrySource.Reader, ValidationEntryLevel.Warning, "Voltage source name expected", parameters.LineInfo));
                    return(null);
                }

                // Get the model
                context.SimulationPreparations.ExecuteActionBeforeSetup((simulation) =>
                {
                    context.ModelsRegistry.SetModel(
                        csw,
                        simulation,
                        parameters.Get(3),
                        $"Could not find model {parameters.Get(3)} for current switch {name}",
                        (CurrentSwitchModel model) => csw.Model = model.Name,
                        context.Result);
                });

                // Optional on or off
                if (parameters.Count > 4)
                {
                    switch (parameters.Get(4).Image.ToLower())
                    {
                    case "on":
                        csw.ParameterSets.SetParameter("on");
                        break;

                    case "off":
                        csw.ParameterSets.SetParameter("off");
                        break;

                    default:
                        context.Result.Validation.Add(new ValidationEntry(ValidationEntrySource.Reader, ValidationEntryLevel.Warning, "ON or OFF expected", parameters.LineInfo));
                        return(csw);
                    }
                }

                return(csw);
            }
        }