public void NodeNamesSubcircuitPositive() { var parser = new SpiceParser(); parser.Settings.Lexing.HasTitle = true; parser.Settings.Parsing.IsEndRequired = true; parser.Settings.Reading.CaseSensitivity.IsNodeNameCaseSensitive = false; var text = string.Join( Environment.NewLine, "CaseSensitivity - SUBCKT", "V1 IN 0 4.0", "X1 IN Out twoResistorsInSeries R1=1 R2=2", "RX OUT 0 1", ".SUBCKT twoResistorsInSeries Input oUtput params: R1=10 R2=100", "R1 input 1 {R1}", "R2 1 output {R2}", ".ENDS twoResistorsInSeries", ".OP", ".SAVE V(OUT)", ".END"); var parseResult = parser.ParseNetlist(text); double export = RunOpSimulation(parseResult.SpiceModel, "V(OUT)"); // Get references double[] references = { 1.0 }; EqualsWithTol(new double[] { export }, references); }
public void EntityParameterPositive3() { var parser = new SpiceParser(); parser.Settings.Lexing.HasTitle = true; parser.Settings.Parsing.IsEndRequired = true; var text = string.Join( Environment.NewLine, "CaseSensitivity - Diode circuit", "D1 OUT 0 1N914", "V1 OUT 0 0", ".model 1N914 D(iS=2.52e-9 RS=0.568 N=1.752 cJO=4e-12 m=0.4 TT=20e-9)", ".DC V1 -1 1 10e-3", ".SAVE @V1[I]", ".END"); var parseResult = parser.ParseNetlist(text); var export = RunDCSimulation(parseResult.SpiceModel, "@V1[I]"); // Get reference double[] references = { 2.520684772022719e-09, 2.520665232097485e-09, 2.520645248083042e-09, 2.520624819979389e-09, 2.520603725741921e-09, 2.520582409459848e-09, 2.520560649088566e-09, 2.520538000538863e-09, 2.520515129944556e-09, 2.520491593216434e-09, 2.520467612399102e-09, 2.520442965447955e-09, 2.520417652362994e-09, 2.520391229055008e-09, 2.520364583702417e-09, 2.520336828126801e-09, 2.520307962328161e-09, 2.520278874484916e-09, 2.520248454374041e-09, 2.520216701995537e-09, 2.520184505527823e-09, 2.520150754747874e-09, 2.520115449655691e-09, 2.520079700474298e-09, 2.520041952891461e-09, 2.520002650996389e-09, 2.519962460922898e-09, 2.519919828358752e-09, 2.519875419437767e-09, 2.519829456204548e-09, 2.519781050480674e-09, 2.519730646355356e-09, 2.519677799739384e-09, 2.519621844498943e-09, 2.519563668812452e-09, 2.519502162456888e-09, 2.519437547476855e-09, 2.519369379783143e-09, 2.519297437331147e-09, 2.519221276031658e-09, 2.519140673840070e-09, 2.519055408711779e-09, 2.518964592468365e-09, 2.518868003065222e-09, 2.518765085390839e-09, 2.518655506378309e-09, 2.518538155804606e-09, 2.518412922647428e-09, 2.518278474639146e-09, 2.518133923601340e-09, 2.517978381355590e-09, 2.517810848701174e-09, 2.517629882348160e-09, 2.517434039006616e-09, 2.517221764364308e-09, 2.516991060019791e-09, 2.516739705527016e-09, 2.516465702484538e-09, 2.516165609200982e-09, 2.515836872163391e-09, 2.515475161501968e-09, 2.515076480413825e-09, 2.514635832895351e-09, 2.514147445786818e-09, 2.513604324683172e-09, 2.512998475978634e-09, 2.512320573799798e-09, 2.511559182849510e-09, 2.510700980451475e-09, 2.509729757349533e-09, 2.508625973618450e-09, 2.507366425597013e-09, 2.505921525841615e-09, 2.504256357838130e-09, 2.502326790221332e-09, 2.500077533884593e-09, 2.497439421933478e-09, 2.494324247148683e-09, 2.490618655759391e-09, 2.486175321170236e-09, 2.480800564974572e-09, 2.474236482363779e-09, 2.466134130241215e-09, 2.456014613905211e-09, 2.443208080293857e-09, 2.426758793916406e-09, 2.405272869765440e-09, 2.377086694149710e-09, 2.341755483969976e-09, 2.297702500486665e-09, 2.242774105321033e-09, 2.174284835509965e-09, 2.088886258411193e-09, 1.982402894618041e-09, 1.849628367134315e-09, 1.684070757845824e-09, 1.477634958835239e-09, 1.220227058285062e-09, 8.992606936875092e-10, 4.990415580774510e-10, -4.208324063460023e-23, -6.222658915921997e-10, -1.398183520351370e-09, -2.365693620165477e-09, -3.572105541915782e-09, -5.076410555804323e-09, -6.952166481388744e-09, -9.291094477115180e-09, -1.220756418174318e-08, -1.584418615752092e-08, -2.037878504834723e-08, -2.603309548487864e-08, -3.308360396747645e-08, -4.187506874586688e-08, -5.283737797290300e-08, -6.650657008444583e-08, -8.355104497148602e-08, -1.048042475026989e-07, -1.313054202034536e-07, -1.643504193848955e-07, -2.055550786805860e-07, -2.569342167357824e-07, -3.210001533471285e-07, -4.008855497006358e-07, -5.004965768495850e-07, -6.247039000539800e-07, -7.795808144028804e-07, -9.727001679671332e-07, -1.213504582209257e-06, -1.513768057126441e-06, -1.888171507258285e-06, -2.355020333966173e-06, -2.937139061076621e-06, -3.662986687191783e-06, -4.568047149322574e-06, -5.696562662471649e-06, -7.103694343424394e-06, -8.858215224893939e-06, -1.104586649613992e-05, -1.377353976839135e-05, -1.717448782878606e-05, -2.141481549700064e-05, -2.670156304629412e-05, -3.329276978536466e-05, -4.150999799246158e-05, -5.175391113643180e-05, -6.452363948283857e-05, -8.044083562419591e-05, -1.002795274224200e-04, -1.250031216609715e-04, -1.558102032684916e-04, -1.941911156088105e-04, -2.419976971548277e-04, -3.015289829039203e-04, -3.756361388815854e-04, -4.678503519079946e-04, -5.825377853404534e-04, -7.250859365310891e-04, -9.021256392514054e-04, -1.121792314356274e-03, -1.394028558000970e-03, -1.730927332259435e-03, -2.147110349238757e-03, -2.660129130047428e-03, -3.290866177790397e-03, -4.063900589218683e-03, -5.007786885759424e-03, -6.155179858715831e-03, -7.542725667060601e-03, -9.210636215301937e-03, -1.120187715360643e-02, -1.356093587232876e-02, -1.633219609264214e-02, -1.955802291413677e-02, -2.327673904312388e-02, -2.752072521737903e-02, -3.231488373640667e-02, -3.767565498752745e-02, -4.361068391378264e-02, -5.011912351695047e-02, -5.719246701131020e-02, -6.481574162201031e-02, -7.296888192813844e-02, -8.162812138207687e-02, -9.076728201979800e-02, -1.003588891563969e-01, -1.103750792457605e-01, -1.207882998568939e-01, -1.315718201008491e-01, -1.427000796200868e-01, -1.541489071231517e-01, -1.658956380366401e-01, -1.779191572005734e-01, -1.901998880621483e-01, -2.027197453741645e-01, -2.154620644191900e-01, -2.284115164341036e-01, -2.415540172223232e-01, -2.548766338536659e-01, -2.683674927728656e-01, -2.820156914701786e-01 }; EqualsWithTol(export, references); }
public void LetNamePositive() { var parser = new SpiceParser(); parser.Settings.Lexing.HasTitle = true; parser.Settings.Parsing.IsEndRequired = true; parser.Settings.Reading.CaseSensitivity.IsExpressionNameCaseSensitive = false; var text = string.Join( Environment.NewLine, "CaseSensitivity - Diode circuit", "D1 OUT 0 default", "V1 OUT 0 {parameter}", ".model default D", ".OP", ".PARAM parameter = 1", ".LET A {i(V1)}", ".SAVE A", ".END"); var parseResult = parser.ParseNetlist(text); var export = RunOpSimulation(parseResult.SpiceModel, "A"); EqualsWithTol(-618.507827392572, export); }
public static SpiceNetlist ParseNetlistToModel(bool isEndRequired, bool hasTitle, string text) { var parser = new SpiceParser(); parser.Settings.Lexing.HasTitle = hasTitle; parser.Settings.Parsing.IsEndRequired = isEndRequired; return(parser.ParseNetlist(text).PreprocessedInputModel); }
public static ISpiceModel <Circuit, Simulation> ParseNetlist(params string[] lines) { var text = string.Join(Environment.NewLine, lines); var parser = new SpiceParser(); parser.Settings.Lexing.HasTitle = true; parser.Settings.Parsing.IsEndRequired = true; return(parser.ParseNetlist(text).SpiceModel); }
public static SpiceNetlist ParseNetlistToModel(bool isEndRequired, bool hasTitle, params string[] lines) { var text = string.Join(Environment.NewLine, lines); var parser = new SpiceParser(); parser.Settings.Lexing.HasTitle = hasTitle; parser.Settings.Parsing.IsEndRequired = isEndRequired; return(parser.ParseNetlist(text).PreprocessedInputModel); }
public static SpiceParserResult ParseNetlistRaw(bool enableBusSyntax = false, params string[] lines) { var text = string.Join(Environment.NewLine, lines); var parser = new SpiceParser(); parser.Settings.Lexing.HasTitle = true; parser.Settings.Lexing.EnableBusSyntax = enableBusSyntax; parser.Settings.Parsing.IsEndRequired = true; return(parser.ParseNetlist(text)); }
public static ISpiceModel <Circuit, Simulation> ParseNetlistInWorkingDirectory(string workingDirectory, params string[] lines) { var text = string.Join(Environment.NewLine, lines); var parser = new SpiceParser(); parser.Settings.Lexing.HasTitle = true; parser.Settings.Parsing.IsEndRequired = true; parser.Settings.WorkingDirectory = workingDirectory; var parserResult = parser.ParseNetlist(text); return(parserResult.SpiceModel); }
public void DotStatementsNoException() { var parser = new SpiceParser(); parser.Settings.Lexing.HasTitle = true; parser.Settings.Lexing.IsDotStatementNameCaseSensitive = false; parser.Settings.Parsing.IsEndRequired = true; var text = string.Join( Environment.NewLine, "CaseSensitivity", ".End"); parser.ParseNetlist(text); }
public static SpiceSharpParser.ModelReaders.Netlist.Spice.SpiceNetlistReaderResult GetSpiceSharpNetlist(string netlist, SpiceExpressionMode evaluatorMode, int?randomSeed, bool hasTitle) { var parser = new SpiceParser(); parser.Settings.Lexing.HasTitle = hasTitle; parser.Settings.Parsing.IsNewlineRequired = false; parser.Settings.Parsing.IsEndRequired = false; parser.Settings.Reading.Seed = randomSeed; parser.Settings.Reading.EvaluatorMode = evaluatorMode; parser.Settings.WorkingDirectory = Environment.CurrentDirectory; var parserResult = parser.ParseNetlist(netlist); return(parserResult.SpiceSharpModel); }
public void NoEndingException() { var text = string.Join(Environment.NewLine, "End test circuit", "* test1", "R1 OUT 0 10 ; test2", "V1 OUT 0 0 $ test3 ; test4 $ test5\n"); var parser = new SpiceParser(); parser.Settings.Lexing.HasTitle = true; parser.Settings.Parsing.IsEndRequired = true; var result = parser.ParseNetlist(text); Assert.True(result.ValidationResult.Parsing.HasError); }
public void DotStatementsException() { var parser = new SpiceParser(); parser.Settings.Lexing.HasTitle = true; parser.Settings.Lexing.IsDotStatementNameCaseSensitive = true; parser.Settings.Parsing.IsEndRequired = true; var text = string.Join( Environment.NewLine, "CaseSensitivity", ".End"); var result = parser.ParseNetlist(text); Assert.True(result.ValidationResult.Parsing.HasError); }
private static void EvaluateSpiceSharpBehavioral(string expression, int count) { Console.WriteLine("---------- Spice# Behavioral ----------"); var sw = new Stopwatch(); // Setup var parser = new SpiceParser(); parser.RegisterDefaults(); var evctxt = new ExpressionEvaluationContext(); // We don't want to test this speed in the benchmark, so let's replicate it. var dict = evctxt.ExpressionContext.Parameters; double X() => dict["x"].CurrentValue; parser.RegisterVariable("x", X); evctxt.ExpressionContext.Parameters.Add("x", new ConstantExpression(2.0)); // Func<double> e = null; System.Linq.Expressions.Expression e = null; for (var i = 0; i < 5; i++) { sw.Restart(); e = parser.Parse(expression, null); sw.Stop(); Console.WriteLine($"Parsing (run {i + 1}): {sw.ElapsedTicks} ({sw.ElapsedMilliseconds} ms)"); } // Compile sw.Restart(); var f = System.Linq.Expressions.Expression.Lambda <Func <double> >(e).Compile(); sw.Stop(); Console.WriteLine($"Compilation: {sw.ElapsedTicks} ({sw.ElapsedMilliseconds} ms)"); // Evaluate a first time dict["x"] = new ConstantExpression(1.0); Console.WriteLine($"Evaluation: {f()}"); sw.Restart(); for (var i = 0; i < count; i++) { f(); } sw.Stop(); Console.WriteLine($"Execution: {sw.ElapsedTicks} ({sw.ElapsedMilliseconds} ms)"); Console.WriteLine(); }
public void When_Simulated_Expect_NoExceptions() { string path = Path.Combine(Directory.GetCurrentDirectory(), "Resources/example01.cir"); var netlistContent = File.ReadAllText(path); var parser = new SpiceParser(); parser.Settings.Lexing.HasTitle = true; var parseResult = parser.ParseNetlist(netlistContent); double[] exports = RunOpSimulation(parseResult.SpiceModel, new[] { "V(N1)", "V(N2)", "V(N3)" }); EqualsWithTol(1.0970919064909939, exports[0]); EqualsWithTol(0.014696545624995935, exports[1]); EqualsWithTol(0.014715219080886419, exports[2]); }
public void When_DistributionNameSensitive_Positive_Expect_NoException() { var parser = new SpiceParser(); parser.Settings.Reading.CaseSensitivity.IsDistributionNameCaseSensitive = true; var text = string.Join(Environment.NewLine, "Dev - Diode circuit", "D1 OUT 0 1N914", "V1 OUT 0 0", ".model 1N914 D(Is=2.52e-9 DEV/unifoRm1 10% Rs=0.568 N=1.752 Cjo=4e-12 M=0.4 tt=20e-9)", ".DC V1 -1 1 0.1", ".SAVE i(V1)", ".DISTRIBUTION unifoRm1 (-1,1) (1, 1)", ".END"); var parseResult = parser.ParseNetlist(text); parseResult.SpiceModel.Simulations[0].Run(parseResult.SpiceModel.Circuit); }
public void BuiltInFunctionNamePositive() { var parser = new SpiceParser(); parser.Settings.Lexing.HasTitle = true; parser.Settings.Parsing.IsEndRequired = true; parser.Settings.Reading.CaseSensitivity.IsFunctionNameCaseSensitive = false; var text = string.Join( Environment.NewLine, "CaseSensitivity", "R1 0 1 {Cos(1)}", "V1 0 1 10", ".OP", ".End"); var parseResult = parser.ParseNetlist(text); parseResult.SpiceModel.Simulations[0].Run(parseResult.SpiceModel.Circuit); }
public void SubcircuitWithWrongEnding() { var text = string.Join(Environment.NewLine, "Subcircuit - ComplexContainedSubcircuitWithParams", "V1 IN 0 4.0", "X1 IN OUT resistor", "RX OUT 0 1", ".SUBCKT resistor input output params: R=1", "R1 input output {R}", ".ENDS resistor2", ".OP", ".SAVE V(OUT)", ".END"); var parser = new SpiceParser(); parser.Settings.Lexing.HasTitle = true; parser.Settings.Parsing.IsEndRequired = true; var result = parser.ParseNetlist(text); Assert.True(result.ValidationResult.Parsing.HasError); }
public void EntityParameterException() { var parser = new SpiceParser(); parser.Settings.Lexing.HasTitle = true; parser.Settings.Parsing.IsEndRequired = true; parser.Settings.Reading.CaseSensitivity.IsEntityParameterNameCaseSensitive = true; var text = string.Join( Environment.NewLine, "CaseSensitivity - Diode circuit", "D1 OUT 0 1N914", "V1 OUT 0 0", ".model 1N914 D(Is=2.52e-9 Rs=0.568 N=1.752 Cjo=4e-12 M=0.4 tt=20e-9)", ".DC V1 -1 1 10e-3", ".SAVE i(V1)", ".END"); var result = parser.ParseNetlist(text); Assert.True(result.ValidationResult.Reading.HasWarning); }
public void ComponentNamesException() { var parser = new SpiceParser(); parser.Settings.Lexing.HasTitle = true; parser.Settings.Parsing.IsEndRequired = true; parser.Settings.Reading.CaseSensitivity.IsEntityNamesCaseSensitive = true; var text = string.Join( Environment.NewLine, "CaseSensitivity", "R1 0 OUT 1", "V1 0 OUT 10", ".SAVE I(r1)", ".OP", ".END"); var parseResult = parser.ParseNetlist(text); Assert.Throws <SpiceSharp.BehaviorsNotFoundException>(() => RunOpSimulation(parseResult.SpiceModel, "I(r1)")); }
public void NodeNamesNegative() { var parser = new SpiceParser(); parser.Settings.Lexing.HasTitle = true; parser.Settings.Parsing.IsEndRequired = true; parser.Settings.Reading.CaseSensitivity.IsNodeNameCaseSensitive = true; var text = string.Join( Environment.NewLine, "CaseSensitivity", "R1 0 out {cos(0)}", "V1 0 OUT 10", ".SAVE V(Out)", ".OP", ".END"); var parseResult = parser.ParseNetlist(text); Assert.Throws <SpiceSharpParserException>(() => RunOpSimulation(parseResult.SpiceModel, "V(Out)")); }
public void EntityParameterException3() { var parser = new SpiceParser(); parser.Settings.Lexing.HasTitle = true; parser.Settings.Parsing.IsEndRequired = true; parser.Settings.Reading.CaseSensitivity.IsEntityParameterNameCaseSensitive = true; var text = string.Join( Environment.NewLine, "CaseSensitivity - Diode circuit", "D1 OUT 0 1N914", "V1 OUT 0 0", ".model 1N914 D(is=2.52e-9 rs=0.568 n=1.752 cjo=4e-12 m=0.4 tt=20e-9)", ".DC V1 -1 1 10e-3", ".SAVE @V1[I]", ".END"); var parseResult = parser.ParseNetlist(text); Assert.Throws <SpiceSharpParserException>(() => RunDCSimulation(parseResult.SpiceModel, "@V1[I]")); }
public void ComponentNamesPositive() { var parser = new SpiceParser(); parser.Settings.Lexing.HasTitle = true; parser.Settings.Parsing.IsEndRequired = true; parser.Settings.Reading.CaseSensitivity.IsEntityNamesCaseSensitive = false; var text = string.Join( Environment.NewLine, "CaseSensitivity", "R1 0 OUT 1", "V1 0 OUT 10", ".SAVE I(r1)", ".OP", ".END"); var parseResult = parser.ParseNetlist(text); var export = RunOpSimulation(parseResult.SpiceModel, "I(r1)"); Assert.Equal(10, export); }
public void ParamNamesException() { var parser = new SpiceParser(); parser.Settings.Lexing.HasTitle = true; parser.Settings.Parsing.IsEndRequired = true; parser.Settings.Reading.CaseSensitivity.IsParameterNameCaseSensitive = true; var text = string.Join( Environment.NewLine, "CaseSensitivity - Diode circuit", "D1 OUT 0 default", "V1 OUT 0 {PARAMETER}", ".model default D", ".OP", ".PARAM parameter = 1", ".SAVE i(V1)", ".END"); var result = parser.ParseNetlist(text); Assert.True(result.ValidationResult.Reading.HasWarning); }
public void ModelNamesPositive() { var parser = new SpiceParser(); parser.Settings.Lexing.HasTitle = true; parser.Settings.Parsing.IsEndRequired = true; parser.Settings.Reading.CaseSensitivity.IsEntityNamesCaseSensitive = false; var text = string.Join( Environment.NewLine, "CaseSensitivity - Diode circuit", "D1 OUT 0 default", "V1 OUT 0 1", ".model DEFAULT D", ".OP", ".SAVE i(V1)", ".END"); var parseResult = parser.ParseNetlist(text); var export = RunOpSimulation(parseResult.SpiceModel, "i(V1)"); EqualsWithTol(-618.507827392572, export); }