public static Tuple <string, double>[] RunOpSimulation(ISpiceModel <Circuit, Simulation> readerResult)
        {
            var simulation = readerResult.Simulations.First(s => s is OP);

            Tuple <string, double>[] result = new Tuple <string, double> [readerResult.Exports.Count];

            simulation.ExportSimulationData += (sender, e) =>
            {
                for (var i = 0; i < readerResult.Exports.Count; i++)
                {
                    var export = readerResult.Exports[i];
                    try
                    {
                        result[i] = new Tuple <string, double>(export.Name, export.Extract());
                    }
                    catch
                    {
                        result[i] = new Tuple <string, double>(export.Name, double.NaN);
                    }
                }
            };

            simulation.Run(readerResult.Circuit);

            return(result);
        }
 /// <summary>
 /// Runs simulations from collection.
 /// </summary>
 /// <param name="readerResult">A reader result</param>
 /// <returns>
 /// A list of exports list
 /// </returns>
 public static void RunSimulations(ISpiceModel <Circuit, Simulation> readerResult)
 {
     foreach (var simulation in readerResult.Simulations)
     {
         simulation.Run(readerResult.Circuit);
     }
 }
Esempio n. 3
0
        /// <summary>
        /// Parses the netlist.
        /// </summary>
        /// <param name="spiceNetlist">Netlist to parse.</param>
        /// <returns>
        /// A parsing result.
        /// </returns>
        public SpiceParserResult ParseNetlist(string spiceNetlist)
        {
            if (spiceNetlist == null)
            {
                throw new ArgumentNullException(nameof(spiceNetlist));
            }

            var result = new SpiceParserResult {
                ValidationResult = new SpiceParserValidationResult()
            };

            // Get tokens
            try
            {
                var tokens = TokenProviderPool.GetSpiceTokenProvider(Settings.Lexing).GetTokens(spiceNetlist);

                SpiceNetlist originalNetlistModel = SingleNetlistParser.Parse(tokens);

                // Preprocessing
                var preprocessedNetListModel = GetPreprocessedNetListModel(originalNetlistModel, result.ValidationResult);

                // Reading model
                var reader = new SpiceNetlistReader(Settings.Reading);
                ISpiceModel <Circuit, Simulation> spiceModel = reader.Read(preprocessedNetListModel);

                result.OriginalInputModel     = originalNetlistModel;
                result.PreprocessedInputModel = preprocessedNetListModel;
                result.SpiceModel             = spiceModel;

                result.ValidationResult.Reading.AddRange(result.SpiceModel.ValidationResult);
            }
            catch (LexerException e)
            {
                result.ValidationResult.Lexing.Add(
                    new ValidationEntry(
                        ValidationEntrySource.Lexer,
                        ValidationEntryLevel.Error,
                        e.ToString(),
                        null));
            }
            catch (ParseException e)
            {
                result.ValidationResult.Parsing.Add(
                    new ValidationEntry(
                        ValidationEntrySource.Parser,
                        ValidationEntryLevel.Error,
                        e.ToString(),
                        null));
            }

            return(result);
        }
        public static double RunOpSimulation(ISpiceModel <Circuit, Simulation> readerResult, string nameOfExport)
        {
            double result     = double.NaN;
            var    export     = readerResult.Exports.Find(e => e.Name == nameOfExport);
            var    simulation = readerResult.Simulations.Single();

            simulation.ExportSimulationData += (sender, e) =>
            {
                result = export.Extract();
            };

            simulation.Run(readerResult.Circuit);

            return(result);
        }
        public static Tuple <double, double>[] RunDCSimulation(ISpiceModel <Circuit, Simulation> readerResult, string nameOfExport)
        {
            var list = new List <Tuple <double, double> >();

            var export     = readerResult.Exports.Find(e => e.Name == nameOfExport && e.Simulation is DC);
            var simulation = readerResult.Simulations.First(s => s is DC);

            simulation.ExportSimulationData += (sender, e) =>
            {
                list.Add(new Tuple <double, double>(e.SweepValue, export.Extract()));
            };

            simulation.Run(readerResult.Circuit);

            return(list.ToArray());
        }
        /// <summary>
        /// Runs simulations from collection.
        /// </summary>
        /// <param name="readerResult">A reader result</param>
        /// <returns>
        /// A list of exports list
        /// </returns>
        public static List <object> RunSimulationsAndReturnExports(ISpiceModel <Circuit, Simulation> readerResult)
        {
            var result = new List <object>();

            foreach (var export in readerResult.Exports)
            {
                var simulation = export.Simulation;
                if (simulation is DC)
                {
                    var dcResult = new List <double>();
                    result.Add(dcResult);
                    simulation.ExportSimulationData += (sender, e) =>
                    {
                        dcResult.Add(export.Extract());
                    };
                }

                if (simulation is OP)
                {
                    simulation.ExportSimulationData += (sender, e) =>
                    {
                        var opResult = export.Extract();
                        result.Add(opResult);
                    };
                }

                if (simulation is Transient)
                {
                    var tranResult = new List <Tuple <double, double> >();
                    result.Add(tranResult);
                    simulation.ExportSimulationData += (sender, e) =>
                    {
                        tranResult.Add(new Tuple <double, double>(e.Time, export.Extract()));
                    };
                }
            }

            foreach (var simulation in readerResult.Simulations)
            {
                simulation.Run(readerResult.Circuit);
            }

            return(result);
        }
        public static double[] RunOpSimulation(ISpiceModel <Circuit, Simulation> readerResult, params string[] nameOfExport)
        {
            var simulation = readerResult.Simulations.Single();

            double[] result = new double[nameOfExport.Length];

            simulation.ExportSimulationData += (sender, e) =>
            {
                for (var i = 0; i < nameOfExport.Length; i++)
                {
                    var export = readerResult.Exports.Find(exp => exp.Name == nameOfExport[i]);
                    result[i] = export.Extract();
                }
            };

            simulation.Run(readerResult.Circuit);

            return(result);
        }
        public void OptionsSeedOverridesParsingSeed()
        {
            ISpiceModel <Circuit, Simulation> parseResult2223 = null;
            ISpiceModel <Circuit, Simulation> parseResult2224 = null;

            var resultsSeed2223 = new List <double>();
            var resultsSeed2224 = new List <double>();

            int n = 5;

            for (var i = 0; i < n; i++)
            {
                parseResult2223 = ParseNetlist(
                    1111,
                    "Random - Seed test circuit",
                    "V1 0 1 100",
                    "R1 1 0 {R+N}",
                    ".OP",
                    ".SAVE i(R1) @R1[resistance]",
                    ".PARAM N=0",
                    ".PARAM R={random() * 1000}",
                    ".STEP PARAM N LIST 2 3",
                    ".OPTIONS SEED = 2223",
                    ".END");

                var exports = RunSimulationsAndReturnExports(parseResult2223);
                resultsSeed2223.Add((double)exports[0]);
            }

            for (var i = 0; i < n; i++)
            {
                parseResult2224 = ParseNetlist(
                    1111,
                    "Random - Seed test circuit",
                    "V1 0 1 100",
                    "R1 1 0 {R+N}",
                    ".OP",
                    ".SAVE i(R1) @R1[resistance]",
                    ".PARAM N=0",
                    ".PARAM R={random() * 1000}",
                    ".STEP PARAM N LIST 2 3",
                    ".OPTIONS SEED = 2224",
                    ".END");

                var exports = RunSimulationsAndReturnExports(parseResult2224);
                resultsSeed2224.Add((double)exports[0]);
            }

            for (var i = 0; i < n; i++)
            {
                Assert.Equal(resultsSeed2223[0], resultsSeed2223[i]);
            }

            for (var i = 0; i < n; i++)
            {
                Assert.Equal(resultsSeed2224[0], resultsSeed2224[i]);
            }

            Assert.NotEqual(resultsSeed2224[0], resultsSeed2223[0]);

            Assert.Equal(2223, parseResult2223?.Seed);
            Assert.Equal(2224, parseResult2224?.Seed);
        }