Skip to content

Commit d508a48

Browse files
Merge pull request #173 from SpiceSharp/mosfets
Expose Levels and Mosfets
2 parents 73117ba + f7e3b51 commit d508a48

6 files changed

Lines changed: 69 additions & 2 deletions

File tree

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
Mosfet circuit
2+
Md 0 1 2 3 my-pmos
3+
.model my-pmos pmos(level = 3)
4+
.END

src/SpiceSharpParser.IntegrationTests/Examples/Extensions/CustomMosfetModelTest.cs

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
using System.IO;
1+
using SpiceSharpParser.ModelReaders.Netlist.Spice.Readers.EntityGenerators.Components.Semiconductors;
2+
using SpiceSharpParser.ModelReaders.Netlist.Spice.Readers.EntityGenerators.Models;
3+
using System.IO;
24
using Xunit;
35

46
namespace SpiceSharpParser.IntegrationTests.Examples.Extensions
@@ -19,6 +21,34 @@ public void When_CustomMosfetModel_Used_NoExceptions()
1921
var spiceSharpReader = new SpiceSharpReader();
2022
spiceSharpReader.Settings.CaseSensitivity.IsModelTypeCaseSensitive = false;
2123
spiceSharpReader.Settings.Mappings.Models.Map(new[] { "PMOS", "NMOS" }, new CustomMosfetModelGenerator());
24+
var spiceSharpModel = spiceSharpReader.Read(parseResult.FinalModel);
25+
26+
Assert.False(spiceSharpModel.ValidationResult.HasError);
27+
Assert.False(spiceSharpModel.ValidationResult.HasWarning);
28+
}
29+
[Fact]
30+
public void When_CustomMosfetModel2_Used_NoExceptions()
31+
{
32+
// Create a model from text file
33+
string path = Path.Combine(Directory.GetCurrentDirectory(), "Examples/Circuits/MosfetExample2.cir");
34+
var netlistContent = File.ReadAllText(path);
35+
var parser = new SpiceNetlistParser();
36+
parser.Settings.Lexing.HasTitle = true;
37+
var parseResult = parser.ParseNetlist(netlistContent);
38+
39+
// Convert to Spice#
40+
var spiceSharpReader = new SpiceSharpReader();
41+
spiceSharpReader.Settings.CaseSensitivity.IsModelTypeCaseSensitive = false;
42+
43+
// custom mosfet models
44+
var modelGenerator = new MosfetModelGenerator();
45+
modelGenerator.AddLevel<SpiceSharp.Components.Mosfet3Model, SpiceSharp.Components.Mosfets.Level3.ModelParameters>(4);
46+
spiceSharpReader.Settings.Mappings.Models.Map(new[] { "PMOS", "NMOS" }, modelGenerator);
47+
var mosfetGenerator = new MosfetGenerator();
48+
mosfetGenerator.AddMosfet<SpiceSharp.Components.Mosfet3Model, SpiceSharp.Components.Mosfet3>();
49+
spiceSharpReader.Settings.Mappings.Components.Map("M", mosfetGenerator);
50+
51+
2252
var spiceSharpModel = spiceSharpReader.Read(parseResult.FinalModel);
2353

2454
Assert.False(spiceSharpModel.ValidationResult.HasError);

src/SpiceSharpParser.IntegrationTests/SpiceSharpParser.IntegrationTests.csproj

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,9 @@
9696
<None Update="Examples\Circuits\Example04_reversed.cir">
9797
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
9898
</None>
99+
<None Update="Examples\Circuits\MosfetExample2.cir">
100+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
101+
</None>
99102
<None Update="Examples\Circuits\MosfetExample.cir">
100103
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
101104
</None>

src/SpiceSharpParser/ModelReaders/Netlist/Spice/Readers/EntityGenerators/Components/Semiconductors/MosfetGenerator.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,16 @@ public MosfetGenerator()
3737

3838
protected Dictionary<Type, Func<string, MosfetDetails>> Mosfets { get; } = new ();
3939

40+
public void AddMosfet<TModel, TMosfet>()
41+
where TMosfet : SpiceSharp.Components.Component
42+
{
43+
Mosfets[typeof(TModel)] = (name) =>
44+
{
45+
var mosfet = (TMosfet)Activator.CreateInstance(typeof(TMosfet), name);
46+
return new MosfetDetails { Mosfet = mosfet, SetModelAction = (model) => mosfet.Model = model.Name };
47+
};
48+
}
49+
4050
public override IEntity Generate(string componentIdentifier, string originalName, string type, ParameterCollection parameters, IReadingContext context)
4151
{
4252
// Errors

src/SpiceSharpParser/ModelReaders/Netlist/Spice/Readers/EntityGenerators/Models/MosfetModelGenerator.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
using System;
22
using System.Collections.Generic;
3+
using SpiceSharp;
34
using SpiceSharp.Components;
5+
using SpiceSharp.Components.Mosfets;
6+
using SpiceSharp.Entities;
47
using SpiceSharpParser.Common.Validation;
58
using SpiceSharpParser.ModelReaders.Netlist.Spice.Context;
69
using SpiceSharpParser.Models.Netlist.Spice.Objects;
@@ -56,6 +59,23 @@ public MosfetModelGenerator()
5659
/// </summary>
5760
protected Dictionary<int, Func<string, string, string, Context.Models.Model>> Levels { get; } = new Dictionary<int, Func<string, string, string, Context.Models.Model>>();
5861

62+
public void AddLevel<TModel, TParameters>(int level)
63+
where TModel : Entity<TParameters>
64+
where TParameters : ModelParameters, ICloneable<TParameters>, new()
65+
{
66+
Levels[level] = (name, type, _) =>
67+
{
68+
var mosfet = (TModel)Activator.CreateInstance(typeof(TModel), name);
69+
switch (type.ToLower())
70+
{
71+
case "nmos": mosfet.SetParameter("nmos", true); break;
72+
case "pmos": mosfet.SetParameter("pmos", true); break;
73+
}
74+
75+
return new Context.Models.Model(name, mosfet, mosfet.Parameters);
76+
};
77+
}
78+
5979
public override Context.Models.Model Generate(string id, string type, ParameterCollection parameters, IReadingContext context)
6080
{
6181
var clonedParameters = (ParameterCollection)parameters.Clone();

src/SpiceSharpParser/SpiceSharpParser.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
<StartupObject />
2323
<PackageLicenseExpression>MIT</PackageLicenseExpression>
2424
<LangVersion>latest</LangVersion>
25-
<Version>3.2.6</Version>
25+
<Version>3.2.7</Version>
2626
</PropertyGroup>
2727

2828
<PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Debug|netstandard1.5|AnyCPU'">

0 commit comments

Comments
 (0)