Skip to content

Commit d15eb8b

Browse files
Merge pull request #155 from SpiceSharp/development
Development
2 parents 84e05dd + f3306a1 commit d15eb8b

File tree

11 files changed

+127
-31
lines changed

11 files changed

+127
-31
lines changed

src/SpiceSharpParser.CodeAnalysis/SpiceSharpParser.CodeAnalysis.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,9 @@
2121
</ItemGroup>
2222

2323
<ItemGroup>
24-
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="3.10.0" />
24+
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="3.11.0" />
2525
<PackageReference Include="SpiceSharp" Version="3.1.5" />
26-
<PackageReference Include="SpiceSharpBehavioral" Version="3.1.1" />
26+
<PackageReference Include="SpiceSharpBehavioral" Version="3.1.2" />
2727
<PackageReference Include="StyleCop.Analyzers" Version="1.1.118">
2828
<PrivateAssets>all</PrivateAssets>
2929
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>

src/SpiceSharpParser.IntegrationTests/Common/CaseSensitivityTests.cs

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1+
using SpiceSharpParser.Common;
2+
using SpiceSharpParser.ModelReaders.Netlist.Spice;
13
using System;
4+
using System.IO;
5+
using System.Text;
26
using Xunit;
37

48
namespace SpiceSharpParser.IntegrationTests.Common
@@ -54,6 +58,35 @@ public void FunctionNamePositive()
5458
spiceModel.Simulations[0].Run(spiceModel.Circuit);
5559
}
5660

61+
[Fact]
62+
public void FunctionNamePositiveTest2()
63+
{
64+
var parser = new SpiceNetlistParser();
65+
66+
parser.Settings.Lexing.HasTitle = true;
67+
parser.Settings.Parsing.IsEndRequired = true;
68+
69+
var text = string.Join(
70+
Environment.NewLine,
71+
"CaseSensitivity",
72+
"R1 0 1 1",
73+
"V1 0 1 {PWR(V(2),2)}",
74+
"V2 0 2 10",
75+
".OP",
76+
".End");
77+
78+
var parseResult = parser.ParseNetlist(text);
79+
var reader = new SpiceSharpReader();
80+
reader.Settings.CaseSensitivity.IsFunctionNameCaseSensitive = false;
81+
82+
var spiceModel = reader.Read(parseResult.FinalModel);
83+
84+
Assert.NotNull(parseResult);
85+
Assert.False(parseResult.ValidationResult.HasError);
86+
Assert.False(parseResult.ValidationResult.HasWarning);
87+
spiceModel.Simulations[0].Run(spiceModel.Circuit);
88+
}
89+
5790
[Fact]
5891
public void When_DistributionNameNotSensitive_Expect_NoException()
5992
{
@@ -542,5 +575,52 @@ public void EntityParameterPositive3()
542575

543576
Assert.True(EqualsWithTol(export, references));
544577
}
578+
579+
[Fact]
580+
public void SubcircuitPositive()
581+
{
582+
var text = string.Join(Environment.NewLine, "Subcircuit - Case",
583+
"V1 IN 0 4.0",
584+
"X1 IN OUT resistor",
585+
"RX OUT 0 1",
586+
".SUBCKT RESISTOR input output params: R=1",
587+
"R1 input output {R}",
588+
".ENDS RESISTOR",
589+
".OP",
590+
".SAVE V(OUT)",
591+
".END");
592+
var parser = new SpiceNetlistParser();
593+
var netlist = parser.ParseNetlist(text);
594+
595+
var spiceSharpSettings = new SpiceNetlistReaderSettings(new SpiceNetlistCaseSensitivitySettings() { IsSubcircuitNameCaseSensitive = false }, () => parser.Settings.WorkingDirectory, Encoding.Default);
596+
var spiceSharpReader = new SpiceNetlistReader(spiceSharpSettings);
597+
598+
var model = spiceSharpReader.Read(netlist.FinalModel);
599+
Assert.False(model.ValidationResult.HasError);
600+
}
601+
602+
[Fact]
603+
public void SubcircuitPositive2()
604+
{
605+
var text = string.Join(Environment.NewLine, "Subcircuit - Case",
606+
"V1 IN 0 4.0",
607+
"X1 IN OUT resistor",
608+
"RX OUT 0 1",
609+
".SUBCKT RESISTOR input output params: R=1",
610+
"R1 input output {R}",
611+
".ENDS RESISTOR",
612+
".OP",
613+
".SAVE V(OUT)",
614+
".END");
615+
616+
var parser = new SpiceNetlistParser();
617+
var netlist = parser.ParseNetlist(text);
618+
619+
var spiceSharpSettings = new SpiceNetlistReaderSettings(new SpiceNetlistCaseSensitivitySettings() { IsSubcircuitNameCaseSensitive = true }, () => parser.Settings.WorkingDirectory, Encoding.Default);
620+
var spiceSharpReader = new SpiceNetlistReader(spiceSharpSettings);
621+
622+
var model = spiceSharpReader.Read(netlist.FinalModel);
623+
Assert.True(model.ValidationResult.HasError);
624+
}
545625
}
546626
}

