Exemple #1
0
 /// <summary>
 /// Initializes a new instance of the <see cref="CircuitContext"/> class.
 /// </summary>
 /// <param name="contextName">Name of the context.</param>
 /// <param name="parent">Parent of the context.</param>
 /// <param name="evaluator">Circuit evaluator.</param>
 /// <param name="simulationPreparations">Simulation preparations.</param>
 /// <param name="resultService">SpiceModel service for the context.</param>
 /// <param name="nameGenerator">Name generator for the models.</param>
 /// <param name="statementsReader">Statements reader.</param>
 /// <param name="waveformReader">Waveform reader.</param>
 /// <param name="caseSettings">Case settings.</param>
 /// <param name="exporters">Exporters.</param>
 /// <param name="workingDirectory">Working directory.</param>
 /// <param name="instanceData">Instance data.</param>
 public CircuitContext(
     string contextName,
     ICircuitContext parent,
     ICircuitEvaluator evaluator,
     ISimulationPreparations simulationPreparations,
     IResultService resultService,
     INameGenerator nameGenerator,
     ISpiceStatementsReader statementsReader,
     IWaveformReader waveformReader,
     ISpiceNetlistCaseSensitivitySettings caseSettings,
     IMapper <Exporter> exporters,
     string workingDirectory)
 {
     Name      = contextName ?? throw new ArgumentNullException(nameof(contextName));
     Evaluator = evaluator;
     SimulationPreparations = simulationPreparations;
     Result               = resultService ?? throw new ArgumentNullException(nameof(resultService));
     NameGenerator        = nameGenerator ?? throw new ArgumentNullException(nameof(nameGenerator));
     Parent               = parent;
     Children             = new List <ICircuitContext>();
     CaseSensitivity      = caseSettings;
     StatementsReader     = statementsReader;
     WaveformReader       = waveformReader;
     AvailableSubcircuits = CreateAvailableSubcircuitsCollection();
     ModelsRegistry       = CreateModelsRegistry();
     Exporters            = exporters;
     WorkingDirectory     = workingDirectory;
 }
Exemple #2
0
 public EvaluationContext(
     string name,
     ISpiceNetlistCaseSensitivitySettings caseSettings,
     IRandomizer randomizer,
     IExpressionParserFactory expressionParserFactory,
     IExpressionFeaturesReader expressionFeaturesReader,
     IExpressionValueProvider expressionValueProvider,
     INameGenerator nameGenerator,
     IResultService resultService)
 {
     _caseSettings            = caseSettings;
     ExpressionParserFactory  = expressionParserFactory;
     ExpressionFeaturesReader = expressionFeaturesReader;
     ExpressionValueProvider  = expressionValueProvider;
     NameGenerator            = nameGenerator;
     ResultService            = resultService;
     Name               = name;
     Parameters         = new Dictionary <string, Expression>(StringComparerProvider.Get(caseSettings.IsParameterNameCaseSensitive));
     Arguments          = new Dictionary <string, Expression>(StringComparerProvider.Get(caseSettings.IsParameterNameCaseSensitive));
     Functions          = new Dictionary <string, List <IFunction> >(StringComparerProvider.Get(caseSettings.IsFunctionNameCaseSensitive));
     Children           = new List <EvaluationContext>();
     ExpressionRegistry = new ExpressionRegistry(caseSettings.IsParameterNameCaseSensitive, caseSettings.IsExpressionNameCaseSensitive);
     FunctionsBody      = new Dictionary <string, string>();
     FunctionArguments  = new Dictionary <string, List <string> >();
     Randomizer         = randomizer;
 }
Exemple #3
0
        public SpiceEvaluationContext(
            string name,
            SpiceExpressionMode mode,
            ISpiceNetlistCaseSensitivitySettings caseSetting,
            IRandomizer randomizer,
            IExpressionParserFactory expressionParserFactory,
            IExpressionFeaturesReader expressionFeaturesReader,
            IExpressionValueProvider expressionValueProvider,
            INameGenerator nameGenerator,
            IResultService resultService)

            : base(name,
                   caseSetting,
                   randomizer,
                   expressionParserFactory,
                   expressionFeaturesReader,
                   expressionValueProvider,
                   nameGenerator,
                   resultService)
        {
            Mode = mode;
            CreateCommonFunctions();
            CreateSpiceFunctions();
            CreateSpiceParameters();
        }
Exemple #4
0
        public SimpleDerivativeParserExtended(ISpiceNetlistCaseSensitivitySettings caseSensitivitySettings)
        {
            bool isFunctionCaseSensitive = caseSensitivitySettings?.IsFunctionNameCaseSensitive ?? false;

            DefaultFunctions = isFunctionCaseSensitive ? DefaultFunctionsCaseSensitive : DefaultFunctionsCaseInSensitive;
            FunctionFound   += ExpressionParser_FunctionFound;
        }
