aboutsummaryrefslogtreecommitdiffstats
path: root/pyGHDL/dom/_Translate.py
diff options
context:
space:
mode:
authorPatrick Lehmann <Patrick.Lehmann@plc2.de>2021-06-23 10:06:39 +0200
committerPatrick Lehmann <Patrick.Lehmann@plc2.de>2021-06-23 10:06:39 +0200
commit9fca189af9677e435a42eaae1edd91e1098596ac (patch)
tree5c93c53721534b45ba65cbe68076f612c6a4ff2b /pyGHDL/dom/_Translate.py
parent1173ddab8255781e0e2bff2b92e8d07b7bf1c26d (diff)
downloadghdl-9fca189af9677e435a42eaae1edd91e1098596ac.tar.gz
ghdl-9fca189af9677e435a42eaae1edd91e1098596ac.tar.bz2
ghdl-9fca189af9677e435a42eaae1edd91e1098596ac.zip
Added handling of enumeration, array and record types.
Diffstat (limited to 'pyGHDL/dom/_Translate.py')
-rw-r--r--pyGHDL/dom/_Translate.py57
1 files changed, 39 insertions, 18 deletions
diff --git a/pyGHDL/dom/_Translate.py b/pyGHDL/dom/_Translate.py
index a3e3a7c96..8cb1639fd 100644
--- a/pyGHDL/dom/_Translate.py
+++ b/pyGHDL/dom/_Translate.py
@@ -64,6 +64,7 @@ from pyGHDL.dom.Type import (
RecordType,
EnumeratedType,
RecordTypeElement,
+ AccessType,
)
from pyGHDL.dom.Range import Range, RangeExpression
from pyGHDL.dom.Literal import (
@@ -72,7 +73,7 @@ from pyGHDL.dom.Literal import (
FloatingPointLiteral,
StringLiteral,
PhysicalIntegerLiteral,
- PhysicalFloatingLiteral,
+ PhysicalFloatingLiteral, EnumerationLiteral,
)
from pyGHDL.dom.Expression import (
SubtractionExpression,
@@ -195,25 +196,19 @@ def GetTypeFromNode(node: Iir) -> BaseType:
return IntegerType(typeName, r)
elif kind == nodes.Iir_Kind.Enumeration_Type_Definition:
-
- return EnumeratedType(typeName)
+ return EnumeratedType.parse(typeName, typeDefinition)
elif kind == nodes.Iir_Kind.Array_Type_Definition:
- indexSubTypeDefinitionList = nodes.Get_Index_Subtype_Definition_List(
- typeDefinition
- )
- elementSubTypeIndication = nodes.Get_Element_Subtype_Indication(typeDefinition)
+ return ArrayType.parse(typeName, typeDefinition)
+ elif kind == nodes.Iir_Kind.Array_Subtype_Definition:
+ print("Array_Subtype_Definition")
- return ArrayType(typeName)
+ return ArrayType
elif kind == nodes.Iir_Kind.Record_Type_Definition:
- elements = []
- elementDeclarations = nodes.Get_Elements_Declaration_List(typeDefinition)
- for element in utils.flist_iter(elementDeclarations):
- elementName = GetNameOfNode(element)
- elementType = None # GetSubtypeIndicationFromNode(element)
+ return RecordType.parse(typeName, typeDefinition)
+ elif kind == nodes.Iir_Kind.Access_Type_Definition:
+ designatedType = nodes.Get_Designated_Type(typeDefinition)
- elements.append(RecordTypeElement(elementName, elementType))
-
- return RecordType(typeName, elements)
+ return AccessType(typeName, designatedType)
else:
position = GetPositionOfNode(typeDefinition)
raise DOMException(
@@ -229,12 +224,38 @@ def GetTypeFromNode(node: Iir) -> BaseType:
@export
-def GetSubTypeFromNode(node: Iir) -> BaseType:
+def GetSubTypeIndicationFromNode(subTypeIndicationNode: Iir, entity: str, name: str) -> SubTypeOrSymbol:
+ kind = GetIirKindOfNode(subTypeIndicationNode)
+ if kind == nodes.Iir_Kind.Simple_Name:
+ return GetSimpleTypeFromNode(subTypeIndicationNode)
+ elif kind == nodes.Iir_Kind.Array_Subtype_Definition:
+ return GetConstrainedSubTypeFromNode(subTypeIndicationNode)
+ else:
+ raise DOMException(
+ "Unknown kind '{kind}' for an subtype indication in a {entity} of `{name}`.".format(
+ kind=kind.name, entity=entity, name=name
+ )
+ )
+
+@export
+def GetSimpleTypeFromNode(subTypeIndicationNode: Iir) -> SimpleSubTypeSymbol:
+ subTypeName = GetNameOfNode(subTypeIndicationNode)
+ return SimpleSubTypeSymbol(subTypeName)
+
+@export
+def GetConstrainedSubTypeFromNode(subTypeIndicationNode: Iir) -> ConstrainedSubTypeSymbol:
+ typeMark = nodes.Get_Subtype_Type_Mark(subTypeIndicationNode)
+ typeMarkName = GetNameOfNode(typeMark)
+
+ constraints = GetArrayConstraintsFromSubtypeIndication(subTypeIndicationNode)
+ return ConstrainedSubTypeSymbol(typeMarkName, constraints)
+
+@export
+def GetSubTypeFromNode(node: Iir) -> SubTypeOrSymbol:
subTypeName = GetNameOfNode(node)
return SubType(subTypeName)
-
@export
def GetRangeFromNode(node: Iir) -> Range:
direction = nodes.Get_Direction(node)