pyVHDLModel 0.34.0__tar.gz → 0.35.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 (35) hide show
  1. {pyvhdlmodel-0.34.0 → pyvhdlmodel-0.35.0}/PKG-INFO +24 -23
  2. {pyvhdlmodel-0.34.0 → pyvhdlmodel-0.35.0}/README.md +3 -2
  3. {pyvhdlmodel-0.34.0 → pyvhdlmodel-0.35.0}/pyVHDLModel/Base.py +44 -4
  4. {pyvhdlmodel-0.34.0 → pyvhdlmodel-0.35.0}/pyVHDLModel/Concurrent.py +24 -24
  5. {pyvhdlmodel-0.34.0 → pyvhdlmodel-0.35.0}/pyVHDLModel/Declaration.py +3 -3
  6. {pyvhdlmodel-0.34.0 → pyvhdlmodel-0.35.0}/pyVHDLModel/DesignUnit.py +15 -52
  7. {pyvhdlmodel-0.34.0 → pyvhdlmodel-0.35.0}/pyVHDLModel/Expression.py +12 -12
  8. {pyvhdlmodel-0.34.0 → pyvhdlmodel-0.35.0}/pyVHDLModel/Instantiation.py +1 -1
  9. {pyvhdlmodel-0.34.0 → pyvhdlmodel-0.35.0}/pyVHDLModel/Interface.py +163 -13
  10. {pyvhdlmodel-0.34.0 → pyvhdlmodel-0.35.0}/pyVHDLModel/Name.py +7 -7
  11. {pyvhdlmodel-0.34.0 → pyvhdlmodel-0.35.0}/pyVHDLModel/Object.py +5 -5
  12. {pyvhdlmodel-0.34.0 → pyvhdlmodel-0.35.0}/pyVHDLModel/Sequential.py +22 -22
  13. {pyvhdlmodel-0.34.0 → pyvhdlmodel-0.35.0}/pyVHDLModel/Subprogram.py +5 -5
  14. {pyvhdlmodel-0.34.0 → pyvhdlmodel-0.35.0}/pyVHDLModel/Type.py +14 -14
  15. {pyvhdlmodel-0.34.0 → pyvhdlmodel-0.35.0}/pyVHDLModel/__init__.py +253 -48
  16. {pyvhdlmodel-0.34.0 → pyvhdlmodel-0.35.0}/pyVHDLModel.egg-info/PKG-INFO +24 -23
  17. {pyvhdlmodel-0.34.0 → pyvhdlmodel-0.35.0}/pyVHDLModel.egg-info/requires.txt +20 -20
  18. {pyvhdlmodel-0.34.0 → pyvhdlmodel-0.35.0}/LICENSE.md +0 -0
  19. {pyvhdlmodel-0.34.0 → pyvhdlmodel-0.35.0}/pyVHDLModel/Association.py +0 -0
  20. {pyvhdlmodel-0.34.0 → pyvhdlmodel-0.35.0}/pyVHDLModel/Common.py +0 -0
  21. {pyvhdlmodel-0.34.0 → pyvhdlmodel-0.35.0}/pyVHDLModel/Exception.py +0 -0
  22. {pyvhdlmodel-0.34.0 → pyvhdlmodel-0.35.0}/pyVHDLModel/IEEE.py +0 -0
  23. {pyvhdlmodel-0.34.0 → pyvhdlmodel-0.35.0}/pyVHDLModel/Namespace.py +0 -0
  24. {pyvhdlmodel-0.34.0 → pyvhdlmodel-0.35.0}/pyVHDLModel/PSLModel.py +0 -0
  25. {pyvhdlmodel-0.34.0 → pyvhdlmodel-0.35.0}/pyVHDLModel/Predefined.py +0 -0
  26. {pyvhdlmodel-0.34.0 → pyvhdlmodel-0.35.0}/pyVHDLModel/Regions.py +0 -0
  27. {pyvhdlmodel-0.34.0 → pyvhdlmodel-0.35.0}/pyVHDLModel/STD.py +0 -0
  28. {pyvhdlmodel-0.34.0 → pyvhdlmodel-0.35.0}/pyVHDLModel/Symbol.py +0 -0
  29. {pyvhdlmodel-0.34.0 → pyvhdlmodel-0.35.0}/pyVHDLModel/py.typed +0 -0
  30. {pyvhdlmodel-0.34.0 → pyvhdlmodel-0.35.0}/pyVHDLModel.egg-info/SOURCES.txt +0 -0
  31. {pyvhdlmodel-0.34.0 → pyvhdlmodel-0.35.0}/pyVHDLModel.egg-info/dependency_links.txt +0 -0
  32. {pyvhdlmodel-0.34.0 → pyvhdlmodel-0.35.0}/pyVHDLModel.egg-info/top_level.txt +0 -0
  33. {pyvhdlmodel-0.34.0 → pyvhdlmodel-0.35.0}/pyproject.toml +0 -0
  34. {pyvhdlmodel-0.34.0 → pyvhdlmodel-0.35.0}/setup.cfg +0 -0
  35. {pyvhdlmodel-0.34.0 → pyvhdlmodel-0.35.0}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyVHDLModel
3
- Version: 0.34.0
3
+ Version: 0.35.0
4
4
  Summary: An abstract VHDL language model.
5
5
  Home-page: https://GitHub.com/VHDL/pyVHDLModel
6
6
  Author: Patrick Lehmann
@@ -28,41 +28,41 @@ Description-Content-Type: text/markdown
28
28
  License-File: LICENSE.md
29
29
  Requires-Dist: pyTooling~=8.14
30
30
  Provides-Extra: doc
31
- Requires-Dist: autoapi>=2.0.1; extra == "doc"
32
- Requires-Dist: sphinx_autodoc_typehints~=3.10; extra == "doc"
31
+ Requires-Dist: sphinx_design~=0.7.0; extra == "doc"
33
32
  Requires-Dist: sphinx-copybutton>=0.5.2; extra == "doc"
