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); }
/// <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); }
/// <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); }
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); }
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); }
/// <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); } }