public void When_ParameterBracketWithMixedContentIsParsed_Expect_Reference()
        {
            var vectorTokens = new SpiceToken[]
            {
                new SpiceToken(SpiceTokenType.WORD, "d"),
                new SpiceToken(SpiceTokenType.DELIMITER, "("),
                new SpiceToken(SpiceTokenType.VALUE, "1"),
                new SpiceToken(SpiceTokenType.WORD, "tt"),
                new SpiceToken(SpiceTokenType.EQUAL, "="),
                new SpiceToken(SpiceTokenType.VALUE, "0.75ns"),
                new SpiceToken(SpiceTokenType.DELIMITER, ")"),
            };

            var parser = new ParseTreeGenerator(true);
            ParseTreeNonTerminalNode root = parser.GetParseTree(vectorTokens, Symbols.Parameter);

            var child = root.Children[0] as ParseTreeNonTerminalNode;

            Assert.NotNull(child);
            Assert.Equal(Symbols.ParameterBracket, child.Name);
            Assert.Equal(4, child.Children.Count);
            var parameters = (child.Children[2] as ParseTreeNonTerminalNode)?.Children[0] as ParseTreeNonTerminalNode;

            Assert.Equal(Symbols.Parameters, parameters?.Name);
            Assert.Equal(3, parameters?.Children.Count);
        }
        public void When_ParameterEqualWithFourArgumentsIsParsed_Expect_Reference()
        {
            var tokens = new SpiceToken[]
            {
                new SpiceToken(SpiceTokenType.WORD, "fun"),
                new SpiceToken(SpiceTokenType.DELIMITER, "("),
                new SpiceToken(SpiceTokenType.WORD, "out"),
                new SpiceToken(SpiceTokenType.COMMA, ","),
                new SpiceToken(SpiceTokenType.VALUE, "1"),
                new SpiceToken(SpiceTokenType.COMMA, ","),
                new SpiceToken(SpiceTokenType.VALUE, "1"),
                new SpiceToken(SpiceTokenType.COMMA, ","),
                new SpiceToken(SpiceTokenType.VALUE, "1"),
                new SpiceToken(SpiceTokenType.DELIMITER, ")"),
                new SpiceToken(SpiceTokenType.EQUAL, "="),
                new SpiceToken(SpiceTokenType.WORD, "12"),
            };

            var parser = new ParseTreeGenerator(true);
            ParseTreeNonTerminalNode root = parser.GetParseTree(tokens, Symbols.Parameter);
            var child = root.Children[0] as ParseTreeNonTerminalNode;

            Assert.NotNull(child);
            Assert.Equal(Symbols.ParameterEqual, child.Name);
            Assert.Equal(6, child.Children.Count);
        }
        public void When_ParameterBracketWithMultipleParameterEqualEdgeCaseIsParsed_Expect_Reference()
        {
            var tokens = new SpiceToken[]
            {
                new SpiceToken(SpiceTokenType.WORD, "D"),
                new SpiceToken(SpiceTokenType.DELIMITER, "("),
                new SpiceToken(SpiceTokenType.WORD, "Is"),
                new SpiceToken(SpiceTokenType.EQUAL, "="),
                new SpiceToken(SpiceTokenType.VALUE, "2.52e-9"),
                new SpiceToken(SpiceTokenType.WORD, "Rs"),
                new SpiceToken(SpiceTokenType.EQUAL, "="),
                new SpiceToken(SpiceTokenType.VALUE, "0.568"),
                new SpiceToken(SpiceTokenType.WORD, "N"),
                new SpiceToken(SpiceTokenType.EQUAL, "="),
                new SpiceToken(SpiceTokenType.VALUE, "1.752"),
                new SpiceToken(SpiceTokenType.WORD, "Cjo"),
                new SpiceToken(SpiceTokenType.EQUAL, "="),
                new SpiceToken(SpiceTokenType.VALUE, "4e-12"),
                new SpiceToken(SpiceTokenType.WORD, "M"),
                new SpiceToken(SpiceTokenType.EQUAL, "="),
                new SpiceToken(SpiceTokenType.VALUE, "0.4"),
                new SpiceToken(SpiceTokenType.WORD, "tt"),
                new SpiceToken(SpiceTokenType.EQUAL, "="),
                new SpiceToken(SpiceTokenType.VALUE, "20e-9"),
                new SpiceToken(SpiceTokenType.DELIMITER, ")"),
            };

            var parser = new ParseTreeGenerator(true);
            ParseTreeNonTerminalNode tree = parser.GetParseTree(tokens, Symbols.Parameter);

            var child = tree.Children[0] as ParseTreeNonTerminalNode;

            Assert.NotNull(child);
            Assert.Equal(Symbols.ParameterBracket, child.Name);
        }
        public void When_AssigmentParameterWithAssigmentParameters_Expect_Reference()
        {
            // Arrange
            var vectorTokens = new SpiceToken[]
            {
                new SpiceToken(SpiceTokenType.WORD, "v"),
                new SpiceToken(SpiceTokenType.DELIMITER, "("),
                new SpiceToken(SpiceTokenType.WORD, "n1"),
                new SpiceToken(SpiceTokenType.EQUAL, "="),
                new SpiceToken(SpiceTokenType.VALUE, "2"),
                new SpiceToken(SpiceTokenType.WORD, "n3"),
                new SpiceToken(SpiceTokenType.EQUAL, "="),
                new SpiceToken(SpiceTokenType.VALUE, "3"),
                new SpiceToken(SpiceTokenType.DELIMITER, ")"),
            };

            var parser = new ParseTreeGenerator(true);
            ParseTreeNonTerminalNode tree = parser.GetParseTree(vectorTokens, Symbols.Parameter);

            // Act
            ParseTreeEvaluator eval = new ParseTreeEvaluator();
            var spiceObject         = eval.Evaluate(tree);

            // Assert
            Assert.IsType <BracketParameter>(spiceObject);
            Assert.True(((BracketParameter)spiceObject).Name == "v");
            Assert.True(((BracketParameter)spiceObject).Parameters.Count == 2);
            Assert.True(((BracketParameter)spiceObject).Parameters[0] is AssignmentParameter);
            Assert.True(((BracketParameter)spiceObject).Parameters[1] is AssignmentParameter);
        }
        public void When_BracketParameterWithVector_Expect_Reference()
        {
            // Arrange
            var vectorTokens = new SpiceToken[]
            {
                new SpiceToken(SpiceTokenType.WORD, "v"),
                new SpiceToken(SpiceTokenType.DELIMITER, "("),
                new SpiceToken(SpiceTokenType.WORD, "out"),
                new SpiceToken(SpiceTokenType.COMMA, ","),
                new SpiceToken(SpiceTokenType.WORD, "0"),
                new SpiceToken(SpiceTokenType.DELIMITER, ")"),
            };

            var parser = new ParseTreeGenerator(true);
            ParseTreeNonTerminalNode tree = parser.GetParseTree(vectorTokens, Symbols.Parameter);

            // Act
            ParseTreeEvaluator eval = new ParseTreeEvaluator();
            var spiceObject         = eval.Evaluate(tree);

            // Assert
            Assert.IsType <BracketParameter>(spiceObject);
            Assert.True(((BracketParameter)spiceObject).Name == "v");
            Assert.True(((BracketParameter)spiceObject).Parameters.Count == 1);
            Assert.True(((BracketParameter)spiceObject).Parameters[0] is VectorParameter);
            Assert.True((((BracketParameter)spiceObject).Parameters[0] as VectorParameter).Elements.Count == 2);
        }
        public void When_Component_Expect_Reference()
        {
            // Arrange
            var vectorTokens = new SpiceToken[]
            {
                new SpiceToken(SpiceTokenType.WORD, "L1"),
                new SpiceToken(SpiceTokenType.VALUE, "5"),
                new SpiceToken(SpiceTokenType.VALUE, "3"),
                new SpiceToken(SpiceTokenType.VALUE, "3MH"),
            };

            var parser = new ParseTreeGenerator(true);
            ParseTreeNonTerminalNode tree = parser.GetParseTree(vectorTokens, Symbols.Component);

            // Act
            ParseTreeEvaluator eval = new ParseTreeEvaluator();
            var spiceObject         = eval.Evaluate(tree);

            // Assert
            Assert.IsType <Component>(spiceObject);
            Assert.True(((Component)spiceObject).Name == "L1");
            Assert.True(((Component)spiceObject).PinsAndParameters.Count == 3);
            Assert.True(((Component)spiceObject).PinsAndParameters[0] is ValueParameter);
            Assert.True(((Component)spiceObject).PinsAndParameters[1] is ValueParameter);
            Assert.True(((Component)spiceObject).PinsAndParameters[2] is ValueParameter);
        }
        public void When_AssigmentParameterWithVector_Expect_Reference()
        {
            // Arrange
            var vectorTokens = new SpiceToken[]
            {
                new SpiceToken(SpiceTokenType.WORD, "v"),
                new SpiceToken(SpiceTokenType.DELIMITER, "("),
                new SpiceToken(SpiceTokenType.WORD, "out"),
                new SpiceToken(SpiceTokenType.COMMA, ","),
                new SpiceToken(SpiceTokenType.WORD, "0"),
                new SpiceToken(SpiceTokenType.DELIMITER, ")"),
                new SpiceToken(SpiceTokenType.EQUAL, "="),
                new SpiceToken(SpiceTokenType.VALUE, "13"),
            };

            var parser = new ParseTreeGenerator(true);
            ParseTreeNonTerminalNode tree = parser.GetParseTree(vectorTokens, Symbols.Parameter);

            // Act
            ParseTreeEvaluator eval = new ParseTreeEvaluator();
            var spiceObject         = eval.Evaluate(tree);

            // Assert
            Assert.IsType <AssignmentParameter>(spiceObject);
            Assert.True(((AssignmentParameter)spiceObject).Name == "v");
            Assert.True(((AssignmentParameter)spiceObject).Arguments.Count == 2);
            Assert.True(((AssignmentParameter)spiceObject).Value == "13");
        }
        public void When_BracketWithSingeParameters_Expect_Reference()
        {
            // Arrange
            var vectorTokens = new SpiceToken[]
            {
                new SpiceToken(SpiceTokenType.WORD, "pulse"),
                new SpiceToken(SpiceTokenType.DELIMITER, "("),
                new SpiceToken(SpiceTokenType.VALUE, "1"),
                new SpiceToken(SpiceTokenType.VALUE, "2"),
                new SpiceToken(SpiceTokenType.VALUE, "3"),
                new SpiceToken(SpiceTokenType.DELIMITER, ")"),
            };

            var parser = new ParseTreeGenerator(true);
            ParseTreeNonTerminalNode tree = parser.GetParseTree(vectorTokens, Symbols.Parameter);

            // Act
            ParseTreeEvaluator eval = new ParseTreeEvaluator();
            var spiceObject         = eval.Evaluate(tree);

            // Assert
            Assert.IsType <BracketParameter>(spiceObject);
            Assert.True(((BracketParameter)spiceObject).Name == "pulse");
            Assert.True(((BracketParameter)spiceObject).Parameters[0] is SingleParameter);
            Assert.True(((BracketParameter)spiceObject).Parameters[1] is SingleParameter);
            Assert.True(((BracketParameter)spiceObject).Parameters[2] is SingleParameter);
        }
        public void When_NetlistHasNewlineAfterEnd_Expect_NoException()
        {
            var tokens = new SpiceToken[]
            {
                new SpiceToken(SpiceTokenType.END, ".end"),
                new SpiceToken(SpiceTokenType.NEWLINE, "\n"), new SpiceToken(SpiceTokenType.EOF, string.Empty),
            };

            var parser = new ParseTreeGenerator(true);
            ParseTreeNonTerminalNode root = parser.GetParseTree(tokens, Symbols.NetlistEnding);

            Assert.NotNull(root);
        }
        public void When_NetlistIsVerySimple_Expect_NoException()
        {
            var tokens = new SpiceToken[]
            {
                new SpiceToken(SpiceTokenType.TITLE, "Example of title"),
                new SpiceToken(SpiceTokenType.NEWLINE, "\n"),
                new SpiceToken(SpiceTokenType.END, ".end"),
                new SpiceToken(SpiceTokenType.EOF, null),
            };

            var parser = new ParseTreeGenerator(true);
            ParseTreeNonTerminalNode root = parser.GetParseTree(tokens, Symbols.Netlist);

            Assert.NotNull(root);
        }
