aboutsummaryrefslogtreecommitdiffstats
path: root/pyGHDL
diff options
context:
space:
mode:
authorPatrick Lehmann <Patrick.Lehmann@plc2.de>2021-06-21 15:48:35 +0200
committerPatrick Lehmann <Patrick.Lehmann@plc2.de>2021-06-22 12:26:59 +0200
commited99fae7f13db8d5c3e95e935e32db825313b56a (patch)
tree2e58bf9b63f3e3214fc00cda3e8368697539b56b /pyGHDL
parentec37f2b5efe56d442ea51d3e10d16742f3cd4bce (diff)
downloadghdl-ed99fae7f13db8d5c3e95e935e32db825313b56a.tar.gz
ghdl-ed99fae7f13db8d5c3e95e935e32db825313b56a.tar.bz2
ghdl-ed99fae7f13db8d5c3e95e935e32db825313b56a.zip
Prepared handling of functions, types, subtypes and aliases.
Diffstat (limited to 'pyGHDL')
-rwxr-xr-xpyGHDL/cli/DOM.py8
-rw-r--r--pyGHDL/dom/Misc.py124
-rw-r--r--pyGHDL/dom/NonStandard.py171
-rw-r--r--pyGHDL/dom/Subprogram.py44
-rw-r--r--pyGHDL/dom/Type.py32
-rw-r--r--pyGHDL/dom/_Translate.py25
-rw-r--r--pyGHDL/dom/formatting/prettyprint.py19
7 files changed, 292 insertions, 131 deletions
diff --git a/pyGHDL/cli/DOM.py b/pyGHDL/cli/DOM.py
index 3d0be2af9..8f9c58edc 100755
--- a/pyGHDL/cli/DOM.py
+++ b/pyGHDL/cli/DOM.py
@@ -7,7 +7,7 @@ from pathlib import Path
from pydecor import export
-from pyGHDL.dom import Misc
+from pyGHDL.dom import NonStandard
from pyGHDL import GHDLBaseException
__all__ = []
@@ -18,13 +18,13 @@ from pyGHDL.dom.formatting.prettyprint import PrettyPrint
@export
class Application:
- _design: Misc.Design
+ _design: NonStandard.Design
def __init__(self):
- self._design = Misc.Design()
+ self._design = NonStandard.Design()
def addFile(self, filename: Path, library: str):
- document = Misc.Document(filename)
+ document = NonStandard.Document(filename)
self._design.Documents.append(document)
def prettyPrint(self):
diff --git a/pyGHDL/dom/Misc.py b/pyGHDL/dom/Misc.py
index 7bee2ec7b..8ff62a119 100644
--- a/pyGHDL/dom/Misc.py
+++ b/pyGHDL/dom/Misc.py
@@ -35,133 +35,19 @@
.. todo::
Add a module documentation.
"""
-from pathlib import Path
-from typing import Any
-
from pydecor import export
-from pyVHDLModel.VHDLModel import Design as VHDLModel_Design
-from pyVHDLModel.VHDLModel import Library as VHDLModel_Library
-from pyVHDLModel.VHDLModel import Document as VHDLModel_Document
-
-import pyGHDL.libghdl as libghdl
-from pyGHDL.libghdl import (
- name_table,
- files_map,
- errorout_memory,
- LibGHDLException,
- utils,
+from pyVHDLModel.VHDLModel import (
+ Alias as VHDLModel_Alias,
)
-from pyGHDL.libghdl.vhdl import nodes, sem_lib, parse
from pyGHDL.dom._Utils import GetIirKindOfNode
from pyGHDL.dom.Common import DOMException, GHDLMixin
-from pyGHDL.dom.DesignUnit import (
- Entity,
- Architecture,
- Package,
- PackageBody,
- Context,
- Configuration,
-)
__all__ = []
@export
-class Design(VHDLModel_Design):
- def __init__(self):
- super().__init__()
-
- self.__ghdl_init()
-
- def __ghdl_init(self):
- """Initialization: set options and then load libraries"""
- # Initialize libghdl
- libghdl.finalize()
- libghdl.initialize()
-
- # Collect error messages in memory
- errorout_memory.Install_Handler()
-
- libghdl.set_option("--std=08")
-
- parse.Flag_Parse_Parenthesis.value = True
-
- # Finish initialization. This will load the standard package.
- if libghdl.analyze_init_status() != 0:
- raise LibGHDLException("Error initializing 'libghdl'.")
-
-
-@export
-class Library(VHDLModel_Library):
- pass
-
-
-@export
-class Document(VHDLModel_Document, GHDLMixin):
- __ghdlFileID: Any
- __ghdlSourceFileEntry: Any
- __ghdlFile: Any
-
- def __init__(self, path: Path = None, dontParse: bool = False):
- super().__init__(path)
- GHDLMixin.__init__(self)
-
- self.__ghdl_init()
- if dontParse == False:
- self.parse()
-
- def __ghdl_init(self):
- # Read input file
- self.__ghdlFileID = name_table.Get_Identifier(str(self.Path))
- self.__ghdlSourceFileEntry = files_map.Read_Source_File(
- name_table.Null_Identifier, self.__ghdlFileID
- )
- if self.__ghdlSourceFileEntry == files_map.No_Source_File_Entry:
- raise LibGHDLException("Cannot load file '{!s}'".format(self.Path))
-
- self.CheckForErrors()
-
- # Parse input file
- self.__ghdlFile = sem_lib.Load_File(self.__ghdlSourceFileEntry)
-
- self.CheckForErrors()
-
- def parse(self):
- firstUnit = nodes.Get_First_Design_Unit(self.__ghdlFile)
-
- for unit in utils.chain_iter(firstUnit):
- libraryUnit = nodes.Get_Library_Unit(unit)
- nodeKind = GetIirKindOfNode(libraryUnit)
-
- if nodeKind == nodes.Iir_Kind.Entity_Declaration:
- entity = Entity.parse(libraryUnit)
- self.Entities.append(entity)
-
- elif nodeKind == nodes.Iir_Kind.Architecture_Body:
- architecture = Architecture.parse(libraryUnit)
- self.Architectures.append(architecture)
-
- elif nodeKind == nodes.Iir_Kind.Package_Declaration:
- package = Package.parse(libraryUnit)
- self.Packages.append(package)
-
- elif nodeKind == nodes.Iir_Kind.Package_Body:
- packageBody = PackageBody.parse(libraryUnit)
- self.PackageBodies.append(packageBody)
-
- elif nodeKind == nodes.Iir_Kind.Context_Declaration:
- context = Context.parse(libraryUnit)
- self.Contexts.append(context)
-
- elif nodeKind == nodes.Iir_Kind.Configuration_Declaration:
- configuration = Configuration.parse(libraryUnit)
- self.Configurations.append(configuration)
-
- else:
- raise DOMException(
- "Unknown design unit kind '{kindName}'({kind}).".format(
- kindName=nodeKind.name, kind=nodeKind
- )
- )
+class Alias(VHDLModel_Alias):
+ def __init__(self, aliasName: str):
+ super().__init__(aliasName)
diff --git a/pyGHDL/dom/NonStandard.py b/pyGHDL/dom/NonStandard.py
new file mode 100644
index 000000000..c3fd358b5
--- /dev/null
+++ b/pyGHDL/dom/NonStandard.py
@@ -0,0 +1,171 @@
+# =============================================================================
+# ____ _ _ ____ _ _
+# _ __ _ _ / ___| | | | _ \| | __| | ___ _ __ ___
+# | '_ \| | | | | _| |_| | | | | | / _` |/ _ \| '_ ` _ \
+# | |_) | |_| | |_| | _ | |_| | |___ | (_| | (_) | | | | | |
+# | .__/ \__, |\____|_| |_|____/|_____(_)__,_|\___/|_| |_| |_|
+# |_| |___/
+# =============================================================================
+# Authors:
+# Patrick Lehmann
+#
+# Package module: DOM: Elements not covered by the VHDL standard.
+#
+# 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
+# ============================================================================
+
+"""
+.. todo::
+ Add a module documentation.
+"""
+from pathlib import Path
+from typing import Any
+
+from pydecor import export
+
+from pyVHDLModel.VHDLModel import (
+ Design as VHDLModel_Design,
+ Library as VHDLModel_Library,
+ Document as VHDLModel_Document,
+)
+
+from pyGHDL.libghdl import (
+ initialize as libghdl_initialize,
+ finalize as libghdl_finalize,
+ set_option as libghdl_set_option,
+ analyze_init_status as libghdl_analyze_init_status,
+ name_table,
+ files_map,
+ errorout_memory,
+ LibGHDLException,
+ utils,
+)
+from pyGHDL.libghdl.vhdl import nodes, sem_lib, parse
+from pyGHDL.dom._Utils import GetIirKindOfNode
+from pyGHDL.dom.Common import DOMException, GHDLMixin
+from pyGHDL.dom.DesignUnit import (
+ Entity,
+ Architecture,
+ Package,
+ PackageBody,
+ Context,
+ Configuration,
+)
+
+__all__ = []
+
+
+@export
+class Design(VHDLModel_Design):
+ def __init__(self):
+ super().__init__()
+
+ self.__ghdl_init()
+
+ def __ghdl_init(self):
+ """Initialization: set options and then load libraries"""
+ # Initialize libghdl
+ libghdl_finalize()
+ libghdl_initialize()
+
+ # Collect error messages in memory
+ errorout_memory.Install_Handler()
+
+ libghdl_set_option("--std=08")
+
+ parse.Flag_Parse_Parenthesis.value = True
+
+ # Finish initialization. This will load the standard package.
+ if libghdl_analyze_init_status() != 0:
+ raise LibGHDLException("Error initializing 'libghdl'.")
+
+
+@export
+class Library(VHDLModel_Library):
+ pass
+
+
+@export
+class Document(VHDLModel_Document, GHDLMixin):
+ __ghdlFileID: Any
+ __ghdlSourceFileEntry: Any
+ __ghdlFile: Any
+
+ def __init__(self, path: Path = None, dontParse: bool = False):
+ super().__init__(path)
+ GHDLMixin.__init__(self)
+
+ self.__ghdl_init()
+ if dontParse == False:
+ self.parse()
+
+ def __ghdl_init(self):
+ # Read input file
+ self.__ghdlFileID = name_table.Get_Identifier(str(self.Path))
+ self.__ghdlSourceFileEntry = files_map.Read_Source_File(
+ name_table.Null_Identifier, self.__ghdlFileID
+ )
+ if self.__ghdlSourceFileEntry == files_map.No_Source_File_Entry:
+ raise LibGHDLException("Cannot load file '{!s}'".format(self.Path))
+
+ self.CheckForErrors()
+
+ # Parse input file
+ self.__ghdlFile = sem_lib.Load_File(self.__ghdlSourceFileEntry)
+
+ self.CheckForErrors()
+
+ def parse(self):
+ firstUnit = nodes.Get_First_Design_Unit(self.__ghdlFile)
+
+ for unit in utils.chain_iter(firstUnit):
+ libraryUnit = nodes.Get_Library_Unit(unit)
+ nodeKind = GetIirKindOfNode(libraryUnit)
+
+ if nodeKind == nodes.Iir_Kind.Entity_Declaration:
+ entity = Entity.parse(libraryUnit)
+ self.Entities.append(entity)
+
+ elif nodeKind == nodes.Iir_Kind.Architecture_Body:
+ architecture = Architecture.parse(libraryUnit)
+ self.Architectures.append(architecture)
+
+ elif nodeKind == nodes.Iir_Kind.Package_Declaration:
+ package = Package.parse(libraryUnit)
+ self.Packages.append(package)
+
+ elif nodeKind == nodes.Iir_Kind.Package_Body:
+ packageBody = PackageBody.parse(libraryUnit)
+ self.PackageBodies.append(packageBody)
+
+ elif nodeKind == nodes.Iir_Kind.Context_Declaration:
+ context = Context.parse(libraryUnit)
+ self.Contexts.append(context)
+
+ elif nodeKind == nodes.Iir_Kind.Configuration_Declaration:
+ configuration = Configuration.parse(libraryUnit)
+ self.Configurations.append(configuration)
+
+ else:
+ raise DOMException(
+ "Unknown design unit kind '{kindName}'({kind}).".format(
+ kindName=nodeKind.name, kind=nodeKind
+ )
+ )
diff --git a/pyGHDL/dom/Subprogram.py b/pyGHDL/dom/Subprogram.py
new file mode 100644
index 000000000..70645df6f
--- /dev/null
+++ b/pyGHDL/dom/Subprogram.py
@@ -0,0 +1,44 @@
+# =============================================================================
+# ____ _ _ ____ _ _
+# _ __ _ _ / ___| | | | _ \| | __| | ___ _ __ ___
+# | '_ \| | | | | _| |_| | | | | | / _` |/ _ \| '_ ` _ \
+# | |_) | |_| | |_| | _ | |_| | |___ | (_| | (_) | | | | | |
+# | .__/ \__, |\____|_| |_|____/|_____(_)__,_|\___/|_| |_| |_|
+# |_| |___/
+# =============================================================================
+# Authors:
+# Patrick Lehmann
+#
+# Package module: DOM: Interface items (e.g. generic or port)
+#
+# 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
+# ============================================================================
+from pydecor import export
+
+from pyVHDLModel.VHDLModel import (
+ Function as VHDLModel_Function,
+ Expression,
+)
+
+
+@export
+class Function(VHDLModel_Function):
+ def __init__(self, functionName: str):
+ super().__init__(functionName)
diff --git a/pyGHDL/dom/Type.py b/pyGHDL/dom/Type.py
index df143b4d0..c276387c7 100644
--- a/pyGHDL/dom/Type.py
+++ b/pyGHDL/dom/Type.py
@@ -1,3 +1,35 @@
+# =============================================================================
+# ____ _ _ ____ _ _
+# _ __ _ _ / ___| | | | _ \| | __| | ___ _ __ ___
+# | '_ \| | | | | _| |_| | | | | | / _` |/ _ \| '_ ` _ \
+# | |_) | |_| | |_| | _ | |_| | |___ | (_| | (_) | | | | | |
+# | .__/ \__, |\____|_| |_|____/|_____(_)__,_|\___/|_| |_| |_|
+# |_| |___/
+# =============================================================================
+# Authors:
+# Patrick Lehmann
+#
+# Package module: DOM: Interface items (e.g. generic or port)
+#
+# 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
+# ============================================================================
from pydecor import export
from pyVHDLModel.VHDLModel import (
diff --git a/pyGHDL/dom/_Translate.py b/pyGHDL/dom/_Translate.py
index cd2a3e53e..e1770672d 100644
--- a/pyGHDL/dom/_Translate.py
+++ b/pyGHDL/dom/_Translate.py
@@ -34,7 +34,7 @@ from typing import List
from pydecor import export
-from pyGHDL.dom.Type import IntegerType, SubType
+from pyGHDL.dom.Misc import Alias
from pyVHDLModel.VHDLModel import (
Constraint,
Direction,
@@ -49,13 +49,14 @@ from pyGHDL.libghdl.utils import flist_iter
from pyGHDL.libghdl.vhdl import nodes
from pyGHDL.dom._Utils import GetNameOfNode, GetIirKindOfNode
from pyGHDL.dom.Common import DOMException
-from pyGHDL.dom.Range import Range, RangeExpression
from pyGHDL.dom.Symbol import (
SimpleObjectOrFunctionCallSymbol,
SimpleSubTypeSymbol,
ConstrainedSubTypeSymbol,
IndexedObjectOrFunctionCallSymbol,
)
+from pyGHDL.dom.Type import IntegerType, SubType
+from pyGHDL.dom.Range import Range, RangeExpression
from pyGHDL.dom.Literal import (
IntegerLiteral,
CharacterLiteral,
@@ -95,6 +96,8 @@ from pyGHDL.dom.Expression import (
RotateLeftExpression,
RotateRightExpression,
)
+from pyGHDL.dom.Subprogram import Function
+
__all__ = []
@@ -304,14 +307,12 @@ def GetDeclaredItemsFromChainedNodes(nodeChain: Iir, entity: str, name: str):
elif kind == nodes.Iir_Kind.Subtype_Declaration:
result.append(GetSubTypeFromNode(item))
elif kind == nodes.Iir_Kind.Function_Declaration:
- functionName = GetNameOfNode(item)
- print("found function '{name}'".format(name=functionName))
+ result.append(GetFunctionFromNode(item))
elif kind == nodes.Iir_Kind.Function_Body:
# functionName = NodeToName(item)
print("found function body '{name}'".format(name="????"))
elif kind == nodes.Iir_Kind.Object_Alias_Declaration:
- aliasName = GetNameOfNode(item)
- print("found alias '{name}'".format(name=aliasName))
+ result.append(GetAliasFromNode(item))
else:
raise DOMException(
"Unknown declared item kind '{kindName}'({kind}) in {entity} '{name}'.".format(
@@ -320,3 +321,15 @@ def GetDeclaredItemsFromChainedNodes(nodeChain: Iir, entity: str, name: str):
)
return result
+
+
+def GetFunctionFromNode(node: Iir):
+ functionName = GetNameOfNode(node)
+
+ return Function(functionName)
+
+
+def GetAliasFromNode(node: Iir):
+ aliasName = GetNameOfNode(node)
+
+ return Alias(aliasName)
diff --git a/pyGHDL/dom/formatting/prettyprint.py b/pyGHDL/dom/formatting/prettyprint.py
index 8f95a412e..afbcbb851 100644
--- a/pyGHDL/dom/formatting/prettyprint.py
+++ b/pyGHDL/dom/formatting/prettyprint.py
@@ -2,16 +2,17 @@ from typing import List, Union
from pydecor import export
+from pyGHDL.dom.Misc import Alias
from pyGHDL.dom.Type import IntegerType, SubType
from pyVHDLModel.VHDLModel import (
GenericInterfaceItem,
NamedEntity,
PortInterfaceItem,
- WithDefaultExpression,
+ WithDefaultExpression, Function,
)
from pyGHDL import GHDLBaseException
-from pyGHDL.dom.Misc import Document, Design, Library
+from pyGHDL.dom.NonStandard import Document, Design, Library
from pyGHDL.dom.DesignUnit import (
Entity,
Architecture,
@@ -311,6 +312,20 @@ class PrettyPrint:
name=item.Name,
)
)
+ elif isinstance(item, Alias):
+ buffer.append(
+ "{prefix}- alias {name} is ?????".format(
+ prefix=prefix,
+ name=item.Name,
+ )
+ )
+ elif isinstance(item, Function):
+ buffer.append(
+ "{prefix}- function {name}".format(
+ prefix=prefix,
+ name=item.Name,
+ )
+ )
else:
raise PrettyPrintException("Unhandled declared item kind.")