Skip to content

Commit 8777589

Browse files
committed
Add BSIM2 extension.
1 parent bdec9a9 commit 8777589

3 files changed

Lines changed: 78 additions & 0 deletions

File tree

File renamed without changes.
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
using System;
2+
using SpiceSharp.Components;
3+
using SpiceSharpParser;
4+
using SpiceSharpParser.ModelReaders.Netlist.Spice.Readers.EntityGenerators.Components.Semiconductors;
5+
using SpiceSharpParser.ModelReaders.Netlist.Spice.Readers.EntityGenerators.Models;
6+
7+
namespace SpiceSharpBSIM.Parser;
8+
9+
/// <summary>
10+
/// A helper class that can extend Spice#.Parser with BSIM1 models.
11+
/// </summary>
12+
public static class BSIM2Extensions
13+
{
14+
/// <summary>
15+
/// Extends a <see cref="SpiceSharpReader"/> with the BSIM1 models.
16+
/// </summary>
17+
/// <param name="reader">The reader.</param>
18+
/// <param name="level">The level.</param>
19+
/// <exception cref="NotImplementedException"></exception>
20+
public static void UseBSIM2(this SpiceSharpReader reader, int level = 5)
21+
{
22+
// Register the model level
23+
var nmosModelGenerator = reader.Settings.Mappings.Models.GetValue("NMOS", false);
24+
var pmosModelGenerator = reader.Settings.Mappings.Models.GetValue("PMOS", false);
25+
if (ReferenceEquals(nmosModelGenerator, pmosModelGenerator) &&
26+
nmosModelGenerator is MosfetModelGenerator modelGenerator)
27+
modelGenerator.AddGenericLevel<BSIM2Model, Components.Semiconductors.BSIM.BSIM2Behaviors.ModelParameters>(level);
28+
else
29+
throw new NotImplementedException();
30+
31+
// Register the mosfet component
32+
if (reader.Settings.Mappings.Components.TryGetValue("M", false, out var generator) &&
33+
generator is MosfetGenerator mosGenerator)
34+
mosGenerator.AddMosfet<BSIM2Model, BSIM2>();
35+
else
36+
throw new NotImplementedException();
37+
}
38+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
using NUnit.Framework;
2+
using SpiceSharpParser;
3+
using SpiceSharpBSIM.Parser;
4+
5+
namespace SpiceSharpBSIMTests.BSIM2Tests;
6+
7+
[TestFixture]
8+
public class BSIM2ParserTests
9+
{
10+
[Test]
11+
public void When_BSIM2Netlist_Expect_Reference()
12+
{
13+
string netlistContent = """
14+
V1 g 0 0
15+
V2 d 0 0
16+
M1 d g 0 0 mod w=100u l=100u
17+
.MODEL mod NMOS(LEVEL=5 vfb=-0.3 phi=0.8 k1=0.6 mu0=250 n0=1.3 tox=1e-7 mj=0.5 mjsw=0.33 pb=0.8 pbsw=1.0 xpart=1.0)
18+
.DC V2 0 3.3 0.3 V1 0 3.3 0.3
19+
20+
.END
21+
""";
22+
23+
var parser = new SpiceNetlistParser();
24+
parser.Settings.Lexing.HasTitle = false;
25+
var parseResult = parser.ParseNetlist(netlistContent);
26+
27+
// Convert to Spice#
28+
var spiceSharpReader = new SpiceSharpReader();
29+
spiceSharpReader.Settings.CaseSensitivity.IsModelTypeCaseSensitive = false;
30+
spiceSharpReader.UseBSIM2();
31+
var spiceSharpModel = spiceSharpReader.Read(parseResult.FinalModel);
32+
33+
Assert.That(spiceSharpModel.ValidationResult.HasError || spiceSharpModel.ValidationResult.HasWarning, Is.False);
34+
Assert.That(spiceSharpModel.Simulations.Count, Is.EqualTo(1));
35+
36+
var simulation = spiceSharpModel.Simulations[0];
37+
var codes = simulation.Run(spiceSharpModel.Circuit, -1);
38+
foreach (int _ in simulation.InvokeEvents(codes)) ;
39+
}
40+
}

0 commit comments

Comments
 (0)