Пример #11
0
        /// <summary>
        /// Parses a SPICE netlist and returns a SPICE model.
        /// </summary>
        /// <param name="tokens">SPICE netlist tokens.</param>
        /// <returns>
        /// A SPICE netlist model.
        /// </returns>
        public SpiceNetlist Parse(SpiceToken[] tokens)
        {
            if (tokens == null)
            {
                throw new ArgumentNullException(nameof(tokens));
            }

            VerifyTokens(tokens, Settings.IsEndRequired, Settings.IsNewlineRequired);

            ParseTreeNonTerminalNode parseTreeRoot = GetParseTree(
                tokens,
                Settings.Lexer.HasTitle ? Symbols.Netlist : Symbols.NetlistWithoutTitle,
                Settings.Lexer.IsDotStatementNameCaseSensitive);

            return(GetNetlistModelFromTree(parseTreeRoot));
        }
        public void When_ParameterBracketIsParsed_Expect_Reference()
        {
            var vectorTokens = new SpiceToken[]
            {
                new SpiceToken(SpiceTokenType.WORD, "D1"),
                new SpiceToken(SpiceTokenType.DELIMITER, "("),
                new SpiceToken(SpiceTokenType.WORD, "BF"),
                new SpiceToken(SpiceTokenType.DELIMITER, ")"),
            };

            var parser = new ParseTreeGenerator(true);
            ParseTreeNonTerminalNode tree = parser.GetParseTree(vectorTokens, Symbols.Parameter);

            var child = tree.Children[0] as ParseTreeNonTerminalNode;

            Assert.NotNull(child);
            Assert.Equal(Symbols.ParameterBracket, child.Name);
            Assert.Equal(4, child.Children.Count);
        }
        public void When_Vector_Expect_Reference()
        {
            // Arrange
            var vectorTokens = new SpiceToken[]
            {
                new SpiceToken(SpiceTokenType.VALUE, "1"),
                new SpiceToken(SpiceTokenType.COMMA, ","),
                new SpiceToken(SpiceTokenType.VALUE, "2"),
                new SpiceToken(SpiceTokenType.COMMA, ","),
                new SpiceToken(SpiceTokenType.VALUE, "3"),
            };

            var parser = new ParseTreeGenerator(true);
            ParseTreeNonTerminalNode tree = parser.GetParseTree(vectorTokens, Symbols.Vector);

            // Act
            ParseTreeEvaluator eval = new ParseTreeEvaluator();
            var spiceObject         = eval.Evaluate(tree) as VectorParameter;

            Assert.Equal(3, spiceObject.Elements.Count);
        }
        public void When_ParameterEqualWithoutArgumentIsParsed_Expect_Reference()
        {
            var tokens = new SpiceToken[]
            {
                new SpiceToken(SpiceTokenType.WORD, "v"),
                new SpiceToken(SpiceTokenType.EQUAL, "="),
                new SpiceToken(SpiceTokenType.VALUE, "12"),
            };

            var parser = new ParseTreeGenerator(true);
            ParseTreeNonTerminalNode root = parser.GetParseTree(tokens, Symbols.Parameter);

            var child = root.Children[0] as ParseTreeNonTerminalNode;

            Assert.NotNull(child);
            Assert.Equal(Symbols.ParameterEqual, child.Name);
            Assert.Single(child.Children);
            var paramater_equal_single = (root.Children[0] as ParseTreeNonTerminalNode).Children[0] as ParseTreeNonTerminalNode;

            Assert.NotNull(paramater_equal_single);
            Assert.Equal(Symbols.ParameterEqualSingle, paramater_equal_single.Name);
        }
        public void When_EmptyComment_Expect_NoException()
        {
            // Arrange
            var tokens = new SpiceToken[]
            {
                new SpiceToken(SpiceTokenType.TITLE, "Example of title"),
                new SpiceToken(SpiceTokenType.NEWLINE, "\n"),
                new SpiceToken(SpiceTokenType.COMMENT, "*"),
                new SpiceToken(SpiceTokenType.NEWLINE, "\n"),
                new SpiceToken(SpiceTokenType.END, ".end"),
                new SpiceToken(SpiceTokenType.EOF, null),
            };

            var parser = new ParseTreeGenerator(true);
            ParseTreeNonTerminalNode root = parser.GetParseTree(tokens, Symbols.Netlist);

            // Act
            ParseTreeEvaluator eval = new ParseTreeEvaluator();
            var spiceObject         = eval.Evaluate(root) as SpiceNetlist;

            Assert.NotNull(spiceObject);
        }
Пример #16
0
        /// <summary>
        /// Gets the netlist model.
        /// </summary>
        /// <param name="root">A parse tree root.</param>
        /// <returns>
        /// A netlist model.
        /// </returns>
        private SpiceNetlist GetNetlistModelFromTree(ParseTreeNonTerminalNode root)
        {
            var translator = new ParseTreeEvaluator();

            return(translator.Evaluate(root) as SpiceNetlist);
        }