/// <summary>Adds a resistor between specified nodes.</summary> /// <param name="builder">The builder.</param> /// <param name="nodes">Array of connections of the subcircuit.</param> /// <param name="subcircuit">Resistance of the resistor in ohms.</param> /// <param name="tag">Tag to identify the device.</param> /// <returns></returns> public static CircuitBuilder AddSubcircuit(this CircuitBuilder builder, int[] nodes, ISubcircuitDefinition subcircuit, object tag = null) { builder.AddDevice(nodes, new Subcircuit(subcircuit, tag)); return(builder); }
/// <summary> /// Initializes a new instance of the <see cref="SubcircuitSimulation" /> class. /// </summary> /// <param name="name">The name of the subcircuit.</param> /// <param name="parent">The parent simulation.</param> /// <param name="definition">The subcircuit definition.</param> /// <param name="nodes">The node bridges.</param> /// <exception cref="ArgumentNullException">Thrown if <paramref name="name"/>, <paramref name="parent"/>, <paramref name="definition"/> or <paramref name="nodes"/> is <c>null</c>.</exception> public SubcircuitSimulation(string name, ISimulation parent, ISubcircuitDefinition definition, IReadOnlyList <Bridge <string> > nodes) : base(parent, new BehaviorContainerCollection(), new InterfaceTypeSet <ISimulationState>()) { Definition = definition.ThrowIfNull(nameof(definition)); Nodes = nodes.ThrowIfNull(nameof(nodes)); InstanceName = name.ThrowIfNull(nameof(name)); }
/// <summary>Applies the statement in the given context.</summary> /// <param name="context"></param> public override void Apply() { base.Apply(); var name = tokens[1]; subname = name.Value; var terminals = GetNodeIndices(tokens.Skip(2), subScope); if (Scope.SymbolTable.TryGetSubcircuit(name.Value, out _)) { errors.Add(tokens[1].ToError(SpiceParserErrorCode.SubcircuitAlreadyExists)); } // validate terminal specs - no duplicates if (terminals.Distinct().Count() != terminals.Length) { errors.Add(name.ToError(SpiceParserErrorCode.TerminalNamesNotUnique)); } // ground node not allowed as terminal if (terminals.Contains(0)) { errors.Add(name.ToError(SpiceParserErrorCode.TerminalToGround)); } try { if (subScope.Errors.Count + errors.Count == 0) { subScope.CircuitBuilder.SetNodeVoltage(terminals.Max(), null); def = subScope.CircuitBuilder.BuildSubcircuit(terminals, name.Value); } } catch (NotConnectedSubcircuitException e) { // translate node indexes to node names used in the input file var names = e.Components.Select(c => subScope.SymbolTable.GetNodeNames(c).ToArray()).Cast <object>() .ToArray(); errors.Add(new SpiceParserError(SpiceParserErrorCode.SubcircuitNotConnected, name.LineNumber, name.LineColumn, names)); } if (def == null) { def = new NullSubcircuitDefinition(terminals, subScope.CircuitBuilder.NodeCount); } Scope.Errors.AddRange(errors); Scope.SymbolTable.AddSubcircuit(subname, def); }
/// <summary>Gets the subcircuit associated with given name.</summary> /// <param name="name">Name of the subcircuit.</param> /// <param name="subcircuit">Out variable to store found model in.</param> /// <returns></returns> public bool TryGetSubcircuit(string name, out ISubcircuitDefinition subcircuit) { var t = this; while (!t?.SubcircuitDevices.ContainsKey(name) ?? false) { t = t.parent; } subcircuit = null; if (t == null) { return(false); } return(t.SubcircuitDevices.TryGetValue(name, out subcircuit)); }
/// <summary> /// Initializes a new instance of the <see cref="Subcircuit"/> class. /// </summary> /// <param name="name">The name of the subcircuit.</param> /// <param name="definition">The subcircuit definition.</param> /// <param name="nodes">The nodes that the subcircuit is connected to.</param> /// <exception cref="ArgumentNullException">Thrown if <paramref name="name"/> or <paramref name="definition"/> is <c>null</c>.</exception> public Subcircuit(string name, ISubcircuitDefinition definition, params string[] nodes) : base(name) { Parameters.Definition = definition.ThrowIfNull(nameof(definition)); Connect(nodes); }
/// <summary>Adds subcircuit under given name to the symbol tables.</summary> /// <param name="name">Name of the subcircuit.</param> /// <param name="subcircuit">The subcircuit deinition.</param> public void AddSubcircuit(string name, ISubcircuitDefinition subcircuit) { SubcircuitDevices.Add(name, subcircuit); }
public Subcircuit(ISubcircuitDefinition definition, object tag = null) : base(definition.TerminalNodes.Length, tag) { Definition = definition; }