-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathIdealDiode.cs
More file actions
119 lines (103 loc) · 4.3 KB
/
Copy pathIdealDiode.cs
File metadata and controls
119 lines (103 loc) · 4.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
using SpiceSharp.Attributes;
using SpiceSharp.Behaviors;
using SpiceSharp.Components;
using SpiceSharp.ParameterSets;
using SpiceSharp.Simulations;
using SpiceSharpParser.CustomComponents.IdealDiodes;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
namespace SpiceSharpParser.CustomComponents
{
/// <summary>
/// A standalone LTspice-style ideal diode component.
/// </summary>
/// <seealso cref="Component" />
/// <seealso cref="IParameterized{P}" />
/// <seealso cref="IdealDiodeParameters" />
[Pin(0, "D+"), Pin(1, "D-")]
public class IdealDiode : Component<IdealDiodeParameters>
{
private readonly ConcurrentDictionary<ISimulation, IdealDiodeParameters> _simulationModelParameters = new ConcurrentDictionary<ISimulation, IdealDiodeParameters>();
private readonly ConcurrentDictionary<ISimulation, ConcurrentDictionary<string, double>> _simulationModelParameterOverrides =
new ConcurrentDictionary<ISimulation, ConcurrentDictionary<string, double>>();
/// <summary>
/// The pin count for ideal diodes.
/// </summary>
[ParameterName("pincount"), ParameterInfo("Number of pins")]
public const int PinCount = 2;
internal IdealDiodeParameters ModelParameters { get; set; }
internal void SetModelParameters(ISimulation simulation, IdealDiodeParameters parameters)
{
if (simulation == null)
{
ModelParameters = parameters;
return;
}
_simulationModelParameters[simulation] = parameters;
}
internal IdealDiodeParameters GetModelParameters(ISimulation simulation)
{
if (simulation != null && _simulationModelParameters.TryGetValue(simulation, out var parameters))
{
return parameters;
}
return ModelParameters;
}
internal void SetModelParameterOverride(ISimulation simulation, string parameterName, double value)
{
if (simulation == null)
{
return;
}
var overrides = _simulationModelParameterOverrides.GetOrAdd(
simulation,
_ => new ConcurrentDictionary<string, double>(StringComparer.OrdinalIgnoreCase));
overrides[parameterName] = value;
}
internal IEnumerable<KeyValuePair<string, double>> GetModelParameterOverrides(ISimulation simulation)
{
if (simulation != null && _simulationModelParameterOverrides.TryGetValue(simulation, out var overrides))
{
return overrides;
}
return Array.Empty<KeyValuePair<string, double>>();
}
/// <summary>
/// Initializes a new instance of the <see cref="IdealDiode"/> class.
/// </summary>
/// <param name="name">The name of the device.</param>
/// <exception cref="ArgumentNullException">Thrown if <paramref name="name"/> is <c>null</c>.</exception>
public IdealDiode(string name)
: base(name, PinCount)
{
}
/// <summary>
/// Initializes a new instance of the <see cref="IdealDiode"/> class.
/// </summary>
/// <param name="name">The name of the device.</param>
/// <param name="anode">The anode.</param>
/// <param name="cathode">The cathode.</param>
/// <exception cref="ArgumentNullException">Thrown if <paramref name="name"/> is <c>null</c>.</exception>
public IdealDiode(string name, string anode, string cathode)
: this(name)
{
Connect(anode, cathode);
}
/// <inheritdoc />
public override void CreateBehaviors(ISimulation simulation)
{
var behaviors = new BehaviorContainer(Name);
var context = new ComponentBindingContext(this, simulation, behaviors);
if (simulation.UsesBehaviors<IFrequencyBehavior>())
{
behaviors.Add(new Frequency(context, this, simulation));
}
else if (simulation.UsesBehaviors<IBiasingBehavior>())
{
behaviors.Add(new Biasing(context, this, simulation));
}
simulation.EntityBehaviors.Add(behaviors);
}
}
}