Пример #1
0
        /// <summary>
        /// Extract the data
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        public override double Extract(SimulationData data)
        {
            IParameterized c = (IParameterized)data.GetObject(Component);

            return(c.Ask(Parameter, data.Circuit));
            // return c.Ask(Parameter);
        }
        public static T AddParameterWithNullValue <T>(this IParameterized <T> parameterized, string typeName, string parameterName = null, int index = -1)
            where T : BuilderBase <T>, IParameterized <T>
        {
            var parameter = GetParameter(parameterized.Parent, typeName, parameterName)
                            .WithNullDefault();

            return(parameterized.AddParameterInternal(parameter, index));
        }
        public static T AddParameter <T>(this IParameterized <T> parameterized, IParameterSymbol parameter)
            where T : BuilderBase <T>, IParameterized <T>
        {
            if (parameter.HasExplicitDefaultValue)
            {
                return(parameterized.AddParameterWithDefaultValue(parameter.Type, parameter.Name, parameter.ExplicitDefaultValue));
            }

            return(parameterized.AddParameter(parameter.Type, parameter.Name));
        }
Пример #4
0
 /// <summary>
 /// Copy the DC parameter back to the object
 /// </summary>
 /// <param name="obj"></param>
 /// <param name="par"></param>
 private void SetDcParameter(IParameterized obj, Parameter par)
 {
     if (obj is Voltagesource vsource)
     {
         vsource.VSRCdcValue.CopyFrom(par);
     }
     if (obj is Currentsource isource)
     {
         isource.ISRCdcValue.CopyFrom(par);
     }
 }
Пример #5
0
 /// <summary>
 /// Get the DC parameter
 /// </summary>
 /// <param name="obj"></param>
 /// <returns></returns>
 private Parameter GetDcParameter(IParameterized obj)
 {
     if (obj is Voltagesource vsource)
     {
         return(vsource.VSRCdcValue);
     }
     if (obj is Currentsource isource)
     {
         return(isource.ISRCdcValue);
     }
     return(null);
 }
        public static bool Matches(this IParameterized parameterized, string name, int paramCount, out string error)
        {
            int amountOfParameters1 = parameterized.MinAmountOfParameters;
            int amountOfParameters2 = parameterized.MaxAmountOfParameters;

            if (amountOfParameters1 != -1 && amountOfParameters2 != -1 && paramCount.IsInRange(amountOfParameters1, amountOfParameters2) || (amountOfParameters1 == -1 && paramCount <= amountOfParameters2 || amountOfParameters2 == -1 && paramCount >= amountOfParameters1) || amountOfParameters1 == -1 && amountOfParameters2 == -1)
            {
                error = string.Empty;
                return(true);
            }
            string str = amountOfParameters1 != -1 ? (amountOfParameters2 != -1 ? (amountOfParameters1 != amountOfParameters2 ? "range {1}-{2}" : "{1}") : "minimun of {2}") : "maximun of {1}";

            error = string.Format("{0} requires " + str + " parameters", (object)name, (object)amountOfParameters1, (object)amountOfParameters2);
            return(false);
        }
        public static T AddParameters <T>(this IParameterized <T> parameterized, IEnumerable <IParameterSymbol> parameters)
            where T : BuilderBase <T>, IParameterized <T>
        {
            if (parameters is null || !parameters.Any())
            {
                return(parameterized.Parent);
            }

            foreach (var parameter in parameters)
            {
                parameterized.AddParameter(parameter);
            }

            return(parameterized.Parent);
        }
Пример #8
0
        /// <summary>
        /// Test the parameters of a parameterized object
        /// </summary>
        /// <param name="obj">The parameterized object</param>
        /// <param name="names">The parameter names</param>
        /// <param name="values">The expected parameter values</param>
        protected void TestParameters(IParameterized p, string[] names, double[] values)
        {
            if (names.Length != values.Length)
            {
                throw new Exception("Unit test error: parameter name array does not match the value array");
            }

            // Test all parameters
            for (int i = 0; i < names.Length; i++)
            {
                double expected = values[i];
                double actual   = p.Ask(names[i]);
                double tol      = Math.Min(Math.Abs(expected), Math.Abs(actual)) * 1e-6;
                Assert.AreEqual(expected, actual, tol);
            }
        }
