/// <summary> /// Constructor when reading subcircuit instances /// </summary> /// <param name="parent">Parent</param> /// <param name="subckt">Subcircuit definition</param> public SubcircuitPath(Netlist netlist, SubcircuitPath parent, Subcircuit subckt) { // Same global parameters globalparameters = parent.globalparameters; // Same globals Globals = parent.Globals; // Build parameters Parameters = GenerateParameters(netlist, subckt.Definition, subckt.Parameters); // Build instance path if (parent.InstancePath != null) { InstancePath = parent.InstancePath.Grow(subckt.Name.Name); } else { InstancePath = subckt.Name; } // Build the definition path if (parent.DefinitionPath != null) { DefinitionPath = parent.DefinitionPath.Grow(subckt.Definition.Name.Name); } else { DefinitionPath = subckt.Definition.Name; } // Node map NodeMap = GenerateNodeMap(subckt.Definition, subckt.Pins); // Add globals to the nodemap foreach (var id in Globals) { if (!NodeMap.ContainsKey(id)) { NodeMap.Add(id, id); } } // Check for recursively called paths if (parent.DefinitionPath != null) { for (int i = 0; i < parent.DefinitionPath.Path.Length; i++) { if (parent.DefinitionPath.Path[i] == subckt.Definition.Name.Name) { throw new ParseException($"Subcircuit definition {subckt.Definition} is called recursively"); } } } }
/// <summary> /// Constructor when reading subcircuit definitions /// </summary> /// <param name="parent">Parent path</param> /// <param name="definition">Subcircuit definition</param> public SubcircuitPath(SubcircuitPath parent, SubcircuitDefinition definition) { // Same global parameters globalparameters = parent.globalparameters; // No parameters or instances Parameters = null; // Should not be used! InstancePath = null; // Build the definition path if (parent.DefinitionPath != null) { DefinitionPath = parent.DefinitionPath.Grow(definition.Name.Name); } else { DefinitionPath = definition.Name; } // No node map NodeMap = null; // Should not be used! }