diff options
author | Unai Martinez-Corral <38422348+umarcor@users.noreply.github.com> | 2021-07-02 00:10:18 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-07-02 00:10:18 +0100 |
commit | 1da694fe05363bf29359b5290042073774a11f25 (patch) | |
tree | b4d55f210cfbf90847dc56a60058afa819107030 /pyGHDL/dom | |
parent | 69e6630acb723282ddde95ad0681ac71686df8e8 (diff) | |
parent | ae51fcf65f195e065987f379410d3f68c14f4a2b (diff) | |
download | ghdl-1da694fe05363bf29359b5290042073774a11f25.tar.gz ghdl-1da694fe05363bf29359b5290042073774a11f25.tar.bz2 ghdl-1da694fe05363bf29359b5290042073774a11f25.zip |
pyHDL: CLI Update for DOM (#1808)
Diffstat (limited to 'pyGHDL/dom')
-rw-r--r-- | pyGHDL/dom/Aggregates.py | 32 | ||||
-rw-r--r-- | pyGHDL/dom/Attribute.py | 102 | ||||
-rw-r--r-- | pyGHDL/dom/DesignUnit.py | 37 | ||||
-rw-r--r-- | pyGHDL/dom/Expression.py | 381 | ||||
-rw-r--r-- | pyGHDL/dom/InterfaceItem.py | 161 | ||||
-rw-r--r-- | pyGHDL/dom/Names.py | 20 | ||||
-rw-r--r-- | pyGHDL/dom/NonStandard.py | 13 | ||||
-rw-r--r-- | pyGHDL/dom/Object.py | 91 | ||||
-rw-r--r-- | pyGHDL/dom/PSL.py | 133 | ||||
-rw-r--r-- | pyGHDL/dom/Range.py | 7 | ||||
-rw-r--r-- | pyGHDL/dom/Subprogram.py | 8 | ||||
-rw-r--r-- | pyGHDL/dom/Symbol.py | 53 | ||||
-rw-r--r-- | pyGHDL/dom/Type.py | 109 | ||||
-rw-r--r-- | pyGHDL/dom/_Translate.py | 204 | ||||
-rw-r--r-- | pyGHDL/dom/__init__.py | 12 | ||||
-rw-r--r-- | pyGHDL/dom/formatting/prettyprint.py | 170 | ||||
-rw-r--r-- | pyGHDL/dom/requirements.txt | 4 |
17 files changed, 970 insertions, 567 deletions
diff --git a/pyGHDL/dom/Aggregates.py b/pyGHDL/dom/Aggregates.py index 32dc1cacf..87bc44360 100644 --- a/pyGHDL/dom/Aggregates.py +++ b/pyGHDL/dom/Aggregates.py @@ -48,12 +48,11 @@ from pyVHDLModel.VHDLModel import ( NamedAggregateElement as VHDLModel_NamedAggregateElement, OthersAggregateElement as VHDLModel_OthersAggregateElement, Expression, + Symbol, ) from pyGHDL.libghdl._types import Iir from pyGHDL.dom import DOMMixin from pyGHDL.dom.Range import Range -from pyGHDL.dom.Symbol import EnumerationLiteralSymbol - __all__ = [] @@ -61,48 +60,33 @@ __all__ = [] @export class SimpleAggregateElement(VHDLModel_SimpleAggregateElement, DOMMixin): def __init__(self, node: Iir, expression: Expression): - super().__init__() + super().__init__(expression) DOMMixin.__init__(self, node) - self._expression = expression - @export class IndexedAggregateElement(VHDLModel_IndexedAggregateElement, DOMMixin): def __init__(self, node: Iir, index: Expression, expression: Expression): - super().__init__() + super().__init__(index, expression) DOMMixin.__init__(self, node) - self._index = index - self._expression = expression - @export class RangedAggregateElement(VHDLModel_RangedAggregateElement, DOMMixin): - def __init__(self, node: Iir, r: Range, expression: Expression): - super().__init__() + def __init__(self, node: Iir, rng: Range, expression: Expression): + super().__init__(rng, expression) DOMMixin.__init__(self, node) - self._range = r - self._expression = expression - @export class NamedAggregateElement(VHDLModel_NamedAggregateElement, DOMMixin): - def __init__( - self, node: Iir, name: EnumerationLiteralSymbol, expression: Expression - ): - super().__init__() + def __init__(self, node: Iir, name: Symbol, expression: Expression): + super().__init__(name, expression) DOMMixin.__init__(self, node) - self._name = name - self._expression = expression - @export class OthersAggregateElement(VHDLModel_OthersAggregateElement, DOMMixin): def __init__(self, node: Iir, expression: Expression): - super().__init__() + super().__init__(expression) DOMMixin.__init__(self, node) - - self._expression = expression diff --git a/pyGHDL/dom/Attribute.py b/pyGHDL/dom/Attribute.py index 8c7b08190..270f8feb3 100644 --- a/pyGHDL/dom/Attribute.py +++ b/pyGHDL/dom/Attribute.py @@ -30,42 +30,80 @@ # # SPDX-License-Identifier: GPL-2.0-or-later # ============================================================================ +from typing import List + from pydecor import export from pyVHDLModel.VHDLModel import ( Attribute as VHDLModel_Attribute, AttributeSpecification as VHDLModel_AttributeSpecification, Name, - SubTypeOrSymbol, + SubtypeOrSymbol, + EntityClass, ) +from pyGHDL.libghdl import utils from pyGHDL.libghdl._types import Iir from pyGHDL.libghdl.vhdl import nodes -from pyGHDL.dom import DOMMixin +from pyGHDL.libghdl.vhdl.tokens import Tok +from pyGHDL.dom import DOMMixin, Position, DOMException, Expression from pyGHDL.dom._Utils import GetNameOfNode, GetIirKindOfNode -from pyGHDL.dom._Translate import GetNameFromNode -from pyGHDL.dom.Symbol import SimpleSubTypeSymbol +from pyGHDL.dom._Translate import GetNameFromNode, GetExpressionFromNode +from pyGHDL.dom.Names import SimpleName +from pyGHDL.dom.Symbol import SimpleSubtypeSymbol @export class Attribute(VHDLModel_Attribute, DOMMixin): - def __init__(self, node: Iir, name: str, subType: SubTypeOrSymbol): - super().__init__(name, subType) + def __init__(self, node: Iir, identifier: str, subtype: SubtypeOrSymbol): + super().__init__(identifier, subtype) DOMMixin.__init__(self, node) @classmethod def parse(cls, attributeNode: Iir) -> "Attribute": name = GetNameOfNode(attributeNode) - subTypeMark = nodes.Get_Type_Mark(attributeNode) - subTypeName = GetNameOfNode(subTypeMark) + subtypeMark = nodes.Get_Type_Mark(attributeNode) + subtypeName = GetNameOfNode(subtypeMark) + + subtype = SimpleSubtypeSymbol(subtypeMark, subtypeName) + return cls(attributeNode, name, subtype) - subType = SimpleSubTypeSymbol(subTypeMark, subTypeName) - return cls(attributeNode, name, subType) + +_TOKEN_TRANSLATION = { + Tok.Entity: EntityClass.Entity, + Tok.Architecture: EntityClass.Architecture, + Tok.Configuration: EntityClass.Configuration, + Tok.Procedure: EntityClass.Procedure, + Tok.Function: EntityClass.Function, + Tok.Package: EntityClass.Package, + Tok.Type: EntityClass.Type, + Tok.Subtype: EntityClass.Subtype, + Tok.Constant: EntityClass.Constant, + Tok.Signal: EntityClass.Signal, + Tok.Variable: EntityClass.Variable, + Tok.Component: EntityClass.Component, + Tok.Label: EntityClass.Label, + Tok.Literal: EntityClass.Literal, + Tok.Units: EntityClass.Units, + Tok.Group: EntityClass.Group, + Tok.File: EntityClass.File, + Tok.Property: EntityClass.Property, + Tok.Sequence: EntityClass.Sequence, + # Tok.View: EntityClass.View, + Tok.Others: EntityClass.Others, +} @export class AttributeSpecification(VHDLModel_AttributeSpecification, DOMMixin): - def __init__(self, node: Iir, attribute: Name): - super().__init__(attribute) + def __init__( + self, + node: Iir, + identifiers: List[Name], + attribute: Name, + entityClass: EntityClass, + expression: Expression, + ): + super().__init__(identifiers, attribute, entityClass, expression) DOMMixin.__init__(self, node) @classmethod @@ -73,11 +111,41 @@ class AttributeSpecification(VHDLModel_AttributeSpecification, DOMMixin): attributeDesignator = nodes.Get_Attribute_Designator(attributeNode) attributeName = GetNameFromNode(attributeDesignator) - # FIXME: needs an implementation + names = [] entityNameList = nodes.Get_Entity_Name_List(attributeNode) - enlk = GetIirKindOfNode(entityNameList) + for name in utils.flist_iter(entityNameList): + nameKind = GetIirKindOfNode(name) + if nameKind == nodes.Iir_Kind.Simple_Name: + names.append(SimpleName(name, GetNameOfNode(name))) + elif nameKind == nodes.Iir_Kind.Signature: + print("[NOT IMPLEMENTED] Signature name in attribute specifications.") + else: + position = Position.parse(name) + raise DOMException( + "Unknown name kind '{kind}' in attribute specification '{attr}' at {file}:{line}:{column}.".format( + kind=nameKind.name, + attr=attributeNode, + file=position.Filename, + line=position.Line, + column=position.Column, + ) + ) + + entityClassToken = nodes.Get_Entity_Class(attributeNode) + try: + entityClass = _TOKEN_TRANSLATION[entityClassToken] + except KeyError: + position = Position.parse(attributeNode) + raise DOMException( + "Unknown token '{token}' in attribute specification for entity class '{entityClass}' at {file}:{line}:{column}.".format( + token=entityClassToken.name, + entityClass=attributeNode, + file=position.Filename, + line=position.Line, + column=position.Column, + ) + ) - entityClass = nodes.Get_Entity_Class(attributeNode) - eck = GetIirKindOfNode(entityClass) + expression = GetExpressionFromNode(nodes.Get_Expression(attributeNode)) - return cls(attributeNode, attributeName) + return cls(attributeNode, names, attributeName, entityClass, expression) diff --git a/pyGHDL/dom/DesignUnit.py b/pyGHDL/dom/DesignUnit.py index a8249d38d..d5bf161fd 100644 --- a/pyGHDL/dom/DesignUnit.py +++ b/pyGHDL/dom/DesignUnit.py @@ -41,8 +41,6 @@ This module contains all DOM classes for VHDL's design units (:class:`context <E """ from typing import List -from pyGHDL.dom import DOMMixin -from pyGHDL.libghdl._types import Iir from pydecor import export from pyVHDLModel.VHDLModel import ( @@ -59,9 +57,12 @@ from pyVHDLModel.VHDLModel import ( PortInterfaceItem, EntityOrSymbol, Name, + ConcurrentStatement, ) +from pyGHDL.libghdl._types import Iir from pyGHDL.libghdl.vhdl import nodes +from pyGHDL.dom import DOMMixin from pyGHDL.dom._Utils import GetNameOfNode from pyGHDL.dom._Translate import ( GetGenericsFromChainedNodes, @@ -95,13 +96,13 @@ class Entity(VHDLModel_Entity, DOMMixin): def __init__( self, node: Iir, - name: str, + identifier: str, genericItems: List[GenericInterfaceItem] = None, portItems: List[PortInterfaceItem] = None, declaredItems: List = None, bodyItems: List["ConcurrentStatement"] = None, ): - super().__init__(name, genericItems, portItems, declaredItems, bodyItems) + super().__init__(identifier, genericItems, portItems, declaredItems, bodyItems) DOMMixin.__init__(self, node) @classmethod @@ -122,12 +123,12 @@ class Architecture(VHDLModel_Architecture, DOMMixin): def __init__( self, node: Iir, - name: str, + identifier: str, entity: EntityOrSymbol, declaredItems: List = None, bodyItems: List["ConcurrentStatement"] = None, ): - super().__init__(name, entity, declaredItems, bodyItems) + super().__init__(identifier, entity, declaredItems, bodyItems) DOMMixin.__init__(self, node) @classmethod @@ -152,11 +153,11 @@ class Component(VHDLModel_Component, DOMMixin): def __init__( self, node: Iir, - name: str, + identifier: str, genericItems: List[GenericInterfaceItem] = None, portItems: List[PortInterfaceItem] = None, ): - super().__init__(name, genericItems, portItems) + super().__init__(identifier, genericItems, portItems) DOMMixin.__init__(self, node) @classmethod @@ -173,11 +174,11 @@ class Package(VHDLModel_Package, DOMMixin): def __init__( self, node: Iir, - name: str, + identifier: str, genericItems: List[GenericInterfaceItem] = None, declaredItems: List = None, ): - super().__init__(name, genericItems, declaredItems) + super().__init__(identifier, genericItems, declaredItems) DOMMixin.__init__(self, node) @classmethod @@ -204,10 +205,10 @@ class PackageBody(VHDLModel_PackageBody, DOMMixin): def __init__( self, node: Iir, - name: str, + identifier: str, declaredItems: List = None, ): - super().__init__(name, declaredItems) + super().__init__(identifier, declaredItems) DOMMixin.__init__(self, node) @classmethod @@ -225,11 +226,11 @@ class PackageInstantiation(VHDLModel_PackageInstantiation, DOMMixin): def __init__( self, node: Iir, - name: str, + identifier: str, uninstantiatedPackageName: Name, # genericItems: List[GenericInterfaceItem] = None, ): - super().__init__(name, uninstantiatedPackageName) + super().__init__(identifier, uninstantiatedPackageName) DOMMixin.__init__(self, node) @classmethod @@ -248,9 +249,9 @@ class Context(VHDLModel_Context, DOMMixin): def __init__( self, node: Iir, - name: str, + identifier: str, ): - super().__init__(name) + super().__init__(identifier) DOMMixin.__init__(self, node) @classmethod @@ -267,9 +268,9 @@ class Configuration(VHDLModel_Configuration, DOMMixin): def __init__( self, node: Iir, - name: str, + identifier: str, ): - super().__init__(name) + super().__init__(identifier) DOMMixin.__init__(self, node) @classmethod diff --git a/pyGHDL/dom/Expression.py b/pyGHDL/dom/Expression.py index b3256d551..972b86ced 100644 --- a/pyGHDL/dom/Expression.py +++ b/pyGHDL/dom/Expression.py @@ -30,12 +30,14 @@ # # SPDX-License-Identifier: GPL-2.0-or-later # ============================================================================ -from typing import List +from typing import List, Union from pydecor import export from pyGHDL.dom import DOMMixin, DOMException from pyVHDLModel.VHDLModel import ( + UnaryExpression as VHDLModel_UnaryExpression, + BinaryExpression as VHDLModel_BinaryExpression, InverseExpression as VHDLModel_InverseExpression, IdentityExpression as VHDLModel_IdentityExpression, NegationExpression as VHDLModel_NegationExpression, @@ -67,23 +69,32 @@ from pyVHDLModel.VHDLModel import ( LessEqualExpression as VHDLModel_LessEqualExpression, GreaterThanExpression as VHDLModel_GreaterThanExpression, GreaterEqualExpression as VHDLModel_GreaterEqualExpression, + MatchingEqualExpression as VHDLModel_MatchingEqualExpression, + MatchingUnequalExpression as VHDLModel_MatchingUnequalExpression, + MatchingLessThanExpression as VHDLModel_MatchingLessThanExpression, + MatchingLessEqualExpression as VHDLModel_MatchingLessEqualExpression, + MatchingGreaterThanExpression as VHDLModel_MatchingGreaterThanExpression, + MatchingGreaterEqualExpression as VHDLModel_MatchingGreaterEqualExpression, ShiftRightLogicExpression as VHDLModel_ShiftRightLogicExpression, ShiftLeftLogicExpression as VHDLModel_ShiftLeftLogicExpression, ShiftRightArithmeticExpression as VHDLModel_ShiftRightArithmeticExpression, ShiftLeftArithmeticExpression as VHDLModel_ShiftLeftArithmeticExpression, RotateRightExpression as VHDLModel_RotateRightExpression, RotateLeftExpression as VHDLModel_RotateLeftExpression, + SubtypeAllocation as VHDLModel_SubtypeAllocation, + QualifiedExpressionAllocation as VHDLModel_QualifiedExpressionAllocation, Aggregate as VHDLModel_Aggregate, Expression, AggregateElement, - SubTypeOrSymbol, + SubtypeOrSymbol, + Symbol, ) from pyGHDL.libghdl import utils from pyGHDL.libghdl._types import Iir from pyGHDL.libghdl.vhdl import nodes from pyGHDL.dom._Utils import GetIirKindOfNode -from pyGHDL.dom.Symbol import EnumerationLiteralSymbol, SimpleSubTypeSymbol +from pyGHDL.dom.Symbol import SimpleSubtypeSymbol from pyGHDL.dom.Aggregates import ( OthersAggregateElement, SimpleAggregateElement, @@ -96,18 +107,18 @@ from pyGHDL.dom.Aggregates import ( __all__ = [] -class _ParseUnaryExpression: +class _ParseUnaryExpressionMixin: @classmethod - def parse(cls, node: Iir): + def parse(cls, node: Iir) -> VHDLModel_UnaryExpression: from pyGHDL.dom._Translate import GetExpressionFromNode operand = GetExpressionFromNode(nodes.Get_Operand(node)) return cls(node, operand) -class _ParseBinaryExpression: +class _ParseBinaryExpressionMixin: @classmethod - def parse(cls, node: Iir): + def parse(cls, node: Iir) -> VHDLModel_BinaryExpression: from pyGHDL.dom._Translate import GetExpressionFromNode left = GetExpressionFromNode(nodes.Get_Left(node)) @@ -116,53 +127,51 @@ class _ParseBinaryExpression: @export -class InverseExpression(VHDLModel_InverseExpression, DOMMixin, _ParseUnaryExpression): +class InverseExpression( + VHDLModel_InverseExpression, DOMMixin, _ParseUnaryExpressionMixin +): def __init__(self, node: Iir, operand: Expression): - super().__init__() + super().__init__(operand) DOMMixin.__init__(self, node) - self._operand = operand - @export -class IdentityExpression(VHDLModel_IdentityExpression, DOMMixin, _ParseUnaryExpression): +class IdentityExpression( + VHDLModel_IdentityExpression, DOMMixin, _ParseUnaryExpressionMixin +): def __init__(self, node: Iir, operand: Expression): - super().__init__() + super().__init__(operand) DOMMixin.__init__(self, node) - self._operand = operand - @export -class NegationExpression(VHDLModel_NegationExpression, DOMMixin, _ParseUnaryExpression): +class NegationExpression( + VHDLModel_NegationExpression, DOMMixin, _ParseUnaryExpressionMixin +): def __init__(self, node: Iir, operand: Expression): - super().__init__() + super().__init__(operand) DOMMixin.__init__(self, node) - self._operand = operand - @export -class AbsoluteExpression(VHDLModel_AbsoluteExpression, DOMMixin, _ParseUnaryExpression): +class AbsoluteExpression( + VHDLModel_AbsoluteExpression, DOMMixin, _ParseUnaryExpressionMixin +): def __init__(self, node: Iir, operand: Expression): - super().__init__() + super().__init__(operand) DOMMixin.__init__(self, node) - self._operand = operand - @export class ParenthesisExpression( - VHDLModel_ParenthesisExpression, DOMMixin, _ParseUnaryExpression + VHDLModel_ParenthesisExpression, DOMMixin, _ParseUnaryExpressionMixin ): def __init__(self, node: Iir, operand: Expression): - super().__init__() + super().__init__(operand) DOMMixin.__init__(self, node) - self._operand = operand - @classmethod - def parse(cls, node: Iir): + def parse(cls, node: Iir) -> "ParenthesisExpression": from pyGHDL.dom._Translate import GetExpressionFromNode operand = GetExpressionFromNode(nodes.Get_Expression(node)) @@ -172,11 +181,9 @@ class ParenthesisExpression( @export class TypeConversion(VHDLModel_TypeConversion, DOMMixin): def __init__(self, node: Iir, operand: Expression): - super().__init__() + super().__init__(operand) DOMMixin.__init__(self, node) - self._operand = operand - @export class FunctionCall(VHDLModel_FunctionCall, DOMMixin): @@ -184,12 +191,12 @@ class FunctionCall(VHDLModel_FunctionCall, DOMMixin): super().__init__() DOMMixin.__init__(self, node) - self._operand = operand - class RangeExpression(VHDLModel_RangeExpression, DOMMixin): @classmethod - def parse(cls, node: Iir) -> "VHDLModel_RangeExpression": + def parse( + cls, node: Iir + ) -> Union["AscendingRangeExpression", "DescendingRangeExpression"]: from pyGHDL.dom._Translate import GetExpressionFromNode direction = nodes.Get_Direction(node) @@ -205,347 +212,350 @@ class RangeExpression(VHDLModel_RangeExpression, DOMMixin): @export class AscendingRangeExpression(VHDLModel_AscendingRangeExpression, DOMMixin): def __init__(self, node: Iir, left: Expression, right: Expression): - super().__init__() + super().__init__(left, right) DOMMixin.__init__(self, node) - self._leftOperand = left - self._rightOperand = right - @export class DescendingRangeExpression(VHDLModel_DescendingRangeExpression, DOMMixin): def __init__(self, node: Iir, left: Expression, right: Expression): - super().__init__() + super().__init__(left, right) DOMMixin.__init__(self, node) - self._leftOperand = left - self._rightOperand = right - @export class AdditionExpression( - VHDLModel_AdditionExpression, DOMMixin, _ParseBinaryExpression + VHDLModel_AdditionExpression, DOMMixin, _ParseBinaryExpressionMixin ): def __init__(self, node: Iir, left: Expression, right: Expression): - super().__init__() + super().__init__(left, right) DOMMixin.__init__(self, node) - self._leftOperand = left - self._rightOperand = right - @export class SubtractionExpression( - VHDLModel_SubtractionExpression, DOMMixin, _ParseBinaryExpression + VHDLModel_SubtractionExpression, DOMMixin, _ParseBinaryExpressionMixin ): def __init__(self, node: Iir, left: Expression, right: Expression): - super().__init__() + super().__init__(left, right) DOMMixin.__init__(self, node) - self._leftOperand = left - self._rightOperand = right - @export class ConcatenationExpression( - VHDLModel_ConcatenationExpression, DOMMixin, _ParseBinaryExpression + VHDLModel_ConcatenationExpression, DOMMixin, _ParseBinaryExpressionMixin ): def __init__(self, node: Iir, left: Expression, right: Expression): - super().__init__() + super().__init__(left, right) DOMMixin.__init__(self, node) - self._leftOperand = left - self._rightOperand = right - @export class MultiplyExpression( - VHDLModel_MultiplyExpression, DOMMixin, _ParseBinaryExpression + VHDLModel_MultiplyExpression, DOMMixin, _ParseBinaryExpressionMixin ): def __init__(self, node: Iir, left: Expression, right: Expression): - super().__init__() + super().__init__(left, right) DOMMixin.__init__(self, node) - self._leftOperand = left - self._rightOperand = right - @export class DivisionExpression( - VHDLModel_DivisionExpression, DOMMixin, _ParseBinaryExpression + VHDLModel_DivisionExpression, DOMMixin, _ParseBinaryExpressionMixin ): def __init__(self, node: Iir, left: Expression, right: Expression): - super().__init__() + super().__init__(left, right) DOMMixin.__init__(self, node) - self._leftOperand = left - self._rightOperand = right - @export class RemainderExpression( - VHDLModel_RemainderExpression, DOMMixin, _ParseBinaryExpression + VHDLModel_RemainderExpression, DOMMixin, _ParseBinaryExpressionMixin ): def __init__(self, node: Iir, left: Expression, right: Expression): - super().__init__() + super().__init__(left, right) DOMMixin.__init__(self, node) - self._leftOperand = left - self._rightOperand = right - @export -class ModuloExpression(VHDLModel_ModuloExpression, DOMMixin, _ParseBinaryExpression): +class ModuloExpression( + VHDLModel_ModuloExpression, DOMMixin, _ParseBinaryExpressionMixin +): def __init__(self, node: Iir, left: Expression, right: Expression): - super().__init__() + super().__init__(left, right) DOMMixin.__init__(self, node) - self._leftOperand = left - self._rightOperand = right - @export class ExponentiationExpression( - VHDLModel_ExponentiationExpression, DOMMixin, _ParseBinaryExpression + VHDLModel_ExponentiationExpression, DOMMixin, _ParseBinaryExpressionMixin ): def __init__(self, node: Iir, left: Expression, right: Expression): - super().__init__() + super().__init__(left, right) DOMMixin.__init__(self, node) - self._leftOperand = left - self._rightOperand = right - @export -class AndExpression(VHDLModel_AndExpression, DOMMixin, _ParseBinaryExpression): +class AndExpression(VHDLModel_AndExpression, DOMMixin, _ParseBinaryExpressionMixin): def __init__(self, node: Iir, left: Expression, right: Expression): - super().__init__() + super().__init__(left, right) DOMMixin.__init__(self, node) - self._leftOperand = left - self._rightOperand = right - @export -class NandExpression(VHDLModel_NandExpression, DOMMixin, _ParseBinaryExpression): +class NandExpression(VHDLModel_NandExpression, DOMMixin, _ParseBinaryExpressionMixin): def __init__(self, node: Iir, left: Expression, right: Expression): - super().__init__() + super().__init__(left, right) DOMMixin.__init__(self, node) - self._leftOperand = left - self._rightOperand = right - @export -class OrExpression(VHDLModel_OrExpression, DOMMixin, _ParseBinaryExpression): +class OrExpression(VHDLModel_OrExpression, DOMMixin, _ParseBinaryExpressionMixin): def __init__(self, node: Iir, left: Expression, right: Expression): - super().__init__() + super().__init__(left, right) DOMMixin.__init__(self, node) - self._leftOperand = left - self._rightOperand = right - @export -class NorExpression(VHDLModel_NorExpression, DOMMixin, _ParseBinaryExpression): +class NorExpression(VHDLModel_NorExpression, DOMMixin, _ParseBinaryExpressionMixin): def __init__(self, node: Iir, left: Expression, right: Expression): - super().__init__() + super().__init__(left, right) DOMMixin.__init__(self, node) - self._leftOperand = left - self._rightOperand = right - @export -class XorExpression(VHDLModel_XorExpression, DOMMixin, _ParseBinaryExpression): +class XorExpression(VHDLModel_XorExpression, DOMMixin, _ParseBinaryExpressionMixin): def __init__(self, node: Iir, left: Expression, right: Expression): - super().__init__() + super().__init__(left, right) DOMMixin.__init__(self, node) - self._leftOperand = left - self._rightOperand = right - @export -class XnorExpression(VHDLModel_XnorExpression, DOMMixin, _ParseBinaryExpression): +class XnorExpression(VHDLModel_XnorExpression, DOMMixin, _ParseBinaryExpressionMixin): def __init__(self, node: Iir, left: Expression, right: Expression): - super().__init__() + super().__init__(left, right) DOMMixin.__init__(self, node) - self._leftOperand = left - self._rightOperand = right - @export -class EqualExpression(VHDLModel_EqualExpression, DOMMixin, _ParseBinaryExpression): +class EqualExpression(VHDLModel_EqualExpression, DOMMixin, _ParseBinaryExpressionMixin): def __init__(self, node: Iir, left: Expression, right: Expression): - super().__init__() + super().__init__(left, right) DOMMixin.__init__(self, node) - self._leftOperand = left - self._rightOperand = right + +@export +class UnequalExpression( + VHDLModel_UnequalExpression, DOMMixin, _ParseBinaryExpressionMixin +): + def __init__(self, node: Iir, left: Expression, right: Expression): + super().__init__(left, right) + DOMMixin.__init__(self, node) @export -class UnequalExpression(VHDLModel_UnequalExpression, DOMMixin, _ParseBinaryExpression): +class LessThanExpression( + VHDLModel_LessThanExpression, DOMMixin, _ParseBinaryExpressionMixin +): def __init__(self, node: Iir, left: Expression, right: Expression): - super().__init__() + super().__init__(left, right) DOMMixin.__init__(self, node) - self._leftOperand = left - self._rightOperand = right + +@export +class LessEqualExpression( + VHDLModel_LessEqualExpression, DOMMixin, _ParseBinaryExpressionMixin +): + def __init__(self, node: Iir, left: Expression, right: Expression): + super().__init__(left, right) + DOMMixin.__init__(self, node) @export -class LessThanExpression( - VHDLModel_LessThanExpression, DOMMixin, _ParseBinaryExpression +class GreaterThanExpression( + VHDLModel_GreaterThanExpression, DOMMixin, _ParseBinaryExpressionMixin ): def __init__(self, node: Iir, left: Expression, right: Expression): - super().__init__() + super().__init__(left, right) DOMMixin.__init__(self, node) - self._leftOperand = left - self._rightOperand = right + +@export +class GreaterEqualExpression( + VHDLModel_GreaterEqualExpression, DOMMixin, _ParseBinaryExpressionMixin +): + def __init__(self, node: Iir, left: Expression, right: Expression): + super().__init__(left, right) + DOMMixin.__init__(self, node) @export -class LessEqualExpression( - VHDLModel_LessEqualExpression, DOMMixin, _ParseBinaryExpression +class MatchingEqualExpression( + VHDLModel_MatchingEqualExpression, DOMMixin, _ParseBinaryExpressionMixin ): def __init__(self, node: Iir, left: Expression, right: Expression): - super().__init__() + super().__init__(left, right) DOMMixin.__init__(self, node) - self._leftOperand = left - self._rightOperand = right + +@export +class MatchingUnequalExpression( + VHDLModel_MatchingUnequalExpression, DOMMixin, _ParseBinaryExpressionMixin +): + def __init__(self, node: Iir, left: Expression, right: Expression): + super().__init__(left, right) + DOMMixin.__init__(self, node) @export -class GreaterThanExpression( - VHDLModel_GreaterThanExpression, DOMMixin, _ParseBinaryExpression +class MatchingLessThanExpression( + VHDLModel_MatchingLessThanExpression, DOMMixin, _ParseBinaryExpressionMixin ): def __init__(self, node: Iir, left: Expression, right: Expression): - super().__init__() + super().__init__(left, right) DOMMixin.__init__(self, node) - self._leftOperand = left - self._rightOperand = right + +@export +class MatchingLessEqualExpression( + VHDLModel_MatchingLessEqualExpression, DOMMixin, _ParseBinaryExpressionMixin +): + def __init__(self, node: Iir, left: Expression, right: Expression): + super().__init__(left, right) + DOMMixin.__init__(self, node) @export -class GreaterEqualExpression( - VHDLModel_GreaterEqualExpression, DOMMixin, _ParseBinaryExpression +class MatchingGreaterThanExpression( + VHDLModel_MatchingGreaterThanExpression, DOMMixin, _ParseBinaryExpressionMixin ): def __init__(self, node: Iir, left: Expression, right: Expression): - super().__init__() + super().__init__(left, right) DOMMixin.__init__(self, node) - self._leftOperand = left - self._rightOperand = right + +@export +class MatchingGreaterEqualExpression( + VHDLModel_MatchingGreaterEqualExpression, DOMMixin, _ParseBinaryExpressionMixin +): + def __init__(self, node: Iir, left: Expression, right: Expression): + super().__init__(left, right) + DOMMixin.__init__(self, node) @export class ShiftRightLogicExpression( - VHDLModel_ShiftRightLogicExpression, DOMMixin, _ParseBinaryExpression + VHDLModel_ShiftRightLogicExpression, DOMMixin, _ParseBinaryExpressionMixin ): def __init__(self, node: Iir, left: Expression, right: Expression): - super().__init__() + super().__init__(left, right) DOMMixin.__init__(self, node) - self._leftOperand = left - self._rightOperand = right - @export class ShiftLeftLogicExpression( - VHDLModel_ShiftLeftLogicExpression, DOMMixin, _ParseBinaryExpression + VHDLModel_ShiftLeftLogicExpression, DOMMixin, _ParseBinaryExpressionMixin ): def __init__(self, node: Iir, left: Expression, right: Expression): - super().__init__() + super().__init__(left, right) DOMMixin.__init__(self, node) - self._leftOperand = left - self._rightOperand = right - @export class ShiftRightArithmeticExpression( - VHDLModel_ShiftRightArithmeticExpression, DOMMixin, _ParseBinaryExpression + VHDLModel_ShiftRightArithmeticExpression, DOMMixin, _ParseBinaryExpressionMixin ): def __init__(self, node: Iir, left: Expression, right: Expression): - super().__init__() + super().__init__(left, right) DOMMixin.__init__(self, node) - self._leftOperand = left - self._rightOperand = right - @export class ShiftLeftArithmeticExpression( - VHDLModel_ShiftLeftArithmeticExpression, DOMMixin, _ParseBinaryExpression + VHDLModel_ShiftLeftArithmeticExpression, DOMMixin, _ParseBinaryExpressionMixin ): def __init__(self, node: Iir, left: Expression, right: Expression): - super().__init__() + super().__init__(left, right) DOMMixin.__init__(self, node) - self._leftOperand = left - self._rightOperand = right - @export class RotateRightExpression( - VHDLModel_RotateRightExpression, DOMMixin, _ParseBinaryExpression + VHDLModel_RotateRightExpression, DOMMixin, _ParseBinaryExpressionMixin ): def __init__(self, node: Iir, left: Expression, right: Expression): - super().__init__() + super().__init__(left, right) DOMMixin.__init__(self, node) - self._leftOperand = left - self._rightOperand = right - @export class RotateLeftExpression( - VHDLModel_RotateLeftExpression, DOMMixin, _ParseBinaryExpression + VHDLModel_RotateLeftExpression, DOMMixin, _ParseBinaryExpressionMixin ): def __init__(self, node: Iir, left: Expression, right: Expression): - super().__init__() + super().__init__(left, right) DOMMixin.__init__(self, node) - self._leftOperand = left - self._rightOperand = right - @export class QualifiedExpression(VHDLModel_QualifiedExpression, DOMMixin): - def __init__(self, node: Iir, subType: SubTypeOrSymbol, operand: Expression): - super().__init__() + def __init__(self, node: Iir, subtype: SubtypeOrSymbol, operand: Expression): + super().__init__(subtype, operand) DOMMixin.__init__(self, node) - self._subtype = subType - self._operand = operand - @classmethod - def parse(cls, node: Iir): + def parse(cls, node: Iir) -> "QualifiedExpression": from pyGHDL.dom._Translate import GetExpressionFromNode, GetNameOfNode typeMarkName = GetNameOfNode(nodes.Get_Type_Mark(node)) - subType = SimpleSubTypeSymbol(typeMarkName) + subtype = SimpleSubtypeSymbol(node, typeMarkName) operand = GetExpressionFromNode(nodes.Get_Expression(node)) - return cls(subType, operand) + return cls(node, subtype, operand) + + +@export +class SubtypeAllocation(VHDLModel_SubtypeAllocation, DOMMixin): + def __init__(self, node: Iir, subtype: Symbol): + super().__init__(subtype) + DOMMixin.__init__(self, node) + + @classmethod + def parse(cls, node: Iir) -> "QualifiedExpressionAllocation": + from pyGHDL.dom._Translate import GetSubtypeIndicationFromNode + + subtype = GetSubtypeIndicationFromNode(node, "allocation", "?") + + return cls(node, subtype) + + +@export +class QualifiedExpressionAllocation(VHDLModel_QualifiedExpressionAllocation, DOMMixin): + def __init__(self, node: Iir, qualifiedExpression: QualifiedExpression): + super().__init__(qualifiedExpression) + DOMMixin.__init__(self, node) + + @classmethod + def parse(cls, node: Iir) -> "QualifiedExpressionAllocation": + from pyGHDL.dom._Translate import GetExpressionFromNode + + expression = GetExpressionFromNode(nodes.Get_Expression(node)) + + return cls(node, expression) @export class Aggregate(VHDLModel_Aggregate, DOMMixin): def __init__(self, node: Iir, elements: List[AggregateElement]): - super().__init__() + super().__init__(elements) DOMMixin.__init__(self, node) - self._elements = elements - @classmethod - def parse(cls, node: Iir): - from pyGHDL.dom._Translate import GetExpressionFromNode, GetRangeFromNode + def parse(cls, node: Iir) -> "Aggregate": + from pyGHDL.dom._Translate import ( + GetExpressionFromNode, + GetRangeFromNode, + GetNameFromNode, + ) choices = [] @@ -563,8 +573,9 @@ class Aggregate(VHDLModel_Aggregate, DOMMixin): r = GetRangeFromNode(nodes.Get_Choice_Range(item)) choices.append(RangedAggregateElement(item, r, value)) elif kind == nodes.Iir_Kind.Choice_By_Name: - name = EnumerationLiteralSymbol(nodes.Get_Choice_Name(item)) - choices.append(NamedAggregateElement(item, name, value)) + name = GetNameFromNode(nodes.Get_Choice_Name(item)) + symbol = Symbol(item, name) + choices.append(NamedAggregateElement(item, symbol, value)) elif kind == nodes.Iir_Kind.Choice_By_Others: choices.append(OthersAggregateElement(item, value)) else: diff --git a/pyGHDL/dom/InterfaceItem.py b/pyGHDL/dom/InterfaceItem.py index df62c8256..4ebea735a 100644 --- a/pyGHDL/dom/InterfaceItem.py +++ b/pyGHDL/dom/InterfaceItem.py @@ -34,13 +34,17 @@ from pydecor import export from pyVHDLModel.VHDLModel import ( GenericConstantInterfaceItem as VHDLModel_GenericConstantInterfaceItem, + GenericTypeInterfaceItem as VHDLModel_GenericTypeInterfaceItem, + GenericPackageInterfaceItem as VHDLModel_GenericPackageInterfaceItem, + GenericProcedureInterfaceItem as VHDLModel_GenericProcedureInterfaceItem, + GenericFunctionInterfaceItem as VHDLModel_GenericFunctionInterfaceItem, PortSignalInterfaceItem as VHDLModel_PortSignalInterfaceItem, ParameterConstantInterfaceItem as VHDLModel_ParameterConstantInterfaceItem, ParameterVariableInterfaceItem as VHDLModel_ParameterVariableInterfaceItem, ParameterSignalInterfaceItem as VHDLModel_ParameterSignalInterfaceItem, ParameterFileInterfaceItem as VHDLModel_ParameterFileInterfaceItem, Mode, - SubTypeOrSymbol, + SubtypeOrSymbol, Expression, ) @@ -48,7 +52,7 @@ from pyGHDL.libghdl._types import Iir from pyGHDL.libghdl.vhdl import nodes from pyGHDL.dom import DOMMixin from pyGHDL.dom._Utils import GetNameOfNode, GetModeOfNode -from pyGHDL.dom._Translate import GetSubTypeIndicationFromNode, GetExpressionFromNode +from pyGHDL.dom._Translate import GetSubtypeIndicationFromNode, GetExpressionFromNode __all__ = [] @@ -59,51 +63,111 @@ class GenericConstantInterfaceItem(VHDLModel_GenericConstantInterfaceItem, DOMMi def __init__( self, node: Iir, - name: str, + identifier: str, mode: Mode, - subType: SubTypeOrSymbol, + subtype: SubtypeOrSymbol, defaultExpression: Expression, ): - super().__init__(name=name, mode=mode) + super().__init__(identifier, mode, subtype, defaultExpression) DOMMixin.__init__(self, node) - # TODO: move to model - self._subType = subType - self._defaultExpression = defaultExpression - @classmethod def parse(cls, genericNode: Iir) -> "GenericConstantInterfaceItem": name = GetNameOfNode(genericNode) mode = GetModeOfNode(genericNode) - subTypeIndication = GetSubTypeIndicationFromNode(genericNode, "generic", name) + subtypeIndication = GetSubtypeIndicationFromNode(genericNode, "generic", name) default = nodes.Get_Default_Value(genericNode) value = GetExpressionFromNode(default) if default else None - return cls(genericNode, name, mode, subTypeIndication, value) + return cls(genericNode, name, mode, subtypeIndication, value) @export -class PortSignalInterfaceItem(VHDLModel_PortSignalInterfaceItem, DOMMixin): +class GenericTypeInterfaceItem(VHDLModel_GenericTypeInterfaceItem, DOMMixin): + def __init__( + self, + node: Iir, + identifier: str, + ): + super().__init__(identifier) + DOMMixin.__init__(self, node) + + @classmethod + def parse(cls, genericNode: Iir) -> "GenericTypeInterfaceItem": + name = GetNameOfNode(genericNode) + + return cls(genericNode, name) + + +@export +class GenericPackageInterfaceItem(VHDLModel_GenericPackageInterfaceItem, DOMMixin): def __init__( self, node: Iir, name: str, + ): + super().__init__(name) + DOMMixin.__init__(self, node) + + @classmethod + def parse(cls, genericNode: Iir) -> "GenericPackageInterfaceItem": + name = GetNameOfNode(genericNode) + + return cls(genericNode, name) + + +@export +class GenericProcedureInterfaceItem(VHDLModel_GenericProcedureInterfaceItem, DOMMixin): + def __init__( + self, + node: Iir, + identifier: str, + ): + super().__init__(identifier) + DOMMixin.__init__(self, node) + + @classmethod + def parse(cls, genericNode: Iir) -> "GenericProcedureInterfaceItem": + name = GetNameOfNode(genericNode) + + return cls(genericNode, name) + + +@export +class GenericFunctionInterfaceItem(VHDLModel_GenericFunctionInterfaceItem, DOMMixin): + def __init__( + self, + node: Iir, + identifier: str, + ): + super().__init__(identifier) + DOMMixin.__init__(self, node) + + @classmethod + def parse(cls, genericNode: Iir) -> "GenericFunctionInterfaceItem": + name = GetNameOfNode(genericNode) + + return cls(genericNode, name) + + +@export +class PortSignalInterfaceItem(VHDLModel_PortSignalInterfaceItem, DOMMixin): + def __init__( + self, + node: Iir, + identifier: str, mode: Mode, - subType: SubTypeOrSymbol, + subtype: SubtypeOrSymbol, defaultExpression: Expression = None, ): - super().__init__(name=name, mode=mode) + super().__init__(identifier, mode, subtype, defaultExpression) DOMMixin.__init__(self, node) - # TODO: move to model - self._subType = subType - self._defaultExpression = defaultExpression - @classmethod def parse(cls, portNode: Iir) -> "PortSignalInterfaceItem": name = GetNameOfNode(portNode) mode = GetModeOfNode(portNode) - subTypeIndication = GetSubTypeIndicationFromNode(portNode, "port", name) + subtypeIndication = GetSubtypeIndicationFromNode(portNode, "port", name) defaultValue = nodes.Get_Default_Value(portNode) value = ( @@ -112,7 +176,7 @@ class PortSignalInterfaceItem(VHDLModel_PortSignalInterfaceItem, DOMMixin): else None ) - return cls(portNode, name, mode, subTypeIndication, value) + return cls(portNode, name, mode, subtypeIndication, value) @export @@ -122,23 +186,19 @@ class ParameterConstantInterfaceItem( def __init__( self, node: Iir, - name: str, + identifier: str, mode: Mode, - subType: SubTypeOrSymbol, + subtype: SubtypeOrSymbol, defaultExpression: Expression = None, ): - super().__init__(name, mode) + super().__init__(identifier, mode, subtype, defaultExpression) DOMMixin.__init__(self, node) - # TODO: move to model - self._subType = subType - self._defaultExpression = defaultExpression - @classmethod def parse(cls, parameterNode: Iir) -> "ParameterConstantInterfaceItem": name = GetNameOfNode(parameterNode) mode = GetModeOfNode(parameterNode) - subTypeIndication = GetSubTypeIndicationFromNode( + subtypeIndication = GetSubtypeIndicationFromNode( parameterNode, "parameter", name ) @@ -149,7 +209,7 @@ class ParameterConstantInterfaceItem( else None ) - return cls(parameterNode, name, mode, subTypeIndication, value) + return cls(parameterNode, name, mode, subtypeIndication, value) @export @@ -159,23 +219,19 @@ class ParameterVariableInterfaceItem( def __init__( self, node: Iir, - name: str, + identifier: str, mode: Mode, - subType: SubTypeOrSymbol, + subtype: SubtypeOrSymbol, defaultExpression: Expression = None, ): - super().__init__(name, mode) + super().__init__(identifier, mode, subtype, defaultExpression) DOMMixin.__init__(self, node) - # TODO: move to model - self._subType = subType - self._defaultExpression = defaultExpression - @classmethod def parse(cls, parameterNode: Iir) -> "ParameterVariableInterfaceItem": name = GetNameOfNode(parameterNode) mode = GetModeOfNode(parameterNode) - subTypeIndication = GetSubTypeIndicationFromNode( + subtypeIndication = GetSubtypeIndicationFromNode( parameterNode, "parameter", name ) @@ -186,7 +242,7 @@ class ParameterVariableInterfaceItem( else None ) - return cls(parameterNode, name, mode, subTypeIndication, value) + return cls(parameterNode, name, mode, subtypeIndication, value) @export @@ -194,23 +250,19 @@ class ParameterSignalInterfaceItem(VHDLModel_ParameterSignalInterfaceItem, DOMMi def __init__( self, node: Iir, - name: str, + identifier: str, mode: Mode, - subType: SubTypeOrSymbol, + subtype: SubtypeOrSymbol, defaultExpression: Expression = None, ): - super().__init__(name, mode) + super().__init__(identifier, mode, subtype, defaultExpression) DOMMixin.__init__(self, node) - # TODO: move to model - self._subType = subType - self._defaultExpression = defaultExpression - @classmethod def parse(cls, parameterNode: Iir) -> "ParameterSignalInterfaceItem": name = GetNameOfNode(parameterNode) mode = GetModeOfNode(parameterNode) - subTypeIndication = GetSubTypeIndicationFromNode( + subtypeIndication = GetSubtypeIndicationFromNode( parameterNode, "parameter", name ) @@ -221,7 +273,7 @@ class ParameterSignalInterfaceItem(VHDLModel_ParameterSignalInterfaceItem, DOMMi else None ) - return cls(parameterNode, name, mode, subTypeIndication, value) + return cls(parameterNode, name, mode, subtypeIndication, value) @export @@ -229,22 +281,17 @@ class ParameterFileInterfaceItem(VHDLModel_ParameterFileInterfaceItem, DOMMixin) def __init__( self, node: Iir, - name: str, - mode: Mode, - subType: SubTypeOrSymbol, + identifier: str, + subtype: SubtypeOrSymbol, ): - super().__init__(name, mode) + super().__init__(identifier, subtype) DOMMixin.__init__(self, node) - # TODO: move to model - self._subType = subType - @classmethod def parse(cls, parameterNode: Iir) -> "ParameterFileInterfaceItem": name = GetNameOfNode(parameterNode) - mode = GetModeOfNode(parameterNode) - subTypeIndication = GetSubTypeIndicationFromNode( + subtypeIndication = GetSubtypeIndicationFromNode( parameterNode, "parameter", name ) - return cls(parameterNode, name, mode, subTypeIndication) + return cls(parameterNode, name, subtypeIndication) diff --git a/pyGHDL/dom/Names.py b/pyGHDL/dom/Names.py index fa53acae6..e09294d40 100644 --- a/pyGHDL/dom/Names.py +++ b/pyGHDL/dom/Names.py @@ -52,8 +52,8 @@ __all__ = [] @export class SimpleName(VHDLModel_SimpleName, DOMMixin): - def __init__(self, node: Iir, name: str): - super().__init__(name) + def __init__(self, node: Iir, identifier: str): + super().__init__(identifier) DOMMixin.__init__(self, node) @@ -66,29 +66,29 @@ class ParenthesisName(VHDLModel_ParenthesisName, DOMMixin): @export class IndexedName(VHDLModel_IndexedName, DOMMixin): - def __init__(self, node: Iir, name: str): - super().__init__(name) + def __init__(self, node: Iir, identifier: str): + super().__init__(identifier) DOMMixin.__init__(self, node) @export class SlicedName(VHDLModel_SlicedName, DOMMixin): - def __init__(self, node: Iir, name: str): - super().__init__(name) + def __init__(self, node: Iir, identifier: str): + super().__init__(identifier) DOMMixin.__init__(self, node) @export class SelectedName(VHDLModel_SelectedName, DOMMixin): - def __init__(self, node: Iir, name: str, prefix: Name): - super().__init__(name, prefix) + def __init__(self, node: Iir, identifier: str, prefix: Name): + super().__init__(identifier, prefix) DOMMixin.__init__(self, node) @export class AttributeName(VHDLModel_AttributeName, DOMMixin): - def __init__(self, node: Iir, name: str, prefix: Name): - super().__init__(name, prefix) + def __init__(self, node: Iir, identifier: str, prefix: Name): + super().__init__(identifier, prefix) DOMMixin.__init__(self, node) diff --git a/pyGHDL/dom/NonStandard.py b/pyGHDL/dom/NonStandard.py index 1524b549f..bf48db900 100644 --- a/pyGHDL/dom/NonStandard.py +++ b/pyGHDL/dom/NonStandard.py @@ -42,6 +42,7 @@ from typing import Any from pydecor import export +from pyGHDL.dom.PSL import VerificationUnit, VerificationProperty, VerificationMode from pyVHDLModel.VHDLModel import ( Design as VHDLModel_Design, Library as VHDLModel_Library, @@ -198,6 +199,18 @@ class Document(VHDLModel_Document): configuration = Configuration.parse(libraryUnit) self.Configurations.append(configuration) + elif nodeKind == nodes.Iir_Kind.Vunit_Declaration: + vunit = VerificationUnit.parse(libraryUnit) + self.VerificationUnits.append(vunit) + + elif nodeKind == nodes.Iir_Kind.Vprop_Declaration: + vprop = VerificationProperty.parse(libraryUnit) + self.VerificationProperties.append(vprop) + + elif nodeKind == nodes.Iir_Kind.Vmode_Declaration: + vmod = VerificationMode.parse(libraryUnit) + self.VerificationModes.append(vmod) + else: raise DOMException( "Unknown design unit kind '{kindName}'({kind}).".format( diff --git a/pyGHDL/dom/Object.py b/pyGHDL/dom/Object.py index 3085f9f81..d25acb587 100644 --- a/pyGHDL/dom/Object.py +++ b/pyGHDL/dom/Object.py @@ -43,7 +43,7 @@ from pyVHDLModel.VHDLModel import ( Signal as VHDLModel_Signal, File as VHDLModel_File, Expression, - SubTypeOrSymbol, + SubtypeOrSymbol, ) from pyGHDL.libghdl.vhdl import nodes @@ -58,54 +58,47 @@ class Constant(VHDLModel_Constant, DOMMixin): def __init__( self, node: Iir, - name: str, - subType: SubTypeOrSymbol, + identifier: str, + subtype: SubtypeOrSymbol, defaultExpression: Expression, ): - super().__init__(name) + super().__init__(identifier, subtype, defaultExpression) DOMMixin.__init__(self, node) - self._name = name - self._subType = subType - self._defaultExpression = defaultExpression - @classmethod def parse(cls, constantNode: Iir) -> Union["Constant", "DeferredConstant"]: from pyGHDL.dom._Translate import ( - GetSubTypeIndicationFromNode, + GetSubtypeIndicationFromNode, GetExpressionFromNode, ) name = GetNameOfNode(constantNode) - subTypeIndication = GetSubTypeIndicationFromNode(constantNode, "constant", name) + subtypeIndication = GetSubtypeIndicationFromNode(constantNode, "constant", name) defaultValue = nodes.Get_Default_Value(constantNode) if defaultValue != nodes.Null_Iir: defaultExpression = GetExpressionFromNode(defaultValue) - return cls(constantNode, name, subTypeIndication, defaultExpression) + return cls(constantNode, name, subtypeIndication, defaultExpression) else: - return DeferredConstant(constantNode, name, subTypeIndication) + return DeferredConstant(constantNode, name, subtypeIndication) @export class DeferredConstant(VHDLModel_DeferredConstant, DOMMixin): - def __init__(self, node: Iir, name: str, subType: SubTypeOrSymbol): - super().__init__(name) + def __init__(self, node: Iir, identifier: str, subtype: SubtypeOrSymbol): + super().__init__(identifier, subtype) DOMMixin.__init__(self, node) - self._name = name - self._subType = subType - @classmethod def parse(cls, constantNode: Iir) -> "DeferredConstant": - from pyGHDL.dom._Translate import GetSubTypeIndicationFromNode + from pyGHDL.dom._Translate import GetSubtypeIndicationFromNode name = GetNameOfNode(constantNode) - subTypeIndication = GetSubTypeIndicationFromNode( + subtypeIndication = GetSubtypeIndicationFromNode( constantNode, "deferred constant", name ) - return cls(constantNode, name, subTypeIndication) + return cls(constantNode, name, subtypeIndication) @export @@ -113,51 +106,44 @@ class Variable(VHDLModel_Variable, DOMMixin): def __init__( self, node: Iir, - name: str, - subType: SubTypeOrSymbol, + identifier: str, + subtype: SubtypeOrSymbol, defaultExpression: Expression, ): - super().__init__(name) + super().__init__(identifier, subtype, defaultExpression) DOMMixin.__init__(self, node) - self._name = name - self._subType = subType - self._defaultExpression = defaultExpression - @classmethod def parse(cls, variableNode: Iir) -> "Variable": from pyGHDL.dom._Translate import ( - GetSubTypeIndicationFromNode, + GetSubtypeIndicationFromNode, GetExpressionFromNode, ) name = GetNameOfNode(variableNode) - subTypeIndication = GetSubTypeIndicationFromNode(variableNode, "variable", name) + subtypeIndication = GetSubtypeIndicationFromNode(variableNode, "variable", name) defaultValue = nodes.Get_Default_Value(variableNode) defaultExpression = None if defaultValue != nodes.Null_Iir: defaultExpression = GetExpressionFromNode(defaultValue) - return cls(variableNode, name, subTypeIndication, defaultExpression) + return cls(variableNode, name, subtypeIndication, defaultExpression) @export class SharedVariable(VHDLModel_SharedVariable, DOMMixin): - def __init__(self, node: Iir, name: str, subType: SubTypeOrSymbol): - super().__init__(name) + def __init__(self, node: Iir, identifier: str, subtype: SubtypeOrSymbol): + super().__init__(identifier, subtype) DOMMixin.__init__(self, node) - self._name = name - self._subType = subType - @classmethod def parse(cls, variableNode: Iir) -> "SharedVariable": - from pyGHDL.dom._Translate import GetSubTypeIndicationFromNode + from pyGHDL.dom._Translate import GetSubtypeIndicationFromNode name = GetNameOfNode(variableNode) - subTypeIndication = GetSubTypeIndicationFromNode(variableNode, "variable", name) + subtypeIndication = GetSubtypeIndicationFromNode(variableNode, "variable", name) - return cls(variableNode, name, subTypeIndication) + return cls(variableNode, name, subtypeIndication) @export @@ -165,48 +151,41 @@ class Signal(VHDLModel_Signal, DOMMixin): def __init__( self, node: Iir, - name: str, - subType: SubTypeOrSymbol, + identifier: str, + subtype: SubtypeOrSymbol, defaultExpression: Expression, ): - super().__init__(name) + super().__init__(identifier, subtype, defaultExpression) DOMMixin.__init__(self, node) - self._name = name - self._subType = subType - self._defaultExpression = defaultExpression - @classmethod def parse(cls, signalNode: Iir) -> "Signal": from pyGHDL.dom._Translate import ( - GetSubTypeIndicationFromNode, + GetSubtypeIndicationFromNode, GetExpressionFromNode, ) name = GetNameOfNode(signalNode) - subTypeIndication = GetSubTypeIndicationFromNode(signalNode, "signal", name) + subtypeIndication = GetSubtypeIndicationFromNode(signalNode, "signal", name) default = nodes.Get_Default_Value(signalNode) defaultExpression = GetExpressionFromNode(default) if default else None - return cls(signalNode, name, subTypeIndication, defaultExpression) + return cls(signalNode, name, subtypeIndication, defaultExpression) @export class File(VHDLModel_File, DOMMixin): - def __init__(self, node: Iir, name: str, subType: SubTypeOrSymbol): - super().__init__(name) + def __init__(self, node: Iir, identifier: str, subtype: SubtypeOrSymbol): + super().__init__(identifier, subtype) DOMMixin.__init__(self, node) - self._name = name - self._subType = subType - @classmethod def parse(cls, fileNode: Iir) -> "File": - from pyGHDL.dom._Translate import GetSubTypeIndicationFromNode + from pyGHDL.dom._Translate import GetSubtypeIndicationFromNode name = GetNameOfNode(fileNode) - subTypeIndication = GetSubTypeIndicationFromNode(fileNode, "file", name) + subtypeIndication = GetSubtypeIndicationFromNode(fileNode, "file", name) # FIXME: handle file open stuff - return cls(fileNode, name, subTypeIndication) + return cls(fileNode, name, subtypeIndication) diff --git a/pyGHDL/dom/PSL.py b/pyGHDL/dom/PSL.py new file mode 100644 index 000000000..6c4ba76b3 --- /dev/null +++ b/pyGHDL/dom/PSL.py @@ -0,0 +1,133 @@ +# ============================================================================= +# ____ _ _ ____ _ _ +# _ __ _ _ / ___| | | | _ \| | __| | ___ _ __ ___ +# | '_ \| | | | | _| |_| | | | | | / _` |/ _ \| '_ ` _ \ +# | |_) | |_| | |_| | _ | |_| | |___ | (_| | (_) | | | | | | +# | .__/ \__, |\____|_| |_|____/|_____(_)__,_|\___/|_| |_| |_| +# |_| |___/ +# ============================================================================= +# Authors: +# Patrick Lehmann +# +# Package module: DOM: VHDL design units (e.g. context or package). +# +# License: +# ============================================================================ +# Copyright (C) 2019-2021 Tristan Gingold +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <gnu.org/licenses>. +# +# SPDX-License-Identifier: GPL-2.0-or-later +# ============================================================================ + +""" +This module contains all DOM classes for VHDL's design units (:class:`context <Entity>`, +:class:`architecture <Architecture>`, :class:`package <Package>`, +:class:`package body <PackageBody>`, :class:`context <Context>` and +:class:`configuration <Configuration>`. + + +""" +from pyGHDL.libghdl.vhdl import nodes +from pydecor import export + +from pyVHDLModel.PSLModel import ( + VerificationUnit as VHDLModel_VerificationUnit, + VerificationProperty as VHDLModel_VerificationProperty, + VerificationMode as VHDLModel_VerificationMode, + DefaultClock as VHDLModel_DefaultClock, +) + +from pyGHDL.libghdl._types import Iir +from pyGHDL.dom import DOMMixin +from pyGHDL.dom._Utils import GetNameOfNode + + +__all__ = [] + + +@export +class VerificationUnit(VHDLModel_VerificationUnit, DOMMixin): + def __init__( + self, + node: Iir, + identifier: str, + ): + super().__init__(identifier) + DOMMixin.__init__(self, node) + + @classmethod + def parse(cls, vunitNode: Iir): + name = GetNameOfNode(vunitNode) + + # FIXME: needs an implementation + + return cls(vunitNode, name) + + +@export +class VerificationProperty(VHDLModel_VerificationProperty, DOMMixin): + def __init__( + self, + node: Iir, + identifier: str, + ): + super().__init__(identifier) + DOMMixin.__init__(self, node) + + @classmethod + def parse(cls, vpropNode: Iir): + name = GetNameOfNode(vpropNode) + + # FIXME: needs an implementation + + return cls(vpropNode, name) + + +@export +class VerificationMode(VHDLModel_VerificationMode, DOMMixin): + def __init__( + self, + node: Iir, + identifier: str, + ): + super().__init__(identifier) + DOMMixin.__init__(self, node) + + @classmethod + def parse(cls, vmodeNode: Iir): + name = GetNameOfNode(vmodeNode) + + # FIXME: needs an implementation + + return cls(vmodeNode, name) + + +@export +class DefaultClock(VHDLModel_DefaultClock, DOMMixin): + def __init__( + self, + node: Iir, + identifier: str, + ): + super().__init__(identifier) + DOMMixin.__init__(self, node) + + @classmethod + def parse(cls, defaultClockNode: Iir): + name = GetNameOfNode(defaultClockNode) + + # FIXME: needs an implementation + + return cls(defaultClockNode, name) diff --git a/pyGHDL/dom/Range.py b/pyGHDL/dom/Range.py index d091be1c6..ce8dfbc40 100644 --- a/pyGHDL/dom/Range.py +++ b/pyGHDL/dom/Range.py @@ -44,9 +44,4 @@ __all__ = [] @export class Range(VHDLModel_Range): - def __init__(self, left: Expression, right: Expression, direction: Direction): - super().__init__() - - self._leftBound = left - self._rightBound = right - self._direction = direction + pass diff --git a/pyGHDL/dom/Subprogram.py b/pyGHDL/dom/Subprogram.py index 42e3c7d79..e8e5ebbb4 100644 --- a/pyGHDL/dom/Subprogram.py +++ b/pyGHDL/dom/Subprogram.py @@ -37,7 +37,7 @@ from pydecor import export from pyVHDLModel.VHDLModel import ( Function as VHDLModel_Function, Procedure as VHDLModel_Procedure, - SubTypeOrSymbol, + SubtypeOrSymbol, GenericInterfaceItem, ParameterInterfaceItem, ) @@ -45,7 +45,7 @@ from pyGHDL.libghdl._types import Iir from pyGHDL.libghdl.vhdl import nodes from pyGHDL.dom import DOMMixin from pyGHDL.dom._Utils import GetNameOfNode -from pyGHDL.dom.Symbol import SimpleSubTypeSymbol +from pyGHDL.dom.Symbol import SimpleSubtypeSymbol @export @@ -54,7 +54,7 @@ class Function(VHDLModel_Function, DOMMixin): self, node: Iir, functionName: str, - returnType: SubTypeOrSymbol, + returnType: SubtypeOrSymbol, genericItems: List[GenericInterfaceItem] = None, parameterItems: List[ParameterInterfaceItem] = None, ): @@ -84,7 +84,7 @@ class Function(VHDLModel_Function, DOMMixin): returnType = nodes.Get_Return_Type_Mark(functionNode) returnTypeName = GetNameOfNode(returnType) - returnTypeSymbol = SimpleSubTypeSymbol(returnType, returnTypeName) + returnTypeSymbol = SimpleSubtypeSymbol(returnType, returnTypeName) return cls(functionNode, functionName, returnTypeSymbol, generics, parameters) diff --git a/pyGHDL/dom/Symbol.py b/pyGHDL/dom/Symbol.py index 85d1c637b..3597f2572 100644 --- a/pyGHDL/dom/Symbol.py +++ b/pyGHDL/dom/Symbol.py @@ -36,10 +36,9 @@ from pydecor import export from pyVHDLModel.VHDLModel import ( EntitySymbol as VHDLModel_EntitySymbol, - SimpleSubTypeSymbol as VHDLModel_SimpleSubTypeSymbol, - ConstrainedScalarSubTypeSymbol as VHDLModel_ConstrainedScalarSubTypeSymbol, - ConstrainedCompositeSubTypeSymbol as VHDLModel_ConstrainedCompositeSubTypeSymbol, - EnumerationLiteralSymbol as VHDLModel_EnumerationLiteralSymbol, + SimpleSubtypeSymbol as VHDLModel_SimpleSubtypeSymbol, + ConstrainedScalarSubtypeSymbol as VHDLModel_ConstrainedScalarSubtypeSymbol, + ConstrainedCompositeSubtypeSymbol as VHDLModel_ConstrainedCompositeSubtypeSymbol, SimpleObjectOrFunctionCallSymbol as VHDLModel_SimpleObjectOrFunctionCallSymbol, IndexedObjectOrFunctionCallSymbol as VHDLModel_IndexedObjectOrFunctionCallSymbol, Constraint, @@ -47,7 +46,6 @@ from pyVHDLModel.VHDLModel import ( ) from pyGHDL.libghdl._types import Iir from pyGHDL.dom import DOMMixin -from pyGHDL.dom._Utils import GetNameOfNode from pyGHDL.dom.Range import Range @@ -56,34 +54,27 @@ __all__ = [] @export class EntitySymbol(VHDLModel_EntitySymbol, DOMMixin): - def __init__(self, node: Iir, entityName: str): + def __init__(self, node: Iir, entityName: Name): super().__init__(entityName) DOMMixin.__init__(self, node) @export -class EnumerationLiteralSymbol(VHDLModel_EnumerationLiteralSymbol, DOMMixin): - def __init__(self, node: Iir, literalName: str): - super().__init__(symbolName=literalName) - DOMMixin.__init__(self, node) - - -@export -class SimpleSubTypeSymbol(VHDLModel_SimpleSubTypeSymbol, DOMMixin): - def __init__(self, node: Iir, subTypeName: Name): - if isinstance(subTypeName, (List, Iterator)): - subTypeName = ".".join(subTypeName) +class SimpleSubtypeSymbol(VHDLModel_SimpleSubtypeSymbol, DOMMixin): + def __init__(self, node: Iir, subtypeName: Name): + if isinstance(subtypeName, (List, Iterator)): + subtypeName = ".".join(subtypeName) - super().__init__(subTypeName=subTypeName) + super().__init__(subtypeName=subtypeName) DOMMixin.__init__(self, node) @export -class ConstrainedScalarSubTypeSymbol( - VHDLModel_ConstrainedScalarSubTypeSymbol, DOMMixin +class ConstrainedScalarSubtypeSymbol( + VHDLModel_ConstrainedScalarSubtypeSymbol, DOMMixin ): - def __init__(self, node: Iir, subTypeName: str, range: Range = None): - super().__init__(subTypeName=subTypeName, range=range) + def __init__(self, node: Iir, subtypeName: Name, rng: Range = None): + super().__init__(subtypeName, rng) DOMMixin.__init__(self, node) @classmethod @@ -92,13 +83,13 @@ class ConstrainedScalarSubTypeSymbol( @export -class ConstrainedCompositeSubTypeSymbol( - VHDLModel_ConstrainedCompositeSubTypeSymbol, DOMMixin +class ConstrainedCompositeSubtypeSymbol( + VHDLModel_ConstrainedCompositeSubtypeSymbol, DOMMixin ): def __init__( - self, node: Iir, subTypeName: str, constraints: List[Constraint] = None + self, node: Iir, subtypeName: Name, constraints: List[Constraint] = None ): - super().__init__(subTypeName=subTypeName, constraints=constraints) + super().__init__(subtypeName, constraints) DOMMixin.__init__(self, node) @classmethod @@ -112,7 +103,9 @@ class SimpleObjectOrFunctionCallSymbol( ): @classmethod def parse(cls, node: Iir): - name = GetNameOfNode(node) + from pyGHDL.dom._Translate import GetNameFromNode + + name = GetNameFromNode(node) return cls(name) @@ -120,13 +113,13 @@ class SimpleObjectOrFunctionCallSymbol( class IndexedObjectOrFunctionCallSymbol( VHDLModel_IndexedObjectOrFunctionCallSymbol, DOMMixin ): - def __init__(self, node: Iir, name: str): - super().__init__(objectName=name) + def __init__(self, node: Iir, name: Name): + super().__init__(name) DOMMixin.__init__(self, node) @classmethod def parse(cls, node: Iir): - from pyGHDL.dom._Translate import GetExpressionFromNode, GetNameFromNode + from pyGHDL.dom._Translate import GetNameFromNode name = GetNameFromNode(node) diff --git a/pyGHDL/dom/Type.py b/pyGHDL/dom/Type.py index db51f1c49..efe32afc2 100644 --- a/pyGHDL/dom/Type.py +++ b/pyGHDL/dom/Type.py @@ -35,6 +35,7 @@ from typing import List, Union, Iterator, Tuple from pydecor import export from pyVHDLModel.VHDLModel import ( + AnonymousType as VHDLModel_AnonymousType, PhysicalType as VHDLModel_PhysicalType, IntegerType as VHDLModel_IntegerType, EnumeratedType as VHDLModel_EnumeratedType, @@ -45,24 +46,38 @@ from pyVHDLModel.VHDLModel import ( FileType as VHDLModel_FileType, ProtectedType as VHDLModel_ProtectedType, ProtectedTypeBody as VHDLModel_ProtectedTypeBody, - SubType as VHDLModel_SubType, - SubTypeOrSymbol, + Subtype as VHDLModel_Subtype, + SubtypeOrSymbol, + Name, ) from pyGHDL.libghdl import utils from pyGHDL.libghdl._types import Iir from pyGHDL.libghdl.vhdl import nodes from pyGHDL.dom import DOMMixin, DOMException from pyGHDL.dom._Utils import GetNameOfNode, GetIirKindOfNode -from pyGHDL.dom.Symbol import SimpleSubTypeSymbol +from pyGHDL.dom.Symbol import SimpleSubtypeSymbol from pyGHDL.dom.Literal import EnumerationLiteral, PhysicalIntegerLiteral from pyGHDL.dom.Range import Range from pyGHDL.dom.Subprogram import Function, Procedure @export +class IncompleteType(VHDLModel_AnonymousType, DOMMixin): + def __init__(self, node: Iir, identifier: str): + super().__init__(identifier) + DOMMixin.__init__(self, node) + + @classmethod + def parse(cls, node: Iir) -> "IncompleteType": + name = GetNameOfNode(node) + + return cls(node, name) + + +@export class EnumeratedType(VHDLModel_EnumeratedType, DOMMixin): - def __init__(self, node: Iir, name: str, literals: List[EnumerationLiteral]): - super().__init__(name, literals) + def __init__(self, node: Iir, identifier: str, literals: List[EnumerationLiteral]): + super().__init__(identifier, literals) DOMMixin.__init__(self, node) @classmethod @@ -78,13 +93,10 @@ class EnumeratedType(VHDLModel_EnumeratedType, DOMMixin): @export class IntegerType(VHDLModel_IntegerType, DOMMixin): - def __init__(self, node: Iir, typeName: str, range: Range): - super().__init__(typeName) + def __init__(self, node: Iir, typeName: str, rng: Union[Range, "Name"]): + super().__init__(typeName, rng) DOMMixin.__init__(self, node) - self._leftBound = range.LeftBound - self._rightBound = range.RightBound - @export class PhysicalType(VHDLModel_PhysicalType, DOMMixin): @@ -92,14 +104,19 @@ class PhysicalType(VHDLModel_PhysicalType, DOMMixin): self, node: Iir, typeName: str, + rng: Union[Range, Name], primaryUnit: str, units: List[Tuple[str, PhysicalIntegerLiteral]], ): - super().__init__(typeName, primaryUnit, units) + super().__init__(typeName, rng, primaryUnit, units) DOMMixin.__init__(self, node) @classmethod def parse(cls, typeName: str, typeDefinitionNode: Iir) -> "PhysicalType": + from pyGHDL.dom._Translate import GetRangeFromNode + + rng = GetRangeFromNode(nodes.Get_Range_Constraint(typeDefinitionNode)) + primaryUnit = nodes.Get_Primary_Unit(typeDefinitionNode) primaryUnitName = GetNameOfNode(primaryUnit) @@ -115,22 +132,22 @@ class PhysicalType(VHDLModel_PhysicalType, DOMMixin): units.append((secondaryUnitName, physicalLiteral)) - return cls(typeDefinitionNode, typeName, primaryUnitName, units) + return cls(typeDefinitionNode, typeName, rng, primaryUnitName, units) @export class ArrayType(VHDLModel_ArrayType, DOMMixin): def __init__( - self, node: Iir, name: str, indices: List, elementSubType: SubTypeOrSymbol + self, node: Iir, identifier: str, indices: List, elementSubtype: SubtypeOrSymbol ): - super().__init__(name, indices, elementSubType) + super().__init__(identifier, indices, elementSubtype) DOMMixin.__init__(self, node) @classmethod def parse(cls, typeName: str, typeDefinitionNode: Iir) -> "ArrayType": from pyGHDL.dom._Translate import ( GetSimpleTypeFromNode, - GetSubTypeIndicationFromIndicationNode, + GetSubtypeIndicationFromIndicationNode, ) indices = [] @@ -138,8 +155,8 @@ class ArrayType(VHDLModel_ArrayType, DOMMixin): for index in utils.flist_iter(indexDefinitions): indexKind = GetIirKindOfNode(index) if indexKind == nodes.Iir_Kind.Simple_Name: - indexSubType = GetSimpleTypeFromNode(index) - indices.append(indexSubType) + indexSubtype = GetSimpleTypeFromNode(index) + indices.append(indexSubtype) else: raise DOMException( "Unknown kind '{kind}' for an index in the array definition of `{typeName}`.".format( @@ -147,28 +164,28 @@ class ArrayType(VHDLModel_ArrayType, DOMMixin): ) ) - elementSubTypeIndication = nodes.Get_Element_Subtype_Indication( + elementSubtypeIndication = nodes.Get_Element_Subtype_Indication( typeDefinitionNode ) - elementSubType = GetSubTypeIndicationFromIndicationNode( - elementSubTypeIndication, "array declaration", typeName + elementSubtype = GetSubtypeIndicationFromIndicationNode( + elementSubtypeIndication, "array declaration", typeName ) - return cls(typeDefinitionNode, typeName, indices, elementSubType) + return cls(typeDefinitionNode, typeName, indices, elementSubtype) @export class RecordTypeElement(VHDLModel_RecordTypeElement, DOMMixin): - def __init__(self, node: Iir, name: str, subType: SubTypeOrSymbol): - super().__init__(name, subType) + def __init__(self, node: Iir, identifier: str, subtype: SubtypeOrSymbol): + super().__init__(identifier, subtype) DOMMixin.__init__(self, node) @classmethod def parse(cls, elementDeclarationNode: Iir) -> "RecordTypeElement": - from pyGHDL.dom._Translate import GetSubTypeIndicationFromNode + from pyGHDL.dom._Translate import GetSubtypeIndicationFromNode elementName = GetNameOfNode(elementDeclarationNode) - elementType = GetSubTypeIndicationFromNode( + elementType = GetSubtypeIndicationFromNode( elementDeclarationNode, "record element", elementName ) @@ -177,8 +194,10 @@ class RecordTypeElement(VHDLModel_RecordTypeElement, DOMMixin): @export class RecordType(VHDLModel_RecordType, DOMMixin): - def __init__(self, node: Iir, name: str, elements: List[RecordTypeElement] = None): - super().__init__(name, elements) + def __init__( + self, node: Iir, identifier: str, elements: List[RecordTypeElement] = None + ): + super().__init__(identifier, elements) DOMMixin.__init__(self, node) @classmethod @@ -194,8 +213,10 @@ class RecordType(VHDLModel_RecordType, DOMMixin): @export class ProtectedType(VHDLModel_ProtectedType, DOMMixin): - def __init__(self, node: Iir, name: str, methods: Union[List, Iterator] = None): - super().__init__(name, methods) + def __init__( + self, node: Iir, identifier: str, methods: Union[List, Iterator] = None + ): + super().__init__(identifier, methods) DOMMixin.__init__(self, node) @classmethod @@ -215,9 +236,9 @@ class ProtectedType(VHDLModel_ProtectedType, DOMMixin): @export class ProtectedTypeBody(VHDLModel_ProtectedTypeBody, DOMMixin): def __init__( - self, node: Iir, name: str, declaredItems: Union[List, Iterator] = None + self, node: Iir, identifier: str, declaredItems: Union[List, Iterator] = None ): - super().__init__(name, declaredItems) + super().__init__(identifier, declaredItems) DOMMixin.__init__(self, node) @classmethod @@ -236,44 +257,44 @@ class ProtectedTypeBody(VHDLModel_ProtectedTypeBody, DOMMixin): @export class AccessType(VHDLModel_AccessType, DOMMixin): - def __init__(self, node: Iir, name: str, designatedSubType: SubTypeOrSymbol): - super().__init__(name, designatedSubType) + def __init__(self, node: Iir, identifier: str, designatedSubtype: SubtypeOrSymbol): + super().__init__(identifier, designatedSubtype) DOMMixin.__init__(self, node) @classmethod def parse(cls, typeName: str, typeDefinitionNode: Iir) -> "AccessType": - from pyGHDL.dom._Translate import GetSubTypeIndicationFromIndicationNode + from pyGHDL.dom._Translate import GetSubtypeIndicationFromIndicationNode designatedSubtypeIndication = nodes.Get_Designated_Subtype_Indication( typeDefinitionNode ) - designatedSubType = GetSubTypeIndicationFromIndicationNode( + designatedSubtype = GetSubtypeIndicationFromIndicationNode( designatedSubtypeIndication, "access type", typeName ) - return cls(typeDefinitionNode, typeName, designatedSubType) + return cls(typeDefinitionNode, typeName, designatedSubtype) @export class FileType(VHDLModel_FileType, DOMMixin): - def __init__(self, node: Iir, name: str, designatedSubType: SubTypeOrSymbol): - super().__init__(name, designatedSubType) + def __init__(self, node: Iir, identifier: str, designatedSubtype: SubtypeOrSymbol): + super().__init__(identifier, designatedSubtype) DOMMixin.__init__(self, node) @classmethod def parse(cls, typeName: str, typeDefinitionNode: Iir) -> "FileType": - designatedSubTypeMark = nodes.Get_File_Type_Mark(typeDefinitionNode) - designatedSubTypeName = GetNameOfNode(designatedSubTypeMark) - designatedSubType = SimpleSubTypeSymbol( - typeDefinitionNode, designatedSubTypeName + designatedSubtypeMark = nodes.Get_File_Type_Mark(typeDefinitionNode) + designatedSubtypeName = GetNameOfNode(designatedSubtypeMark) + designatedSubtype = SimpleSubtypeSymbol( + typeDefinitionNode, designatedSubtypeName ) - return cls(typeDefinitionNode, typeName, designatedSubType) + return cls(typeDefinitionNode, typeName, designatedSubtype) @export -class SubType(VHDLModel_SubType, DOMMixin): +class Subtype(VHDLModel_Subtype, DOMMixin): def __init__(self, node: Iir, subtypeName: str): super().__init__(subtypeName) DOMMixin.__init__(self, node) diff --git a/pyGHDL/dom/_Translate.py b/pyGHDL/dom/_Translate.py index 502a94ad3..a9ead8c2c 100644 --- a/pyGHDL/dom/_Translate.py +++ b/pyGHDL/dom/_Translate.py @@ -36,11 +36,12 @@ from pydecor import export from pyGHDL.dom import Position, DOMException from pyGHDL.dom.Object import Variable +from pyGHDL.dom.PSL import DefaultClock from pyVHDLModel.VHDLModel import ( Constraint, Direction, Expression, - SubTypeOrSymbol, + SubtypeOrSymbol, BaseType, GenericInterfaceItem, PortInterfaceItem, @@ -65,14 +66,14 @@ from pyGHDL.dom.Names import ( ) from pyGHDL.dom.Symbol import ( SimpleObjectOrFunctionCallSymbol, - SimpleSubTypeSymbol, - ConstrainedCompositeSubTypeSymbol, + SimpleSubtypeSymbol, + ConstrainedCompositeSubtypeSymbol, IndexedObjectOrFunctionCallSymbol, - ConstrainedScalarSubTypeSymbol, + ConstrainedScalarSubtypeSymbol, ) from pyGHDL.dom.Type import ( IntegerType, - SubType, + Subtype, ArrayType, RecordType, EnumeratedType, @@ -81,6 +82,7 @@ from pyGHDL.dom.Type import ( ProtectedTypeBody, FileType, PhysicalType, + IncompleteType, ) from pyGHDL.dom.Range import Range from pyGHDL.dom.Literal import ( @@ -125,6 +127,16 @@ from pyGHDL.dom.Expression import ( RotateLeftExpression, RotateRightExpression, RangeExpression, + QualifiedExpressionAllocation, + SubtypeAllocation, + IdentityExpression, + AbsoluteExpression, + MatchingGreaterEqualExpression, + MatchingEqualExpression, + MatchingUnequalExpression, + MatchingLessThanExpression, + MatchingLessEqualExpression, + MatchingGreaterThanExpression, ) from pyGHDL.dom.Subprogram import Function, Procedure from pyGHDL.dom.Misc import Alias @@ -181,11 +193,11 @@ def GetAssociations(node: Iir) -> List: @export def GetArrayConstraintsFromSubtypeIndication( - subTypeIndication: Iir, + subtypeIndication: Iir, ) -> List[Constraint]: constraints = [] for constraint in utils.flist_iter( - nodes.Get_Index_Constraint_List(subTypeIndication) + nodes.Get_Index_Constraint_List(subtypeIndication) ): constraintKind = GetIirKindOfNode(constraint) if constraintKind == nodes.Iir_Kind.Range_Expression: @@ -203,7 +215,7 @@ def GetArrayConstraintsFromSubtypeIndication( "Unknown constraint kind '{kind}' for constraint '{constraint}' in subtype indication '{indication}' at {file}:{line}:{column}.".format( kind=constraintKind.name, constraint=constraint, - indication=subTypeIndication, + indication=subtypeIndication, file=position.Filename, line=position.Line, column=position.Column, @@ -217,22 +229,14 @@ def GetArrayConstraintsFromSubtypeIndication( def GetTypeFromNode(node: Iir) -> BaseType: typeName = GetNameOfNode(node) typeDefinition = nodes.Get_Type_Definition(node) + if typeDefinition is nodes.Null_Iir: + return IncompleteType(node, typeName) kind = GetIirKindOfNode(typeDefinition) - if kind == nodes.Iir_Kind.Range_Expression: - r = GetRangeFromNode(typeDefinition) - - return IntegerType(node, typeName, r) - elif kind == nodes.Iir_Kind.Physical_Type_Definition: - return PhysicalType.parse(typeName, typeDefinition) - elif kind == nodes.Iir_Kind.Enumeration_Type_Definition: + if kind == nodes.Iir_Kind.Enumeration_Type_Definition: return EnumeratedType.parse(typeName, typeDefinition) elif kind == nodes.Iir_Kind.Array_Type_Definition: return ArrayType.parse(typeName, typeDefinition) - elif kind == nodes.Iir_Kind.Array_Subtype_Definition: - print("[NOT IMPLEMENTED] Array_Subtype_Definition") - - return ArrayType(typeDefinition, "????", [], None) elif kind == nodes.Iir_Kind.Record_Type_Definition: return RecordType.parse(typeName, typeDefinition) elif kind == nodes.Iir_Kind.Access_Type_Definition: @@ -244,9 +248,45 @@ def GetTypeFromNode(node: Iir) -> BaseType: else: position = Position.parse(typeDefinition) raise DOMException( - "Unknown type definition kind '{kindName}'({kind}) for type '{name}' at {file}:{line}:{column}.".format( - kind=kind, - kindName=kind.name, + "GetTypeFromNode: Unknown type definition kind '{kind}' for type '{name}' at {file}:{line}:{column}.".format( + kind=kind.name, + name=typeName, + file=position.Filename, + line=position.Line, + column=position.Column, + ) + ) + + +@export +def GetAnonymousTypeFromNode(node: Iir) -> BaseType: + typeName = GetNameOfNode(node) + typeDefinition = nodes.Get_Type_Definition(node) + if typeDefinition is nodes.Null_Iir: + print(1, node, typeName) + return IncompleteType(node, typeName) + + kind = GetIirKindOfNode(typeDefinition) + if kind == nodes.Iir_Kind.Range_Expression: + r = GetRangeFromNode(typeDefinition) + return IntegerType(node, typeName, r) + + elif kind in (nodes.Iir_Kind.Attribute_Name, nodes.Iir_Kind.Parenthesis_Name): + n = GetNameFromNode(typeDefinition) + + return IntegerType(node, typeName, n) + elif kind == nodes.Iir_Kind.Physical_Type_Definition: + return PhysicalType.parse(typeName, typeDefinition) + + elif kind == nodes.Iir_Kind.Array_Subtype_Definition: + print("[NOT IMPLEMENTED] Array_Subtype_Definition") + + return ArrayType(typeDefinition, "????", [], None) + else: + position = Position.parse(typeDefinition) + raise DOMException( + "GetAnonymousTypeFromNode: Unknown type definition kind '{kind}' for type '{name}' at {file}:{line}:{column}.".format( + kind=kind.name, name=typeName, file=position.Filename, line=position.Line, @@ -256,35 +296,35 @@ def GetTypeFromNode(node: Iir) -> BaseType: @export -def GetSubTypeIndicationFromNode(node: Iir, entity: str, name: str) -> SubTypeOrSymbol: - subTypeIndicationNode = nodes.Get_Subtype_Indication(node) - # if subTypeIndicationNode is nodes.Null_Iir: +def GetSubtypeIndicationFromNode(node: Iir, entity: str, name: str) -> SubtypeOrSymbol: + subtypeIndicationNode = nodes.Get_Subtype_Indication(node) + # if subtypeIndicationNode is nodes.Null_Iir: # return None - return GetSubTypeIndicationFromIndicationNode(subTypeIndicationNode, entity, name) + return GetSubtypeIndicationFromIndicationNode(subtypeIndicationNode, entity, name) @export -def GetSubTypeIndicationFromIndicationNode( - subTypeIndicationNode: Iir, entity: str, name: str -) -> SubTypeOrSymbol: - if subTypeIndicationNode is nodes.Null_Iir: +def GetSubtypeIndicationFromIndicationNode( + subtypeIndicationNode: Iir, entity: str, name: str +) -> SubtypeOrSymbol: + if subtypeIndicationNode is nodes.Null_Iir: print( "[NOT IMPLEMENTED]: Unhandled multiple declarations for {entity} '{name}'.".format( entity=entity, name=name ) ) return None - kind = GetIirKindOfNode(subTypeIndicationNode) + kind = GetIirKindOfNode(subtypeIndicationNode) if kind in ( nodes.Iir_Kind.Simple_Name, nodes.Iir_Kind.Selected_Name, nodes.Iir_Kind.Attribute_Name, ): - return GetSimpleTypeFromNode(subTypeIndicationNode) + return GetSimpleTypeFromNode(subtypeIndicationNode) elif kind == nodes.Iir_Kind.Subtype_Definition: - return GetScalarConstrainedSubTypeFromNode(subTypeIndicationNode) + return GetScalarConstrainedSubtypeFromNode(subtypeIndicationNode) elif kind == nodes.Iir_Kind.Array_Subtype_Definition: - return GetCompositeConstrainedSubTypeFromNode(subTypeIndicationNode) + return GetCompositeConstrainedSubtypeFromNode(subtypeIndicationNode) else: raise DOMException( "Unknown kind '{kind}' for an subtype indication in a {entity} of `{name}`.".format( @@ -294,40 +334,40 @@ def GetSubTypeIndicationFromIndicationNode( @export -def GetSimpleTypeFromNode(subTypeIndicationNode: Iir) -> SimpleSubTypeSymbol: - subTypeName = GetNameFromNode(subTypeIndicationNode) - return SimpleSubTypeSymbol(subTypeIndicationNode, subTypeName) +def GetSimpleTypeFromNode(subtypeIndicationNode: Iir) -> SimpleSubtypeSymbol: + subtypeName = GetNameFromNode(subtypeIndicationNode) + return SimpleSubtypeSymbol(subtypeIndicationNode, subtypeName) @export -def GetScalarConstrainedSubTypeFromNode( - subTypeIndicationNode: Iir, -) -> ConstrainedScalarSubTypeSymbol: - typeMark = nodes.Get_Subtype_Type_Mark(subTypeIndicationNode) +def GetScalarConstrainedSubtypeFromNode( + subtypeIndicationNode: Iir, +) -> ConstrainedScalarSubtypeSymbol: + typeMark = nodes.Get_Subtype_Type_Mark(subtypeIndicationNode) typeMarkName = GetNameOfNode(typeMark) - rangeConstraint = nodes.Get_Range_Constraint(subTypeIndicationNode) + rangeConstraint = nodes.Get_Range_Constraint(subtypeIndicationNode) r = GetRangeFromNode(rangeConstraint) - return ConstrainedScalarSubTypeSymbol(subTypeIndicationNode, typeMarkName, r) + return ConstrainedScalarSubtypeSymbol(subtypeIndicationNode, typeMarkName, r) @export -def GetCompositeConstrainedSubTypeFromNode( - subTypeIndicationNode: Iir, -) -> ConstrainedCompositeSubTypeSymbol: - typeMark = nodes.Get_Subtype_Type_Mark(subTypeIndicationNode) +def GetCompositeConstrainedSubtypeFromNode( + subtypeIndicationNode: Iir, +) -> ConstrainedCompositeSubtypeSymbol: + typeMark = nodes.Get_Subtype_Type_Mark(subtypeIndicationNode) typeMarkName = GetNameOfNode(typeMark) - constraints = GetArrayConstraintsFromSubtypeIndication(subTypeIndicationNode) - return ConstrainedCompositeSubTypeSymbol( - subTypeIndicationNode, typeMarkName, constraints + constraints = GetArrayConstraintsFromSubtypeIndication(subtypeIndicationNode) + return ConstrainedCompositeSubtypeSymbol( + subtypeIndicationNode, typeMarkName, constraints ) @export -def GetSubTypeFromNode(subTypeNode: Iir) -> SubTypeOrSymbol: - subTypeName = GetNameOfNode(subTypeNode) +def GetSubtypeFromNode(subtypeNode: Iir) -> SubtypeOrSymbol: + subtypeName = GetNameOfNode(subtypeNode) - return SubType(subTypeNode, subTypeName) + return Subtype(subtypeNode, subtypeName) @export @@ -355,7 +395,9 @@ __EXPRESSION_TRANSLATION = { nodes.Iir_Kind.Physical_Fp_Literal: PhysicalFloatingLiteral, nodes.Iir_Kind.Character_Literal: CharacterLiteral, nodes.Iir_Kind.String_Literal8: StringLiteral, + nodes.Iir_Kind.Identity_Operator: IdentityExpression, nodes.Iir_Kind.Negation_Operator: NegationExpression, + nodes.Iir_Kind.Absolute_Operator: AbsoluteExpression, nodes.Iir_Kind.Range_Expression: RangeExpression, nodes.Iir_Kind.Addition_Operator: AdditionExpression, nodes.Iir_Kind.Concatenation_Operator: ConcatenationExpression, @@ -378,7 +420,13 @@ __EXPRESSION_TRANSLATION = { nodes.Iir_Kind.Less_Than_Operator: LessThanExpression, nodes.Iir_Kind.Less_Than_Or_Equal_Operator: LessEqualExpression, nodes.Iir_Kind.Greater_Than_Operator: GreaterThanExpression, - nodes.Iir_Kind.Greater_Than_Or_Equal_Operator: GreaterEqualExpression, + nodes.Iir_Kind.Greater_Than_Or_Equal_Operator: MatchingGreaterEqualExpression, + nodes.Iir_Kind.Match_Equality_Operator: MatchingEqualExpression, + nodes.Iir_Kind.Match_Inequality_Operator: MatchingUnequalExpression, + nodes.Iir_Kind.Match_Less_Than_Operator: MatchingLessThanExpression, + nodes.Iir_Kind.Match_Less_Than_Or_Equal_Operator: MatchingLessEqualExpression, + nodes.Iir_Kind.Match_Greater_Than_Operator: MatchingGreaterThanExpression, + nodes.Iir_Kind.Match_Greater_Than_Or_Equal_Operator: MatchingGreaterEqualExpression, nodes.Iir_Kind.Sll_Operator: ShiftLeftLogicExpression, nodes.Iir_Kind.Srl_Operator: ShiftRightLogicExpression, nodes.Iir_Kind.Sla_Operator: ShiftLeftArithmeticExpression, @@ -387,6 +435,8 @@ __EXPRESSION_TRANSLATION = { nodes.Iir_Kind.Ror_Operator: RotateRightExpression, nodes.Iir_Kind.Qualified_Expression: QualifiedExpression, nodes.Iir_Kind.Aggregate: Aggregate, + nodes.Iir_Kind.Allocator_By_Subtype: SubtypeAllocation, + nodes.Iir_Kind.Allocator_By_Expression: QualifiedExpressionAllocation, } @@ -399,9 +449,8 @@ def GetExpressionFromNode(node: Iir) -> Expression: except KeyError: position = Position.parse(node) raise DOMException( - "Unknown expression kind '{kindName}'({kind}) in expression '{expr}' at {file}:{line}:{column}.".format( - kind=kind, - kindName=kind.name, + "Unknown expression kind '{kind}' in expression '{expr}' at {file}:{line}:{column}.".format( + kind=kind.name, expr=node, file=position.Filename, line=position.Line, @@ -416,6 +465,13 @@ def GetExpressionFromNode(node: Iir) -> Expression: def GetGenericsFromChainedNodes( nodeChain: Iir, ) -> Generator[GenericInterfaceItem, None, None]: + from pyGHDL.dom.InterfaceItem import ( + GenericTypeInterfaceItem, + GenericPackageInterfaceItem, + GenericProcedureInterfaceItem, + GenericFunctionInterfaceItem, + ) + for generic in utils.chain_iter(nodeChain): kind = GetIirKindOfNode(generic) if kind == nodes.Iir_Kind.Interface_Constant_Declaration: @@ -423,13 +479,13 @@ def GetGenericsFromChainedNodes( yield GenericConstantInterfaceItem.parse(generic) elif kind == nodes.Iir_Kind.Interface_Type_Declaration: - print("[NOT IMPLEMENTED] generic type") + yield GenericTypeInterfaceItem.parse(generic) elif kind == nodes.Iir_Kind.Interface_Package_Declaration: - print("[NOT IMPLEMENTED] generic package") + yield GenericPackageInterfaceItem.parse(generic) elif kind == nodes.Iir_Kind.Interface_Procedure_Declaration: - print("[NOT IMPLEMENTED] generic procedure") + yield GenericProcedureInterfaceItem.parse(generic) elif kind == nodes.Iir_Kind.Interface_Function_Declaration: - print("[NOT IMPLEMENTED] generic function") + yield GenericFunctionInterfaceItem.parse(generic) else: position = Position.parse(generic) raise DOMException( @@ -534,12 +590,16 @@ def GetDeclaredItemsFromChainedNodes( yield File.parse(item) elif kind == nodes.Iir_Kind.Type_Declaration: yield GetTypeFromNode(item) + elif kind == nodes.Iir_Kind.Anonymous_Type_Declaration: - yield GetTypeFromNode(item) + yield GetAnonymousTypeFromNode(item) + elif kind == nodes.Iir_Kind.Subtype_Declaration: - yield GetSubTypeFromNode(item) + yield GetSubtypeFromNode(item) + elif kind == nodes.Iir_Kind.Function_Declaration: yield Function.parse(item) + elif kind == nodes.Iir_Kind.Function_Body: # procedureName = NodeToName(item) print("found function body '{name}'".format(name="????")) @@ -568,6 +628,10 @@ def GetDeclaredItemsFromChainedNodes( from pyGHDL.dom.DesignUnit import UseClause yield UseClause.parse(item) + elif kind == nodes.Iir_Kind.Package_Declaration: + from pyGHDL.dom.DesignUnit import Package + + yield Package.parse(item) elif kind == nodes.Iir_Kind.Package_Instantiation_Declaration: from pyGHDL.dom.DesignUnit import PackageInstantiation @@ -578,6 +642,20 @@ def GetDeclaredItemsFromChainedNodes( name=name ) ) + elif kind == nodes.Iir_Kind.Psl_Default_Clock: + yield DefaultClock.parse(item) + elif kind == nodes.Iir_Kind.Group_Declaration: + print("[NOT IMPLEMENTED] Group declaration in {name}".format(name=name)) + elif kind == nodes.Iir_Kind.Group_Template_Declaration: + print( + "[NOT IMPLEMENTED] Group template declaration in {name}".format( + name=name + ) + ) + elif kind == nodes.Iir_Kind.Disconnection_Specification: + print( + "[NOT IMPLEMENTED] Disconnect specification in {name}".format(name=name) + ) else: position = Position.parse(item) raise DOMException( diff --git a/pyGHDL/dom/__init__.py b/pyGHDL/dom/__init__.py index 19f23a94b..20c90a1d1 100644 --- a/pyGHDL/dom/__init__.py +++ b/pyGHDL/dom/__init__.py @@ -32,13 +32,12 @@ # ============================================================================ from pathlib import Path -from pyGHDL import GHDLBaseException -from pyGHDL.libghdl import files_map, name_table - -from pyGHDL.libghdl.vhdl import nodes from pydecor import export +from pyGHDL import GHDLBaseException +from pyGHDL.libghdl import files_map, name_table from pyGHDL.libghdl._types import Iir +from pyGHDL.libghdl.vhdl import nodes __all__ = [] @@ -85,6 +84,11 @@ class Position: def Column(self) -> int: return self._column + def __str__(self): + return "{file}:{line}:{column}".format( + file=self._filename, line=self._line, column=self._column + ) + @export class DOMMixin: diff --git a/pyGHDL/dom/formatting/prettyprint.py b/pyGHDL/dom/formatting/prettyprint.py index f055f3f51..4d6e5dccb 100644 --- a/pyGHDL/dom/formatting/prettyprint.py +++ b/pyGHDL/dom/formatting/prettyprint.py @@ -4,10 +4,11 @@ from pydecor import export from pyGHDL.dom.Attribute import Attribute, AttributeSpecification from pyGHDL.dom.Misc import Alias +from pyGHDL.dom.PSL import DefaultClock from pyGHDL.dom.Subprogram import Procedure from pyGHDL.dom.Type import ( IntegerType, - SubType, + Subtype, ArrayType, RecordType, AccessType, @@ -16,15 +17,16 @@ from pyGHDL.dom.Type import ( ProtectedType, ProtectedTypeBody, PhysicalType, + IncompleteType, ) from pyVHDLModel.VHDLModel import ( GenericInterfaceItem, NamedEntity, PortInterfaceItem, - WithDefaultExpression, + WithDefaultExpressionMixin, Function, BaseType, - Type, + FullType, ) from pyGHDL import GHDLBaseException @@ -44,10 +46,11 @@ from pyGHDL.dom.Object import Constant, Signal, SharedVariable, File from pyGHDL.dom.InterfaceItem import ( GenericConstantInterfaceItem, PortSignalInterfaceItem, + GenericTypeInterfaceItem, ) from pyGHDL.dom.Symbol import ( - SimpleSubTypeSymbol, - ConstrainedCompositeSubTypeSymbol, + SimpleSubtypeSymbol, + ConstrainedCompositeSubtypeSymbol, ) @@ -96,7 +99,12 @@ class PrettyPrint: # buffer.append(line) buffer.append("{prefix}Packages:".format(prefix=prefix)) for package in library.Packages: - for line in self.formatPackage(package, level + 1): + if isinstance(package, Package): + gen = self.formatPackage + else: + gen = self.formatPackageInstance + + for line in gen(package, level + 1): buffer.append(line) # buffer.append("{prefix}PackageBodies:".format(prefix=prefix)) # for packageBodies in library.PackageBodies: @@ -126,7 +134,12 @@ class PrettyPrint: buffer.append(line) buffer.append("{prefix}Packages:".format(prefix=prefix)) for package in document.Packages: - for line in self.formatPackage(package, level + 1): + if isinstance(package, Package): + gen = self.formatPackage + else: + gen = self.formatPackageInstance + + for line in gen(package, level + 1): buffer.append(line) buffer.append("{prefix}PackageBodies:".format(prefix=prefix)) for packageBodies in document.PackageBodies: @@ -148,7 +161,7 @@ class PrettyPrint: prefix = " " * level buffer.append( "{prefix}- Name: {name} at {file}:{line}:{column}".format( - name=entity.Name, + name=entity.Identifier, prefix=prefix, file=entity.Position.Filename.name, line=entity.Position.Line, @@ -177,7 +190,7 @@ class PrettyPrint: prefix = " " * level buffer.append( "{prefix}- Name: {name} at {file}:{line}:{column}".format( - name=architecture.Name, + name=architecture.Identifier, prefix=prefix, file=architecture.Position.Filename.name, line=architecture.Position.Line, @@ -200,7 +213,9 @@ class PrettyPrint: buffer = [] prefix = " " * level buffer.append( - "{prefix}- Component: {name}".format(name=component.Name, prefix=prefix) + "{prefix}- Component: {name}".format( + name=component.Identifier, prefix=prefix + ) ) buffer.append("{prefix} Generics:".format(prefix=prefix)) for generic in component.GenericItems: @@ -216,7 +231,9 @@ class PrettyPrint: def formatPackage(self, package: Package, level: int = 0) -> StringBuffer: buffer = [] prefix = " " * level - buffer.append("{prefix}- Name: {name}".format(name=package.Name, prefix=prefix)) + buffer.append( + "{prefix}- Name: {name}".format(name=package.Identifier, prefix=prefix) + ) buffer.append("{prefix} Declared:".format(prefix=prefix)) for item in package.DeclaredItems: for line in self.formatDeclaredItems(item, level + 1): @@ -224,13 +241,33 @@ class PrettyPrint: return buffer + def formatPackageInstance( + self, package: PackageInstantiation, level: int = 0 + ) -> StringBuffer: + buffer = [] + prefix = " " * level + buffer.append( + "{prefix}- Name: {name}".format(name=package.Identifier, prefix=prefix) + ) + buffer.append( + "{prefix} Package: {name!s}".format( + prefix=prefix, name=package.PackageReference + ) + ) + buffer.append("{prefix} Generic Map: ...".format(prefix=prefix)) + # for item in package.GenericItems: + # for line in self.formatGeneric(item, level + 1): + # buffer.append(line) + + return buffer + def formatPackageBody( self, packageBody: PackageBody, level: int = 0 ) -> StringBuffer: buffer = [] prefix = " " * level buffer.append( - "{prefix}- Name: {name}".format(name=packageBody.Name, prefix=prefix) + "{prefix}- Name: {name}".format(name=packageBody.Identifier, prefix=prefix) ) buffer.append("{prefix} Declared:".format(prefix=prefix)) for item in packageBody.DeclaredItems: @@ -245,7 +282,9 @@ class PrettyPrint: buffer = [] prefix = " " * level buffer.append( - "{prefix}- Name: {name}".format(name=configuration.Name, prefix=prefix) + "{prefix}- Name: {name}".format( + name=configuration.Identifier, prefix=prefix + ) ) return buffer @@ -253,7 +292,9 @@ class PrettyPrint: def formatContext(self, context: Context, level: int = 0) -> StringBuffer: buffer = [] prefix = " " * level - buffer.append("{prefix}- Name: {name}".format(name=context.Name, prefix=prefix)) + buffer.append( + "{prefix}- Name: {name}".format(name=context.Identifier, prefix=prefix) + ) return buffer @@ -262,9 +303,13 @@ class PrettyPrint: ) -> StringBuffer: if isinstance(generic, GenericConstantInterfaceItem): return self.formatGenericConstant(generic, level) + elif isinstance(generic, GenericTypeInterfaceItem): + return self.formatGenericType(generic, level) else: raise PrettyPrintException( - "Unhandled generic kind for generic '{name}'.".format(name=generic.Name) + "Unhandled generic kind for generic '{name}'.".format( + name=generic.Identifier + ) ) def formatPort( @@ -274,7 +319,7 @@ class PrettyPrint: return self.formatPortSignal(port, level) else: raise PrettyPrintException( - "Unhandled port kind for port '{name}'.".format(name=port.Name) + "Unhandled port kind for port '{name}'.".format(name=port.Identifier) ) def formatGenericConstant( @@ -286,10 +331,10 @@ class PrettyPrint: buffer.append( "{prefix} - {name} : {mode!s} {subtypeindication}{initialValue}".format( prefix=prefix, - name=generic.Name, + name=generic.Identifier, mode=generic.Mode, subtypeindication=self.formatSubtypeIndication( - generic.SubType, "generic", generic.Name + generic.Subtype, "generic", generic.Identifier ), initialValue=self.formatInitialValue(generic), ) @@ -297,6 +342,21 @@ class PrettyPrint: return buffer + def formatGenericType( + self, generic: GenericConstantInterfaceItem, level: int = 0 + ) -> StringBuffer: + buffer = [] + prefix = " " * level + + buffer.append( + "{prefix} - type {name}".format( + prefix=prefix, + name=generic.Identifier, + ) + ) + + return buffer + def formatPortSignal( self, port: PortSignalInterfaceItem, level: int = 0 ) -> StringBuffer: @@ -306,10 +366,10 @@ class PrettyPrint: buffer.append( "{prefix} - {name} : {mode!s} {subtypeindication}{initialValue}".format( prefix=prefix, - name=port.Name, + name=port.Identifier, mode=port.Mode, subtypeindication=self.formatSubtypeIndication( - port.SubType, "port", port.Name + port.Subtype, "port", port.Identifier ), initialValue=self.formatInitialValue(port), ) @@ -325,9 +385,9 @@ class PrettyPrint: buffer.append( "{prefix}- constant {name} : {subtype} := {expr}".format( prefix=prefix, - name=item.Name, + name=item.Identifier, subtype=self.formatSubtypeIndication( - item.SubType, "constant", item.Name + item.Subtype, "constant", item.Identifier ), expr=str(item.DefaultExpression), ) @@ -336,9 +396,9 @@ class PrettyPrint: buffer.append( "{prefix}- shared variable {name} : {subtype}".format( prefix=prefix, - name=item.Name, + name=item.Identifier, subtype=self.formatSubtypeIndication( - item.SubType, "shared variable", item.Name + item.Subtype, "shared variable", item.Identifier ), ) ) @@ -346,9 +406,9 @@ class PrettyPrint: buffer.append( "{prefix}- signal {name} : {subtype}{initValue}".format( prefix=prefix, - name=item.Name, + name=item.Identifier, subtype=self.formatSubtypeIndication( - item.SubType, "signal", item.Name + item.Subtype, "signal", item.Identifier ), initValue=" := {expr}".format(expr=str(item.DefaultExpression)) if item.DefaultExpression is not None @@ -359,41 +419,41 @@ class PrettyPrint: buffer.append( "{prefix}- File {name} : {subtype}".format( prefix=prefix, - name=item.Name, + name=item.Identifier, subtype=self.formatSubtypeIndication( - item.SubType, "file", item.Name + item.Subtype, "file", item.Identifier ), ) ) - elif isinstance(item, Type): + elif isinstance(item, (FullType, IncompleteType)): buffer.append( "{prefix}- {type}".format(prefix=prefix, type=self.formatType(item)) ) - elif isinstance(item, SubType): + elif isinstance(item, Subtype): buffer.append( "{prefix}- subtype {name} is ?????".format( prefix=prefix, - name=item.Name, + name=item.Identifier, ) ) elif isinstance(item, Alias): buffer.append( "{prefix}- alias {name} is ?????".format( prefix=prefix, - name=item.Name, + name=item.Identifier, ) ) elif isinstance(item, Function): buffer.append( "{prefix}- function {name} return {returnType!s}".format( - prefix=prefix, name=item.Name, returnType=item.ReturnType + prefix=prefix, name=item.Identifier, returnType=item.ReturnType ) ) elif isinstance(item, Procedure): buffer.append( "{prefix}- procedure {name}".format( prefix=prefix, - name=item.Name, + name=item.Identifier, ) ) elif isinstance(item, Component): @@ -402,7 +462,7 @@ class PrettyPrint: elif isinstance(item, Attribute): buffer.append( "{prefix}- attribute {name} : {type!s}".format( - prefix=prefix, name=item.Name, type=item.SubType + prefix=prefix, name=item.Identifier, type=item.Subtype ) ) elif isinstance(item, AttributeSpecification): @@ -419,10 +479,22 @@ class PrettyPrint: buffer.append( "{prefix}- use {name!s}".format(prefix=prefix, name=item.Item) ) + elif isinstance(item, Package): + buffer.append( + "{prefix}- package {name} is ..... end package".format( + prefix=prefix, name=item.Identifier + ) + ) elif isinstance(item, PackageInstantiation): buffer.append( "{prefix}- package {name} is new {name2!s} generic map (.....)".format( - prefix=prefix, name=item.Name, name2=item.PackageReference + prefix=prefix, name=item.Identifier, name2=item.PackageReference + ) + ) + elif isinstance(item, DefaultClock): + buffer.append( + "{prefix}- default {name} is {expr}".format( + prefix=prefix, name=item.Identifier, expr="..." ) ) else: @@ -435,11 +507,11 @@ class PrettyPrint: return buffer def formatType(self, item: BaseType) -> str: - result = "type {name} is ".format(name=item.Name) - if isinstance(item, IntegerType): - result += "range {left!s} to {right!s}".format( - left=item.LeftBound, right=item.RightBound - ) + result = "type {name} is ".format(name=item.Identifier) + if isinstance(item, IncompleteType): + result += "" + elif isinstance(item, IntegerType): + result += "range {range!s}".format(range=item.Range) elif isinstance(item, EnumeratedType): result += "(........)" elif isinstance(item, PhysicalType): @@ -463,25 +535,25 @@ class PrettyPrint: return result - def formatSubtypeIndication(self, subTypeIndication, entity: str, name: str) -> str: - if isinstance(subTypeIndication, SimpleSubTypeSymbol): - return "{type}".format(type=subTypeIndication.SymbolName) - elif isinstance(subTypeIndication, ConstrainedCompositeSubTypeSymbol): + def formatSubtypeIndication(self, subtypeIndication, entity: str, name: str) -> str: + if isinstance(subtypeIndication, SimpleSubtypeSymbol): + return "{type}".format(type=subtypeIndication.SymbolName) + elif isinstance(subtypeIndication, ConstrainedCompositeSubtypeSymbol): constraints = [] - for constraint in subTypeIndication.Constraints: + for constraint in subtypeIndication.Constraints: constraints.append(str(constraint)) return "{type}({constraints})".format( - type=subTypeIndication.SymbolName, constraints=", ".join(constraints) + type=subtypeIndication.SymbolName, constraints=", ".join(constraints) ) else: raise PrettyPrintException( "Unhandled subtype kind '{type}' for {entity} '{name}'.".format( - type=subTypeIndication.__class__.__name__, entity=entity, name=name + type=subtypeIndication.__class__.__name__, entity=entity, name=name ) ) - def formatInitialValue(self, item: WithDefaultExpression) -> str: + def formatInitialValue(self, item: WithDefaultExpressionMixin) -> str: if item.DefaultExpression is None: return "" diff --git a/pyGHDL/dom/requirements.txt b/pyGHDL/dom/requirements.txt new file mode 100644 index 000000000..66e3025ae --- /dev/null +++ b/pyGHDL/dom/requirements.txt @@ -0,0 +1,4 @@ +-r ../libghdl/requirements.txt + +pyVHDLModel==0.11.1 +#https://github.com/VHDL/pyVHDLModel/archive/dev.zip#pyVHDLModel |