/// <summary>
        /// Generate resistor.
        /// </summary>
        /// <param name="name">Name of resistor to generate.</param>
        /// <param name="parameters">Parameters and pins for resistor.</param>
        /// <param name="context">Reading context.</param>
        /// <returns>
        /// A new instance of resistor.
        /// </returns>
        protected IEntity GenerateRes(string name, ParameterCollection parameters, ICircuitContext context)
        {
            if (parameters.Count == 3)
            {
                var evalContext = context.Evaluator.GetEvaluationContext();

                // RName Node1 Node2 something
                var    something  = parameters[2];
                string expression = null;

                if (something is AssignmentParameter asp)
                {
                    expression = asp.Value;
                }
                else
                {
                    expression = something.Image;
                }

                if (evalContext.HaveSpiceProperties(expression) || evalContext.HaveFunctions(expression))
                {
                    BehavioralResistor behavioralResistor = new BehavioralResistor(name);
                    context.CreateNodes(behavioralResistor, parameters.Take(BehavioralResistor.BehavioralResistorPinCount));

                    behavioralResistor.Parameters.Expression  = expression;
                    behavioralResistor.Parameters.ParseAction = (expression) =>
                    {
                        var parser = new ExpressionParser(context.Evaluator.GetEvaluationContext(null), false, context.CaseSensitivity);
                        return(parser.Resolve(expression));
                    };

                    if (evalContext.HaveFunctions(expression))
                    {
                        context.SimulationPreparations.ExecuteActionBeforeSetup((simulation) =>
                        {
                            behavioralResistor.Parameters.Expression = expression.ToString();

                            behavioralResistor.Parameters.ParseAction = (expression) =>
                            {
                                var parser = new ExpressionParser(context.Evaluator.GetEvaluationContext(simulation), false, context.CaseSensitivity);
                                return(parser.Resolve(expression));
                            };
                        });
                    }

                    return(behavioralResistor);
                }
            }

            Resistor res = new Resistor(name);

            context.CreateNodes(res, parameters);

            if (parameters.Count == 3)
            {
                // RName Node1 Node2 something
                var something = parameters[2];

                // Check if something is a model name
                if ((something is WordParameter || something is IdentifierParameter) &&
                    context.ModelsRegistry.FindModel(parameters.Get(2).Image) != null)
                {
                    // RName Node1 Node2 modelName
                    context.Result.Validation.Add(
                        new ValidationEntry(
                            ValidationEntrySource.Reader,
                            ValidationEntryLevel.Warning,
                            $"R parameter needs to be specified",
                            parameters.LineInfo));
                    return(null);
                }

                // Check if something can be resistance
                if (!(something is WordParameter ||
                      something is IdentifierParameter ||
                      something is ValueParameter ||
                      something is ExpressionParameter ||
                      (something is AssignmentParameter ap && (ap.Name.ToLower() == "r" || ap.Name.ToLower() == "resistance"))))
                {
                    context.Result.Validation.Add(
                        new ValidationEntry(
                            ValidationEntrySource.Reader,
                            ValidationEntryLevel.Warning,
                            $"Third parameter needs to represent resistance of resistor",
                            parameters.LineInfo));

                    return(null);
                }

                // Set resistance
                if (something is AssignmentParameter asp)
                {
                    context.SetParameter(res, "resistance", asp, true, false);
                }
                else
                {
                    context.SetParameter(res, "resistance", something, true, false);
                }
            }
            else
            {
                var resistorParameters = new List <Parameter>(parameters.Skip(Resistor.ResistorPinCount).ToArray());

                // RName Node1 Node2 something param1 ...
                if (resistorParameters.Count == 0)
                {
                    context.Result.Validation.Add(
                        new ValidationEntry(
                            ValidationEntrySource.Reader,
                            ValidationEntryLevel.Warning,
                            $"Resistor doesn't have at least 3 parameters",
                            parameters.LineInfo));
                    return(null);
                }

                var something = resistorParameters[0];

                // Check if something is a model name
                bool hasModelSyntax = (something is WordParameter || something is IdentifierParameter) &&
                                      context.ModelsRegistry.FindModel(something.Image) != null;
                bool hasTcParameter = parameters.Any(
                    p => p is AssignmentParameter ap && ap.Name.Equals(
                        "tc",
                        false ? StringComparison.CurrentCulture : StringComparison.CurrentCultureIgnoreCase));

                AssignmentParameter tcParameter = null;

                if (hasTcParameter)
                {
                    tcParameter = (AssignmentParameter)parameters.Single(
                        p => p is AssignmentParameter ap && ap.Name.Equals(
                            "tc",
                            false ? StringComparison.CurrentCulture : StringComparison.CurrentCultureIgnoreCase));
                    resistorParameters.Remove(tcParameter);
                }

                if (hasModelSyntax)
                {
                    var modelNameParameter = resistorParameters[0];

                    // Ignore tc parameter on resistor ...
                    context.SimulationPreparations.ExecuteActionBeforeSetup((simulation) =>
                    {
                        context.ModelsRegistry.SetModel(
                            res,
                            simulation,
                            modelNameParameter,
                            $"Could not find model {modelNameParameter} for resistor {name}",
                            (Context.Models.Model model) => res.Model = model.Name,
                            context.Result);
                    });

                    resistorParameters.RemoveAt(0);

                    if (resistorParameters.Count > 0 && (resistorParameters[0] is WordParameter ||
                                                         resistorParameters[0] is IdentifierParameter ||
                                                         resistorParameters[0] is ValueParameter ||
                                                         resistorParameters[0] is ExpressionParameter))
                    {
                        context.SetParameter(res, "resistance", resistorParameters[0].Image, true, false);
                        resistorParameters.RemoveAt(0);
                    }
                }
                else
                {
                    if (hasTcParameter)
                    {
                        var model = new ResistorModel(res.Name + "_default_model");
                        if (tcParameter.Values.Count == 2)
                        {
                            context.SetParameter(model, "tc1", tcParameter.Values[0]);
                            context.SetParameter(model, "tc2", tcParameter.Values[1]);
                        }
                        else
                        {
                            context.SetParameter(model, "tc1", tcParameter.Value);
                        }

                        context.ModelsRegistry.RegisterModelInstance(new Context.Models.Model(model.Name, model, model.Parameters));
                        res.Model = model.Name;
                        context.Result.AddEntity(model);
                    }

                    // Check if something can be resistance
                    var resistanceParameter = resistorParameters[0];

                    if (!(resistanceParameter is WordParameter ||
                          resistanceParameter is IdentifierParameter ||
                          resistanceParameter is ValueParameter ||
                          resistanceParameter is ExpressionParameter ||
                          (resistanceParameter is AssignmentParameter ap && (ap.Name.ToLower() == "r" || ap.Name.ToLower() == "resistance"))))
                    {
                        context.Result.Validation.Add(
                            new ValidationEntry(
                                ValidationEntrySource.Reader,
                                ValidationEntryLevel.Warning,
                                $"Invalid value for resistance",
                                parameters.LineInfo));
                        return(null);
                    }

                    if (resistanceParameter is AssignmentParameter asp)
                    {
                        context.SetParameter(res, "resistance", asp.Value, true, false);
                    }
                    else
                    {
                        context.SetParameter(res, "resistance", resistanceParameter.Image, true, false);
                    }

                    resistorParameters.RemoveAt(0);
                }

                foreach (var parameter in resistorParameters)
                {
                    if (parameter is AssignmentParameter ap)
                    {
                        try
                        {
                            context.SetParameter(res, ap.Name, ap.Value);
                        }
                        catch (Exception e)
                        {
                            context.Result.Validation.Add(
                                new ValidationEntry(
                                    ValidationEntrySource.Reader,
                                    ValidationEntryLevel.Error,
                                    $"Can't set parameter for resistor: '{parameter.Image}'",
                                    parameters.LineInfo,
                                    exception: e));

                            return(null);
                        }
                    }
                    else
                    {
                        context.Result.Validation.Add(
                            new ValidationEntry(
                                ValidationEntrySource.Reader,
                                ValidationEntryLevel.Error,
                                $"Invalid parameter for resistor: '{parameter.Image}'",
                                parameters.LineInfo));

                        return(null);
                    }
                }
            }

            return(res);
        }
        /// <summary>
        /// Generate resistor.
        /// </summary>
        /// <param name="name">Name of resistor to generate.</param>
        /// <param name="parameters">Parameters and pins for resistor.</param>
        /// <param name="context">Reading context.</param>
        /// <returns>
        /// A new instance of resistor.
        /// </returns>
        protected SpiceSharp.Components.Component GenerateRes(string name, ParameterCollection parameters, ICircuitContext context)
        {
            Resistor res = new Resistor(name);

            var dynamicParameter = parameters.FirstOrDefault(p => p.Image == "dynamic");

            if (dynamicParameter != null)
            {
                parameters.Remove(dynamicParameter);
            }

            bool isDynamic = dynamicParameter != null || context.Result?.SimulationConfiguration?.DynamicResistors == true;

            if (isDynamic)
            {
                context.SimulationPreparations.ExecuteTemperatureBehaviorBeforeLoad(res);
            }

            context.CreateNodes(res, parameters);

            if (parameters.Count == 3)
            {
                // RName Node1 Node2 something
                var something = parameters[2];

                // Check if something is a model name
                if ((something is WordParameter || something is IdentifierParameter) &&
                    context.ModelsRegistry.FindModel <ResistorModel>(parameters.Get(2).Image) != null)
                {
                    // RName Node1 Node2 modelName
                    context.Result.Validation.Add(new ValidationEntry(ValidationEntrySource.Reader,
                                                                      ValidationEntryLevel.Warning,
                                                                      $"R parameter needs to be specified", parameters.LineInfo));
                    return(null);
                }

                // Check if something can be resistance
                if (!(something is WordParameter ||
                      something is IdentifierParameter ||
                      something is ValueParameter ||
                      something is ExpressionParameter ||
                      (something is AssignmentParameter ap && (ap.Name.ToLower() == "r" || ap.Name.ToLower() == "resistance"))))
                {
                    context.Result.Validation.Add(new ValidationEntry(ValidationEntrySource.Reader,
                                                                      ValidationEntryLevel.Warning,
                                                                      $"Third parameter needs to represent resistance of resistor", parameters.LineInfo));
                    return(null);
                }

                // Set resistance
                if (something is AssignmentParameter asp)
                {
                    context.SetParameter(res, "resistance", asp, true, isDynamic);
                }
                else
                {
                    context.SetParameter(res, "resistance", something, true, isDynamic);
                }
            }
            else
            {
                var resistorParameters = new List <Parameter>(parameters.Skip(Resistor.ResistorPinCount).ToArray());

                // RName Node1 Node2 something param1 ...
                if (resistorParameters.Count == 0)
                {
                    context.Result.Validation.Add(new ValidationEntry(ValidationEntrySource.Reader,
                                                                      ValidationEntryLevel.Warning,
                                                                      $"Resistor doesn't have at least 3 parameters", parameters.LineInfo));
                    return(null);
                }

                var something = resistorParameters[0];

                // Check if something is a model name
                bool hasModelSyntax = (something is WordParameter || something is IdentifierParameter) &&
                                      context.ModelsRegistry.FindModel <ResistorModel>(something.Image) != null;
                bool hasTcParameter = parameters.Any(
                    p => p is AssignmentParameter ap && ap.Name.Equals(
                        "tc",
                        context.CaseSensitivity.IsEntityParameterNameCaseSensitive ? StringComparison.CurrentCulture : StringComparison.CurrentCultureIgnoreCase));

                AssignmentParameter tcParameter = null;

                if (hasTcParameter)
                {
                    tcParameter = (AssignmentParameter)parameters.Single(
                        p => p is AssignmentParameter ap && ap.Name.Equals(
                            "tc",
                            context.CaseSensitivity.IsEntityParameterNameCaseSensitive ? StringComparison.CurrentCulture : StringComparison.CurrentCultureIgnoreCase));
                    resistorParameters.Remove(tcParameter);
                }

                if (hasModelSyntax)
                {
                    var modelNameParameter = resistorParameters[0];

                    // Ignore tc parameter on resistor ...
                    context.SimulationPreparations.ExecuteActionBeforeSetup((simulation) =>
                    {
                        context.ModelsRegistry.SetModel(
                            res,
                            simulation,
                            modelNameParameter,
                            $"Could not find model {modelNameParameter} for resistor {name}",
                            (ResistorModel model) => res.Model = model.Name,
                            context.Result);
                    });

                    resistorParameters.RemoveAt(0);

                    if (resistorParameters.Count > 0 && (resistorParameters[0] is WordParameter ||
                                                         resistorParameters[0] is IdentifierParameter ||
                                                         resistorParameters[0] is ValueParameter ||
                                                         resistorParameters[0] is ExpressionParameter))
                    {
                        context.SetParameter(res, "resistance", resistorParameters[0].Image, true);
                        resistorParameters.RemoveAt(0);
                    }
                }
                else
                {
                    if (hasTcParameter)
                    {
                        var model = new ResistorModel(res.Name + "_default_model");
                        if (tcParameter.Values.Count == 2)
                        {
                            context.SetParameter(model, "tc1", tcParameter.Values[0]);
                            context.SetParameter(model, "tc2", tcParameter.Values[1]);
                        }
                        else
                        {
                            context.SetParameter(model, "tc1", tcParameter.Value);
                        }

                        context.ModelsRegistry.RegisterModelInstance(model);
                        res.Model = model.Name;
                        context.Result.AddEntity(model);
                    }

                    // Check if something can be resistance
                    var resistanceParameter = resistorParameters[0];

                    if (!(resistanceParameter is WordParameter ||
                          resistanceParameter is IdentifierParameter ||
                          resistanceParameter is ValueParameter ||
                          resistanceParameter is ExpressionParameter ||
                          (resistanceParameter is AssignmentParameter ap && !(ap.Name.ToLower() == "r" || ap.Name.ToLower() == "resistance"))))
                    {
                        context.Result.Validation.Add(new ValidationEntry(ValidationEntrySource.Reader,
                                                                          ValidationEntryLevel.Warning,
                                                                          $"Invalid value for resistance", parameters.LineInfo));
                        return(null);
                    }

                    if (resistanceParameter is AssignmentParameter asp)
                    {
                        context.SetParameter(res, "resistance", asp.Value, true, isDynamic);
                    }
                    else
                    {
                        context.SetParameter(res, "resistance", resistanceParameter.Image, true, isDynamic);
                    }

                    resistorParameters.RemoveAt(0);
                }

                foreach (var parameter in resistorParameters)
                {
                    if (parameter is AssignmentParameter ap)
                    {
                        try
                        {
                            context.SetParameter(res, ap.Name, ap.Value);
                        }
                        catch (Exception e)
                        {
                            context.Result.Validation.Add(new ValidationEntry(ValidationEntrySource.Reader,
                                                                              ValidationEntryLevel.Warning,
                                                                              $"Can't set parameter for resistor: '{parameter.Image}'", parameters.LineInfo));
                            return(null);
                        }
                    }
                    else
                    {
                        context.Result.Validation.Add(new ValidationEntry(ValidationEntrySource.Reader,
                                                                          ValidationEntryLevel.Warning,
                                                                          $"Invalid parameter for resistor: '{parameter.Image}'", parameters.LineInfo));
                        return(null);
                    }
                }
            }

            return(res);
        }