protected void SetSourceParameters( string name, ParameterCollection parameters, ICircuitContext context, Component component) { var originalParameters = parameters; parameters = parameters.Skip(VoltageSource.VoltageSourcePinCount); var acParameter = parameters.FirstOrDefault(p => p.Image.ToLower() == "ac"); if (acParameter != null) { int acParameterIndex = parameters.IndexOf(acParameter); if (acParameterIndex != parameters.Count - 1) { var acParameterValue = parameters.Get(acParameterIndex + 1); context.SetParameter(component, "acmag", acParameterValue); if (acParameterIndex + 1 != parameters.Count - 1) { // Check first if next parameter is waveform var acPhaseCandidate = parameters[acParameterIndex + 2].Image; if (parameters[acParameterIndex + 2] is SingleParameter && !context.WaveformReader.Supports(acPhaseCandidate, context) && acPhaseCandidate.ToLower() != "dc") { var acPhaseParameterValue = parameters.Get(acParameterIndex + 2); context.SetParameter(component, "acphase", acPhaseParameterValue); parameters.RemoveAt(acParameterIndex + 2); } } parameters.RemoveAt(acParameterIndex + 1); } parameters.RemoveAt(acParameterIndex); } // 2. Set DC var dcParameter = parameters.FirstOrDefault(p => p.Image.ToLower() == "dc"); if (dcParameter != null) { int dcParameterIndex = parameters.IndexOf(dcParameter); if (dcParameterIndex != parameters.Count - 1) { var dcParameterValue = parameters.Get(dcParameterIndex + 1); context.SetParameter(component, "dc", dcParameterValue); parameters.RemoveAt(dcParameterIndex + 1); } parameters.RemoveAt(dcParameterIndex); } else { if (parameters.Count > 0 && parameters[0] is SingleParameter sp && !context.WaveformReader.Supports(sp.Image, context) && parameters[0].Image.ToLower() != "value") { context.SetParameter(component, "dc", sp); parameters.RemoveAt(0); } } // 3. Set up waveform if (parameters.Count > 0) { var firstParameter = parameters[0]; if (firstParameter is BracketParameter bp) { if (context.WaveformReader.Supports(bp.Name, context)) { component.SetParameter("waveform", context.WaveformReader.Generate(bp.Name, bp.Parameters, context)); } else { context.Result.Validation.Add(new ValidationEntry(ValidationEntrySource.Reader, ValidationEntryLevel.Warning, $"Unsupported waveform: {bp.Name}", bp.LineInfo)); } } else { if (firstParameter is WordParameter wp && wp.Image.ToLower() != "value") { if (context.WaveformReader.Supports(wp.Image, context)) { component.SetParameter("waveform", context.WaveformReader.Generate(wp.Image, parameters.Skip(1), context)); } else { context.Result.Validation.Add(new ValidationEntry(ValidationEntrySource.Reader, ValidationEntryLevel.Warning, $"Unsupported waveform: {wp}", wp.LineInfo)); } } } if (firstParameter is AssignmentParameter ap && ap.Name.ToLower() == "value") { context.SetParameter(component, "dc", ap.Value); } if (parameters.Count >= 2 && parameters[0].Image.ToLower() == "value" && parameters[1] is SingleParameter) { context.SetParameter(component, "dc", parameters[1].Image); } } context.CreateNodes(component, originalParameters); }
public override IEntity Generate(string componentIdentifier, string originalName, string type, SpiceSharpParser.Models.Netlist.Spice.Objects.ParameterCollection parameters, ICircuitContext context) { // Errors switch (parameters.Count) { case 0: context.Result.Validation.Add( new ValidationEntry( ValidationEntrySource.Reader, ValidationEntryLevel.Error, $"Node expected for component {componentIdentifier}", parameters.LineInfo)); return(null); case 1: case 2: case 3: context.Result.Validation.Add( new ValidationEntry( ValidationEntrySource.Reader, ValidationEntryLevel.Error, $"Node expected", parameters.LineInfo)); return(null); case 4: context.Result.Validation.Add( new ValidationEntry( ValidationEntrySource.Reader, ValidationEntryLevel.Error, $"Model name expected", parameters.LineInfo)); return(null); } // Get the model and generate a component for it SpiceSharp.Components.Component mosfet = null; var modelNameParameter = parameters.Get(4); var model = context.ModelsRegistry.FindModel(modelNameParameter.Image); if (model == null) { context.Result.Validation.Add( new ValidationEntry( ValidationEntrySource.Reader, ValidationEntryLevel.Error, $"Could not find model {modelNameParameter.Image} for mosfet {originalName}", parameters.LineInfo)); return(null); } if (Mosfets.ContainsKey(model.GetType())) { var mosfetDetails = Mosfets[model.GetType()].Invoke(componentIdentifier); mosfet = mosfetDetails.Mosfet; context.SimulationPreparations.ExecuteActionBeforeSetup((simulation) => { context.ModelsRegistry.SetModel( mosfetDetails.Mosfet, simulation, modelNameParameter, $"Could not find model {modelNameParameter.Image} for mosfet {componentIdentifier}", mosfetDetails.SetModelAction, context.Result); }); } else { context.Result.Validation.Add( new ValidationEntry( ValidationEntrySource.Reader, ValidationEntryLevel.Error, $"Invalid model {model.GetType()} for {componentIdentifier}", parameters.LineInfo)); return(null); } // The rest is all just parameters context.CreateNodes(mosfet, parameters); SetParameters(context, mosfet, parameters.Skip(5), true); return(mosfet); }