public bool HaveSpiceProperties(string expression, EvaluationContext context) { var parser = _factory.Create(context, false); var variables = parser.GetVariables(expression); var voltageExportFactory = new VoltageExporter(); var currentExportFactory = new CurrentExporter(); foreach (var variable in variables) { var variableName = variable.ToLower(); if (currentExportFactory.CreatedTypes.Any(type => variableName.StartsWith(type))) { return(true); } if (voltageExportFactory.CreatedTypes.Any(type => variableName.StartsWith(type))) { return(true); } } return(false); }
private void ApplySpiceProperty(EvaluationContext context, SpicePropertyFoundEventArgs <double> arg, bool applyVoltage) { var parameters = GetSpicePropertyParameters(context, arg); var propertyName = arg.Property.Identifier.ToLower(); string key = $"{context.Name}_{propertyName}_{parameters}_{context.Simulation?.Name}"; if (_exporterInstances.TryGetValue(key, out Export cachedExport)) { ApplyExport(arg, cachedExport, applyVoltage); } else { var voltageExportFactory = new VoltageExporter(); var currentExportFactory = new CurrentExporter(); var propertyExporter = new PropertyExporter(); Exporter factory = null; if (currentExportFactory.CreatedTypes.Contains(propertyName)) { factory = currentExportFactory; } if (voltageExportFactory.CreatedTypes.Contains(propertyName)) { factory = voltageExportFactory; } if (propertyName == "@") { factory = propertyExporter; } if (factory == null) { throw new SpiceSharpParserException($"Unknown spice property {propertyName}"); } var export = factory.CreateExport( $"{propertyName}_{parameters}", propertyName, parameters, context, _caseSettings); _exporterInstances[key] = export; ApplyExport(arg, export, applyVoltage); } }
private void OnVariableFound(object sender, SpiceSharpBehavioral.Builders.Direct.VariableFoundEventArgs <double> e) { if (e.Node.NodeType != NodeTypes.Voltage && e.Node.NodeType != NodeTypes.Current && e.Node.NodeType != NodeTypes.Property) { var found = Variables.SingleOrDefault(variable => StringComparerProvider.Get(_caseSettings.IsParameterNameCaseSensitive).Equals(variable.Name, e.Node.Name)); if (found != null) { e.Result = found.Value(); } } else { if (Context.Simulation == null) { e.Result = 0; } else { if (e.Node.NodeType == NodeTypes.Current) { var name = e.Node.Name; var parameters = new ParameterCollection(); var vectorParameter = new VectorParameter(); vectorParameter.Elements.Add(new IdentifierParameter(e.Node.Name.ToString())); parameters.Add(vectorParameter); string key = $"{Context.Name}_I_{parameters}_{Context.Simulation?.Name}"; if (_exporterInstances.TryGetValue(key, out Export cachedExport)) { e.Result = cachedExport.Extract(); } else { var currentExporter = new CurrentExporter(); var export = currentExporter.CreateExport( key, "I", parameters, Context, _caseSettings); _exporterInstances[key] = export; e.Result = export.Extract(); } } else if (e.Node.NodeType == NodeTypes.Voltage) { var name = e.Node.Name; var variable = Variables.FirstOrDefault(v => v.Name == name); if (variable != null) { name = variable.Value().ToString(); } var parameters = new ParameterCollection(); var vectorParameter = new VectorParameter(); vectorParameter.Elements.Add(new IdentifierParameter(name)); parameters.Add(vectorParameter); string key = $"{Context.Name}_V_{parameters}_{Context.Simulation?.Name}"; if (_exporterInstances.TryGetValue(key, out Export cachedExport)) { e.Result = cachedExport.Extract(); } else { var currentExporter = new VoltageExporter(); var export = currentExporter.CreateExport( key, "V", parameters, Context, _caseSettings); _exporterInstances[key] = export; try { e.Result = export.Extract(); } catch (Exception ex) { if (ThrowOnErrors) { throw; } e.Result = 0; } } } } } }