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.
Files changed (61) hide show
  1. {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/.gitignore +2 -0
  2. {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/PKG-INFO +1 -1
  3. {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/pyproject.toml +5 -1
  4. {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/Base.py +44 -0
  5. pyvhdlmodeltreesitter-0.7.0/src/pyVHDLModelTreesitter/Concurrent.py +243 -0
  6. {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/DesignUnit.py +35 -6
  7. {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/Expression.py +297 -0
  8. {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/Name.py +22 -0
  9. {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/Object.py +68 -3
  10. {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/Symbol.py +8 -0
  11. {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/_Document.py +11 -0
  12. {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/_parse.py +296 -40
  13. pyvhdlmodeltreesitter-0.7.0/src/pyVHDLModelTreesitter/cli/__init__.py +1 -0
  14. pyvhdlmodeltreesitter-0.7.0/src/pyVHDLModelTreesitter/cli/_dump_treesitter_parse.py +29 -0
  15. {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/__init__.py +2 -0
  16. {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/_utils.py +48 -0
  17. pyvhdlmodeltreesitter-0.7.0/src/pyVHDLModelTreesitter/treesitter/queries/component_instantiation_statement.scm +54 -0
  18. pyvhdlmodeltreesitter-0.7.0/src/pyVHDLModelTreesitter/treesitter/queries/concurrent_simple_signal_assignment.scm +6 -0
  19. {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/function_call.scm +3 -9
  20. pyvhdlmodeltreesitter-0.7.0/src/pyVHDLModelTreesitter/treesitter/queries/indexed_name.scm +8 -0
  21. pyvhdlmodeltreesitter-0.7.0/src/pyVHDLModelTreesitter/treesitter/queries/logical_expression.scm +5 -0
  22. pyvhdlmodeltreesitter-0.7.0/src/pyVHDLModelTreesitter/treesitter/queries/relational_expression.scm +5 -0
  23. pyvhdlmodeltreesitter-0.7.0/src/pyVHDLModelTreesitter/treesitter/queries/shift_expression.scm +5 -0
  24. pyvhdlmodeltreesitter-0.7.0/src/pyVHDLModelTreesitter/treesitter/queries/signal_declaration.scm +10 -0
  25. pyvhdlmodeltreesitter-0.7.0/src/pyVHDLModelTreesitter/treesitter/queries/type_conversion.scm +18 -0
  26. pyvhdlmodeltreesitter-0.7.0/src/pyVHDLModelTreesitter/treesitter/queries/unary_expression.scm +9 -0
  27. {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/query.py +28 -0
  28. pyvhdlmodeltreesitter-0.6.0/src/pyVHDLModelTreesitter/Concurrent.py +0 -110
  29. pyvhdlmodeltreesitter-0.6.0/src/pyVHDLModelTreesitter/treesitter/queries/component_instantiation_statement.scm +0 -18
  30. pyvhdlmodeltreesitter-0.6.0/src/pyVHDLModelTreesitter/treesitter/queries/type_conversion.scm +0 -30
  31. {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/LICENSE +0 -0
  32. {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/README.md +0 -0
  33. {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/Association.py +0 -0
  34. {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/Interface.py +0 -0
  35. {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/_Design.py +0 -0
  36. {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/_Library.py +0 -0
  37. {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/__init__.py +0 -0
  38. {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/_errors.py +0 -0
  39. {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/format.py +0 -0
  40. {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/py.typed +0 -0
  41. {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/_base_class.py +0 -0
  42. {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/adding_expression.scm +0 -0
  43. {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/architecture_definition.scm +0 -0
  44. {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/association_element.scm +0 -0
  45. {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/association_elements.scm +0 -0
  46. {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/association_list_simple_range.scm +0 -0
  47. {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/constant_declaration.scm +0 -0
  48. {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/constrained_1d_array.scm +0 -0
  49. {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/design_units.scm +0 -0
  50. {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/entity_declaration.scm +0 -0
  51. {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/ignorable_parentheses.scm +0 -0
  52. {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/interface_declaration.scm +0 -0
  53. {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/interface_declarations.scm +0 -0
  54. {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/library_clauses.scm +0 -0
  55. {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/library_namespaces.scm +0 -0
  56. {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/multiplying_expression.scm +0 -0
  57. {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/package_declaration.scm +0 -0
  58. {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/package_definition.scm +0 -0
  59. {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/selected_names.scm +0 -0
  60. {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/simple_subtype.scm +0 -0
  61. {pyvhdlmodeltreesitter-0.6.0 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/use_clauses.scm +0 -0
@@ -1,6 +1,8 @@
1
1
  /.coverage*
2
2
  /.htmlcov/
3
3
  /.junit.xml
4
+ /.opencode/node_modules/
5
+ /.opencode/package*.json
4
6
  /.token
5
7
  /.venv
6
8
  /dist/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyVHDLModelTreesitter
3
- Version: 0.6.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
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "pyVHDLModelTreesitter"
7
- version = "0.6.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"]
@@ -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
+ )
@@ -24,13 +24,17 @@ from pyVHDLModelTreesitter._errors import (
24
24
  NodeExtraChildError,
25
25
  NotImplementedWarning,
26
26
  )
27
- from pyVHDLModelTreesitter.Concurrent import EntityInstantiation
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
- EntityInstantiation.from_treesitter_node(statement_node),
203
+ ConcurrentSimpleSignalAssignment.from_treesitter_node(
204
+ statement_node,
205
+ ),
177
206
  )
178
207
  elif statement_node.type == "begin":
179
208
  continue