/// <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);
 }
Example #2
0
 /// <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));
 }
Example #3
0
            /// <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);
            }
Example #4
0
        /// <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));
        }
Example #5
0
 /// <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);
 }
Example #6
0
 /// <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);
 }
Example #7
0
 public Subcircuit(ISubcircuitDefinition definition, object tag = null) : base(definition.TerminalNodes.Length, tag)
 {
     Definition = definition;
 }