Пример #9
0
        /// <summary>
        /// Read
        /// </summary>
        /// <param name="name">The type of the waveform</param>
        /// <param name="parameters">Parameters</param>
        /// <param name="netlist">The netlist</param>
        /// <returns></returns>
        public override bool Read(string type, Statement st, Netlist netlist)
        {
            IParameterized w = Generate(type);

            if (st.Parameters.Count > keys.Length)
            {
                throw new ParseException(st.Name, $"Too many arguments for waveform \"{st.Name.image}\"");
            }
            for (int i = 0; i < st.Parameters.Count; i++)
            {
                w.Set(keys[i], netlist.ParseDouble(st.Parameters[i]));
            }

            Generated = w;
            return(true);
        }
        private static T AddParameterInternal <T>(this IParameterized <T> parameterized, ParameterBuilder <T> parameter, int index)
            where T : BuilderBase <T>, IParameterized <T>
        {
            if (parameterized.Parameters.Any(p => p.Type == parameter.Type && p.Name == parameter.Name))
            {
                return(parameterized.Parent);
            }

            if (index > -1)
            {
                parameterized.Parameters.Insert(index, parameter);
            }
            else
            {
                parameterized.Parameters.Add(parameter);
            }

            return(parameterized.Parent);
        }
        public string Set(IParameterized setter, int index, object value)
        {
            if (_disabled)
            {
                if (value is string str)
                {
                    return("\"" + str.Replace("\"", "\\\"") + "\"");
                }
                if (value is bool b)
                {
                    return(b ? "true" : "false");
                }
                return(value?.ToString() ?? "null");
            }
            var key = setter.ParameterName + (index >= 0 ? "_" + index : "");

            Parameters[key] = value;
            return($"p.{key}");
        }
        public string SetMany(IParameterized setter, params object[] parameters)
        {
            if (_disabled)
            {
                return("[" + string.Join(", ", parameters.Select(parameter =>
                {
                    if (parameter is string str)
                    {
                        return "\"" + str.Replace("\"", "\\\"") + "\"";
                    }
                    if (parameter is bool b)
                    {
                        return b ? "true" : "false";
                    }
                    return parameter?.ToString() ?? "null";
                })) + "]");
            }
            var key = setter.ParameterName;

            Parameters[key] = parameters;
            return($"p.{key}");
        }
Пример #13
0
        /// <summary>
        /// Read named parameters for a Parameterized object
        /// </summary>
        /// <param name="obj">The parameterized object</param>
        /// <param name="parameters">The parameters</param>
        /// <param name="start">The starting index</param>
        public static void ReadParameters(this Netlist netlist, IParameterized obj, List <Token> parameters, int start = 0)
        {
            for (int i = start; i < parameters.Count; i++)
            {
                if (parameters[i].kind == TokenConstants.ASSIGNMENT)
                {
                    AssignmentToken at = parameters[i] as AssignmentToken;
                    string          pname;
                    if (at.Name.kind == WORD)
                    {
                        pname = at.Name.image.ToLower();
                    }
                    else
                    {
                        throw new ParseException(parameters[i], "Invalid assignment");
                    }
                    switch (at.Value.kind)
                    {
                    case VALUE:
                        obj.Set(pname, netlist.Readers.ParseDouble(at.Value.image.ToLower()));
                        break;

                    case EXPRESSION:
                        obj.Set(pname, netlist.Readers.ParseDouble(at.Value.image.Substring(1, at.Value.image.Length - 2).ToLower()));
                        break;

                    case WORD:
                    case STRING:
                        obj.Set(pname, netlist.ParseString(at.Value));
                        break;

                    default:
                        throw new ParseException(parameters[i], "Invalid assignment");
                    }
                }
            }
        }
 public static T AddParameter <T>(this IParameterized <T> parameterized, ITypeSymbol typeSymbol, string parameterName)
     where T : BuilderBase <T>, IParameterized <T>
 {
     parameterized.Parent.AddNamespaceImport(typeSymbol);
     return(parameterized.AddParameter(typeSymbol.Name, parameterName));
 }
 public static T AddParameter <T>(this IParameterized <T> parameterized, string typeName, string parameterName, int index)
     where T : BuilderBase <T>, IParameterized <T>
 {
     return(parameterized.AddParameterInternal(GetParameter(parameterized.Parent, typeName, parameterName), index));
 }
 public static T AddParameterWithNullValue <T>(this IParameterized <T> parameterized, ITypeSymbol typeSymbol, string parameterName = null, int index = -1)
     where T : BuilderBase <T>, IParameterized <T>
 {
     parameterized.Parent.AddNamespaceImport(typeSymbol);
     return(parameterized.AddParameterWithNullValue(typeSymbol.Name, parameterName, index));
 }
