Beispiel #1
0
        public void When_Exponential_Expect_Reference()
        {
            var sweep    = new DecadeSweep(0.1, 100, 1);
            var expected = new[]
            {
                0.1,
                1,
                10,
                100
            };
            var index = 0;

            foreach (var c in sweep)
            {
                Assert.AreEqual(expected[index++], c, 1e-9);
            }
            Assert.AreEqual(index, expected.Length);
        }
Beispiel #2
0
        public void When_DecayingNegative_Expect_Reference()
        {
            var sweep    = new DecadeSweep(-100, -0.1, 1);
            var expected = new[]
            {
                -100,
                -10,
                -1,
                -0.1
            };
            var index = 0;

            foreach (var c in sweep)
            {
                Assert.AreEqual(expected[index++], c, 1e-9);
            }
            Assert.AreEqual(index, expected.Length);
        }
Beispiel #3
0
        private Noise CreateNoiseSimulation(string name, Control statement, ICircuitContext context)
        {
            Noise noise = null;

            // Check parameter count
            switch (statement.Parameters.Count)
            {
            case 0:
                context.Result.Validation.Add(new ValidationEntry(ValidationEntrySource.Reader, ValidationEntryLevel.Warning, "SpiceModel expected for .NOISE", statement.LineInfo));
                return(null);

            case 1:
                context.Result.Validation.Add(new ValidationEntry(ValidationEntrySource.Reader, ValidationEntryLevel.Warning, "Source expected", statement.LineInfo));
                return(null);

            case 2:
                context.Result.Validation.Add(new ValidationEntry(ValidationEntrySource.Reader, ValidationEntryLevel.Warning, "Step type expected", statement.LineInfo));
                return(null);

            case 3:
                context.Result.Validation.Add(new ValidationEntry(ValidationEntrySource.Reader, ValidationEntryLevel.Warning, "Number of points expected", statement.LineInfo));
                return(null);

            case 4:
                context.Result.Validation.Add(new ValidationEntry(ValidationEntrySource.Reader, ValidationEntryLevel.Warning, "Starting frequency expected", statement.LineInfo));
                return(null);

            case 5:
                context.Result.Validation.Add(new ValidationEntry(ValidationEntrySource.Reader, ValidationEntryLevel.Warning, "Stopping frequency expected", statement.LineInfo));
                return(null);

            case 6: break;

            case 7: break;

            default:
                context.Result.Validation.Add(new ValidationEntry(ValidationEntrySource.Reader, ValidationEntryLevel.Warning, "Too many parameters for .NOISE", statement.LineInfo));
                return(null);
            }

            string type        = statement.Parameters.Get(2).Image;
            var    numberSteps = context.Evaluator.EvaluateDouble(statement.Parameters.Get(3));
            var    start       = context.Evaluator.EvaluateDouble(statement.Parameters.Get(4));
            var    stop        = context.Evaluator.EvaluateDouble(statement.Parameters.Get(5));

            Sweep <double> sweep;

            switch (type)
            {
            case "lin": sweep = new LinearSweep(start, stop, (int)numberSteps); break;

            case "oct": sweep = new OctaveSweep(start, stop, (int)numberSteps); break;

            case "dec": sweep = new DecadeSweep(start, stop, (int)numberSteps); break;

            default:
                context.Result.Validation.Add(new ValidationEntry(ValidationEntrySource.Reader, ValidationEntryLevel.Warning, "LIN, DEC or OCT expected", statement.LineInfo));
                return(null);
            }

            // The first parameters needs to specify the output voltage
            if (statement.Parameters[0] is BracketParameter bracket)
            {
                if (bracket.Name.ToLower() == "v")
                {
                    switch (bracket.Parameters.Count)
                    {
                    // V(A, B) - V(vector)
                    // V(A) - V(singleParameter)
                    case 1:
                        if (bracket.Parameters[0] is VectorParameter v && v.Elements.Count == 2)
                        {
                            var output    = v.Elements[0].Image;
                            var reference = v.Elements[1].Image;
                            var input     = statement.Parameters[2].Image;
                            noise = new Noise(name, output, reference, input, sweep);
                        }
                        else if (bracket.Parameters[0] is SingleParameter s)
                        {
                            var output = s.Image;
                            var input  = statement.Parameters[1].Image;
                            noise = new Noise(name, output, input, sweep);
                        }

                        break;