diff options
Diffstat (limited to 'pyGHDL/dom')
-rw-r--r-- | pyGHDL/dom/NonStandard.py | 14 | ||||
-rw-r--r-- | pyGHDL/dom/_Utils.py | 45 | ||||
-rw-r--r-- | pyGHDL/dom/__init__.py | 5 |
3 files changed, 51 insertions, 13 deletions
diff --git a/pyGHDL/dom/NonStandard.py b/pyGHDL/dom/NonStandard.py index db160faaf..0a2ead728 100644 --- a/pyGHDL/dom/NonStandard.py +++ b/pyGHDL/dom/NonStandard.py @@ -42,6 +42,8 @@ from typing import Any from pyTooling.Decorators import export +from pyGHDL.dom.Names import SimpleName +from pyVHDLModel import VHDLVersion from pyVHDLModel.SyntaxModel import ( Design as VHDLModel_Design, Library as VHDLModel_Library, @@ -50,6 +52,7 @@ from pyVHDLModel.SyntaxModel import ( ) from pyGHDL.libghdl import ( + ENCODING, initialize as libghdl_initialize, finalize as libghdl_finalize, set_option as libghdl_set_option, @@ -58,6 +61,7 @@ from pyGHDL.libghdl import ( files_map, errorout_memory, LibGHDLException, + flags, utils, files_map_editor, ENCODING, @@ -102,7 +106,6 @@ class Design(VHDLModel_Design): errorout_memory.Install_Handler() libghdl_set_option("--std=08") - libghdl_set_option("--ams") Flag_Gather_Comments.value = True Flag_Parse_Parenthesis.value = True @@ -131,6 +134,7 @@ class Document(VHDLModel_Document): self, path: Path, sourceCode: str = None, + vhdlVersion: VHDLVersion = VHDLVersion.VHDL2008, dontParse: bool = False, dontTranslate: bool = False, ): @@ -146,8 +150,16 @@ class Document(VHDLModel_Document): if not dontParse: # Parse input file t1 = time.perf_counter() + + if vhdlVersion.IsAMS: + flags.AMS_Vhdl.value = True + self.__ghdlFile = sem_lib.Load_File(self.__ghdlSourceFileEntry) CheckForErrors() + + if vhdlVersion.IsAMS: + flags.AMS_Vhdl.value = False + self.__ghdlProcessingTime = time.perf_counter() - t1 if not dontTranslate: diff --git a/pyGHDL/dom/_Utils.py b/pyGHDL/dom/_Utils.py index 3b647013b..83f10eae8 100644 --- a/pyGHDL/dom/_Utils.py +++ b/pyGHDL/dom/_Utils.py @@ -49,17 +49,31 @@ __MODE_TRANSLATION = { nodes.Iir_Mode.Buffer_Mode: Mode.Buffer, nodes.Iir_Mode.Linkage_Mode: Mode.Linkage, } +""" +Translation table if IIR modes to pyVHDLModel mode enumeration values. +""" @export def CheckForErrors() -> None: + """ + Check if an error occurred in libghdl and raise an exception if so. + + **Behavior:** + + 1. read the error buffer and clear it afterwards + 2. convert it into a list of internal messages for a :exc:`LibGHDLException` + 3. raise a :exc:`DOMException` with a nested :exc:`LibGHDLException` as a ``__cause__``. + + :raises DOMException: If an error occurred in libghdl. + """ errorCount = errorout_memory.Get_Nbr_Messages() - errors = [] if errorCount != 0: + errors = [] for i in range(errorCount): rec = errorout_memory.Get_Error_Record(i + 1) # FIXME: needs help from @tgingold - fileName = "" # name_table.Get_Name_Ptr(files_map.Get_File_Name(rec.file)) + fileName = "????" # name_table.Get_Name_Ptr(files_map.Get_File_Name(rec.file)) message = errorout_memory.Get_Error_Message(i + 1) errors.append(f"{fileName}:{rec.line}:{rec.offset}: {message}") @@ -71,9 +85,13 @@ def CheckForErrors() -> None: @export def GetIirKindOfNode(node: Iir) -> nodes.Iir_Kind: - """Return the kind of a node in the IIR tree.""" + """Return the kind of a node in the IIR tree. + + :returns: The IIR kind of a node. + :raises ValueError: If parameter ``node`` is :py:data:`~pyGHDL.libghdl.vhdl.nodes.Null_Iir`. + """ if node == Null_Iir: - raise ValueError("GetIirKindOfNode: Parameter 'node' must not be 'Null_iir'.") + raise ValueError("GetIirKindOfNode: Parameter 'node' must not be 'Null_Iir'.") kind: int = nodes.Get_Kind(node) return nodes.Iir_Kind(kind) @@ -81,9 +99,12 @@ def GetIirKindOfNode(node: Iir) -> nodes.Iir_Kind: @export def GetNameOfNode(node: Iir) -> str: - """Return the python string from node :obj:`node` identifier.""" + """Return the Python string from node ``node`` identifier. + + :raises ValueError: If parameter ``node`` is :py:data:`~pyGHDL.libghdl.vhdl.nodes.Null_Iir`. + """ if node == Null_Iir: - raise ValueError("GetNameOfNode: Parameter 'node' must not be 'Null_iir'.") + raise ValueError("GetNameOfNode: Parameter 'node' must not be 'Null_Iir'.") identifier = utils.Get_Source_Identifier(node) return name_table.Get_Name_Ptr(identifier) @@ -103,11 +124,15 @@ def GetDocumentationOfNode(node: Iir) -> str: @export def GetModeOfNode(node: Iir) -> Mode: - """Return the mode of a :obj:`node`.""" + """Return the mode of a ``node``. + + :raises ValueError: If parameter ``node`` is :py:data:`~pyGHDL.libghdl.vhdl.nodes.Null_Iir`. + :raises DOMException: If mode returned by libghdl is not known by :py:data:`__MODE_TRANSLATION`. + """ if node == Null_Iir: - raise ValueError("GetModeOfNode: Parameter 'node' must not be 'Null_iir'.") + raise ValueError("GetModeOfNode: Parameter 'node' must not be 'Null_Iir'.") try: return __MODE_TRANSLATION[nodes.Get_Mode(node)] - except KeyError: - raise LibGHDLException("Unknown mode.") + except KeyError as ex: + raise DOMException(f"Unknown mode '{ex.args[0]}'.") from ex diff --git a/pyGHDL/dom/__init__.py b/pyGHDL/dom/__init__.py index 12caccc1b..e60a4e211 100644 --- a/pyGHDL/dom/__init__.py +++ b/pyGHDL/dom/__init__.py @@ -9,8 +9,6 @@ # Authors: # Patrick Lehmann # -# Package package: Document object model (DOM) for pyGHDL.libghdl. -# # License: # ============================================================================ # Copyright (C) 2019-2021 Tristan Gingold @@ -30,6 +28,9 @@ # # SPDX-License-Identifier: GPL-2.0-or-later # ============================================================================ +""" +Document object model (DOM) for :mod:`pyGHDL.libghdl` based on :doc:`pyVHDLModel <vhdlmodel:index>`. +""" from pathlib import Path from pyTooling.Decorators import export |