diff --git a/src/SpiceSharpParser.IntegrationTests/Examples/Extensions/CustomMosfetModelTest.cs b/src/SpiceSharpParser.IntegrationTests/Examples/Extensions/CustomMosfetModelTest.cs index 4be7dc64..ed0a7c82 100644 --- a/src/SpiceSharpParser.IntegrationTests/Examples/Extensions/CustomMosfetModelTest.cs +++ b/src/SpiceSharpParser.IntegrationTests/Examples/Extensions/CustomMosfetModelTest.cs @@ -1,4 +1,5 @@ -using SpiceSharpParser.ModelReaders.Netlist.Spice.Readers.EntityGenerators.Components.Semiconductors; +using SpiceSharp.Components; +using SpiceSharpParser.ModelReaders.Netlist.Spice.Readers.EntityGenerators.Components.Semiconductors; using SpiceSharpParser.ModelReaders.Netlist.Spice.Readers.EntityGenerators.Models; using System.IO; using Xunit; @@ -49,6 +50,36 @@ public void When_CustomMosfetModel2_Used_NoExceptions() spiceSharpReader.Settings.Mappings.Components.Map("M", mosfetGenerator); + var spiceSharpModel = spiceSharpReader.Read(parseResult.FinalModel); + + Assert.False(spiceSharpModel.ValidationResult.HasError); + Assert.False(spiceSharpModel.ValidationResult.HasWarning); + } + + + [Fact] + public void When_BSIM1_Used_NoExceptions() + { + // Create a model from text file + string path = Path.Combine(Directory.GetCurrentDirectory(), "Examples/Circuits/MosfetExample2.cir"); + var netlistContent = File.ReadAllText(path); + var parser = new SpiceNetlistParser(); + parser.Settings.Lexing.HasTitle = true; + var parseResult = parser.ParseNetlist(netlistContent); + + // Convert to Spice# + var spiceSharpReader = new SpiceSharpReader(); + spiceSharpReader.Settings.CaseSensitivity.IsModelTypeCaseSensitive = false; + + // custom mosfet models + var modelGenerator = new MosfetModelGenerator(); + modelGenerator.AddGenericLevel(4); + spiceSharpReader.Settings.Mappings.Models.Map(new[] { "PMOS", "NMOS" }, modelGenerator); + var mosfetGenerator = new MosfetGenerator(); + mosfetGenerator.AddMosfet(); + spiceSharpReader.Settings.Mappings.Components.Map("M", mosfetGenerator); + + var spiceSharpModel = spiceSharpReader.Read(parseResult.FinalModel); Assert.False(spiceSharpModel.ValidationResult.HasError); diff --git a/src/SpiceSharpParser.IntegrationTests/SpiceSharpParser.IntegrationTests.csproj b/src/SpiceSharpParser.IntegrationTests/SpiceSharpParser.IntegrationTests.csproj index ab22d991..95097b93 100644 --- a/src/SpiceSharpParser.IntegrationTests/SpiceSharpParser.IntegrationTests.csproj +++ b/src/SpiceSharpParser.IntegrationTests/SpiceSharpParser.IntegrationTests.csproj @@ -24,6 +24,7 @@ + diff --git a/src/SpiceSharpParser/ModelReaders/Netlist/Spice/Readers/EntityGenerators/Models/MosfetModelGenerator.cs b/src/SpiceSharpParser/ModelReaders/Netlist/Spice/Readers/EntityGenerators/Models/MosfetModelGenerator.cs index ffe5967c..4bec0787 100644 --- a/src/SpiceSharpParser/ModelReaders/Netlist/Spice/Readers/EntityGenerators/Models/MosfetModelGenerator.cs +++ b/src/SpiceSharpParser/ModelReaders/Netlist/Spice/Readers/EntityGenerators/Models/MosfetModelGenerator.cs @@ -1,13 +1,14 @@ -using System; -using System.Collections.Generic; -using SpiceSharp; +using SpiceSharp; using SpiceSharp.Components; using SpiceSharp.Components.Mosfets; using SpiceSharp.Entities; +using SpiceSharp.ParameterSets; using SpiceSharpParser.Common.Validation; using SpiceSharpParser.ModelReaders.Netlist.Spice.Context; using SpiceSharpParser.Models.Netlist.Spice.Objects; using SpiceSharpParser.Models.Netlist.Spice.Objects.Parameters; +using System; +using System.Collections.Generic; namespace SpiceSharpParser.ModelReaders.Netlist.Spice.Readers.EntityGenerators.Models { @@ -76,6 +77,23 @@ public void AddLevel(int level) }; } + public void AddGenericLevel(int level) + where TModel : Entity + where TParameters : ParameterSet, new() + { + Levels[level] = (name, type, _) => + { + var mosfet = (TModel)Activator.CreateInstance(typeof(TModel), name); + switch (type.ToLower()) + { + case "nmos": mosfet.SetParameter("nmos", true); break; + case "pmos": mosfet.SetParameter("pmos", true); break; + } + + return new Context.Models.Model(name, mosfet, mosfet.Parameters); + }; + } + public override Context.Models.Model Generate(string id, string type, ParameterCollection parameters, IReadingContext context) { var clonedParameters = (ParameterCollection)parameters.Clone(); diff --git a/src/SpiceSharpParser/SpiceSharpParser.csproj b/src/SpiceSharpParser/SpiceSharpParser.csproj index 4a6db727..fdbcaffb 100644 --- a/src/SpiceSharpParser/SpiceSharpParser.csproj +++ b/src/SpiceSharpParser/SpiceSharpParser.csproj @@ -22,7 +22,7 @@ MIT latest - 3.2.7 + 3.2.8