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);
        }
示例#2
0
        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);
            }
        }
示例#3
0
        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;
                            }
                        }
                    }
                }
            }
        }