From 66425e5257c9cec2bdc428b761d59d887564daf6 Mon Sep 17 00:00:00 2001 From: Patrick Lehmann Date: Wed, 23 Jun 2021 01:18:13 +0200 Subject: Better type handling. --- pyGHDL/dom/Type.py | 31 +++++++++++++++++++++++--- pyGHDL/dom/_Translate.py | 35 ++++++++++++++++++++++++++---- pyGHDL/dom/formatting/prettyprint.py | 42 ++++++++++++++++++++++++++++-------- setup.py | 2 ++ 4 files changed, 94 insertions(+), 16 deletions(-) diff --git a/pyGHDL/dom/Type.py b/pyGHDL/dom/Type.py index c276387c7..69cf97af0 100644 --- a/pyGHDL/dom/Type.py +++ b/pyGHDL/dom/Type.py @@ -32,8 +32,13 @@ # ============================================================================ from pydecor import export +from pyGHDL.dom.Range import Range from pyVHDLModel.VHDLModel import ( IntegerType as VHDLModel_IntegerType, + EnumeratedType as VHDLModel_EnumeratedType, + ArrayType as VHDLModel_ArrayType, + RecordType as VHDLModel_RecordType, + AccessType as VHDLModel_AccessType, SubType as VHDLModel_SubType, Expression, ) @@ -41,10 +46,30 @@ from pyVHDLModel.VHDLModel import ( @export class IntegerType(VHDLModel_IntegerType): - def __init__(self, typeName: str, leftBound: Expression, rightBound: Expression): + def __init__(self, typeName: str, range: Range): super().__init__(typeName) - self._leftBound = leftBound - self._rightBound = rightBound + self._leftBound = range.LeftBound + self._rightBound = range.RightBound + + +@export +class EnumeratedType(VHDLModel_EnumeratedType): + pass + + +@export +class ArrayType(VHDLModel_ArrayType): + pass + + +@export +class RecordType(VHDLModel_RecordType): + pass + + +@export +class AccessType(VHDLModel_AccessType): + pass @export diff --git a/pyGHDL/dom/_Translate.py b/pyGHDL/dom/_Translate.py index 3771b57f5..7239da77c 100644 --- a/pyGHDL/dom/_Translate.py +++ b/pyGHDL/dom/_Translate.py @@ -57,7 +57,7 @@ from pyGHDL.dom.Symbol import ( ConstrainedSubTypeSymbol, IndexedObjectOrFunctionCallSymbol, ) -from pyGHDL.dom.Type import IntegerType, SubType +from pyGHDL.dom.Type import IntegerType, SubType, ArrayType, RecordType, EnumeratedType from pyGHDL.dom.Range import Range, RangeExpression from pyGHDL.dom.Literal import ( IntegerLiteral, @@ -181,10 +181,37 @@ def GetArrayConstraintsFromSubtypeIndication( @export def GetTypeFromNode(node: Iir) -> BaseType: typeName = GetNameOfNode(node) - leftBound = IntegerLiteral(0) - rightBound = IntegerLiteral(15) + typeDefinition = nodes.Get_Type_Definition(node) + kind = GetIirKindOfNode(typeDefinition) + if kind == nodes.Iir_Kind.Range_Expression: + r = GetRangeFromNode(typeDefinition) + + return IntegerType(typeName, r) + elif kind == nodes.Iir_Kind.Enumeration_Type_Definition: + + return EnumeratedType(typeName) + 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(typeName) + elif kind == nodes.Iir_Kind.Record_Type_Definition: - return IntegerType(typeName, leftBound, rightBound) + return RecordType(typeName) + else: + position = GetPositionOfNode(typeDefinition) + raise DOMException( + "Unknown type definition kind '{kindName}'({kind}) for type '{name}' at {file}:{line}:{column}.".format( + kind=kind, + kindName=kind.name, + name=typeName, + file=position.Filename, + line=position.Line, + column=position.Column, + ) + ) @export diff --git a/pyGHDL/dom/formatting/prettyprint.py b/pyGHDL/dom/formatting/prettyprint.py index c4f76acaa..26a5d1916 100644 --- a/pyGHDL/dom/formatting/prettyprint.py +++ b/pyGHDL/dom/formatting/prettyprint.py @@ -4,13 +4,22 @@ from pydecor import export from pyGHDL.dom.Misc import Alias from pyGHDL.dom.Subprogram import Procedure -from pyGHDL.dom.Type import IntegerType, SubType +from pyGHDL.dom.Type import ( + IntegerType, + SubType, + ArrayType, + RecordType, + AccessType, + EnumeratedType, +) from pyVHDLModel.VHDLModel import ( GenericInterfaceItem, NamedEntity, PortInterfaceItem, WithDefaultExpression, Function, + BaseType, + Type, ) from pyGHDL import GHDLBaseException @@ -325,15 +334,9 @@ class PrettyPrint: else "", ) ) - elif isinstance(item, IntegerType): + elif isinstance(item, Type): buffer.append( - "{prefix}- type {name} is range {range}".format( - prefix=prefix, - name=item.Name, - range="{left!s} to {right!s}".format( - left=item.LeftBound, right=item.RightBound - ), - ) + "{prefix}- {type}".format(prefix=prefix, type=self.formatType(item)) ) elif isinstance(item, SubType): buffer.append( @@ -374,6 +377,27 @@ 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 + ) + elif isinstance(item, EnumeratedType): + result += "(........)" + elif isinstance(item, ArrayType): + result += "array(........) of ....." + elif isinstance(item, RecordType): + result += "record ..... end record" + elif isinstance(item, AccessType): + result += "access ....." + else: + raise PrettyPrintException( + "Unknown type '{name}'".format(name=item.__class__.__name__) + ) + + return result + def formatSubtypeIndication(self, subTypeIndication, entity: str, name: str) -> str: if isinstance(subTypeIndication, SimpleSubTypeSymbol): return "{type}".format(type=subTypeIndication.SymbolName) diff --git a/setup.py b/setup.py index 26bd54181..32acf3456 100644 --- a/setup.py +++ b/setup.py @@ -35,6 +35,8 @@ from pathlib import Path from re import compile as re_compile +from typing import List + from setuptools import ( setup as setuptools_setup, find_packages as setuptools_find_packages, -- cgit v1.2.3