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.
Files changed (68) hide show
  1. {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/.gitignore +2 -0
  2. {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/PKG-INFO +10 -10
  3. {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/pyproject.toml +18 -10
  4. {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/Association.py +9 -7
  5. {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/Base.py +50 -6
  6. pyvhdlmodeltreesitter-0.7.0/src/pyVHDLModelTreesitter/Concurrent.py +243 -0
  7. {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/DesignUnit.py +65 -36
  8. pyvhdlmodeltreesitter-0.7.0/src/pyVHDLModelTreesitter/Expression.py +651 -0
  9. {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/Interface.py +5 -5
  10. pyvhdlmodeltreesitter-0.7.0/src/pyVHDLModelTreesitter/Name.py +109 -0
  11. pyvhdlmodeltreesitter-0.7.0/src/pyVHDLModelTreesitter/Object.py +146 -0
  12. {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/Symbol.py +63 -21
  13. {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/_Design.py +2 -2
  14. {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/_Document.py +12 -1
  15. pyvhdlmodeltreesitter-0.7.0/src/pyVHDLModelTreesitter/_parse.py +633 -0
  16. pyvhdlmodeltreesitter-0.7.0/src/pyVHDLModelTreesitter/cli/__init__.py +1 -0
  17. pyvhdlmodeltreesitter-0.7.0/src/pyVHDLModelTreesitter/cli/_dump_treesitter_parse.py +29 -0
  18. {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/format.py +2 -2
  19. {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/__init__.py +2 -0
  20. {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/_base_class.py +2 -2
  21. {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/_utils.py +50 -2
  22. pyvhdlmodeltreesitter-0.7.0/src/pyVHDLModelTreesitter/treesitter/queries/association_list_simple_range.scm +6 -0
  23. pyvhdlmodeltreesitter-0.7.0/src/pyVHDLModelTreesitter/treesitter/queries/component_instantiation_statement.scm +54 -0
  24. pyvhdlmodeltreesitter-0.7.0/src/pyVHDLModelTreesitter/treesitter/queries/concurrent_simple_signal_assignment.scm +6 -0
  25. pyvhdlmodeltreesitter-0.7.0/src/pyVHDLModelTreesitter/treesitter/queries/constrained_1d_array.scm +17 -0
  26. {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/function_call.scm +3 -9
  27. pyvhdlmodeltreesitter-0.7.0/src/pyVHDLModelTreesitter/treesitter/queries/indexed_name.scm +8 -0
  28. {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/interface_declaration.scm +13 -1
  29. {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/interface_declarations.scm +3 -1
  30. pyvhdlmodeltreesitter-0.7.0/src/pyVHDLModelTreesitter/treesitter/queries/logical_expression.scm +5 -0
  31. pyvhdlmodeltreesitter-0.7.0/src/pyVHDLModelTreesitter/treesitter/queries/multiplying_expression.scm +11 -0
  32. pyvhdlmodeltreesitter-0.7.0/src/pyVHDLModelTreesitter/treesitter/queries/relational_expression.scm +5 -0
  33. pyvhdlmodeltreesitter-0.7.0/src/pyVHDLModelTreesitter/treesitter/queries/shift_expression.scm +5 -0
  34. pyvhdlmodeltreesitter-0.7.0/src/pyVHDLModelTreesitter/treesitter/queries/signal_declaration.scm +10 -0
  35. pyvhdlmodeltreesitter-0.7.0/src/pyVHDLModelTreesitter/treesitter/queries/type_conversion.scm +18 -0
  36. pyvhdlmodeltreesitter-0.7.0/src/pyVHDLModelTreesitter/treesitter/queries/unary_expression.scm +9 -0
  37. {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/query.py +33 -1
  38. pyvhdlmodeltreesitter-0.5.2/src/pyVHDLModelTreesitter/Concurrent.py +0 -110
  39. pyvhdlmodeltreesitter-0.5.2/src/pyVHDLModelTreesitter/Expression.py +0 -309
  40. pyvhdlmodeltreesitter-0.5.2/src/pyVHDLModelTreesitter/Name.py +0 -74
  41. pyvhdlmodeltreesitter-0.5.2/src/pyVHDLModelTreesitter/Object.py +0 -81
  42. pyvhdlmodeltreesitter-0.5.2/src/pyVHDLModelTreesitter/_parse.py +0 -375
  43. pyvhdlmodeltreesitter-0.5.2/src/pyVHDLModelTreesitter/treesitter/queries/component_instantiation_statement.scm +0 -18
  44. pyvhdlmodeltreesitter-0.5.2/src/pyVHDLModelTreesitter/treesitter/queries/concurrent_simple_signal_assignment.scm +0 -5
  45. pyvhdlmodeltreesitter-0.5.2/src/pyVHDLModelTreesitter/treesitter/queries/constrained_1d_array.scm +0 -27
  46. pyvhdlmodeltreesitter-0.5.2/src/pyVHDLModelTreesitter/treesitter/queries/multiplying_expression.scm +0 -5
  47. pyvhdlmodeltreesitter-0.5.2/src/pyVHDLModelTreesitter/treesitter/queries/type_conversion.scm +0 -30
  48. {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/LICENSE +0 -0
  49. {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/README.md +0 -0
  50. {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/_Library.py +0 -0
  51. {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/__init__.py +0 -0
  52. {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/_errors.py +0 -0
  53. {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/py.typed +0 -0
  54. {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/adding_expression.scm +0 -0
  55. {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/architecture_definition.scm +0 -0
  56. {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/association_element.scm +0 -0
  57. {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/association_elements.scm +0 -0
  58. {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/constant_declaration.scm +0 -0
  59. {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/design_units.scm +0 -0
  60. {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/entity_declaration.scm +0 -0
  61. {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/ignorable_parentheses.scm +0 -0
  62. {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/library_clauses.scm +0 -0
  63. {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/library_namespaces.scm +0 -0
  64. {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/package_declaration.scm +0 -0
  65. {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/package_definition.scm +0 -0
  66. {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/selected_names.scm +0 -0
  67. {pyvhdlmodeltreesitter-0.5.2 → pyvhdlmodeltreesitter-0.7.0}/src/pyVHDLModelTreesitter/treesitter/queries/simple_subtype.scm +0 -0
  68. {pyvhdlmodeltreesitter-0.5.2 → 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.5.2
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.14.0; extra == 'dev'
25
- Requires-Dist: cryptography==48.0.0; extra == 'dev'
26
- Requires-Dist: hatch==1.16.5; extra == 'dev'
27
- Requires-Dist: idna==3.16; extra == 'dev'
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.4.0; extra == 'dev'
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.0.3; extra == 'dev'
36
- Requires-Dist: ruff==0.15.14; extra == 'dev'
37
- Requires-Dist: ty==0.0.39; extra == 'dev'
38
- Requires-Dist: uv==0.11.16; extra == 'dev'
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.5.2"
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.14.0",
36
- "hatch == 1.16.5",
37
- "cryptography == 48.0.0", # forced to avoid CVE
38
- "idna == 3.16", # forced to avoid CVE
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.0.3",
42
+ "pytest == 9.1.1",
43
43
  "pytest-cov == 7.1.0",
44
- "pytest-order == 1.4.0",
44
+ "pytest-order == 1.5.0",
45
45
  "pytest-sugar == 1.1.1",
46
46
  "pytest-xdist == 3.8.0",
47
- "ruff == 0.15.14",
48
- "ty == 0.0.39",
49
- "uv == 0.11.16",
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
@@ -22,8 +22,7 @@ from pyVHDLModel.Association import (
22
22
  PortAssociationItem as pyVHDLModel_PortAssociationItem,
23
23
  )
24
24
 
25
- from pyVHDLModelTreesitter._parse import parse_conditional_expression
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
- selected_or_simple_name(get_node_text(formal_node)),
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): # noqa: D101
83
+ class AssociationItem(AssociationItemMixin): # ruff: ignore[undocumented-public-class]
82
84
  pass
83
85
 
84
86
 
85
- class GenericAssociationItem(AssociationItemMixin, pyVHDLModel_GenericAssociationItem): # noqa: D101
87
+ class GenericAssociationItem(AssociationItemMixin, pyVHDLModel_GenericAssociationItem): # ruff: ignore[undocumented-public-class]
86
88
  pass
87
89
 
88
90
 
89
- class ParameterAssociationItem( # noqa: D101
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): # noqa: D101
98
+ class PortAssociationItem(AssociationItemMixin, pyVHDLModel_PortAssociationItem): # ruff: ignore[undocumented-public-class]
97
99
  pass
@@ -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): # noqa: D101
72
+ class Range(TreesitterNodeMixin, pyVHDLModel.Base.Range): # ruff: ignore[undocumented-public-class]
71
73
  @classmethod
72
- def from_treesitter_node( # noqa: C901, PLR0912
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: # noqa: PLR2004
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: # noqa: D105
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: # noqa: D105
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: # noqa: D105
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
+ )