pyVHDLModelTreesitter 0.7.1__tar.gz → 0.9.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pyvhdlmodeltreesitter-0.7.1 → pyvhdlmodeltreesitter-0.9.0}/.gitignore +2 -1
- {pyvhdlmodeltreesitter-0.7.1 → pyvhdlmodeltreesitter-0.9.0}/PKG-INFO +26 -21
- {pyvhdlmodeltreesitter-0.7.1 → pyvhdlmodeltreesitter-0.9.0}/README.md +9 -4
- {pyvhdlmodeltreesitter-0.7.1 → pyvhdlmodeltreesitter-0.9.0}/pyproject.toml +22 -23
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/Expression.py +37 -0
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/_Association.py +53 -0
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/_Base.py +154 -0
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/_Concurrent.py +239 -0
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/_Design.py +24 -0
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/_DesignUnit.py +427 -0
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/_Document.py +159 -0
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/_Interface.py +138 -0
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/_Name.py +20 -0
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/_Object.py +90 -0
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/_Sequential.py +172 -0
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/_Type.py +134 -0
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/__init__.py +14 -0
- {pyvhdlmodeltreesitter-0.7.1 → pyvhdlmodeltreesitter-0.9.0}/src/pyVHDLModelTreesitter/_parse.py +317 -141
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/_subtype_indication.py +169 -0
- pyvhdlmodeltreesitter-0.7.1/src/pyVHDLModelTreesitter/_errors.py → pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/error.py +37 -0
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/format.py +399 -0
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/__init__.py +9 -0
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/_generated_queries.py +193 -0
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/_protocol.py +65 -0
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/_query.py +117 -0
- {pyvhdlmodeltreesitter-0.7.1/src/pyVHDLModelTreesitter/treesitter → pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries}/_utils.py +2 -19
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/aggregate.scm +7 -0
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/bit_string_literal.scm +5 -0
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/component_declaration.scm +8 -0
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/concurrent_conditional_signal_assignment.scm +6 -0
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/constant_declaration.scm +13 -0
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/constrained_scalar.scm +17 -0
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/else_statement.scm +3 -0
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/enumeration_type_definition.scm +5 -0
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/if_elsif_statement.scm +18 -0
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/if_statement_block.scm +3 -0
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/physical_literal.scm +4 -0
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/process_statement.scm +10 -0
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/record_type_definition.scm +6 -0
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/signal_declaration.scm +13 -0
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/subtype_declaration.scm +4 -0
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/type_declaration.scm +13 -0
- pyvhdlmodeltreesitter-0.7.1/src/pyVHDLModelTreesitter/treesitter/queries/signal_declaration.scm → pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/variable_declaration.scm +2 -2
- pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files/wait_statement.scm +13 -0
- pyvhdlmodeltreesitter-0.7.1/src/pyVHDLModelTreesitter/Association.py +0 -104
- pyvhdlmodeltreesitter-0.7.1/src/pyVHDLModelTreesitter/Base.py +0 -205
- pyvhdlmodeltreesitter-0.7.1/src/pyVHDLModelTreesitter/Concurrent.py +0 -244
- pyvhdlmodeltreesitter-0.7.1/src/pyVHDLModelTreesitter/DesignUnit.py +0 -497
- pyvhdlmodeltreesitter-0.7.1/src/pyVHDLModelTreesitter/Expression.py +0 -651
- pyvhdlmodeltreesitter-0.7.1/src/pyVHDLModelTreesitter/Interface.py +0 -213
- pyvhdlmodeltreesitter-0.7.1/src/pyVHDLModelTreesitter/Name.py +0 -117
- pyvhdlmodeltreesitter-0.7.1/src/pyVHDLModelTreesitter/Object.py +0 -146
- pyvhdlmodeltreesitter-0.7.1/src/pyVHDLModelTreesitter/Symbol.py +0 -200
- pyvhdlmodeltreesitter-0.7.1/src/pyVHDLModelTreesitter/_Design.py +0 -55
- pyvhdlmodeltreesitter-0.7.1/src/pyVHDLModelTreesitter/_Document.py +0 -166
- pyvhdlmodeltreesitter-0.7.1/src/pyVHDLModelTreesitter/_Library.py +0 -46
- pyvhdlmodeltreesitter-0.7.1/src/pyVHDLModelTreesitter/__init__.py +0 -40
- pyvhdlmodeltreesitter-0.7.1/src/pyVHDLModelTreesitter/cli/__init__.py +0 -1
- pyvhdlmodeltreesitter-0.7.1/src/pyVHDLModelTreesitter/cli/_dump_treesitter_parse.py +0 -29
- pyvhdlmodeltreesitter-0.7.1/src/pyVHDLModelTreesitter/format.py +0 -68
- pyvhdlmodeltreesitter-0.7.1/src/pyVHDLModelTreesitter/treesitter/__init__.py +0 -25
- pyvhdlmodeltreesitter-0.7.1/src/pyVHDLModelTreesitter/treesitter/_base_class.py +0 -30
- pyvhdlmodeltreesitter-0.7.1/src/pyVHDLModelTreesitter/treesitter/queries/constant_declaration.scm +0 -10
- pyvhdlmodeltreesitter-0.7.1/src/pyVHDLModelTreesitter/treesitter/queries/ignorable_parentheses.scm +0 -11
- pyvhdlmodeltreesitter-0.7.1/src/pyVHDLModelTreesitter/treesitter/query.py +0 -236
- {pyvhdlmodeltreesitter-0.7.1 → pyvhdlmodeltreesitter-0.9.0}/LICENSE +0 -0
- {pyvhdlmodeltreesitter-0.7.1 → pyvhdlmodeltreesitter-0.9.0}/src/pyVHDLModelTreesitter/py.typed +0 -0
- {pyvhdlmodeltreesitter-0.7.1/src/pyVHDLModelTreesitter/treesitter/queries → pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files}/adding_expression.scm +0 -0
- {pyvhdlmodeltreesitter-0.7.1/src/pyVHDLModelTreesitter/treesitter/queries → pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files}/architecture_definition.scm +0 -0
- {pyvhdlmodeltreesitter-0.7.1/src/pyVHDLModelTreesitter/treesitter/queries → pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files}/association_element.scm +0 -0
- {pyvhdlmodeltreesitter-0.7.1/src/pyVHDLModelTreesitter/treesitter/queries → pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files}/association_elements.scm +0 -0
- {pyvhdlmodeltreesitter-0.7.1/src/pyVHDLModelTreesitter/treesitter/queries → pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files}/association_list_simple_range.scm +0 -0
- {pyvhdlmodeltreesitter-0.7.1/src/pyVHDLModelTreesitter/treesitter/queries → pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files}/component_instantiation_statement.scm +0 -0
- {pyvhdlmodeltreesitter-0.7.1/src/pyVHDLModelTreesitter/treesitter/queries → pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files}/concurrent_simple_signal_assignment.scm +0 -0
- {pyvhdlmodeltreesitter-0.7.1/src/pyVHDLModelTreesitter/treesitter/queries → pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files}/constrained_1d_array.scm +0 -0
- {pyvhdlmodeltreesitter-0.7.1/src/pyVHDLModelTreesitter/treesitter/queries → pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files}/design_units.scm +0 -0
- {pyvhdlmodeltreesitter-0.7.1/src/pyVHDLModelTreesitter/treesitter/queries → pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files}/entity_declaration.scm +0 -0
- {pyvhdlmodeltreesitter-0.7.1/src/pyVHDLModelTreesitter/treesitter/queries → pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files}/function_call.scm +0 -0
- {pyvhdlmodeltreesitter-0.7.1/src/pyVHDLModelTreesitter/treesitter/queries → pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files}/indexed_name.scm +0 -0
- {pyvhdlmodeltreesitter-0.7.1/src/pyVHDLModelTreesitter/treesitter/queries → pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files}/interface_declaration.scm +0 -0
- {pyvhdlmodeltreesitter-0.7.1/src/pyVHDLModelTreesitter/treesitter/queries → pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files}/interface_declarations.scm +0 -0
- {pyvhdlmodeltreesitter-0.7.1/src/pyVHDLModelTreesitter/treesitter/queries → pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files}/library_clauses.scm +0 -0
- {pyvhdlmodeltreesitter-0.7.1/src/pyVHDLModelTreesitter/treesitter/queries → pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files}/library_namespaces.scm +0 -0
- {pyvhdlmodeltreesitter-0.7.1/src/pyVHDLModelTreesitter/treesitter/queries → pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files}/logical_expression.scm +0 -0
- {pyvhdlmodeltreesitter-0.7.1/src/pyVHDLModelTreesitter/treesitter/queries → pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files}/multiplying_expression.scm +0 -0
- {pyvhdlmodeltreesitter-0.7.1/src/pyVHDLModelTreesitter/treesitter/queries → pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files}/package_declaration.scm +0 -0
- {pyvhdlmodeltreesitter-0.7.1/src/pyVHDLModelTreesitter/treesitter/queries → pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files}/package_definition.scm +0 -0
- {pyvhdlmodeltreesitter-0.7.1/src/pyVHDLModelTreesitter/treesitter/queries → pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files}/relational_expression.scm +0 -0
- {pyvhdlmodeltreesitter-0.7.1/src/pyVHDLModelTreesitter/treesitter/queries → pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files}/selected_names.scm +0 -0
- {pyvhdlmodeltreesitter-0.7.1/src/pyVHDLModelTreesitter/treesitter/queries → pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files}/shift_expression.scm +0 -0
- {pyvhdlmodeltreesitter-0.7.1/src/pyVHDLModelTreesitter/treesitter/queries → pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files}/simple_subtype.scm +0 -0
- {pyvhdlmodeltreesitter-0.7.1/src/pyVHDLModelTreesitter/treesitter/queries → pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files}/type_conversion.scm +0 -0
- {pyvhdlmodeltreesitter-0.7.1/src/pyVHDLModelTreesitter/treesitter/queries → pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files}/unary_expression.scm +0 -0
- {pyvhdlmodeltreesitter-0.7.1/src/pyVHDLModelTreesitter/treesitter/queries → pyvhdlmodeltreesitter-0.9.0/src/pyVHDLModelTreesitter/queries/query-files}/use_clauses.scm +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pyVHDLModelTreesitter
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.9.0
|
|
4
4
|
Summary: An implementation of pyVHDLModel using treesitter
|
|
5
5
|
Project-URL: Repository, https://gitlab.com/dawalters/pyVHDLModelTreesitter
|
|
6
6
|
Author: Dominic Adam Walters
|
|
@@ -16,26 +16,26 @@ Classifier: Programming Language :: Python :: 3.13
|
|
|
16
16
|
Classifier: Programming Language :: Python :: 3.14
|
|
17
17
|
Requires-Python: >=3.11
|
|
18
18
|
Requires-Dist: pygments>=2.20.0
|
|
19
|
-
Requires-Dist: pyvhdlmodel>=0.
|
|
19
|
+
Requires-Dist: pyvhdlmodel>=0.38.0
|
|
20
20
|
Requires-Dist: rich>=11.0.0
|
|
21
21
|
Requires-Dist: tree-sitter-vhdl>=1.2.5
|
|
22
22
|
Requires-Dist: tree-sitter>=0.23.0
|
|
23
23
|
Provides-Extra: dev
|
|
24
|
-
Requires-Dist: coverage
|
|
25
|
-
Requires-Dist: cryptography
|
|
26
|
-
Requires-Dist: hatch
|
|
27
|
-
Requires-Dist: idna
|
|
28
|
-
Requires-Dist: jaraco-context
|
|
29
|
-
Requires-Dist: mypy
|
|
30
|
-
Requires-Dist: pre-commit
|
|
31
|
-
Requires-Dist: pytest-cov
|
|
32
|
-
Requires-Dist: pytest-order
|
|
33
|
-
Requires-Dist: pytest-sugar
|
|
34
|
-
Requires-Dist: pytest-xdist
|
|
35
|
-
Requires-Dist: pytest
|
|
36
|
-
Requires-Dist: ruff
|
|
37
|
-
Requires-Dist: ty
|
|
38
|
-
Requires-Dist: uv
|
|
24
|
+
Requires-Dist: coverage>=7.15.2; extra == 'dev'
|
|
25
|
+
Requires-Dist: cryptography>=49.0.0; extra == 'dev'
|
|
26
|
+
Requires-Dist: hatch>=1.17.1; extra == 'dev'
|
|
27
|
+
Requires-Dist: idna>=3.18; extra == 'dev'
|
|
28
|
+
Requires-Dist: jaraco-context>=6.1.2; extra == 'dev'
|
|
29
|
+
Requires-Dist: mypy>=2.3.0; extra == 'dev'
|
|
30
|
+
Requires-Dist: pre-commit>=4.6.1; extra == 'dev'
|
|
31
|
+
Requires-Dist: pytest-cov>=7.1.0; extra == 'dev'
|
|
32
|
+
Requires-Dist: pytest-order>=1.5.0; extra == 'dev'
|
|
33
|
+
Requires-Dist: pytest-sugar>=1.1.1; extra == 'dev'
|
|
34
|
+
Requires-Dist: pytest-xdist>=3.8.0; extra == 'dev'
|
|
35
|
+
Requires-Dist: pytest>=9.1.1; extra == 'dev'
|
|
36
|
+
Requires-Dist: ruff>=0.16.1; extra == 'dev'
|
|
37
|
+
Requires-Dist: ty>=0.0.65; extra == 'dev'
|
|
38
|
+
Requires-Dist: uv>=0.12.0; extra == 'dev'
|
|
39
39
|
Description-Content-Type: text/markdown
|
|
40
40
|
|
|
41
41
|
# pyVHDLModelTreesitter
|
|
@@ -47,7 +47,8 @@ Description-Content-Type: text/markdown
|
|
|
47
47
|
[![Python Version][shield-python-version]][pyVHDLModelTreesitter-pypi]
|
|
48
48
|
|
|
49
49
|
`pyVHDLModelTreesitter` is an implementation of the
|
|
50
|
-
[`pyVHDLModel`][pyVHDLModel-github] API using
|
|
50
|
+
[`pyVHDLModel`][pyVHDLModel-github] API using
|
|
51
|
+
[`tree-sitter-vhdl`][tree-sitter-vhdl].
|
|
51
52
|
|
|
52
53
|
> Disclaimer: This project is in early development and only implements a
|
|
53
54
|
fraction of the features of [`pyVHDLModel`][pyVHDLModel-github].
|
|
@@ -69,9 +70,9 @@ You can download source releases from the
|
|
|
69
70
|
|
|
70
71
|
## Documentation
|
|
71
72
|
|
|
72
|
-
|
|
73
|
+
To parse a VHDL file:
|
|
73
74
|
|
|
74
|
-
```
|
|
75
|
+
```python
|
|
75
76
|
import pyVHDLModelTreesitter
|
|
76
77
|
|
|
77
78
|
document = pyVHDLModelTreesitter.Document.from_file("path/to/file.vhd")
|
|
@@ -80,7 +81,9 @@ document = pyVHDLModelTreesitter.Document.from_file("path/to/file.vhd")
|
|
|
80
81
|
`pyVHDLModelTreesitter.Document` is a subclass of
|
|
81
82
|
[`pyVHDLModel.Document`][pyVHDLModel-Document].
|
|
82
83
|
|
|
83
|
-
Detailed documentation is
|
|
84
|
+
Detailed documentation is available for [`pyVHDLModel`][pyVHDLModel-documentation].
|
|
85
|
+
|
|
86
|
+
A complete list of public API endpoints is in [DOCS.md](DOCS.md).
|
|
84
87
|
|
|
85
88
|
## Setup for Development
|
|
86
89
|
|
|
@@ -107,6 +110,7 @@ You can `make help` to see what actions are available.
|
|
|
107
110
|
|
|
108
111
|
[precommit-github]: https://github.com/pre-commit/pre-commit
|
|
109
112
|
[pyVHDLModel-Document]: https://vhdl.github.io/pyVHDLModel/pyVHDLModel/pyVHDLModel.html#pyVHDLModel.Document
|
|
113
|
+
[pyVHDLModel-documentation]: https://vhdl.github.io/pyVHDLModel
|
|
110
114
|
[pyVHDLModel-github]: https://github.com/VHDL/pyVHDLModel
|
|
111
115
|
[pyVHDLModelTreesitter-codecov]: https://codecov.io/gitlab/dawalters/pyVHDLModelTreesitter
|
|
112
116
|
[pyVHDLModelTreesitter-pipeline]: https://gitlab.com/dawalters/pyVHDLModelTreesitter/-/pipelines?page=1&scope=all&ref=develop
|
|
@@ -118,3 +122,4 @@ You can `make help` to see what actions are available.
|
|
|
118
122
|
[shield-python-version]: https://img.shields.io/pypi/pyversions/pyVHDLModelTreesitter
|
|
119
123
|
[shield-releases]: https://gitlab.com/dawalters/pyVHDLModelTreesitter/-/badges/release.svg
|
|
120
124
|
[shield-version]: https://img.shields.io/pypi/v/pyVHDLModelTreesitter
|
|
125
|
+
[tree-sitter-vhdl]: https://github.com/jpt13653903/tree-sitter-vhdl
|
|
@@ -7,7 +7,8 @@
|
|
|
7
7
|
[![Python Version][shield-python-version]][pyVHDLModelTreesitter-pypi]
|
|
8
8
|
|
|
9
9
|
`pyVHDLModelTreesitter` is an implementation of the
|
|
10
|
-
[`pyVHDLModel`][pyVHDLModel-github] API using
|
|
10
|
+
[`pyVHDLModel`][pyVHDLModel-github] API using
|
|
11
|
+
[`tree-sitter-vhdl`][tree-sitter-vhdl].
|
|
11
12
|
|
|
12
13
|
> Disclaimer: This project is in early development and only implements a
|
|
13
14
|
fraction of the features of [`pyVHDLModel`][pyVHDLModel-github].
|
|
@@ -29,9 +30,9 @@ You can download source releases from the
|
|
|
29
30
|
|
|
30
31
|
## Documentation
|
|
31
32
|
|
|
32
|
-
|
|
33
|
+
To parse a VHDL file:
|
|
33
34
|
|
|
34
|
-
```
|
|
35
|
+
```python
|
|
35
36
|
import pyVHDLModelTreesitter
|
|
36
37
|
|
|
37
38
|
document = pyVHDLModelTreesitter.Document.from_file("path/to/file.vhd")
|
|
@@ -40,7 +41,9 @@ document = pyVHDLModelTreesitter.Document.from_file("path/to/file.vhd")
|
|
|
40
41
|
`pyVHDLModelTreesitter.Document` is a subclass of
|
|
41
42
|
[`pyVHDLModel.Document`][pyVHDLModel-Document].
|
|
42
43
|
|
|
43
|
-
Detailed documentation is
|
|
44
|
+
Detailed documentation is available for [`pyVHDLModel`][pyVHDLModel-documentation].
|
|
45
|
+
|
|
46
|
+
A complete list of public API endpoints is in [DOCS.md](DOCS.md).
|
|
44
47
|
|
|
45
48
|
## Setup for Development
|
|
46
49
|
|
|
@@ -67,6 +70,7 @@ You can `make help` to see what actions are available.
|
|
|
67
70
|
|
|
68
71
|
[precommit-github]: https://github.com/pre-commit/pre-commit
|
|
69
72
|
[pyVHDLModel-Document]: https://vhdl.github.io/pyVHDLModel/pyVHDLModel/pyVHDLModel.html#pyVHDLModel.Document
|
|
73
|
+
[pyVHDLModel-documentation]: https://vhdl.github.io/pyVHDLModel
|
|
70
74
|
[pyVHDLModel-github]: https://github.com/VHDL/pyVHDLModel
|
|
71
75
|
[pyVHDLModelTreesitter-codecov]: https://codecov.io/gitlab/dawalters/pyVHDLModelTreesitter
|
|
72
76
|
[pyVHDLModelTreesitter-pipeline]: https://gitlab.com/dawalters/pyVHDLModelTreesitter/-/pipelines?page=1&scope=all&ref=develop
|
|
@@ -78,3 +82,4 @@ You can `make help` to see what actions are available.
|
|
|
78
82
|
[shield-python-version]: https://img.shields.io/pypi/pyversions/pyVHDLModelTreesitter
|
|
79
83
|
[shield-releases]: https://gitlab.com/dawalters/pyVHDLModelTreesitter/-/badges/release.svg
|
|
80
84
|
[shield-version]: https://img.shields.io/pypi/v/pyVHDLModelTreesitter
|
|
85
|
+
[tree-sitter-vhdl]: https://github.com/jpt13653903/tree-sitter-vhdl
|
|
@@ -4,16 +4,16 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "pyVHDLModelTreesitter"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.9.0"
|
|
8
8
|
description = "An implementation of pyVHDLModel using treesitter"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.11"
|
|
11
11
|
dependencies = [
|
|
12
|
-
"pyVHDLModel >= 0.
|
|
12
|
+
"pyVHDLModel >= 0.38.0",
|
|
13
13
|
"rich >= 11.0.0",
|
|
14
14
|
"pygments >= 2.20.0", # forced to avoid CVE
|
|
15
15
|
"tree-sitter >= 0.23.0",
|
|
16
|
-
"tree-sitter-vhdl >= 1.2.5",
|
|
16
|
+
"tree-sitter-vhdl >= 1.2.5", # TODO: move to 1.6.0 once released
|
|
17
17
|
]
|
|
18
18
|
authors = [
|
|
19
19
|
{ name = "Dominic Adam Walters" },
|
|
@@ -32,26 +32,23 @@ classifiers = [
|
|
|
32
32
|
|
|
33
33
|
[project.optional-dependencies]
|
|
34
34
|
dev = [
|
|
35
|
-
"coverage
|
|
36
|
-
"hatch
|
|
37
|
-
"cryptography
|
|
38
|
-
"idna
|
|
39
|
-
"jaraco-context
|
|
40
|
-
"mypy
|
|
41
|
-
"pre-commit
|
|
42
|
-
"pytest
|
|
43
|
-
"pytest-cov
|
|
44
|
-
"pytest-order
|
|
45
|
-
"pytest-sugar
|
|
46
|
-
"pytest-xdist
|
|
47
|
-
"ruff
|
|
48
|
-
"ty
|
|
49
|
-
"uv
|
|
35
|
+
"coverage >= 7.15.2",
|
|
36
|
+
"hatch >= 1.17.1",
|
|
37
|
+
"cryptography >= 49.0.0", # forced to avoid CVE
|
|
38
|
+
"idna >= 3.18", # forced to avoid CVE
|
|
39
|
+
"jaraco-context >= 6.1.2", # forced to avoid CVE
|
|
40
|
+
"mypy >= 2.3.0",
|
|
41
|
+
"pre-commit >= 4.6.1",
|
|
42
|
+
"pytest >= 9.1.1",
|
|
43
|
+
"pytest-cov >= 7.1.0",
|
|
44
|
+
"pytest-order >= 1.5.0",
|
|
45
|
+
"pytest-sugar >= 1.1.1",
|
|
46
|
+
"pytest-xdist >= 3.8.0",
|
|
47
|
+
"ruff >= 0.16.1",
|
|
48
|
+
"ty >= 0.0.65",
|
|
49
|
+
"uv >= 0.12.0",
|
|
50
50
|
]
|
|
51
51
|
|
|
52
|
-
[project.scripts]
|
|
53
|
-
dump-treesitter-parse = "pyVHDLModelTreesitter.cli._dump_treesitter_parse:main"
|
|
54
|
-
|
|
55
52
|
[project.urls]
|
|
56
53
|
Repository = "https://gitlab.com/dawalters/pyVHDLModelTreesitter"
|
|
57
54
|
|
|
@@ -92,12 +89,14 @@ dependencies = [
|
|
|
92
89
|
python = ["3.11", "3.12", "3.13", "3.14"]
|
|
93
90
|
|
|
94
91
|
[tool.mypy]
|
|
92
|
+
allow_redefinition = true
|
|
93
|
+
implicit_reexport = true
|
|
94
|
+
scripts_are_modules = true
|
|
95
95
|
strict = true
|
|
96
96
|
warn_unreachable = true
|
|
97
|
-
implicit_reexport = true
|
|
98
97
|
|
|
99
98
|
[tool.pytest.ini_options]
|
|
100
|
-
addopts = "--capture=fd -n
|
|
99
|
+
addopts = "--capture=fd -n auto --dist loadgroup --cov=pyVHDLModelTreesitter --cov-report html --cov-report xml --verbose --junitxml=.junit.xml -o junit_family=legacy"
|
|
101
100
|
norecursedirs = "oss/*"
|
|
102
101
|
testpaths = [
|
|
103
102
|
"tests",
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"""Submodule mirroring modified aspects of pyVHDLModel.Expression."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
__all__ = [
|
|
6
|
+
"FunctionCall",
|
|
7
|
+
]
|
|
8
|
+
|
|
9
|
+
from typing import TYPE_CHECKING
|
|
10
|
+
|
|
11
|
+
import pyVHDLModel
|
|
12
|
+
|
|
13
|
+
if TYPE_CHECKING:
|
|
14
|
+
from pyVHDLModel.Association import ParameterAssociationItem
|
|
15
|
+
from pyVHDLModel.Name import Name
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
#####################################
|
|
19
|
+
# Modified first order base classes #
|
|
20
|
+
#####################################
|
|
21
|
+
class FunctionCall(pyVHDLModel.Expression.FunctionCall): # ruff: ignore[undocumented-public-class]
|
|
22
|
+
# TODO: Report on pyVHDLModel that function calls are currently undefined
|
|
23
|
+
_name: Name
|
|
24
|
+
_arguments: list[ParameterAssociationItem]
|
|
25
|
+
|
|
26
|
+
def __init__( # ruff: ignore[undocumented-public-init]
|
|
27
|
+
self,
|
|
28
|
+
name: Name,
|
|
29
|
+
arguments: list[ParameterAssociationItem],
|
|
30
|
+
parent: pyVHDLModel.Base.ModelEntity | None = None,
|
|
31
|
+
) -> None:
|
|
32
|
+
super().__init__(parent)
|
|
33
|
+
self._name = name
|
|
34
|
+
self._arguments = arguments
|
|
35
|
+
|
|
36
|
+
def __str__(self) -> str: # ruff: ignore[undocumented-magic-method]
|
|
37
|
+
return f"{self._name}({', '.join(str(a) for a in self._arguments)})"
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"""Submodule defining parsers for classes from pyVHDLModel.Association."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
__all__ = [
|
|
6
|
+
"parse_association_item",
|
|
7
|
+
]
|
|
8
|
+
|
|
9
|
+
from typing import TYPE_CHECKING, TypeVar
|
|
10
|
+
|
|
11
|
+
from pyVHDLModel.Association import AssociationItem
|
|
12
|
+
from pyVHDLModel.Name import OpenName
|
|
13
|
+
from pyVHDLModel.Symbol import SignalSymbol
|
|
14
|
+
|
|
15
|
+
from pyVHDLModelTreesitter._Name import parse_name
|
|
16
|
+
from pyVHDLModelTreesitter.queries import AssociationElement
|
|
17
|
+
from pyVHDLModelTreesitter.queries._protocol import inject_node
|
|
18
|
+
from pyVHDLModelTreesitter.queries._utils import (
|
|
19
|
+
get_node,
|
|
20
|
+
get_node_text,
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
if TYPE_CHECKING:
|
|
24
|
+
import pyVHDLModel
|
|
25
|
+
import tree_sitter
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
T = TypeVar("T", bound=AssociationItem)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def parse_association_item(cls: type[T], node: tree_sitter.Node) -> T | None:
|
|
32
|
+
"""Create an AssociationItem from a tree-sitter node."""
|
|
33
|
+
captures = AssociationElement.capture_first_root(node)
|
|
34
|
+
formal_node = get_node(node, captures, "formal", optional=True)
|
|
35
|
+
formal = None
|
|
36
|
+
if formal_node is not None:
|
|
37
|
+
formal = SignalSymbol(parse_name(get_node_text(formal_node)))
|
|
38
|
+
actual_node = get_node(node, captures, "actual")
|
|
39
|
+
actual: pyVHDLModel.Base.ExpressionUnion
|
|
40
|
+
if actual_node.type == "OPEN":
|
|
41
|
+
actual = OpenName()
|
|
42
|
+
else:
|
|
43
|
+
# ruff: ignore[import-outside-top-level]
|
|
44
|
+
from pyVHDLModelTreesitter._parse import parse_conditional_expression
|
|
45
|
+
|
|
46
|
+
actual = parse_conditional_expression(actual_node)
|
|
47
|
+
if actual is None:
|
|
48
|
+
return None
|
|
49
|
+
# TODO: `formal` is a `SignalSymbol`, is this correct?
|
|
50
|
+
# TODO: `OpenName` might need wrapping in a `Symbol`
|
|
51
|
+
# ty: ignore[invalid-argument-type]
|
|
52
|
+
ret = cls(formal, actual) # type: ignore[arg-type]
|
|
53
|
+
return inject_node(ret, node)
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
"""Submodule defining parsers for classes from pyVHDLModel.Base."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
__all__ = [
|
|
6
|
+
"parse_direction",
|
|
7
|
+
"parse_mode",
|
|
8
|
+
"parse_simple_range",
|
|
9
|
+
"parse_waveform_element",
|
|
10
|
+
]
|
|
11
|
+
|
|
12
|
+
from typing import TYPE_CHECKING
|
|
13
|
+
|
|
14
|
+
import pyVHDLModel
|
|
15
|
+
from pyVHDLModel.Base import SimpleRange, WaveformElement
|
|
16
|
+
|
|
17
|
+
if TYPE_CHECKING:
|
|
18
|
+
from tree_sitter import Node
|
|
19
|
+
|
|
20
|
+
from pyVHDLModelTreesitter._parse import parse_simple_expression
|
|
21
|
+
from pyVHDLModelTreesitter.error import (
|
|
22
|
+
NodeExtraChildError,
|
|
23
|
+
NodeMissingChildError,
|
|
24
|
+
NodeTextIsInvalidError,
|
|
25
|
+
NodeTextIsNoneError,
|
|
26
|
+
NotImplementedWarning,
|
|
27
|
+
)
|
|
28
|
+
from pyVHDLModelTreesitter.queries._protocol import inject_node
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def parse_direction(string: str) -> pyVHDLModel.Base.Direction | None:
|
|
32
|
+
"""
|
|
33
|
+
Parse a string as a direction.
|
|
34
|
+
|
|
35
|
+
This will accept any mix of the following:
|
|
36
|
+
- Incorrect capitalisation
|
|
37
|
+
- "tO"
|
|
38
|
+
- "To"
|
|
39
|
+
- Split words with whitespace
|
|
40
|
+
- "down to"
|
|
41
|
+
"""
|
|
42
|
+
# TODO: make a PR on pyVHDLModel to add this
|
|
43
|
+
string = "".join(string.split()).lower().capitalize()
|
|
44
|
+
if string == "Downto":
|
|
45
|
+
string = "DownTo"
|
|
46
|
+
try:
|
|
47
|
+
return pyVHDLModel.Base.Direction[string]
|
|
48
|
+
except IndexError:
|
|
49
|
+
return None
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def parse_mode(string: str) -> pyVHDLModel.Base.Mode | None:
|
|
53
|
+
"""
|
|
54
|
+
Parse a string as a mode.
|
|
55
|
+
|
|
56
|
+
This will accept any mix of the following:
|
|
57
|
+
- Incorrect capitalisation
|
|
58
|
+
- "IN"
|
|
59
|
+
- "iN"
|
|
60
|
+
- "in"
|
|
61
|
+
- Split words with whitespace
|
|
62
|
+
- "in out"
|
|
63
|
+
"""
|
|
64
|
+
# TODO: make a PR on pyVHDLModel to add this
|
|
65
|
+
string = "".join(string.split()).lower().capitalize()
|
|
66
|
+
if string == "Inout":
|
|
67
|
+
string = "InOut"
|
|
68
|
+
try:
|
|
69
|
+
return pyVHDLModel.Base.Mode[string]
|
|
70
|
+
except IndexError:
|
|
71
|
+
return None
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def parse_simple_range(node: Node) -> SimpleRange | None: # ruff: ignore[complex-structure, too-many-branches]
|
|
75
|
+
"""
|
|
76
|
+
Create a SimpleRange from a treesitter node.
|
|
77
|
+
|
|
78
|
+
Raises
|
|
79
|
+
------
|
|
80
|
+
NodeExtraChildError:
|
|
81
|
+
If `node.children` does not have 2 elements.
|
|
82
|
+
NodeMissingChildError:
|
|
83
|
+
If `node.type` is not `simple_range`.
|
|
84
|
+
NodeTextIsInvalidError:
|
|
85
|
+
If the direction in `node` could not be parsed.
|
|
86
|
+
NodeTextIsNoneError:
|
|
87
|
+
If `node` or any relevant subnode doesn't define `text`.
|
|
88
|
+
|
|
89
|
+
"""
|
|
90
|
+
if node.type != "simple_range":
|
|
91
|
+
raise NodeMissingChildError(node, "simple_range")
|
|
92
|
+
if node.text is None or len(node.text) == 0:
|
|
93
|
+
raise NodeTextIsNoneError(node)
|
|
94
|
+
if len(node.children) != 3: # ruff: ignore[magic-value-comparison]
|
|
95
|
+
raise NodeExtraChildError(node, "all children", 3)
|
|
96
|
+
left = node.child(0)
|
|
97
|
+
if left is None:
|
|
98
|
+
raise NodeMissingChildError(node, "first-child")
|
|
99
|
+
if left.type != "simple_expression":
|
|
100
|
+
NotImplementedWarning.warn_child_type(left)
|
|
101
|
+
return None
|
|
102
|
+
if left.text is None or len(left.text) == 0:
|
|
103
|
+
raise NodeTextIsNoneError(left)
|
|
104
|
+
direction_node = node.child(1)
|
|
105
|
+
if direction_node is None:
|
|
106
|
+
raise NodeMissingChildError(node, "second-child")
|
|
107
|
+
if len(direction_node.type) == 0:
|
|
108
|
+
NotImplementedWarning.warn_child_type(direction_node)
|
|
109
|
+
return None
|
|
110
|
+
if direction_node.text is None or len(direction_node.text) == 0:
|
|
111
|
+
raise NodeTextIsNoneError(direction_node)
|
|
112
|
+
direction_str = direction_node.text.decode("utf-8")
|
|
113
|
+
right = node.child(2)
|
|
114
|
+
if right is None:
|
|
115
|
+
raise NodeMissingChildError(node, "third-child")
|
|
116
|
+
if right.type != "simple_expression":
|
|
117
|
+
NotImplementedWarning.warn_child_type(right)
|
|
118
|
+
return None
|
|
119
|
+
if right.text is None or len(right.text) == 0:
|
|
120
|
+
raise NodeTextIsNoneError(right)
|
|
121
|
+
left_expr = parse_simple_expression(left)
|
|
122
|
+
if left_expr is None:
|
|
123
|
+
return None
|
|
124
|
+
right_expr = parse_simple_expression(right)
|
|
125
|
+
if right_expr is None:
|
|
126
|
+
return None
|
|
127
|
+
direction = parse_direction(direction_str)
|
|
128
|
+
if direction is None:
|
|
129
|
+
raise NodeTextIsInvalidError(
|
|
130
|
+
node,
|
|
131
|
+
f"'{direction_str}' is not a valid VHDL direction",
|
|
132
|
+
)
|
|
133
|
+
return inject_node(SimpleRange(left_expr, right_expr, direction), node)
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def parse_waveform_element(node: Node) -> WaveformElement | None:
|
|
137
|
+
"""Create a WaveformElement from a treesitter node."""
|
|
138
|
+
if node.type != "waveform_element":
|
|
139
|
+
return None
|
|
140
|
+
simple_expression_node = None
|
|
141
|
+
for child in node.children:
|
|
142
|
+
if child.type == "simple_expression":
|
|
143
|
+
simple_expression_node = child
|
|
144
|
+
break
|
|
145
|
+
if simple_expression_node is None:
|
|
146
|
+
NotImplementedWarning.warn(
|
|
147
|
+
"waveform_element expects a 'simple_expression' child",
|
|
148
|
+
node,
|
|
149
|
+
)
|
|
150
|
+
return None
|
|
151
|
+
expression = parse_simple_expression(simple_expression_node)
|
|
152
|
+
if expression is None:
|
|
153
|
+
return None
|
|
154
|
+
return inject_node(WaveformElement(expression), node)
|