src/SpiceSharpParser.IntegrationTests/SpiceSharpParser.IntegrationTests.csproj

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,14 @@
1616

1717

1818
<ItemGroup>
19-
<PackageReference Include="coverlet.msbuild" Version="3.0.3">
19+
<PackageReference Include="coverlet.msbuild" Version="3.1.0">
2020
<PrivateAssets>all</PrivateAssets>
2121
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
2222
</PackageReference>
23-
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="3.10.0" />
24-
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.10.0" />
23+
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="3.11.0" />
24+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.11.0" />
2525
<PackageReference Include="SpiceSharp" Version="3.1.5" />
26-
<PackageReference Include="SpiceSharpBehavioral" Version="3.1.1" />
26+
<PackageReference Include="SpiceSharpBehavioral" Version="3.1.2" />
2727
<PackageReference Include="xunit" Version="2.4.1" />
2828
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.3">
2929
<PrivateAssets>all</PrivateAssets>

src/SpiceSharpParser.Tests/SpiceSharpParser.Tests.csproj

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,14 @@
1414
</PropertyGroup>
1515

1616
<ItemGroup>
17-
<PackageReference Include="coverlet.msbuild" Version="3.0.3">
17+
<PackageReference Include="coverlet.msbuild" Version="3.1.0">
1818
<PrivateAssets>all</PrivateAssets>
1919
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
2020
</PackageReference>
21-
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.10.0" />
21+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.11.0" />
2222
<PackageReference Include="NSubstitute" Version="4.2.2" />
2323
<PackageReference Include="SpiceSharp" Version="3.1.5" />
24-
<PackageReference Include="SpiceSharpBehavioral" Version="3.1.1" />
24+
<PackageReference Include="SpiceSharpBehavioral" Version="3.1.2" />
2525
<PackageReference Include="StyleCop.Analyzers" Version="1.1.118">
2626
<PrivateAssets>all</PrivateAssets>
2727
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>

src/SpiceSharpParser/Common/SpiceNetlistCaseSensitivitySettings.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,5 +44,10 @@ public class SpiceNetlistCaseSensitivitySettings
4444
/// Gets or sets a value indicating whether expression names are case-sensitive.
4545
/// </summary>
4646
public bool IsExpressionNameCaseSensitive { get; set; } = false;
47+
48+
/// <summary>
49+
/// Gets or sets a value indicating whether subcircuit names are case-sensitive.
50+
/// </summary>
51+
public bool IsSubcircuitNameCaseSensitive { get; set; } = false;
4752
}
4853
}

src/SpiceSharpParser/ModelReaders/Netlist/Spice/Context/IReadingContext.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,9 @@ public interface IReadingContext
4444
ICollection<IReadingContext> Children { get; }
4545

