aboutsummaryrefslogtreecommitdiffstats
path: root/pyGHDL/dom/Type.py
diff options
context:
space:
mode:
Diffstat (limited to 'pyGHDL/dom/Type.py')
-rw-r--r--pyGHDL/dom/Type.py178
1 files changed, 151 insertions, 27 deletions
diff --git a/pyGHDL/dom/Type.py b/pyGHDL/dom/Type.py
index 2875f1bc2..db51f1c49 100644
--- a/pyGHDL/dom/Type.py
+++ b/pyGHDL/dom/Type.py
@@ -30,38 +30,41 @@
#
# SPDX-License-Identifier: GPL-2.0-or-later
# ============================================================================
-from pyGHDL.dom.Common import DOMException
-from pyGHDL.dom.Literal import EnumerationLiteral
-from pyGHDL.dom._Utils import GetNameOfNode, GetIirKindOfNode
-from pyGHDL.libghdl import utils
-
-from pyGHDL.libghdl.vhdl import nodes
+from typing import List, Union, Iterator, Tuple
-from pyGHDL.libghdl._types import Iir
from pydecor import export
-from pyGHDL.dom.Range import Range
from pyVHDLModel.VHDLModel import (
+ PhysicalType as VHDLModel_PhysicalType,
IntegerType as VHDLModel_IntegerType,
EnumeratedType as VHDLModel_EnumeratedType,
ArrayType as VHDLModel_ArrayType,
RecordTypeElement as VHDLModel_RecordTypeElement,
RecordType as VHDLModel_RecordType,
AccessType as VHDLModel_AccessType,
+ FileType as VHDLModel_FileType,
+ ProtectedType as VHDLModel_ProtectedType,
+ ProtectedTypeBody as VHDLModel_ProtectedTypeBody,
SubType as VHDLModel_SubType,
+ SubTypeOrSymbol,
)
+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.Literal import EnumerationLiteral, PhysicalIntegerLiteral
+from pyGHDL.dom.Range import Range
+from pyGHDL.dom.Subprogram import Function, Procedure
@export
-class IntegerType(VHDLModel_IntegerType):
- def __init__(self, typeName: str, range: Range):
- super().__init__(typeName)
- self._leftBound = range.LeftBound
- self._rightBound = range.RightBound
-
+class EnumeratedType(VHDLModel_EnumeratedType, DOMMixin):
+ def __init__(self, node: Iir, name: str, literals: List[EnumerationLiteral]):
+ super().__init__(name, literals)
+ DOMMixin.__init__(self, node)
-@export
-class EnumeratedType(VHDLModel_EnumeratedType):
@classmethod
def parse(cls, typeName: str, typeDefinitionNode: Iir) -> "EnumeratedType":
literals = []
@@ -70,11 +73,59 @@ class EnumeratedType(VHDLModel_EnumeratedType):
literal = EnumerationLiteral.parse(enumerationLiteral)
literals.append(literal)
- return cls(typeName, literals)
+ return cls(typeDefinitionNode, typeName, literals)
+
+
+@export
+class IntegerType(VHDLModel_IntegerType, DOMMixin):
+ def __init__(self, node: Iir, typeName: str, range: Range):
+ super().__init__(typeName)
+ DOMMixin.__init__(self, node)
+
+ self._leftBound = range.LeftBound
+ self._rightBound = range.RightBound
+
+
+@export
+class PhysicalType(VHDLModel_PhysicalType, DOMMixin):
+ def __init__(
+ self,
+ node: Iir,
+ typeName: str,
+ primaryUnit: str,
+ units: List[Tuple[str, PhysicalIntegerLiteral]],
+ ):
+ super().__init__(typeName, primaryUnit, units)
+ DOMMixin.__init__(self, node)
+
+ @classmethod
+ def parse(cls, typeName: str, typeDefinitionNode: Iir) -> "PhysicalType":
+ primaryUnit = nodes.Get_Primary_Unit(typeDefinitionNode)
+ primaryUnitName = GetNameOfNode(primaryUnit)
+
+ units = []
+ for secondaryUnit in utils.chain_iter(nodes.Get_Unit_Chain(typeDefinitionNode)):
+ secondaryUnitName = GetNameOfNode(secondaryUnit)
+ if secondaryUnit == primaryUnit:
+ continue
+
+ physicalLiteral = PhysicalIntegerLiteral.parse(
+ nodes.Get_Physical_Literal(secondaryUnit)
+ )
+
+ units.append((secondaryUnitName, physicalLiteral))
+
+ return cls(typeDefinitionNode, typeName, primaryUnitName, units)
@export
-class ArrayType(VHDLModel_ArrayType):
+class ArrayType(VHDLModel_ArrayType, DOMMixin):
+ def __init__(
+ self, node: Iir, name: str, indices: List, elementSubType: SubTypeOrSymbol
+ ):
+ super().__init__(name, indices, elementSubType)
+ DOMMixin.__init__(self, node)
+
@classmethod
def parse(cls, typeName: str, typeDefinitionNode: Iir) -> "ArrayType":
from pyGHDL.dom._Translate import (
@@ -103,11 +154,15 @@ class ArrayType(VHDLModel_ArrayType):
elementSubTypeIndication, "array declaration", typeName
)
- return cls(typeName, indices, elementSubType)
+ return cls(typeDefinitionNode, typeName, indices, elementSubType)
@export
-class RecordTypeElement(VHDLModel_RecordTypeElement):
+class RecordTypeElement(VHDLModel_RecordTypeElement, DOMMixin):
+ def __init__(self, node: Iir, name: str, subType: SubTypeOrSymbol):
+ super().__init__(name, subType)
+ DOMMixin.__init__(self, node)
+
@classmethod
def parse(cls, elementDeclarationNode: Iir) -> "RecordTypeElement":
from pyGHDL.dom._Translate import GetSubTypeIndicationFromNode
@@ -117,11 +172,15 @@ class RecordTypeElement(VHDLModel_RecordTypeElement):
elementDeclarationNode, "record element", elementName
)
- return cls(elementName, elementType)
+ return cls(elementDeclarationNode, elementName, elementType)
@export
-class RecordType(VHDLModel_RecordType):
+class RecordType(VHDLModel_RecordType, DOMMixin):
+ def __init__(self, node: Iir, name: str, elements: List[RecordTypeElement] = None):
+ super().__init__(name, elements)
+ DOMMixin.__init__(self, node)
+
@classmethod
def parse(cls, typeName: str, typeDefinitionNode: Iir) -> "RecordType":
elements = []
@@ -130,11 +189,57 @@ class RecordType(VHDLModel_RecordType):
element = RecordTypeElement.parse(elementDeclaration)
elements.append(element)
- return cls(typeName, elements)
+ return cls(typeDefinitionNode, typeName, elements)
@export
-class AccessType(VHDLModel_AccessType):
+class ProtectedType(VHDLModel_ProtectedType, DOMMixin):
+ def __init__(self, node: Iir, name: str, methods: Union[List, Iterator] = None):
+ super().__init__(name, methods)
+ DOMMixin.__init__(self, node)
+
+ @classmethod
+ def parse(cls, typeName: str, typeDefinitionNode: Iir) -> "ProtectedType":
+ # FIXME: change this to a generator
+ methods = []
+ for item in utils.chain_iter(nodes.Get_Declaration_Chain(typeDefinitionNode)):
+ kind = GetIirKindOfNode(item)
+ if kind == nodes.Iir_Kind.Function_Declaration:
+ methods.append(Function.parse(item))
+ elif kind == nodes.Iir_Kind.Procedure_Declaration:
+ methods.append(Procedure.parse(item))
+
+ return cls(typeDefinitionNode, typeName, methods)
+
+
+@export
+class ProtectedTypeBody(VHDLModel_ProtectedTypeBody, DOMMixin):
+ def __init__(
+ self, node: Iir, name: str, declaredItems: Union[List, Iterator] = None
+ ):
+ super().__init__(name, declaredItems)
+ DOMMixin.__init__(self, node)
+
+ @classmethod
+ def parse(cls, protectedBodyNode: Iir) -> "ProtectedTypeBody":
+ from pyGHDL.dom._Translate import GetDeclaredItemsFromChainedNodes
+
+ typeName = GetNameOfNode(protectedBodyNode)
+ declaredItems = GetDeclaredItemsFromChainedNodes(
+ nodes.Get_Declaration_Chain(protectedBodyNode),
+ "protected type body",
+ typeName,
+ )
+
+ return cls(protectedBodyNode, typeName, declaredItems)
+
+
+@export
+class AccessType(VHDLModel_AccessType, DOMMixin):
+ def __init__(self, node: Iir, name: str, designatedSubType: SubTypeOrSymbol):
+ super().__init__(name, designatedSubType)
+ DOMMixin.__init__(self, node)
+
@classmethod
def parse(cls, typeName: str, typeDefinitionNode: Iir) -> "AccessType":
from pyGHDL.dom._Translate import GetSubTypeIndicationFromIndicationNode
@@ -146,10 +251,29 @@ class AccessType(VHDLModel_AccessType):
designatedSubtypeIndication, "access type", typeName
)
- return cls(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)
+ 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
+ )
+
+ return cls(typeDefinitionNode, typeName, designatedSubType)
@export
-class SubType(VHDLModel_SubType):
- def __init__(self, subtypeName: str):
+class SubType(VHDLModel_SubType, DOMMixin):
+ def __init__(self, node: Iir, subtypeName: str):
super().__init__(subtypeName)
+ DOMMixin.__init__(self, node)