aboutsummaryrefslogtreecommitdiffstats
path: root/pyGHDL/dom/NonStandard.py
diff options
context:
space:
mode:
authorUnai Martinez-Corral <38422348+umarcor@users.noreply.github.com>2021-06-22 12:05:45 +0100
committerGitHub <noreply@github.com>2021-06-22 12:05:45 +0100
commitbf45d9939dc26d0d584dd549923b9962f83360ec (patch)
tree976beef99129705fa8d0e592dfba4fad61b80135 /pyGHDL/dom/NonStandard.py
parent15f447b1270a815748fdbcce46d97abd9eecc21d (diff)
parent0a69901be945dfb6c5372e657332d5e5ddfa10c7 (diff)
downloadghdl-bf45d9939dc26d0d584dd549923b9962f83360ec.tar.gz
ghdl-bf45d9939dc26d0d584dd549923b9962f83360ec.tar.bz2
ghdl-bf45d9939dc26d0d584dd549923b9962f83360ec.zip
More expression kinds and function calls (#1802)
Diffstat (limited to 'pyGHDL/dom/NonStandard.py')
-rw-r--r--pyGHDL/dom/NonStandard.py172
1 files changed, 172 insertions, 0 deletions
diff --git a/pyGHDL/dom/NonStandard.py b/pyGHDL/dom/NonStandard.py
new file mode 100644
index 000000000..9010e392b
--- /dev/null
+++ b/pyGHDL/dom/NonStandard.py
@@ -0,0 +1,172 @@
+# =============================================================================
+# ____ _ _ ____ _ _
+# _ __ _ _ / ___| | | | _ \| | __| | ___ _ __ ___
+# | '_ \| | | | | _| |_| | | | | | / _` |/ _ \| '_ ` _ \
+# | |_) | |_| | |_| | _ | |_| | |___ | (_| | (_) | | | | | |
+# | .__/ \__, |\____|_| |_|____/|_____(_)__,_|\___/|_| |_| |_|
+# |_| |___/
+# =============================================================================
+# 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
+ )
+ )