33
+ Requires-Dist: docutils_stubs~=0.0.22; extra == "doc"
34
34
  Requires-Dist: sphinx~=9.1; extra == "doc"
35
+ Requires-Dist: autoapi>=2.0.1; extra == "doc"
36
+ Requires-Dist: sphinx_reports~=0.11.0; extra == "doc"
37
+ Requires-Dist: sphinx_autodoc_typehints~=3.11; extra == "doc"
38
+ Requires-Dist: sphinx_rtd_theme~=3.1; extra == "doc"
35
39
  Requires-Dist: sphinxcontrib-mermaid~=2.0; extra == "doc"
36
- Requires-Dist: docutils_stubs~=0.0.22; extra == "doc"
37
- Requires-Dist: sphinx_reports~=0.10.0; extra == "doc"
38
- Requires-Dist: sphinx_design~=0.7.0; extra == "doc"
39
40
  Requires-Dist: pyTooling~=8.14; extra == "doc"
40
- Requires-Dist: sphinx_rtd_theme~=3.1; extra == "doc"
41
41
  Provides-Extra: test
42
- Requires-Dist: lxml<7.0,>=5.4; extra == "test"
42
+ Requires-Dist: pytest~=9.0; extra == "test"
43
43
  Requires-Dist: pytest-cov~=7.1; extra == "test"
44
- Requires-Dist: Coverage~=7.13; extra == "test"
44
+ Requires-Dist: Coverage~=7.14; extra == "test"
45
45
  Requires-Dist: typing_extensions~=4.15; extra == "test"
46
+ Requires-Dist: lxml<7.0,>=5.4; extra == "test"
46
47
  Requires-Dist: mypy[reports]~=1.19; extra == "test"
47
- Requires-Dist: pytest~=9.0; extra == "test"
48
48
  Requires-Dist: pyTooling~=8.14; extra == "test"
49
49
  Provides-Extra: all
50
- Requires-Dist: autoapi>=2.0.1; extra == "all"
51
- Requires-Dist: sphinx_autodoc_typehints~=3.10; extra == "all"
50
+ Requires-Dist: pytest~=9.0; extra == "all"
51
+ Requires-Dist: sphinx_design~=0.7.0; extra == "all"
52
52
  Requires-Dist: sphinx-copybutton>=0.5.2; extra == "all"
53
- Requires-Dist: sphinx~=9.1; extra == "all"
54
- Requires-Dist: lxml<7.0,>=5.4; extra == "all"
55
- Requires-Dist: sphinxcontrib-mermaid~=2.0; extra == "all"
56
53
  Requires-Dist: docutils_stubs~=0.0.22; extra == "all"
57
- Requires-Dist: mypy[reports]~=1.19; extra == "all"
58
54
  Requires-Dist: pytest-cov~=7.1; extra == "all"
59
- Requires-Dist: Coverage~=7.13; extra == "all"
55
+ Requires-Dist: Coverage~=7.14; extra == "all"
56
+ Requires-Dist: sphinx~=9.1; extra == "all"
57
+ Requires-Dist: mypy[reports]~=1.19; extra == "all"
58
+ Requires-Dist: autoapi>=2.0.1; extra == "all"
60
59
  Requires-Dist: typing_extensions~=4.15; extra == "all"
61
- Requires-Dist: sphinx_reports~=0.10.0; extra == "all"
62
- Requires-Dist: pytest~=9.0; extra == "all"
63
- Requires-Dist: sphinx_design~=0.7.0; extra == "all"
64
- Requires-Dist: pyTooling~=8.14; extra == "all"
60
+ Requires-Dist: sphinx_reports~=0.11.0; extra == "all"
61
+ Requires-Dist: lxml<7.0,>=5.4; extra == "all"
62
+ Requires-Dist: sphinx_autodoc_typehints~=3.11; extra == "all"
65
63
  Requires-Dist: sphinx_rtd_theme~=3.1; extra == "all"
64
+ Requires-Dist: sphinxcontrib-mermaid~=2.0; extra == "all"
65
+ Requires-Dist: pyTooling~=8.14; extra == "all"
66
66
  Dynamic: author
67
67
  Dynamic: author-email
68
68
  Dynamic: classifier