Exemple #5
0
        public ExpressionParser(EvaluationContext context, bool throwOnErrors, ISpiceNetlistCaseSensitivitySettings caseSettings)
        {
            InternalParser = new Parser();
            DoubleBuilder  = new CustomRealBuilder(context, InternalParser, caseSettings, throwOnErrors);

            Context       = context;
            ThrowOnErrors = throwOnErrors;
            CaseSettings  = caseSettings;
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="SpiceNetlistReaderSettings"/> class.
        /// </summary>
        /// <param name="caseSensitivitySettings">
        /// Case sensitivity settings.
        /// </param>
        /// <param name="workingDirectoryProvider">
        /// Working directory provider.
        /// </param>
        public SpiceNetlistReaderSettings(
            ISpiceNetlistCaseSensitivitySettings caseSensitivitySettings,
            Func <string> workingDirectoryProvider)
        {
            EvaluatorMode = SpiceExpressionMode.Spice3f5;
            Mappings      = new SpiceObjectMappings();
            Orderer       = new SpiceStatementsOrderer();

            CaseSensitivity           = caseSensitivitySettings ?? throw new ArgumentNullException(nameof(caseSensitivitySettings));
            _workingDirectoryProvider = workingDirectoryProvider ?? throw new ArgumentNullException(nameof(workingDirectoryProvider));
        }
Exemple #7
0
        public CustomRealBuilder(EvaluationContext context, Parser parser, ISpiceNetlistCaseSensitivitySettings caseSettings, bool throwOnErrors)
        {
            _caseSettings = caseSettings;

            FunctionFound += OnDefaultFunctionFound;
            FunctionFound += OnCustomFunctionFound;
            VariableFound += OnVariableFound;
            Context        = context;
            Parser         = parser;

            // setup variables
            foreach (var variable in Context.Arguments)
            {
                var variableNode = Parser.Parse(variable.Value.ValueExpression);

                Variables.Add(
                    new CustomVariable <Func <double> >()
                {
                    Name = variable.Key, VariableNode = variableNode, Value = () => this.Build(variableNode)
                });
            }

            foreach (var variable in context.Parameters)
            {
                if (variable.Value is ConstantExpression ce)
                {
                    Variables.Add(new CustomVariable <Func <double> >()
                    {
                        Name = variable.Key, Value = () => ce.Value, Constant = true
                    });
                }
                else
                {
                    var variableNode = Parser.Parse(variable.Value.ValueExpression);
                    Variables.Add(new CustomVariable <Func <double> >()
                    {
                        Name = variable.Key, VariableNode = variableNode, Value = () => Build(variableNode)
                    });
                }
            }

            ThrowOnErrors = throwOnErrors;
        }
Exemple #8
0
 public ExpressionParserFactory(ISpiceNetlistCaseSensitivitySettings caseSettings)
 {
     _caseSettings = caseSettings;
 }
        public override Export CreateExport(
            string name,
            string type,
            ParameterCollection parameters,
            EvaluationContext context,
            ISpiceNetlistCaseSensitivitySettings caseSettings)
        {
            if (parameters.Count != 1 || (!(parameters[0] is VectorParameter) && !(parameters[0] is SingleParameter)))
            {
                throw new SpiceSharpParserException("Voltage exports should have vector or single parameter", parameters.LineInfo);
            }

            // Get the nodes
            string node, reference = null;
            string nodePath = null, referencePath = null;

            if (parameters[0] is VectorParameter vector)
            {
                switch (vector.Elements.Count)
                {
                case 0:
                    throw new SpiceSharpParserException("No nodes for voltage export. Node expected", vector.LineInfo);

                case 2:
                    referencePath = vector.Elements[1].Image;
                    reference     = context.NameGenerator.ParseNodeName(referencePath);
                    nodePath      = vector.Elements[0].Image;
                    node          = context.NameGenerator.ParseNodeName(nodePath);
                    break;

                case 1:
                    nodePath = vector.Elements[0].Image;
                    node     = context.NameGenerator.ParseNodeName(nodePath);
                    break;

                default:
                    throw new SpiceSharpParserException("Too many nodes specified for voltage export", vector.LineInfo);
                }
            }
            else
            {
                nodePath = parameters.Get(0).Image;
                node     = context.NameGenerator.ParseNodeName(nodePath);
            }

            Export ve = null;

            switch (type.ToLower())
            {
            case "v":
                ve = new VoltageExport(name, context.Simulation, node, reference);
                break;

            case "vr":
                ve = new VoltageRealExport(name, context.Simulation, node, reference);
                break;

            case "vi":
                ve = new VoltageImaginaryExport(name, context.Simulation, node, reference);
                break;

            case "vm":
                ve = new VoltageMagnitudeExport(name, context.Simulation, node, reference);
                break;

            case "vdb":
                ve = new VoltageDecibelExport(name, context.Simulation, node, reference);
                break;

            case "vph":
            case "vp":
                ve = new VoltagePhaseExport(name, context.Simulation, node, reference);
                break;
            }

            return(ve);
        }
        /// <summary>
        /// Creates a new current export.
        /// </summary>
        /// <param name="name">Name of export.</param>
        /// <param name="type">A type of export.</param>
        /// <param name="parameters">A parameters of export.</param>
        /// <param name="context">Expression context.</param>
        /// <param name="caseSettings">Case settings.</param>
        /// <returns>
        /// A new export.
        /// </returns>
        public override Export CreateExport(string name, string type, ParameterCollection parameters, EvaluationContext context, ISpiceNetlistCaseSensitivitySettings caseSettings)
        {
            if (name == null)
            {
                throw new ArgumentNullException(nameof(name));
            }

            if (type == null)
            {
                throw new ArgumentNullException(nameof(type));
            }

            if (parameters == null)
            {
                throw new ArgumentNullException(nameof(parameters));
            }

            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }

            var comparer = StringComparerProvider.Get(false);

            var entityName   = (parameters[0] as VectorParameter)?.Elements[0].Image;
            var propertyName = (parameters[0] as VectorParameter)?.Elements[1].Image;

            if (entityName != null && propertyName != null)
            {
                if (entityName.Contains("#"))
                {
                    string objectName = $"{context.NameGenerator.GenerateObjectName(entityName)}_{context.Simulation.Name}";
                    return(new PropertyExport(name, context.Simulation, objectName, propertyName));
                }
                else
                {
                    string objectName = context.NameGenerator.GenerateObjectName(entityName);

                    if (context.ResultService.FindObject(objectName, out _))
                    {
                        return(new PropertyExport(name, context.Simulation, objectName, propertyName));
                    }
                    else
                    {
                        return(new PropertyExport(name, context.Simulation, entityName, propertyName));
                    }
                }
            }

            throw new SpiceSharpParserException("Invalid property export", parameters.LineInfo);
        }
 /// <summary>
 /// Creates a new export.
 /// </summary>
 /// <param name="name">Name of export.</param>
 /// <param name="type">A type of export.</param>
 /// <param name="parameters">A parameters of export.</param>
 /// <param name="context">Expression context.</param>
 /// <param name="caseSettings">Case settings.</param>
 /// <returns>
 /// A new export.
 /// </returns>
 public abstract Export CreateExport(string name, string type, ParameterCollection parameters, EvaluationContext context, ISpiceNetlistCaseSensitivitySettings caseSettings);