Пример #17
0
        /// <summary>
        /// Execute the DC simulation
        /// </summary>
        /// <param name="ckt">The circuit</param>
        public override void Execute(Circuit ckt)
        {
            // Setup the state
            var state  = ckt.State;
            var rstate = state.Real;
            var config = CurrentConfig;

            state.Initialize(ckt);
            state.UseIC          = false; // UseIC is only used in transient simulations
            state.UseDC          = true;
            state.UseSmallSignal = false;
            state.Domain         = CircuitState.DomainTypes.None;
            state.Gmin           = config.Gmin;

            // Initialize
            IParameterized[] components = new IParameterized[Sweeps.Count];
            Parameter[]      parameters = new Parameter[Sweeps.Count];

            // Initialize first time
            for (int i = 0; i < Sweeps.Count; i++)
            {
                // Get the component to be swept
                var sweep = Sweeps[i];
                if (!ckt.Objects.Contains(sweep.ComponentName))
                {
                    throw new CircuitException($"Could not find source {sweep.ComponentName}");
                }
                components[i] = (IParameterized)ckt.Objects[sweep.ComponentName];

                // Get the parameter and save it for restoring later
                parameters[i] = (Parameter)GetDcParameter(components[i]).Clone();

                // Start with the original values
                sweep.SetCurrentStep(0);
                components[i].Set("dc", sweep.CurrentValue);
            }

            Initialize(ckt);

            // Execute the sweeps
            int level = Sweeps.Count - 1;

            while (level >= 0)
            {
                // Fill the values with start values
                while (level < Sweeps.Count - 1)
                {
                    level++;
                    Sweeps[level].SetCurrentStep(0);
                    components[level].Set("dc", Sweeps[level].CurrentValue);
                }

                // Calculate the solution
                if (!Iterate(config, ckt, config.SweepMaxIterations))
                {
                    IterationFailed?.Invoke(this, ckt);
                    Op(config, ckt, config.DcMaxIterations);
                }

                // Export data
                Export(ckt);

                // Remove all values that are greater or equal to the maximum value
                while (level >= 0 && Sweeps[level].CurrentStep >= Sweeps[level].Limit)
                {
                    level--;
                }

                // Go to the next step for the top level
                if (level >= 0)
                {
                    Sweeps[level].SetCurrentStep(Sweeps[level].CurrentStep + 1);
                    components[level].Set("dc", Sweeps[level].CurrentValue);
                }
            }

            // Restore all the parameters of the swept components
            for (int i = 0; i < Sweeps.Count; i++)
            {
                SetDcParameter(components[i], parameters[i]);
            }

            Finalize(ckt);
        }
 public static T AddParameter <T>(this IParameterized <T> parameterized, string typeName)
     where T : BuilderBase <T>, IParameterized <T>
 {
     return(parameterized.AddParameterInternal(GetParameter(parameterized.Parent, typeName, null), -1));
 }
Пример #19
0
        /// <summary>
        /// Ask a component parameter using the circuit
        /// </summary>
        /// <param name="component">The component name</param>
        /// <param name="parameter">The parameter name</param>
        /// <returns></returns>
        public double Ask(CircuitIdentifier component, string parameter)
        {
            IParameterized p = (IParameterized)Circuit.Objects[component];

            return(p.Ask(parameter, Circuit));
        }