@@ -85,7 +85,7 @@ Dynamic: summary
85
85
  [![Sourcecode on GitHub](https://img.shields.io/badge/VHDL-pyVHDLModel-29b6f6?longCache=true&style=flat-square&logo=GitHub&labelColor=0277bd)](https://github.com/vhdl/pyVHDLModel)
86
86
  [![Sourcecode License](https://img.shields.io/pypi/l/pyVHDLModel?longCache=true&style=flat-square&logo=Apache&label=code)](LICENSE.md)
87
87
  [![Documentation](https://img.shields.io/website?longCache=true&style=flat-square&label=vhdl.github.io%2FpyVHDLModel&logo=GitHub&logoColor=fff&up_color=blueviolet&up_message=Read%20now%20%E2%9E%9A&url=https%3A%2F%2Fvhdl.github.io%2FpyVHDLModel%2Findex.html)](https://vhdl.github.io/pyVHDLModel/)
88
- [![Documentation License](https://img.shields.io/badge/doc-CC--BY%204.0-green?longCache=true&style=flat-square&logo=CreativeCommons&logoColor=fff)](LICENSE.md)
88
+ [![Documentation License](https://img.shields.io/badge/doc-CC--BY%204.0-green?longCache=true&style=flat-square&logo=CreativeCommons&logoColor=fff)](doc/Doc-License.rst)
89
89
  [![Gitter](https://img.shields.io/badge/chat-on%20gitter-4db797?longCache=true&style=flat-square&logo=gitter&logoColor=e8ecef)](https://gitter.im/hdl/community)
90
90
  [![PyPI](https://img.shields.io/pypi/v/pyVHDLModel?longCache=true&style=flat-square&logo=PyPI&logoColor=FBE072)](https://pypi.org/project/pyVHDLModel/)
91
91
  ![PyPI - Status](https://img.shields.io/pypi/status/pyVHDLModel?longCache=true&style=flat-square&logo=PyPI&logoColor=FBE072)
@@ -120,6 +120,7 @@ on such a model, while supporting multiple frontends.
120
120
 
121
121
  * High-level API for [GHDL's](https://GitHub.com/ghdl/ghdl) `libghdl` offered via `pyghdl`.
122
122
  * Code Document-Object-Model (Code-DOM) in [pyVHDLParser](https://GitHub.com/Paebbels/pyVHDLParser).
123
+ * [PyHDLio](https://github.com/amb5l/PyHDLio) based on an ANTLR4 grammar.
123
124
  * [pyVHDLModelTreesitter](https://gitlab.com/dawalters/pyVHDLModelTreesitter) based on [tree-sitter-vhdl](https://github.com/jpt13653903/tree-sitter-vhdl).
124
125
 
125
126
  ## pyVHDLModel Consumers
@@ -169,7 +170,7 @@ for entity in document.Entities.values():
169
170
 
170
171
  # License
171
172
 
172
- This Python package (source code) licensed under [Apache License 2.0](LICENSE.md).
173
+ This Python package (source code) is licensed under [Apache License 2.0](LICENSE.md).
173
174
  The accompanying documentation is licensed under [Creative Commons - Attribution 4.0 (CC-BY 4.0)](doc/Doc-License.rst).
174
175
 
175
176
  -------------------------
@@ -5,7 +5,7 @@
5
5
  [![Sourcecode on GitHub](https://img.shields.io/badge/VHDL-pyVHDLModel-29b6f6?longCache=true&style=flat-square&logo=GitHub&labelColor=0277bd)](https://github.com/vhdl/pyVHDLModel)
6
6
  [![Sourcecode License](https://img.shields.io/pypi/l/pyVHDLModel?longCache=true&style=flat-square&logo=Apache&label=code)](LICENSE.md)
7
7
  [![Documentation](https://img.shields.io/website?longCache=true&style=flat-square&label=vhdl.github.io%2FpyVHDLModel&logo=GitHub&logoColor=fff&up_color=blueviolet&up_message=Read%20now%20%E2%9E%9A&url=https%3A%2F%2Fvhdl.github.io%2FpyVHDLModel%2Findex.html)](https://vhdl.github.io/pyVHDLModel/)
8
- [![Documentation License](https://img.shields.io/badge/doc-CC--BY%204.0-green?longCache=true&style=flat-square&logo=CreativeCommons&logoColor=fff)](LICENSE.md)
8
+ [![Documentation License](https://img.shields.io/badge/doc-CC--BY%204.0-green?longCache=true&style=flat-square&logo=CreativeCommons&logoColor=fff)](doc/Doc-License.rst)
9
9
  [![Gitter](https://img.shields.io/badge/chat-on%20gitter-4db797?longCache=true&style=flat-square&logo=gitter&logoColor=e8ecef)](https://gitter.im/hdl/community)
10
10
  [![PyPI](https://img.shields.io/pypi/v/pyVHDLModel?longCache=true&style=flat-square&logo=PyPI&logoColor=FBE072)](https://pypi.org/project/pyVHDLModel/)
11
11
  ![PyPI - Status](https://img.shields.io/pypi/status/pyVHDLModel?longCache=true&style=flat-square&logo=PyPI&logoColor=FBE072)
@@ -40,6 +40,7 @@ on such a model, while supporting multiple frontends.
40
40
 
41
41
  * High-level API for [GHDL's](https://GitHub.com/ghdl/ghdl) `libghdl` offered via `pyghdl`.
42
42
  * Code Document-Object-Model (Code-DOM) in [pyVHDLParser](https://GitHub.com/Paebbels/pyVHDLParser).
43
+ * [PyHDLio](https://github.com/amb5l/PyHDLio) based on an ANTLR4 grammar.
43
44
  * [pyVHDLModelTreesitter](https://gitlab.com/dawalters/pyVHDLModelTreesitter) based on [tree-sitter-vhdl](https://github.com/jpt13653903/tree-sitter-vhdl).
44
45
 
45
46
  ## pyVHDLModel Consumers
@@ -89,7 +90,7 @@ for entity in document.Entities.values():
89
90
 
90
91
  # License
91
92
 
92
- This Python package (source code) licensed under [Apache License 2.0](LICENSE.md).
93
+ This Python package (source code) is licensed under [Apache License 2.0](LICENSE.md).
93
94
  The accompanying documentation is licensed under [Creative Commons - Attribution 4.0 (CC-BY 4.0)](doc/Doc-License.rst).
94
95
 
95
96
  -------------------------
@@ -137,13 +137,13 @@ class ModelEntity(metaclass=ExtendedType, slots=True):
137
137
  @export
138
138
  class NamedEntityMixin(metaclass=ExtendedType, mixin=True):
139
139
  """
140
- A ``NamedEntityMixin`` is a mixin class for all VHDL entities that have identifiers.
140
+ A ``NamedEntityMixin`` is a mixin class for all VHDL entities that have an identifier.
141
141
 
142
142
  Protected variables :attr:`_identifier` and :attr:`_normalizedIdentifier` are available to derived classes as well as
143
143
  two readonly properties :attr:`Identifier` and :attr:`NormalizedIdentifier` for public access.
144
144
  """
145
145
 
146
- _identifier: str #: The identifier of a model entity.
146
+ _identifier: str #: The identifier of a model entity.
147
147
  _normalizedIdentifier: str #: The normalized (lower case) identifier of a model entity.
148
148
 
149
149
  def __init__(self, identifier: str) -> None:
@@ -174,6 +174,46 @@ class NamedEntityMixin(metaclass=ExtendedType, mixin=True):
174
174
  return self._normalizedIdentifier
175
175
 
176
176
 
177
+ @export
178
+ class OptionallyNamedEntityMixin(metaclass=ExtendedType, mixin=True):
179
+ """
180
+ A ``OptionallyNamedEntityMixin`` is a mixin class for all VHDL entities that have an optional identifier.
181
+
182
+ Protected variables :attr:`_identifier` and :attr:`_normalizedIdentifier` are available to derived classes as well as
183
+ two readonly properties :attr:`Identifier` and :attr:`NormalizedIdentifier` for public access.
184
+ """
185
+
186
+ _identifier: Nullable[str] #: The identifier of a model entity.
187
+ _normalizedIdentifier: Nullable[str] #: The normalized (lower case) identifier of a model entity.
188
+
189
+ def __init__(self, identifier: Nullable[str]) -> None:
190
+ """
191
+ Initializes a named entity.
192
+
193
+ :param identifier: Identifier (name) of the model entity.
194
+ """
195
+ self._identifier = identifier
196
+ self._normalizedIdentifier = identifier.lower() if identifier is not None else None
197
+
198
+ @readonly
199
+ def Identifier(self) -> Nullable[str]:
200
+ """
201
+ Returns a model entity's identifier (name).
202
+
203
+ :returns: Name of a model entity.
204
+ """
205
+ return self._identifier
206
+
207
+ @readonly
208
+ def NormalizedIdentifier(self) -> Nullable[str]:
209
+ """
210
+ Returns a model entity's normalized identifier (lower case name).
211
+
212
+ :returns: Normalized name of a model entity.
213
+ """
214
+ return self._normalizedIdentifier
215
+
216
+
177
217
  @export
178
218
  class MultipleNamedEntityMixin(metaclass=ExtendedType, mixin=True):
179
219
  """
@@ -401,7 +441,7 @@ class Range(ModelEntity):
401
441
  _rightBound: ExpressionUnion
402
442
  _direction: Direction
403
443
 
404
- def __init__(self, leftBound: ExpressionUnion, rightBound: ExpressionUnion, direction: Direction, parent: ModelEntity = None) -> None:
444
+ def __init__(self, leftBound: ExpressionUnion, rightBound: ExpressionUnion, direction: Direction, parent: Nullable[ModelEntity] = None) -> None:
405
445
  super().__init__(parent)
406
446
 
407
447
  self._leftBound = leftBound
@@ -433,7 +473,7 @@ class WaveformElement(ModelEntity):
433
473
  _expression: ExpressionUnion
434
474
  _after: ExpressionUnion
435
475
 
436
- def __init__(self, expression: ExpressionUnion, after: Nullable[ExpressionUnion] = None, parent: ModelEntity = None) -> None:
476
+ def __init__(self, expression: ExpressionUnion, after: Nullable[ExpressionUnion] = None, parent: Nullable[ModelEntity] = None) -> None:
437
477
  super().__init__(parent)
438
478
 
439
479
  self._expression = expression
@@ -138,7 +138,7 @@ class Instantiation(ConcurrentStatement):
138
138
  label: str,
139
139
  genericAssociations: Nullable[Iterable[AssociationItem]] = None,
140
140
  portAssociations: Nullable[Iterable[AssociationItem]] = None,
141
- parent: ModelEntity = None
141
+ parent: Nullable[ModelEntity] = None
142
142
  ) -> None:
143
143
  super().__init__(label, parent)
144
144
 
@@ -185,7 +185,7 @@ class ComponentInstantiation(Instantiation):
185
185
  componentSymbol: ComponentInstantiationSymbol,
186
186
  genericAssociations: Nullable[Iterable[AssociationItem]] = None,
187
187
  portAssociations: Nullable[Iterable[AssociationItem]] = None,
188
- parent: ModelEntity = None
188
+ parent: Nullable[ModelEntity] = None
189
189
  ) -> None:
190
190
  super().__init__(label, genericAssociations, portAssociations, parent)
191
191
 
@@ -219,7 +219,7 @@ class EntityInstantiation(Instantiation):
219
219
  architectureSymbol: Nullable[ArchitectureSymbol] = None,
220
220
  genericAssociations: Nullable[Iterable[AssociationItem]] = None,
221
221
  portAssociations: Nullable[Iterable[AssociationItem]] = None,
222
- parent: ModelEntity = None
222
+ parent: Nullable[ModelEntity] = None
223
223
  ) -> None:
224
224
  super().__init__(label, genericAssociations, portAssociations, parent)
225
225
 
@@ -259,7 +259,7 @@ class ConfigurationInstantiation(Instantiation):
259
259
  configurationSymbol: ConfigurationInstantiationSymbol,
260
260
  genericAssociations: Nullable[Iterable[AssociationItem]] = None,
261
261
  portAssociations: Nullable[Iterable[AssociationItem]] = None,
262
- parent: ModelEntity = None
262
+ parent: Nullable[ModelEntity] = None
263
263
  ) -> None:
264
264
  super().__init__(label, genericAssociations, portAssociations, parent)
265
265
 
@@ -296,7 +296,7 @@ class ProcessStatement(ConcurrentStatement, SequentialDeclarationsMixin, Sequent
296
296
  statements: Nullable[Iterable[SequentialStatement]] = None,
297
297
  sensitivityList: Nullable[Iterable[Name]] = None,
298
298
  documentation: Nullable[str] = None,
299
- parent: ModelEntity = None
299
+ parent: Nullable[ModelEntity] = None
300
300
  ) -> None:
301
301
  super().__init__(label, parent)
302
302
  SequentialDeclarationsMixin.__init__(self, declaredItems)
@@ -323,7 +323,7 @@ class ConcurrentProcedureCall(ConcurrentStatement, ProcedureCallMixin):
323
323
  label: str,
324
324
  procedureName: Name,
325
325
  parameterMappings: Nullable[Iterable[ParameterAssociationItem]] = None,
326
- parent: ModelEntity = None
326
+ parent: Nullable[ModelEntity] = None
327
327
  ) -> None:
328
328
  super().__init__(label, parent)
329
329
  ProcedureCallMixin.__init__(self, procedureName, parameterMappings)
@@ -341,7 +341,7 @@ class ConcurrentBlockStatement(ConcurrentStatement, BlockStatementMixin, Labeled
341
341
  statements: Iterable['ConcurrentStatement'] = None,
342
342
  documentation: Nullable[str] = None,
343
343
  allowBlackbox: Nullable[bool] = None,
344
- parent: ModelEntity = None
344
+ parent: Nullable[ModelEntity] = None
345
345
  ) -> None:
346
346
  super().__init__(label, parent)
347
347
  BlockStatementMixin.__init__(self)
@@ -386,7 +386,7 @@ class GenerateBranch(ModelEntity, ConcurrentDeclarationRegionMixin, ConcurrentSt
386
386
  statements: Nullable[Iterable[ConcurrentStatement]] = None,
387
387
  alternativeLabel: Nullable[str] = None,
388
388
  allowBlackbox: Nullable[bool] = None,
389
- parent: ModelEntity = None
389
+ parent: Nullable[ModelEntity] = None
390
390
  ) -> None:
391
391
  super().__init__(parent)
392
392
  ConcurrentDeclarationRegionMixin.__init__(self, declaredItems)
@@ -434,7 +434,7 @@ class IfGenerateBranch(GenerateBranch, IfBranchMixin):
434
434
  statements: Nullable[Iterable[ConcurrentStatement]] = None,
435
435
  alternativeLabel: Nullable[str] = None,
436
436
  allowBlackbox: Nullable[bool] = None,
437
- parent: ModelEntity = None
437
+ parent: Nullable[ModelEntity] = None
438
438
  ) -> None:
439
439
  super().__init__(declaredItems, statements, alternativeLabel, allowBlackbox, parent)
440
440
  IfBranchMixin.__init__(self, condition)
@@ -467,7 +467,7 @@ class ElsifGenerateBranch(GenerateBranch, ElsifBranchMixin):
467
467
  statements: Nullable[Iterable[ConcurrentStatement]] = None,
468
468
  alternativeLabel: Nullable[str] = None,
469
469
  allowBlackbox: Nullable[bool] = None,
470
- parent: ModelEntity = None
470
+ parent: Nullable[ModelEntity] = None
471
471
  ) -> None:
472
472
  super().__init__(declaredItems, statements, alternativeLabel, allowBlackbox, parent)
473
473
  ElsifBranchMixin.__init__(self, condition)
@@ -499,7 +499,7 @@ class ElseGenerateBranch(GenerateBranch, ElseBranchMixin):
499
499
  statements: Nullable[Iterable[ConcurrentStatement]] = None,
500
500
  alternativeLabel: Nullable[str] = None,
501
501
  allowBlackbox: Nullable[bool] = None,
502
- parent: ModelEntity = None
502
+ parent: Nullable[ModelEntity] = None
503
503
  ) -> None:
504
504
  super().__init__(declaredItems, statements, alternativeLabel, allowBlackbox, parent)
505
505
  ElseBranchMixin.__init__(self)
@@ -523,7 +523,7 @@ class GenerateStatement(ConcurrentStatement, AllowBlackboxMixin):
523
523
  self,
524
524
  label: Nullable[str] = None,
525
525
  allowBlackbox: Nullable[bool] = None,
526
- parent: ModelEntity = None
526
+ parent: Nullable[ModelEntity] = None
527
527
  ) -> None:
528
528
  super().__init__(label, parent)
529
529
  AllowBlackboxMixin.__init__(self, allowBlackbox)
@@ -575,7 +575,7 @@ class IfGenerateStatement(GenerateStatement):
575
575
  elsifBranches: Nullable[Iterable[ElsifGenerateBranch]] = None,
576
576
  elseBranch: Nullable[ElseGenerateBranch] = None,
577
577
  allowBlackbox: Nullable[bool] = None,
578
- parent: ModelEntity = None
578
+ parent: Nullable[ModelEntity] = None
579
579
  ) -> None:
580
580
  super().__init__(label, allowBlackbox, parent)
581
581
 
@@ -630,7 +630,7 @@ class ConcurrentChoice(BaseChoice):
630
630
  class IndexedGenerateChoice(ConcurrentChoice):
631
631
  _expression: ExpressionUnion
632
632
 
633
- def __init__(self, expression: ExpressionUnion, parent: ModelEntity = None) -> None:
633
+ def __init__(self, expression: ExpressionUnion, parent: Nullable[ModelEntity] = None) -> None:
634
634
  super().__init__(parent)
635
635
 
636
636
  self._expression = expression
@@ -648,7 +648,7 @@ class IndexedGenerateChoice(ConcurrentChoice):
648
648
  class RangedGenerateChoice(ConcurrentChoice):
649
649
  _range: 'Range'
650
650
 
651
- def __init__(self, rng: 'Range', parent: ModelEntity = None) -> None:
651
+ def __init__(self, rng: 'Range', parent: Nullable[ModelEntity] = None) -> None:
652
652
  super().__init__(parent)
653
653
 
654
654
  self._range = rng
@@ -670,7 +670,7 @@ class ConcurrentCase(BaseCase, LabeledEntityMixin, ConcurrentDeclarationRegionMi
670
670
  statements: Nullable[Iterable[ConcurrentStatement]] = None,
671
671
  alternativeLabel: Nullable[str] = None,
672
672
  allowBlackbox: Nullable[bool] = None,
673
- parent: ModelEntity = None
673
+ parent: Nullable[ModelEntity] = None
674
674
  ) -> None:
675
675
  super().__init__(parent)
676
676
  LabeledEntityMixin.__init__(self, alternativeLabel)
@@ -690,7 +690,7 @@ class GenerateCase(ConcurrentCase):
690
690
  statements: Nullable[Iterable[ConcurrentStatement]] = None,
691
691
  alternativeLabel: Nullable[str] = None,
692
692
  allowBlackbox: Nullable[bool] = None,
693
- parent: ModelEntity = None
693
+ parent: Nullable[ModelEntity] = None
694
694
  ) -> None:
695
695
  super().__init__(declaredItems, statements, alternativeLabel, allowBlackbox, parent)
696
696
 
@@ -744,7 +744,7 @@ class CaseGenerateStatement(GenerateStatement):
744
744
  expression: ExpressionUnion,
745
745
  cases: Iterable[ConcurrentCase],
746
746
  allowBlackbox: Nullable[bool] = None,
747
- parent: ModelEntity = None
747
+ parent: Nullable[ModelEntity] = None
748
748
  ) -> None:
749
749
  super().__init__(label, allowBlackbox, parent)
750
750
 
@@ -800,7 +800,7 @@ class ForGenerateStatement(GenerateStatement, ConcurrentDeclarationRegionMixin,
800
800
  declaredItems: Nullable[Iterable] = None,
801
801
  statements: Nullable[Iterable[ConcurrentStatement]] = None,
802
802
  allowBlackbox: Nullable[bool] = None,
803
- parent: ModelEntity = None
803
+ parent: Nullable[ModelEntity] = None
804
804
  ) -> None:
805
805
  super().__init__(label, allowBlackbox, parent)
806
806
  ConcurrentDeclarationRegionMixin.__init__(self, declaredItems)
@@ -842,7 +842,7 @@ class ConcurrentSignalAssignment(ConcurrentStatement, SignalAssignmentMixin):
842
842
  * :class:`~pyVHDLModel.Concurrent.ConcurrentSelectedSignalAssignment`
843
843
  * :class:`~pyVHDLModel.Concurrent.ConcurrentConditionalSignalAssignment`
844
844
  """
845
- def __init__(self, label: str, target: Name, parent: ModelEntity = None) -> None:
845
+ def __init__(self, label: str, target: Name, parent: Nullable[ModelEntity] = None) -> None:
846
846
  super().__init__(label, parent)
847
847
  SignalAssignmentMixin.__init__(self, target)
848
848
 
@@ -851,7 +851,7 @@ class ConcurrentSignalAssignment(ConcurrentStatement, SignalAssignmentMixin):
851
851
  class ConcurrentSimpleSignalAssignment(ConcurrentSignalAssignment):
852
852
  _waveform: List[WaveformElement]
853
853
 
854
- def __init__(self, label: str, target: Name, waveform: Iterable[WaveformElement], parent: ModelEntity = None) -> None:
854
+ def __init__(self, label: str, target: Name, waveform: Iterable[WaveformElement], parent: Nullable[ModelEntity] = None) -> None:
855
855
  super().__init__(label, target, parent)
856
856
 
857
857
  # TODO: extract to mixin
@@ -868,13 +868,13 @@ class ConcurrentSimpleSignalAssignment(ConcurrentSignalAssignment):
868
868
 
869
869
  @export
870
870
  class ConcurrentSelectedSignalAssignment(ConcurrentSignalAssignment):
871
- def __init__(self, label: str, target: Name, expression: ExpressionUnion, parent: ModelEntity = None) -> None:
871
+ def __init__(self, label: str, target: Name, expression: ExpressionUnion, parent: Nullable[ModelEntity] = None) -> None:
872
872
  super().__init__(label, target, parent)
873
873
 
874
874
 
875
875
  @export
876
876
  class ConcurrentConditionalSignalAssignment(ConcurrentSignalAssignment):
877
- def __init__(self, label: str, target: Name, expression: ExpressionUnion, parent: ModelEntity = None) -> None:
877
+ def __init__(self, label: str, target: Name, expression: ExpressionUnion, parent: Nullable[ModelEntity] = None) -> None:
878
878
  super().__init__(label, target, parent)
879
879
 
880
880
 
@@ -886,7 +886,7 @@ class ConcurrentAssertStatement(ConcurrentStatement, AssertStatementMixin):
886
886
  message: ExpressionUnion,
887
887
  severity: Nullable[ExpressionUnion] = None,
888
888
  label: Nullable[str] = None,
889
- parent: ModelEntity = None
889
+ parent: Nullable[ModelEntity] = None
890
890
  ) -> None:
891
891
  super().__init__(label, parent)
892
892
  AssertStatementMixin.__init__(self, condition, message, severity)
@@ -103,7 +103,7 @@ class Attribute(ModelEntity, NamedEntityMixin, DocumentedEntityMixin):
103
103
  identifier: str,
104
104
  subtype: Symbol,
105
105
  documentation: Nullable[str] = None,
106
- parent: ModelEntity = None
106
+ parent: Nullable[ModelEntity] = None
107
107
  ) -> None:
108
108
  super().__init__(parent)
109
109
  NamedEntityMixin.__init__(self, identifier)
@@ -141,7 +141,7 @@ class AttributeSpecification(ModelEntity, DocumentedEntityMixin):
141
141
  entityClass: EntityClass,
142
142
  expression: ExpressionUnion,
143
143
  documentation: Nullable[str] = None,
144
- parent: ModelEntity = None
144
+ parent: Nullable[ModelEntity] = None
145
145
  ) -> None:
146
146
  super().__init__(parent)
147
147
  DocumentedEntityMixin.__init__(self, documentation)
@@ -179,7 +179,7 @@ class AttributeSpecification(ModelEntity, DocumentedEntityMixin):
179
179
  # TODO: move somewhere else
180
180
  @export
181
181
  class Alias(ModelEntity, NamedEntityMixin, DocumentedEntityMixin):
182
- def __init__(self, identifier: str, documentation: Nullable[str] = None, parent: ModelEntity = None) -> None:
182
+ def __init__(self, identifier: str, documentation: Nullable[str] = None, parent: Nullable[ModelEntity] = None) -> None:
183
183
  """
184
184
  Initializes underlying ``BaseType``.
185
185
 
@@ -46,7 +46,7 @@ from pyVHDLModel.Base import ModelEntity, NamedEntityMixin, DocumentedEnti
46
46
  from pyVHDLModel.Namespace import Namespace
47
47
  from pyVHDLModel.Regions import ConcurrentDeclarationRegionMixin
48
48
  from pyVHDLModel.Symbol import Symbol, PackageSymbol, EntitySymbol, LibraryReferenceSymbol
49
- from pyVHDLModel.Interface import GenericInterfaceItemMixin, PortInterfaceItemMixin
49
+ from pyVHDLModel.Interface import GenericInterfaceItemMixin, PortInterfaceItemMixin, WithGenericsMixin, WithPortsMixin
50
50
  from pyVHDLModel.Object import DeferredConstant
51
51
  from pyVHDLModel.Concurrent import ConcurrentStatement, ConcurrentStatementsMixin
52
52
 
@@ -65,7 +65,7 @@ class Reference(ModelEntity):
65
65
 
66
66
  _symbols: List[Symbol]
67
67
 
68
- def __init__(self, symbols: Iterable[Symbol], parent: ModelEntity = None) -> None:
68
+ def __init__(self, symbols: Iterable[Symbol], parent: Nullable[ModelEntity] = None) -> None:
69
69
  """
70
70
  Initializes a reference by taking a list of symbols and a parent reference.
71
71
 
@@ -187,7 +187,7 @@ class DesignUnit(ModelEntity, NamedEntityMixin, DocumentedEntityMixin):
187
187
 
188
188
  _namespace: 'Namespace'
189
189
 
190
- def __init__(self, identifier: str, contextItems: Nullable[Iterable[ContextUnion]] = None, documentation: Nullable[str] = None, parent: ModelEntity = None) -> None:
190
+ def __init__(self, identifier: str, contextItems: Nullable[Iterable[ContextUnion]] = None, documentation: Nullable[str] = None, parent: Nullable[ModelEntity] = None) -> None:
191
191
  """
192
192
  Initializes a design unit.
193
193
 
@@ -373,7 +373,7 @@ class Context(PrimaryUnit):
373
373
 
374
374
  _references: List[ContextUnion]
375
375
 
376
- def __init__(self, identifier: str, references: Nullable[Iterable[ContextUnion]] = None, documentation: Nullable[str] = None, parent: ModelEntity = None) -> None:
376
+ def __init__(self, identifier: str, references: Nullable[Iterable[ContextUnion]] = None, documentation: Nullable[str] = None, parent: Nullable[ModelEntity] = None) -> None:
377
377
  super().__init__(identifier, None, documentation, parent)
378
378
 
379
379
  self._references = []
@@ -414,7 +414,7 @@ class Context(PrimaryUnit):
414
414
 
415
415
 
416
416
  @export
417
- class Package(PrimaryUnit, DesignUnitWithContextMixin, ConcurrentDeclarationRegionMixin, AllowBlackboxMixin):
417
+ class Package(PrimaryUnit, DesignUnitWithContextMixin, WithGenericsMixin, ConcurrentDeclarationRegionMixin, AllowBlackboxMixin):
418
418
  """
419
419
  Represents a package declaration.
420
420
 
@@ -429,8 +429,6 @@ class Package(PrimaryUnit, DesignUnitWithContextMixin, ConcurrentDeclarationRegi
429
429
 
430
430
  _packageBody: Nullable["PackageBody"]
431
431
 
432
- _genericItems: List[GenericInterfaceItemMixin]
433
-
434
432
  _deferredConstants: Dict[str, DeferredConstant]
435
433
  _components: Dict[str, 'Component']
436
434
 
@@ -442,7 +440,7 @@ class Package(PrimaryUnit, DesignUnitWithContextMixin, ConcurrentDeclarationRegi
442
440
  declaredItems: Nullable[Iterable] = None,
443
441
  documentation: Nullable[str] = None,
444
442
  allowBlackbox: Nullable[bool] = None,
445
- parent: ModelEntity = None
443
+ parent: Nullable[ModelEntity] = None
446
444
  ) -> None:
447
445
  """
448
446
  Initialize a package.
@@ -457,18 +455,12 @@ class Package(PrimaryUnit, DesignUnitWithContextMixin, ConcurrentDeclarationRegi
457
455
  """
458
456
  super().__init__(identifier, contextItems, documentation, parent)
459
457
  DesignUnitWithContextMixin.__init__(self)
458
+ WithGenericsMixin.__init__(self, genericItems)
460
459
  ConcurrentDeclarationRegionMixin.__init__(self, declaredItems)
461
460
  AllowBlackboxMixin.__init__(self, allowBlackbox)
462
461
 
463
462
  self._packageBody = None
464
463
 
465
- # TODO: extract to mixin
466
- self._genericItems = [] # TODO: convert to dict
467
- if genericItems is not None:
468
- for generic in genericItems:
469
- self._genericItems.append(generic)
470
- generic._parent = self
471
-
472
464
  self._deferredConstants = {}
473
465
  self._components = {}
474
466
 
@@ -476,10 +468,6 @@ class Package(PrimaryUnit, DesignUnitWithContextMixin, ConcurrentDeclarationRegi
476
468
  def PackageBody(self) -> Nullable["PackageBody"]:
477
469
  return self._packageBody
478
470
 
479
- @property
480
- def GenericItems(self) -> List[GenericInterfaceItemMixin]:
481
- return self._genericItems
482
-
483
471
  @property
484
472
  def DeclaredItems(self) -> List:
485
473
  return self._declaredItems
@@ -534,7 +522,7 @@ class PackageBody(SecondaryUnit, DesignUnitWithContextMixin, ConcurrentDeclarati
534
522
  contextItems: Nullable[Iterable[ContextUnion]] = None,
535
523
  declaredItems: Nullable[Iterable] = None,
536
524
  documentation: Nullable[str] = None,
537
- parent: ModelEntity = None
525
+ parent: Nullable[ModelEntity] = None
538
526
  ) -> None:
539
527
  super().__init__(packageSymbol.Name.Identifier, contextItems, documentation, parent)
540
528
  DesignUnitWithContextMixin.__init__(self)
@@ -566,7 +554,7 @@ class PackageBody(SecondaryUnit, DesignUnitWithContextMixin, ConcurrentDeclarati
566
554
 
567
555
 
568
556
  @export
569
- class Entity(PrimaryUnit, DesignUnitWithContextMixin, ConcurrentDeclarationRegionMixin, ConcurrentStatementsMixin, AllowBlackboxMixin):
557
+ class Entity(PrimaryUnit, DesignUnitWithContextMixin, WithGenericsMixin, WithPortsMixin, ConcurrentDeclarationRegionMixin, ConcurrentStatementsMixin, AllowBlackboxMixin):
570
558
  """
571
559
  Represents an entity declaration.
572
560
 
@@ -579,9 +567,6 @@ class Entity(PrimaryUnit, DesignUnitWithContextMixin, ConcurrentDeclarationRegio
579
567
  end entity;
580
568
  """
581
569
 
582
- _genericItems: List[GenericInterfaceItemMixin]
583
- _portItems: List[PortInterfaceItemMixin]
584
-
585
570
  _architectures: Dict[str, 'Architecture']
586
571
 
587
572
  def __init__(
@@ -594,40 +579,18 @@ class Entity(PrimaryUnit, DesignUnitWithContextMixin, ConcurrentDeclarationRegio
594
579
  statements: Nullable[Iterable[ConcurrentStatement]] = None,
595
580
  documentation: Nullable[str] = None,
596
581
  allowBlackbox: Nullable[bool] = None,
597
- parent: ModelEntity = None
582
+ parent: Nullable[ModelEntity] = None
598
583
  ) -> None:
599
584
  super().__init__(identifier, contextItems, documentation, parent)
600
585
  DesignUnitWithContextMixin.__init__(self)
586
+ WithGenericsMixin.__init__(self, genericItems)
587
+ WithPortsMixin.__init__(self, portItems)
601
588
  ConcurrentDeclarationRegionMixin.__init__(self, declaredItems)
602
589
  ConcurrentStatementsMixin.__init__(self, statements)
603
590
  AllowBlackboxMixin.__init__(self, allowBlackbox)
604
591
 
605
- # TODO: extract to mixin
606
- self._genericItems = []
607
- if genericItems is not None:
608
- for item in genericItems:
609
- self._genericItems.append(item)
610
- item._parent = self
611
-
612
- # TODO: extract to mixin
613
- self._portItems = []
614
- if portItems is not None:
615
- for item in portItems:
616
- self._portItems.append(item)
617
- item._parent = self
618
-
619
592
  self._architectures = {}
620
593
 
621
- # TODO: extract to mixin for generics
622
- @property
623
- def GenericItems(self) -> List[GenericInterfaceItemMixin]:
624
- return self._genericItems
625
-
626
- # TODO: extract to mixin for ports
627
- @property
628
- def PortItems(self) -> List[PortInterfaceItemMixin]:
629
- return self._portItems
630
-
631
594
  @property
632
595
  def Architectures(self) -> Dict[str, 'Architecture']:
633
596
  return self._architectures
@@ -672,7 +635,7 @@ class Architecture(SecondaryUnit, DesignUnitWithContextMixin, ConcurrentDeclarat
672
635
  statements: Iterable['ConcurrentStatement'] = None,
673
636
  documentation: Nullable[str] = None,
674
637
  allowBlackbox: Nullable[bool] = None,
675
- parent: ModelEntity = None
638
+ parent: Nullable[ModelEntity] = None
676
639
  ) -> None:
677
640
  super().__init__(identifier, contextItems, documentation, parent)
678
641
  DesignUnitWithContextMixin.__init__(self)
@@ -728,7 +691,7 @@ class Component(ModelEntity, NamedEntityMixin, DocumentedEntityMixin, AllowBlack
728
691
  portItems: Nullable[Iterable[PortInterfaceItemMixin]] = None,
729
692
  documentation: Nullable[str] = None,
730
693
  allowBlackbox: Nullable[bool] = None,
731
- parent: ModelEntity = None
694
+ parent: Nullable[ModelEntity] = None
732
695
  ) -> None:
733
696
  super().__init__(parent)
734
697
  NamedEntityMixin.__init__(self, identifier)
@@ -811,7 +774,7 @@ class Configuration(PrimaryUnit, DesignUnitWithContextMixin):
811
774
  identifier: str,
812
775
  contextItems: Nullable[Iterable[Context]] = None,
813
776
  documentation: Nullable[str] = None,
814
- parent: ModelEntity = None
777
+ parent: Nullable[ModelEntity] = None
815
778
  ) -> None:
816
779
  super().__init__(identifier, contextItems, documentation, parent)
817
780
  DesignUnitWithContextMixin.__init__(self)