4646
/// <summary>
47-
/// Gets the list of available subcircuit for the context.
47+
/// Gets the dictionary of available subcircuit for the context.
4848
/// </summary>
49-
ICollection<SubCircuit> AvailableSubcircuits { get; }
49+
Dictionary<string, SubCircuit> AvailableSubcircuits { get; }
5050

5151
/// <summary>
5252
/// Gets the list of available subcircuit for the context.

src/SpiceSharpParser/ModelReaders/Netlist/Spice/Context/ReadingContext.cs

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
using System;
22
using System.Collections.Generic;
33
using System.Linq;
4-
using System.Text;
54
using SpiceSharp;
65
using SpiceSharp.Components;
76
using SpiceSharp.Entities;
@@ -17,7 +16,6 @@
1716
using SpiceSharpParser.ModelReaders.Netlist.Spice.Readers.Controls.Simulations.Configurations;
1817
using SpiceSharpParser.Models.Netlist.Spice.Objects;
1918
using SpiceSharpParser.Models.Netlist.Spice.Objects.Parameters;
20-
using SpiceSharpParser.Parsers.Expression;
2119

2220
namespace SpiceSharpParser.ModelReaders.Netlist.Spice.Context
2321
{
@@ -61,9 +59,9 @@ public ReadingContext(
6159
Children = new List<IReadingContext>();
6260
StatementsReader = statementsReader;
6361
WaveformReader = waveformReader;
62+
ReaderSettings = readerSettings;
6463
AvailableSubcircuits = CreateAvailableSubcircuitsCollection();
6564
AvailableSubcircuitDefinitions = CreateAvailableSubcircuitDefinitions();
66-
ReaderSettings = readerSettings;
6765
Exporters = exporters;
6866
ContextEntities = new Circuit(new EntityCollection(StringComparerProvider.Get(readerSettings.CaseSensitivity.IsEntityNamesCaseSensitive)));
6967
SimulationConfiguration = simulationConfiguration;
@@ -108,7 +106,7 @@ public ReadingContext(
108106
/// <summary>
109107
/// Gets available subcircuits in context.
110108
/// </summary>
111-
public ICollection<SubCircuit> AvailableSubcircuits { get; }
109+
public Dictionary<string, SubCircuit> AvailableSubcircuits { get; }
112110

113111
public Dictionary<string, SubcircuitDefinition> AvailableSubcircuitDefinitions { get; }
114112

@@ -389,27 +387,27 @@ public ExpressionResolver CreateExpressionResolver(Simulation simulation)
389387
return parser;
390388
}
391389

392-
protected ICollection<SubCircuit> CreateAvailableSubcircuitsCollection()
390+
protected Dictionary<string, SubCircuit> CreateAvailableSubcircuitsCollection()
393391
{
394392
if (Parent != null)
395393
{
396-
return new List<SubCircuit>(Parent.AvailableSubcircuits);
394+
return new Dictionary<string, SubCircuit>(Parent.AvailableSubcircuits, StringComparerProvider.Get(ReaderSettings.CaseSensitivity.IsSubcircuitNameCaseSensitive));
397395
}
398396
else
399397
{
400-
return new List<SubCircuit>();
398+
return new Dictionary<string, SubCircuit>(StringComparerProvider.Get(ReaderSettings.CaseSensitivity.IsSubcircuitNameCaseSensitive));
401399
}
402400
}
403401

404402
protected Dictionary<string, SubcircuitDefinition> CreateAvailableSubcircuitDefinitions()
405403
{
406404
if (Parent != null)
407405
{
408-
return new Dictionary<string, SubcircuitDefinition>(Parent.AvailableSubcircuitDefinitions);
406+
return new Dictionary<string, SubcircuitDefinition>(Parent.AvailableSubcircuitDefinitions, StringComparerProvider.Get(ReaderSettings.CaseSensitivity.IsSubcircuitNameCaseSensitive));
409407
}
410408
else
411409
{
412-
return new Dictionary<string, SubcircuitDefinition>();
410+
return new Dictionary<string, SubcircuitDefinition>(StringComparerProvider.Get(ReaderSettings.CaseSensitivity.IsSubcircuitNameCaseSensitive));
413411
}
414412
}
415413

src/SpiceSharpParser/ModelReaders/Netlist/Spice/Readers/EntityGenerators/Components/SubCircuitGenerator.cs

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -188,17 +188,20 @@ private SubCircuit FindSubcircuitDefinition(ParameterCollection parameters, IRea
188188
}
189189

190190
string subCircuitDefinitionName = parameters.Get(parameters.Count - skipCount - 1).Value;
191-
var result = context.AvailableSubcircuits.ToList().Find(subCkt => subCkt.Name == subCircuitDefinitionName);
192191

193-
if (result == null)
192+
if (context.AvailableSubcircuits.TryGetValue(subCircuitDefinitionName, out var result))
194193
{
195-
context.Result.ValidationResult.AddError(
196-
ValidationEntrySource.Reader,
197-
$"Could not find '{subCircuitDefinitionName}' subcircuit",
198-
parameters.LineInfo);
194+
if (result == null)
195+
{
196+
context.Result.ValidationResult.AddError(
197+
ValidationEntrySource.Reader,
198+
$"Could not find '{subCircuitDefinitionName}' subcircuit",
199+
parameters.LineInfo);
200+
}
201+
return result;
199202
}
200203

201-
return result;
204+
return null;
202205
}
203206

204207
private List<string> GetPinNames(ParameterCollection parameters)

src/SpiceSharpParser/ModelReaders/Netlist/Spice/Readers/SubcircuitDefinitionReader.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public override void Read(SubCircuit statement, IReadingContext context)
2626
throw new ArgumentNullException(nameof(context));
2727
}
2828

