Esempio n. 1
0
 /// <summary>
 /// Constructor
 /// </summary>
 /// <param name="definition">The definition</param>
 /// <param name="name">Name identifier</param>
 public Subcircuit(SubcircuitDefinition definition, CircuitIdentifier name, List <CircuitIdentifier> pins, Dictionary <CircuitIdentifier, Token> parameters = null)
 {
     Definition = definition;
     Name       = name;
     Pins       = pins;
     Parameters = parameters;
 }
Esempio n. 2
0
        /// <summary>
        /// Find the nodemap for a subcircuit definition
        /// </summary>
        /// <param name="definition">Subcircuit definition</param>
        /// <param name="pins">The new pins</param>
        /// <returns></returns>
        private Dictionary <CircuitIdentifier, CircuitIdentifier> GenerateNodeMap(SubcircuitDefinition definition, List <CircuitIdentifier> pins)
        {
            // Initialize
            Dictionary <CircuitIdentifier, CircuitIdentifier> nodemap = new Dictionary <CircuitIdentifier, CircuitIdentifier>();

            // This is actually simple, just a one on one relation
            for (int i = 0; i < pins.Count; i++)
            {
                nodemap.Add(definition.Pins[i], pins[i]);
            }
            return(nodemap);
        }
Esempio n. 3
0
        /// <summary>
        /// Find a subcircuit definition using the current scope rules
        /// </summary>
        /// <param name="id">Subcircuit definition identifier</param>
        /// <returns></returns>
        public SubcircuitDefinition FindDefinition(Dictionary <CircuitIdentifier, SubcircuitDefinition> definitions, CircuitIdentifier id)
        {
            SubcircuitDefinition result = null;
            CircuitIdentifier    orig   = id;

            switch (DefinitionScope)
            {
            case ScopeRule.Descend:

                while (id != null)
                {
                    // Try to find the definition
                    if (definitions.TryGetValue(id, out result))
                    {
                        return(result);
                    }

                    // Not found, go to the parent path
                    id = id.Shrink();
                }
                break;

            case ScopeRule.GlobalLocal:

                // Try to find the definition locally
                if (definitions.TryGetValue(id, out result))
                {
                    return(result);
                }

                // Try to find the definition globally
                if (id.Path.Length > 1)
                {
                    id = new CircuitIdentifier(id.Name);
                    if (definitions.TryGetValue(id, out result))
                    {
                        return(result);
                    }
                }
                break;
            }
            throw new ParseException($"Cannot find subcircuit \"{orig}\"");
        }
Esempio n. 4
0
        /// <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!
        }
Esempio n. 5
0
        /// <summary>
        /// Find the parameters
        /// </summary>
        /// <param name="definition">Subcircuit definition</param>
        /// <param name="parameters">Parameters</param>
        /// <returns></returns>
        private Dictionary <CircuitIdentifier, double> GenerateParameters(Netlist netlist, SubcircuitDefinition definition, Dictionary <CircuitIdentifier, Token> parameters)
        {
            // Our new parameters
            Dictionary <CircuitIdentifier, double> np = new Dictionary <CircuitIdentifier, double>();

            // Add local parameters
            if (parameters != null)
            {
                foreach (var item in parameters)
                {
                    np.Add(item.Key, netlist.ParseDouble(item.Value));
                }
            }

            // Add default parameters
            if (definition.Defaults != null)
            {
                foreach (var item in definition.Defaults)
                {
                    if (!np.ContainsKey(item.Key))
                    {
                        np.Add(item.Key, netlist.ParseDouble(item.Value));
                    }
                }
            }

            // Other parameters
            if (Parameters != null)
            {
                switch (ParameterScope)
                {
                case ScopeRule.Descend:

                    // Copy all parameters from the previous node
                    foreach (var item in Parameters)
                    {
                        if (!np.ContainsKey(item.Key))
                        {
                            np.Add(item.Key, item.Value);
                        }
                    }
                    break;

                case ScopeRule.GlobalLocal:

                    // Only copy the global parameters
                    foreach (var item in globalparameters)
                    {
                        if (!np.ContainsKey(item.Key))
                        {
                            np.Add(item.Key, item.Value);
                        }
                    }
                    break;
                }
            }

            // Return results
            return(np);
        }