pyVHDLModelTreesitter 0.6.0__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.6.0 → pyvhdlmodeltreesitter-0.7.0}/.gitignore +2 -0
- {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/PKG-INFO +1 -1
- {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/pyproject.toml +5 -1
- {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/Base.py +44 -0
- pyvhdlmodeltreesitter-0.7.0/src/pyVHDLModelTreesitter/Concurrent.py +243 -0
- {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/DesignUnit.py +35 -6
- {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/Expression.py +297 -0
- {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/Name.py +22 -0
- {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/Object.py +68 -3
- {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/Symbol.py +8 -0
- {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/_Document.py +11 -0
- {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/_parse.py +296 -40
- 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.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/__init__.py +2 -0
- {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/_utils.py +48 -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.6.0 → 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.7.0/src/pyVHDLModelTreesitter/treesitter/queries/logical_expression.scm +5 -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.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/query.py +28 -0
- pyvhdlmodeltreesitter-0.6.0/src/pyVHDLModelTreesitter/Concurrent.py +0 -110
- pyvhdlmodeltreesitter-0.6.0/src/pyVHDLModelTreesitter/treesitter/queries/component_instantiation_statement.scm +0 -18
- pyvhdlmodeltreesitter-0.6.0/src/pyVHDLModelTreesitter/treesitter/queries/type_conversion.scm +0 -30
- {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/LICENSE +0 -0
- {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/README.md +0 -0
- {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/Association.py +0 -0
- {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/Interface.py +0 -0
- {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/_Design.py +0 -0
- {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/_Library.py +0 -0
- {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/__init__.py +0 -0
- {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/_errors.py +0 -0
- {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/format.py +0 -0
- {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/py.typed +0 -0
- {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/_base_class.py +0 -0
- {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/adding_expression.scm +0 -0
- {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/architecture_definition.scm +0 -0
- {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/association_element.scm +0 -0
- {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/association_elements.scm +0 -0
- {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/association_list_simple_range.scm +0 -0
- {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/constant_declaration.scm +0 -0
- {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/constrained_1d_array.scm +0 -0
- {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/design_units.scm +0 -0
- {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/entity_declaration.scm +0 -0
- {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/ignorable_parentheses.scm +0 -0
- {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/interface_declaration.scm +0 -0
- {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/interface_declarations.scm +0 -0
- {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/library_clauses.scm +0 -0
- {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/library_namespaces.scm +0 -0
- {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/multiplying_expression.scm +0 -0
- {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/package_declaration.scm +0 -0
- {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/package_definition.scm +0 -0
- {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/selected_names.scm +0 -0
- {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/simple_subtype.scm +0 -0
- {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/use_clauses.scm +0 -0
|
@@ -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"
|
|
@@ -49,6 +49,9 @@ dev = [
|
|
|
49
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"]
|
{pyvhdlmodeltreesitter-0.6.0 → 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
|
|
@@ -159,3 +161,45 @@ class Range(TreesitterNodeMixin, pyVHDLModel.Base.Range): # ruff: ignore[undocu
|
|
|
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
|
+
)
|
{pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/DesignUnit.py
RENAMED
|
@@ -24,13 +24,17 @@ from pyVHDLModelTreesitter._errors import (
|
|
|
24
24
|
NodeExtraChildError,
|
|
25
25
|
NotImplementedWarning,
|
|
26
26
|
)
|
|
27
|
-
from pyVHDLModelTreesitter.Concurrent import
|
|
27
|
+
from pyVHDLModelTreesitter.Concurrent import (
|
|
28
|
+
ComponentInstantiation,
|
|
29
|
+
ConcurrentSimpleSignalAssignment,
|
|
30
|
+
EntityInstantiation,
|
|
31
|
+
)
|
|
28
32
|
from pyVHDLModelTreesitter.Interface import (
|
|
29
33
|
GenericConstantInterfaceItem,
|
|
30
34
|
PortSignalInterfaceItem,
|
|
31
35
|
)
|
|
32
36
|
from pyVHDLModelTreesitter.Name import SimpleName, parse_name
|
|
33
|
-
from pyVHDLModelTreesitter.Object import Constant
|
|
37
|
+
from pyVHDLModelTreesitter.Object import Constant, Signal
|
|
34
38
|
from pyVHDLModelTreesitter.Symbol import (
|
|
35
39
|
EntitySymbol,
|
|
36
40
|
LibraryReferenceSymbol,
|
|
@@ -137,14 +141,16 @@ class UseClause(TreesitterNodeMixin, VHDLModel_UseClause): # ruff: ignore[undoc
|
|
|
137
141
|
return f"{self.__class__.__name__}(_symbols={self._symbols!r}, )"
|
|
138
142
|
|
|
139
143
|
|
|
140
|
-
Declarations = Constant
|
|
144
|
+
Declarations = Constant | Signal
|
|
141
145
|
|
|
142
146
|
|
|
143
147
|
def parse_declarations(node: tree_sitter.Node) -> list[Declarations]:
|
|
144
|
-
ret = []
|
|
148
|
+
ret: list[Declarations] = []
|
|
145
149
|
for child in node.children:
|
|
146
150
|
if child.type == "constant_declaration":
|
|
147
151
|
ret.extend(Constant.from_treesitter_node(child))
|
|
152
|
+
elif child.type == "signal_declaration":
|
|
153
|
+
ret.extend(Signal.from_treesitter_node(child))
|
|
148
154
|
elif child.type == "is":
|
|
149
155
|
continue
|
|
150
156
|
else:
|
|
@@ -152,6 +158,18 @@ def parse_declarations(node: tree_sitter.Node) -> list[Declarations]:
|
|
|
152
158
|
return ret
|
|
153
159
|
|
|
154
160
|
|
|
161
|
+
def _is_component_instantiation(node: tree_sitter.Node) -> bool:
|
|
162
|
+
"""Check if a component_instantiation_statement is a component instantiation."""
|
|
163
|
+
if node.child_by_field_name("component") is not None:
|
|
164
|
+
return True
|
|
165
|
+
for child in node.children:
|
|
166
|
+
if child.type != "instantiated_unit":
|
|
167
|
+
continue
|
|
168
|
+
if child.child_by_field_name("component") is not None:
|
|
169
|
+
return True
|
|
170
|
+
return False
|
|
171
|
+
|
|
172
|
+
|
|
155
173
|
class Architecture(TreesitterNodeMixin, VHDLModel_Architecture): # ruff: ignore[undocumented-public-class]
|
|
156
174
|
@classmethod
|
|
157
175
|
def from_treesitter_node(
|
|
@@ -169,11 +187,22 @@ class Architecture(TreesitterNodeMixin, VHDLModel_Architecture): # ruff: ignore
|
|
|
169
187
|
declarations_node = get_node(node, captures, "declarations")
|
|
170
188
|
declared_items = parse_declarations(declarations_node)
|
|
171
189
|
statements_node = get_node(node, captures, "statements")
|
|
172
|
-
statements = []
|
|
190
|
+
statements: list[Any] = []
|
|
173
191
|
for statement_node in statements_node.children:
|
|
174
192
|
if statement_node.type == "component_instantiation_statement":
|
|
193
|
+
if _is_component_instantiation(statement_node):
|
|
194
|
+
statements.extend(
|
|
195
|
+
ComponentInstantiation.from_treesitter_node(statement_node),
|
|
196
|
+
)
|
|
197
|
+
else:
|
|
198
|
+
statements.extend(
|
|
199
|
+
EntityInstantiation.from_treesitter_node(statement_node),
|
|
200
|
+
)
|
|
201
|
+
elif statement_node.type == "concurrent_simple_signal_assignment":
|
|
175
202
|
statements.extend(
|
|
176
|
-
|
|
203
|
+
ConcurrentSimpleSignalAssignment.from_treesitter_node(
|
|
204
|
+
statement_node,
|
|
205
|
+
),
|
|
177
206
|
)
|
|
178
207
|
elif statement_node.type == "begin":
|
|
179
208
|
continue
|