Exemple #12
0
        public override Export CreateExport(string name, string type, ParameterCollection parameters, EvaluationContext context, ISpiceNetlistCaseSensitivitySettings caseSettings)
        {
            if (parameters.Count != 1 || (!(parameters[0] is VectorParameter) && !(parameters[0] is SingleParameter)))
            {
                throw new SpiceSharpParserException("Current exports should have a single parameter or vector parameter", parameters.LineInfo);
            }

            // Get the nodes
            string componentIdentifier = null;

            if (parameters[0] is VectorParameter vector)
            {
                switch (vector.Elements.Count)
                {
                case 0:
                    throw new SpiceSharpParserException("Node expected", parameters.LineInfo);

                case 1:
                    componentIdentifier = context.NameGenerator.GenerateObjectName(vector.Elements[0].Image);
                    break;

                default:
                    throw new SpiceSharpParserException("Too many nodes specified", parameters.LineInfo);
                }
            }
            else
            {
                componentIdentifier = context.NameGenerator.GenerateObjectName(parameters.Get(0).Image);
            }

            Export export = null;

            switch (type.ToLower())
            {
            case "i": export = new CurrentExport(name, context.Simulation, componentIdentifier); break;

            case "ir": export = new CurrentRealExport(name, context.Simulation, componentIdentifier); break;

            case "ii": export = new CurrentImaginaryExport(name, context.Simulation, componentIdentifier); break;

            case "im": export = new CurrentMagnitudeExport(name, context.Simulation, componentIdentifier); break;

            case "idb": export = new CurrentDecibelExport(name, context.Simulation, componentIdentifier); break;

            case "ip": export = new CurrentPhaseExport(name, context.Simulation, componentIdentifier); break;
            }

            return(export);
        }