pyVHDLModelTreesitter 0.5.2__tar.gz → 0.7.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.5.2 → pyvhdlmodeltreesitter-0.7.0}/.gitignore +2 -0
- {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/PKG-INFO +10 -10
- {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/pyproject.toml +18 -10
- {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/Association.py +9 -7
- {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/Base.py +50 -6
- pyvhdlmodeltreesitter-0.7.0/src/pyVHDLModelTreesitter/Concurrent.py +243 -0
- {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/DesignUnit.py +65 -36
- pyvhdlmodeltreesitter-0.7.0/src/pyVHDLModelTreesitter/Expression.py +651 -0
- {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/Interface.py +5 -5
- pyvhdlmodeltreesitter-0.7.0/src/pyVHDLModelTreesitter/Name.py +109 -0
- pyvhdlmodeltreesitter-0.7.0/src/pyVHDLModelTreesitter/Object.py +146 -0
- {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/Symbol.py +63 -21
- {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/_Design.py +2 -2
- {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/_Document.py +12 -1
- pyvhdlmodeltreesitter-0.7.0/src/pyVHDLModelTreesitter/_parse.py +633 -0
- pyvhdlmodeltreesitter-0.7.0/src/pyVHDLModelTreesitter/cli/__init__.py +1 -0
- pyvhdlmodeltreesitter-0.7.0/src/pyVHDLModelTreesitter/cli/_dump_treesitter_parse.py +29 -0
- {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/format.py +2 -2
- {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/__init__.py +2 -0
- {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/_base_class.py +2 -2
- {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/_utils.py +50 -2
- pyvhdlmodeltreesitter-0.7.0/src/pyVHDLModelTreesitter/treesitter/queries/association_list_simple_range.scm +6 -0
- pyvhdlmodeltreesitter-0.7.0/src/pyVHDLModelTreesitter/treesitter/queries/component_instantiation_statement.scm +54 -0
- pyvhdlmodeltreesitter-0.7.0/src/pyVHDLModelTreesitter/treesitter/queries/concurrent_simple_signal_assignment.scm +6 -0
- pyvhdlmodeltreesitter-0.7.0/src/pyVHDLModelTreesitter/treesitter/queries/constrained_1d_array.scm +17 -0
- {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/function_call.scm +3 -9
- pyvhdlmodeltreesitter-0.7.0/src/pyVHDLModelTreesitter/treesitter/queries/indexed_name.scm +8 -0
- {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/interface_declaration.scm +13 -1
- {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/interface_declarations.scm +3 -1
- pyvhdlmodeltreesitter-0.7.0/src/pyVHDLModelTreesitter/treesitter/queries/logical_expression.scm +5 -0
- pyvhdlmodeltreesitter-0.7.0/src/pyVHDLModelTreesitter/treesitter/queries/multiplying_expression.scm +11 -0
- pyvhdlmodeltreesitter-0.7.0/src/pyVHDLModelTreesitter/treesitter/queries/relational_expression.scm +5 -0
- pyvhdlmodeltreesitter-0.7.0/src/pyVHDLModelTreesitter/treesitter/queries/shift_expression.scm +5 -0
- pyvhdlmodeltreesitter-0.7.0/src/pyVHDLModelTreesitter/treesitter/queries/signal_declaration.scm +10 -0
- pyvhdlmodeltreesitter-0.7.0/src/pyVHDLModelTreesitter/treesitter/queries/type_conversion.scm +18 -0
- pyvhdlmodeltreesitter-0.7.0/src/pyVHDLModelTreesitter/treesitter/queries/unary_expression.scm +9 -0
- {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/query.py +33 -1
- pyvhdlmodeltreesitter-0.5.2/src/pyVHDLModelTreesitter/Concurrent.py +0 -110
- pyvhdlmodeltreesitter-0.5.2/src/pyVHDLModelTreesitter/Expression.py +0 -309
- pyvhdlmodeltreesitter-0.5.2/src/pyVHDLModelTreesitter/Name.py +0 -74
- pyvhdlmodeltreesitter-0.5.2/src/pyVHDLModelTreesitter/Object.py +0 -81
- pyvhdlmodeltreesitter-0.5.2/src/pyVHDLModelTreesitter/_parse.py +0 -375
- pyvhdlmodeltreesitter-0.5.2/src/pyVHDLModelTreesitter/treesitter/queries/component_instantiation_statement.scm +0 -18
- pyvhdlmodeltreesitter-0.5.2/src/pyVHDLModelTreesitter/treesitter/queries/concurrent_simple_signal_assignment.scm +0 -5
- pyvhdlmodeltreesitter-0.5.2/src/pyVHDLModelTreesitter/treesitter/queries/constrained_1d_array.scm +0 -27
- pyvhdlmodeltreesitter-0.5.2/src/pyVHDLModelTreesitter/treesitter/queries/multiplying_expression.scm +0 -5
- pyvhdlmodeltreesitter-0.5.2/src/pyVHDLModelTreesitter/treesitter/queries/type_conversion.scm +0 -30
- {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/LICENSE +0 -0
- {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/README.md +0 -0
- {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/_Library.py +0 -0
- {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/__init__.py +0 -0
- {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/_errors.py +0 -0
- {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/py.typed +0 -0
- {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/adding_expression.scm +0 -0
- {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/architecture_definition.scm +0 -0
- {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/association_element.scm +0 -0
- {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/association_elements.scm +0 -0
- {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/constant_declaration.scm +0 -0
- {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/design_units.scm +0 -0
- {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/entity_declaration.scm +0 -0
- {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/ignorable_parentheses.scm +0 -0
- {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/library_clauses.scm +0 -0
- {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/library_namespaces.scm +0 -0
- {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/package_declaration.scm +0 -0
- {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/package_definition.scm +0 -0
- {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/selected_names.scm +0 -0
- {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/simple_subtype.scm +0 -0
- {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/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.7.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
|
|
@@ -21,21 +21,21 @@ 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==7.
|
|
25
|
-
Requires-Dist: cryptography==
|
|
26
|
-
Requires-Dist: hatch==1.
|
|
27
|
-
Requires-Dist: idna==3.
|
|
24
|
+
Requires-Dist: coverage==7.15.0; extra == 'dev'
|
|
25
|
+
Requires-Dist: cryptography==49.0.0; extra == 'dev'
|
|
26
|
+
Requires-Dist: hatch==1.17.0; extra == 'dev'
|
|
27
|
+
Requires-Dist: idna==3.18; extra == 'dev'
|
|
28
28
|
Requires-Dist: jaraco-context==6.1.2; extra == 'dev'
|
|
29
29
|
Requires-Dist: mypy==2.1.0; extra == 'dev'
|
|
30
30
|
Requires-Dist: pre-commit==4.6.0; extra == 'dev'
|
|
31
31
|
Requires-Dist: pytest-cov==7.1.0; extra == 'dev'
|
|
32
|
-
Requires-Dist: pytest-order==1.
|
|
32
|
+
Requires-Dist: pytest-order==1.5.0; extra == 'dev'
|
|
33
33
|
Requires-Dist: pytest-sugar==1.1.1; extra == 'dev'
|
|
34
34
|
Requires-Dist: pytest-xdist==3.8.0; extra == 'dev'
|
|
35
|
-
Requires-Dist: pytest==9.
|
|
36
|
-
Requires-Dist: ruff==0.15.
|
|
37
|
-
Requires-Dist: ty==0.0.
|
|
38
|
-
Requires-Dist: uv==0.11.
|
|
35
|
+
Requires-Dist: pytest==9.1.1; extra == 'dev'
|
|
36
|
+
Requires-Dist: ruff==0.15.20; extra == 'dev'
|
|
37
|
+
Requires-Dist: ty==0.0.56; extra == 'dev'
|
|
38
|
+
Requires-Dist: uv==0.11.26; extra == 'dev'
|
|
39
39
|
Description-Content-Type: text/markdown
|
|
40
40
|
|
|
41
41
|
# pyVHDLModelTreesitter
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "pyVHDLModelTreesitter"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.7.0"
|
|
8
8
|
description = "An implementation of pyVHDLModel using treesitter"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.11"
|
|
@@ -32,23 +32,26 @@ classifiers = [
|
|
|
32
32
|
|
|
33
33
|
[project.optional-dependencies]
|
|
34
34
|
dev = [
|
|
35
|
-
"coverage == 7.
|
|
36
|
-
"hatch == 1.
|
|
37
|
-
"cryptography ==
|
|
38
|
-
"idna == 3.
|
|
35
|
+
"coverage == 7.15.0",
|
|
36
|
+
"hatch == 1.17.0",
|
|
37
|
+
"cryptography == 49.0.0", # forced to avoid CVE
|
|
38
|
+
"idna == 3.18", # forced to avoid CVE
|
|
39
39
|
"jaraco-context == 6.1.2", # forced to avoid CVE
|
|
40
40
|
"mypy == 2.1.0",
|
|
41
41
|
"pre-commit == 4.6.0",
|
|
42
|
-
"pytest == 9.
|
|
42
|
+
"pytest == 9.1.1",
|
|
43
43
|
"pytest-cov == 7.1.0",
|
|
44
|
-
"pytest-order == 1.
|
|
44
|
+
"pytest-order == 1.5.0",
|
|
45
45
|
"pytest-sugar == 1.1.1",
|
|
46
46
|
"pytest-xdist == 3.8.0",
|
|
47
|
-
"ruff == 0.15.
|
|
48
|
-
"ty == 0.0.
|
|
49
|
-
"uv == 0.11.
|
|
47
|
+
"ruff == 0.15.20",
|
|
48
|
+
"ty == 0.0.56",
|
|
49
|
+
"uv == 0.11.26",
|
|
50
50
|
]
|
|
51
51
|
|
|
52
|
+
[project.scripts]
|
|
53
|
+
dump-treesitter-parse = "pyVHDLModelTreesitter.cli._dump_treesitter_parse:main"
|
|
54
|
+
|
|
52
55
|
[project.urls]
|
|
53
56
|
Repository = "https://gitlab.com/dawalters/pyVHDLModelTreesitter"
|
|
54
57
|
|
|
@@ -102,6 +105,7 @@ testpaths = [
|
|
|
102
105
|
|
|
103
106
|
[tool.ruff]
|
|
104
107
|
unsafe-fixes = true
|
|
108
|
+
exclude = ["tests/examples/oss/open-logic"]
|
|
105
109
|
|
|
106
110
|
[tool.ruff.lint]
|
|
107
111
|
fixable = ["ALL"]
|
|
@@ -137,3 +141,7 @@ required-imports = ["from __future__ import annotations"]
|
|
|
137
141
|
[tool.ruff.lint.per-file-ignores]
|
|
138
142
|
"tests/**/*.py" = ["S101"]
|
|
139
143
|
"tests/examples/local/**/*.py" = ["D100", "D103", "INP001", "TID252"]
|
|
144
|
+
|
|
145
|
+
[tool.ty.rules]
|
|
146
|
+
all = "error"
|
|
147
|
+
missing-override-decorator = "ignore" # this is emitted for every dunder override
|
{pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/Association.py
RENAMED
|
@@ -22,8 +22,7 @@ from pyVHDLModel.Association import (
|
|
|
22
22
|
PortAssociationItem as pyVHDLModel_PortAssociationItem,
|
|
23
23
|
)
|
|
24
24
|
|
|
25
|
-
from pyVHDLModelTreesitter.
|
|
26
|
-
from pyVHDLModelTreesitter.Name import selected_or_simple_name
|
|
25
|
+
from pyVHDLModelTreesitter.Name import parse_name
|
|
27
26
|
from pyVHDLModelTreesitter.Symbol import SimpleObjectOrFunctionCallSymbol
|
|
28
27
|
from pyVHDLModelTreesitter.treesitter import (
|
|
29
28
|
TreesitterNodeMixin,
|
|
@@ -48,9 +47,12 @@ class AssociationItemMixin(TreesitterNodeMixin, pyVHDLModel_AssociationItem):
|
|
|
48
47
|
formal = None
|
|
49
48
|
if formal_node is not None:
|
|
50
49
|
formal = SimpleObjectOrFunctionCallSymbol(
|
|
51
|
-
|
|
50
|
+
parse_name(get_node_text(formal_node)),
|
|
52
51
|
)
|
|
53
52
|
actual_node = get_node(node, captures, "actual")
|
|
53
|
+
# ruff: ignore[import-outside-top-level]
|
|
54
|
+
from pyVHDLModelTreesitter._parse import parse_conditional_expression
|
|
55
|
+
|
|
54
56
|
actual = parse_conditional_expression(actual_node)
|
|
55
57
|
if actual is None:
|
|
56
58
|
return []
|
|
@@ -78,20 +80,20 @@ class AssociationItemMixin(TreesitterNodeMixin, pyVHDLModel_AssociationItem):
|
|
|
78
80
|
)
|
|
79
81
|
|
|
80
82
|
|
|
81
|
-
class AssociationItem(AssociationItemMixin): #
|
|
83
|
+
class AssociationItem(AssociationItemMixin): # ruff: ignore[undocumented-public-class]
|
|
82
84
|
pass
|
|
83
85
|
|
|
84
86
|
|
|
85
|
-
class GenericAssociationItem(AssociationItemMixin, pyVHDLModel_GenericAssociationItem): #
|
|
87
|
+
class GenericAssociationItem(AssociationItemMixin, pyVHDLModel_GenericAssociationItem): # ruff: ignore[undocumented-public-class]
|
|
86
88
|
pass
|
|
87
89
|
|
|
88
90
|
|
|
89
|
-
class ParameterAssociationItem( #
|
|
91
|
+
class ParameterAssociationItem( # ruff: ignore[undocumented-public-class]
|
|
90
92
|
AssociationItemMixin,
|
|
91
93
|
pyVHDLModel_ParameterAssociationItem,
|
|
92
94
|
):
|
|
93
95
|
pass
|
|
94
96
|
|
|
95
97
|
|
|
96
|
-
class PortAssociationItem(AssociationItemMixin, pyVHDLModel_PortAssociationItem): #
|
|
98
|
+
class PortAssociationItem(AssociationItemMixin, pyVHDLModel_PortAssociationItem): # ruff: ignore[undocumented-public-class]
|
|
97
99
|
pass
|
{pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/Base.py
RENAMED
|
@@ -4,11 +4,13 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
__all__ = [
|
|
6
6
|
"Range",
|
|
7
|
+
"WaveformElement",
|
|
7
8
|
]
|
|
8
9
|
|
|
9
10
|
from typing import TYPE_CHECKING, Self
|
|
10
11
|
|
|
11
12
|
import pyVHDLModel
|
|
13
|
+
from pyVHDLModel.Base import WaveformElement as VHDLModel_WaveformElement
|
|
12
14
|
|
|
13
15
|
if TYPE_CHECKING:
|
|
14
16
|
from tree_sitter import Node
|
|
@@ -67,9 +69,9 @@ def parse_as_mode(string: str) -> pyVHDLModel.Base.Mode | None:
|
|
|
67
69
|
return None
|
|
68
70
|
|
|
69
71
|
|
|
70
|
-
class Range(TreesitterNodeMixin, pyVHDLModel.Base.Range): #
|
|
72
|
+
class Range(TreesitterNodeMixin, pyVHDLModel.Base.Range): # ruff: ignore[undocumented-public-class]
|
|
71
73
|
@classmethod
|
|
72
|
-
def from_treesitter_node( #
|
|
74
|
+
def from_treesitter_node( # ruff: ignore[complex-structure, too-many-branches]
|
|
73
75
|
cls,
|
|
74
76
|
node: Node,
|
|
75
77
|
) -> Self | None:
|
|
@@ -92,7 +94,7 @@ class Range(TreesitterNodeMixin, pyVHDLModel.Base.Range): # noqa: D101
|
|
|
92
94
|
raise NodeMissingChildError(node, "simple_range")
|
|
93
95
|
if node.text is None or len(node.text) == 0:
|
|
94
96
|
raise NodeTextIsNoneError(node)
|
|
95
|
-
if len(node.children) != 3: #
|
|
97
|
+
if len(node.children) != 3: # ruff: ignore[magic-value-comparison]
|
|
96
98
|
raise NodeExtraChildError(node, "all children", 3)
|
|
97
99
|
left = node.child(0)
|
|
98
100
|
if left is None:
|
|
@@ -133,7 +135,7 @@ class Range(TreesitterNodeMixin, pyVHDLModel.Base.Range): # noqa: D101
|
|
|
133
135
|
)
|
|
134
136
|
return cls(left_expr, right_expr, direction, _treesitter_node=node)
|
|
135
137
|
|
|
136
|
-
def __eq__(self, other: object) -> bool: #
|
|
138
|
+
def __eq__(self, other: object) -> bool: # ruff: ignore[undocumented-magic-method]
|
|
137
139
|
if not isinstance(other, self.__class__):
|
|
138
140
|
return False
|
|
139
141
|
return (
|
|
@@ -142,7 +144,7 @@ class Range(TreesitterNodeMixin, pyVHDLModel.Base.Range): # noqa: D101
|
|
|
142
144
|
and self._direction == other._direction
|
|
143
145
|
)
|
|
144
146
|
|
|
145
|
-
def __hash__(self) -> int: #
|
|
147
|
+
def __hash__(self) -> int: # ruff: ignore[undocumented-magic-method]
|
|
146
148
|
return hash(
|
|
147
149
|
(
|
|
148
150
|
self._leftBound,
|
|
@@ -151,7 +153,7 @@ class Range(TreesitterNodeMixin, pyVHDLModel.Base.Range): # noqa: D101
|
|
|
151
153
|
),
|
|
152
154
|
)
|
|
153
155
|
|
|
154
|
-
def __repr__(self) -> str: #
|
|
156
|
+
def __repr__(self) -> str: # ruff: ignore[undocumented-magic-method]
|
|
155
157
|
return (
|
|
156
158
|
f"{self.__class__.__name__}("
|
|
157
159
|
f"_leftBound={self._leftBound!r}, "
|
|
@@ -159,3 +161,45 @@ class Range(TreesitterNodeMixin, pyVHDLModel.Base.Range): # noqa: D101
|
|
|
159
161
|
f"_direction={self._direction!r}, "
|
|
160
162
|
")"
|
|
161
163
|
)
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
class WaveformElement(TreesitterNodeMixin, VHDLModel_WaveformElement): # ruff: ignore[undocumented-public-class]
|
|
167
|
+
@classmethod
|
|
168
|
+
def from_treesitter_node(
|
|
169
|
+
cls,
|
|
170
|
+
node: Node,
|
|
171
|
+
) -> Self | None:
|
|
172
|
+
"""Create a WaveformElement from a treesitter node."""
|
|
173
|
+
if node.type != "waveform_element":
|
|
174
|
+
return None
|
|
175
|
+
simple_expression_node = None
|
|
176
|
+
for child in node.children:
|
|
177
|
+
if child.type == "simple_expression":
|
|
178
|
+
simple_expression_node = child
|
|
179
|
+
break
|
|
180
|
+
if simple_expression_node is None:
|
|
181
|
+
NotImplementedWarning.warn(
|
|
182
|
+
"waveform_element expects a 'simple_expression' child",
|
|
183
|
+
node,
|
|
184
|
+
)
|
|
185
|
+
return None
|
|
186
|
+
expression = parse_simple_expression(simple_expression_node)
|
|
187
|
+
if expression is None:
|
|
188
|
+
return None
|
|
189
|
+
return cls(expression, _treesitter_node=node)
|
|
190
|
+
|
|
191
|
+
def __eq__(self, other: object) -> bool: # ruff: ignore[undocumented-magic-method]
|
|
192
|
+
if not isinstance(other, self.__class__):
|
|
193
|
+
return False
|
|
194
|
+
return self._expression == other._expression and self._after == other._after # type: ignore[no-any-return]
|
|
195
|
+
|
|
196
|
+
def __hash__(self) -> int: # ruff: ignore[undocumented-magic-method]
|
|
197
|
+
return hash((self._expression, self._after))
|
|
198
|
+
|
|
199
|
+
def __repr__(self) -> str: # ruff: ignore[undocumented-magic-method]
|
|
200
|
+
return (
|
|
201
|
+
f"{self.__class__.__name__}("
|
|
202
|
+
f"_expression={self._expression!r}, "
|
|
203
|
+
f"_after={self._after!r}, "
|
|
204
|
+
")"
|
|
205
|
+
)
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
"""Submodule mirroring modified aspects of pyVHDLModel.Concurrent."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
__all__ = [
|
|
6
|
+
"ComponentInstantiation",
|
|
7
|
+
"ConcurrentSimpleSignalAssignment",
|
|
8
|
+
"EntityInstantiation",
|
|
9
|
+
]
|
|
10
|
+
|
|
11
|
+
from typing import TYPE_CHECKING, Any, Self
|
|
12
|
+
|
|
13
|
+
from pyVHDLModel.Concurrent import (
|
|
14
|
+
ComponentInstantiation as pyVHDLModel_ComponentInstantiation,
|
|
15
|
+
)
|
|
16
|
+
from pyVHDLModel.Concurrent import (
|
|
17
|
+
ConcurrentSimpleSignalAssignment as pyVHDLModel_ConcurrentSimpleSignalAssignment,
|
|
18
|
+
)
|
|
19
|
+
from pyVHDLModel.Concurrent import (
|
|
20
|
+
EntityInstantiation as pyVHDLModel_EntityInstantiation,
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
from pyVHDLModelTreesitter.Association import (
|
|
24
|
+
GenericAssociationItem,
|
|
25
|
+
PortAssociationItem,
|
|
26
|
+
)
|
|
27
|
+
from pyVHDLModelTreesitter.Base import WaveformElement
|
|
28
|
+
from pyVHDLModelTreesitter.Name import parse_name
|
|
29
|
+
from pyVHDLModelTreesitter.Symbol import (
|
|
30
|
+
ArchitectureSymbol,
|
|
31
|
+
ComponentInstantiationSymbol,
|
|
32
|
+
EntityInstantiationSymbol,
|
|
33
|
+
)
|
|
34
|
+
from pyVHDLModelTreesitter.treesitter import (
|
|
35
|
+
TreesitterNodeMixin,
|
|
36
|
+
get_node,
|
|
37
|
+
get_node_text,
|
|
38
|
+
get_nodes,
|
|
39
|
+
)
|
|
40
|
+
from pyVHDLModelTreesitter.treesitter.query import (
|
|
41
|
+
ComponentInstantiationStatement,
|
|
42
|
+
)
|
|
43
|
+
from pyVHDLModelTreesitter.treesitter.query import (
|
|
44
|
+
ConcurrentSimpleSignalAssignment as ConcurrentSimpleSignalAssignmentQuery,
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
if TYPE_CHECKING:
|
|
48
|
+
import tree_sitter
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def _parse_instantiation_common(
|
|
52
|
+
node: tree_sitter.Node,
|
|
53
|
+
captures: dict[str, list[tree_sitter.Node]],
|
|
54
|
+
) -> tuple[str, list[Any], list[Any]]:
|
|
55
|
+
label_node = get_node(node, captures, "label")
|
|
56
|
+
label = get_node_text(label_node)
|
|
57
|
+
generic_associations = []
|
|
58
|
+
for association_node in get_nodes(node, captures, "generics", optional=True):
|
|
59
|
+
generic_associations.extend(
|
|
60
|
+
GenericAssociationItem.from_treesitter_node(association_node),
|
|
61
|
+
)
|
|
62
|
+
port_associations = []
|
|
63
|
+
for association_node in get_nodes(node, captures, "ports", optional=True):
|
|
64
|
+
port_associations.extend(
|
|
65
|
+
PortAssociationItem.from_treesitter_node(association_node),
|
|
66
|
+
)
|
|
67
|
+
return label, generic_associations, port_associations
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
class ComponentInstantiation(TreesitterNodeMixin, pyVHDLModel_ComponentInstantiation): # ruff: ignore[undocumented-public-class]
|
|
71
|
+
@classmethod
|
|
72
|
+
def from_treesitter_node(
|
|
73
|
+
cls,
|
|
74
|
+
node: tree_sitter.Node,
|
|
75
|
+
) -> list[Self]:
|
|
76
|
+
"""Create one or more `ComponentInstantiation`s from a treesitter node."""
|
|
77
|
+
captures = ComponentInstantiationStatement.capture(node)
|
|
78
|
+
label, generic_associations, port_associations = _parse_instantiation_common(
|
|
79
|
+
node,
|
|
80
|
+
captures,
|
|
81
|
+
)
|
|
82
|
+
name_node = get_node(node, captures, "component_name")
|
|
83
|
+
component_symbol = ComponentInstantiationSymbol(
|
|
84
|
+
parse_name(get_node_text(name_node)),
|
|
85
|
+
)
|
|
86
|
+
return [
|
|
87
|
+
cls(
|
|
88
|
+
label=label,
|
|
89
|
+
componentSymbol=component_symbol,
|
|
90
|
+
genericAssociations=generic_associations,
|
|
91
|
+
portAssociations=port_associations,
|
|
92
|
+
_treesitter_node=node,
|
|
93
|
+
),
|
|
94
|
+
]
|
|
95
|
+
|
|
96
|
+
def __eq__(self, other: object) -> bool: # ruff: ignore[undocumented-magic-method]
|
|
97
|
+
if not isinstance(other, self.__class__):
|
|
98
|
+
return False
|
|
99
|
+
return (
|
|
100
|
+
self._label == other._label
|
|
101
|
+
and self._component == other._component
|
|
102
|
+
and self._genericAssociations == other._genericAssociations
|
|
103
|
+
and self._portAssociations == other._portAssociations
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
def __hash__(self) -> int: # ruff: ignore[undocumented-magic-method]
|
|
107
|
+
return hash(
|
|
108
|
+
(
|
|
109
|
+
self._label,
|
|
110
|
+
self._component,
|
|
111
|
+
self._genericAssociations,
|
|
112
|
+
self._portAssociations,
|
|
113
|
+
),
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
def __repr__(self) -> str: # ruff: ignore[undocumented-magic-method]
|
|
117
|
+
return (
|
|
118
|
+
f"{self.__class__.__name__}("
|
|
119
|
+
f"_label={self._label!r}, "
|
|
120
|
+
f"_component={self._component!r}, "
|
|
121
|
+
f"_genericAssociations={self._genericAssociations!r}, "
|
|
122
|
+
f"_portAssociations={self._portAssociations!r}, "
|
|
123
|
+
")"
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
class EntityInstantiation(TreesitterNodeMixin, pyVHDLModel_EntityInstantiation): # ruff: ignore[undocumented-public-class]
|
|
128
|
+
@classmethod
|
|
129
|
+
def from_treesitter_node(
|
|
130
|
+
cls,
|
|
131
|
+
node: tree_sitter.Node,
|
|
132
|
+
) -> list[Self]:
|
|
133
|
+
"""Create one or more `EntityInstantiation`s from a treesitter node."""
|
|
134
|
+
captures = ComponentInstantiationStatement.capture(node)
|
|
135
|
+
label, generic_associations, port_associations = _parse_instantiation_common(
|
|
136
|
+
node,
|
|
137
|
+
captures,
|
|
138
|
+
)
|
|
139
|
+
entity_str = ""
|
|
140
|
+
namespace_node = get_node(node, captures, "namespace", optional=True)
|
|
141
|
+
if namespace_node is not None:
|
|
142
|
+
entity_str = f"{get_node_text(namespace_node)}."
|
|
143
|
+
entity_node = get_node(node, captures, "entity")
|
|
144
|
+
entity_str += get_node_text(entity_node)
|
|
145
|
+
entity_symbol = EntityInstantiationSymbol(
|
|
146
|
+
parse_name(entity_str),
|
|
147
|
+
)
|
|
148
|
+
architecture_node = get_node(node, captures, "architecture", optional=True)
|
|
149
|
+
architecture_symbol = None
|
|
150
|
+
if architecture_node is not None:
|
|
151
|
+
architecture_symbol = ArchitectureSymbol(
|
|
152
|
+
parse_name(get_node_text(architecture_node)),
|
|
153
|
+
)
|
|
154
|
+
return [
|
|
155
|
+
cls(
|
|
156
|
+
label=label,
|
|
157
|
+
entitySymbol=entity_symbol,
|
|
158
|
+
architectureSymbol=architecture_symbol,
|
|
159
|
+
genericAssociations=generic_associations,
|
|
160
|
+
portAssociations=port_associations,
|
|
161
|
+
_treesitter_node=node,
|
|
162
|
+
),
|
|
163
|
+
]
|
|
164
|
+
|
|
165
|
+
def __eq__(self, other: object) -> bool: # ruff: ignore[undocumented-magic-method]
|
|
166
|
+
if not isinstance(other, self.__class__):
|
|
167
|
+
return False
|
|
168
|
+
return (
|
|
169
|
+
self._label == other._label
|
|
170
|
+
and self._entity == other._entity
|
|
171
|
+
and self._architecture == other._architecture
|
|
172
|
+
and self._genericAssociations == other._genericAssociations
|
|
173
|
+
and self._portAssociations == other._portAssociations
|
|
174
|
+
)
|
|
175
|
+
|
|
176
|
+
def __hash__(self) -> int: # ruff: ignore[undocumented-magic-method]
|
|
177
|
+
return hash(
|
|
178
|
+
(
|
|
179
|
+
self._label,
|
|
180
|
+
self._entity,
|
|
181
|
+
self._architecture,
|
|
182
|
+
self._genericAssociations,
|
|
183
|
+
self._portAssociations,
|
|
184
|
+
),
|
|
185
|
+
)
|
|
186
|
+
|
|
187
|
+
def __repr__(self) -> str: # ruff: ignore[undocumented-magic-method]
|
|
188
|
+
return (
|
|
189
|
+
f"{self.__class__.__name__}("
|
|
190
|
+
f"_label={self._label!r}, "
|
|
191
|
+
f"_entity={self._entity!r}, "
|
|
192
|
+
f"_architecture={self._architecture!r}, "
|
|
193
|
+
f"_genericAssociations={self._genericAssociations!r}, "
|
|
194
|
+
f"_portAssociations={self._portAssociations!r}, "
|
|
195
|
+
")"
|
|
196
|
+
)
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
class ConcurrentSimpleSignalAssignment( # ruff: ignore[undocumented-public-class]
|
|
200
|
+
TreesitterNodeMixin,
|
|
201
|
+
pyVHDLModel_ConcurrentSimpleSignalAssignment,
|
|
202
|
+
):
|
|
203
|
+
@classmethod
|
|
204
|
+
def from_treesitter_node(
|
|
205
|
+
cls,
|
|
206
|
+
node: tree_sitter.Node,
|
|
207
|
+
) -> list[Self]:
|
|
208
|
+
"""Create ConcurrentSimpleSignalAssignments from a treesitter node."""
|
|
209
|
+
captures = ConcurrentSimpleSignalAssignmentQuery.capture(node)
|
|
210
|
+
label_node = get_node(node, captures, "label", optional=True)
|
|
211
|
+
label = get_node_text(label_node) if label_node is not None else ""
|
|
212
|
+
target_node = get_node(node, captures, "lhs")
|
|
213
|
+
target = parse_name(get_node_text(target_node))
|
|
214
|
+
waveform_node = get_node(node, captures, "rhs")
|
|
215
|
+
waveform = [
|
|
216
|
+
we
|
|
217
|
+
for child in waveform_node.children
|
|
218
|
+
if child.type == "waveform_element"
|
|
219
|
+
for we in [WaveformElement.from_treesitter_node(child)]
|
|
220
|
+
if we is not None
|
|
221
|
+
]
|
|
222
|
+
return [cls(label, target, waveform, _treesitter_node=node)]
|
|
223
|
+
|
|
224
|
+
def __eq__(self, other: object) -> bool: # ruff: ignore[undocumented-magic-method]
|
|
225
|
+
if not isinstance(other, self.__class__):
|
|
226
|
+
return False
|
|
227
|
+
return (
|
|
228
|
+
self._label == other._label
|
|
229
|
+
and self._target == other._target
|
|
230
|
+
and self._waveform == other._waveform
|
|
231
|
+
)
|
|
232
|
+
|
|
233
|
+
def __hash__(self) -> int: # ruff: ignore[undocumented-magic-method]
|
|
234
|
+
return hash((self._label, self._target, tuple(self._waveform)))
|
|
235
|
+
|
|
236
|
+
def __repr__(self) -> str: # ruff: ignore[undocumented-magic-method]
|
|
237
|
+
return (
|
|
238
|
+
f"{self.__class__.__name__}("
|
|
239
|
+
f"_label={self._label!r}, "
|
|
240
|
+
f"_target={self._target!r}, "
|
|
241
|
+
f"_waveform={self._waveform!r}, "
|
|
242
|
+
")"
|
|
243
|
+
)
|