29-
context.AvailableSubcircuits.Add(statement);
29+
context.AvailableSubcircuits[statement.Name] = statement;
3030
}
3131
}
3232
}

src/SpiceSharpParser/ModelReaders/Netlist/Spice/SpiceNetlistReader.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
using SpiceSharp;
22
using SpiceSharp.Entities;
3+
using SpiceSharpBehavioral.Builders.Direct;
4+
using SpiceSharpBehavioral.Builders.Functions;
5+
using SpiceSharpBehavioral.Parsers.Nodes;
36
using SpiceSharpParser.Common;
47
using SpiceSharpParser.Common.Evaluation;
58
using SpiceSharpParser.Common.Mathematics.Probability;
@@ -53,6 +56,13 @@ public SpiceSharpModel Read(SpiceNetlist netlist)
5356
// Set the separator.
5457
Utility.Separator = Settings.Separator;
5558

59+
// Set functions case-sensitivity
60+
ComplexBuilderHelper.RemapFunctions(StringComparerProvider.Get(Settings.CaseSensitivity.IsFunctionNameCaseSensitive));
61+
ComplexFunctionBuilderHelper.RemapFunctions(StringComparerProvider.Get(Settings.CaseSensitivity.IsFunctionNameCaseSensitive));
62+
RealBuilderHelper.RemapFunctions(StringComparerProvider.Get(Settings.CaseSensitivity.IsFunctionNameCaseSensitive));
63+
RealFunctionBuilderHelper.RemapFunctions(StringComparerProvider.Get(Settings.CaseSensitivity.IsFunctionNameCaseSensitive));
64+
DerivativesHelper.RemapFunctions(StringComparerProvider.Get(Settings.CaseSensitivity.IsFunctionNameCaseSensitive));
65+
5666
// Get reading context
5767
var nodeNameGenerator = new MainCircuitNodeNameGenerator(
5868
new[] { "0" },

0 commit comments

Comments
 (0)