From c5a4e881debcc75bdb96cdddd4abda10fd778b68 Mon Sep 17 00:00:00 2001 From: Patrick Lehmann Date: Tue, 22 Jun 2021 21:40:20 +0200 Subject: Improved error handling. --- pyGHDL/dom/_Utils.py | 40 +++++++++++++++++++++++++++++++++++----- 1 file changed, 35 insertions(+), 5 deletions(-) (limited to 'pyGHDL/dom/_Utils.py') diff --git a/pyGHDL/dom/_Utils.py b/pyGHDL/dom/_Utils.py index e75c5f36a..f413351b4 100644 --- a/pyGHDL/dom/_Utils.py +++ b/pyGHDL/dom/_Utils.py @@ -30,13 +30,15 @@ # # SPDX-License-Identifier: GPL-2.0-or-later # ============================================================================ -from pyGHDL.libghdl._types import Iir from pydecor import export +from pyGHDL.dom.Common import DOMException from pyVHDLModel.VHDLModel import Mode -from pyGHDL.libghdl import LibGHDLException, name_table, files_map +from pyGHDL.libghdl import LibGHDLException, name_table, files_map, errorout_memory from pyGHDL.libghdl.vhdl import nodes +from pyGHDL.libghdl.vhdl.nodes import Null_Iir +from pyGHDL.libghdl._types import Iir from pyGHDL.dom.Misc import Position @@ -51,10 +53,25 @@ __MODE_TRANSLATION = { } +@export +def CheckForErrors() -> None: + errorCount = errorout_memory.Get_Nbr_Messages() + errors = [] + if errorCount != 0: + for i in range(errorCount): + errors.append(errorout_memory.Get_Error_Message(i + 1)) + + raise DOMException("Error raised in libghdl.") \ + from LibGHDLException("libghdl: Internal error.", errors) + + @export def GetIirKindOfNode(node: Iir) -> nodes.Iir_Kind: - # This function is the most likely to be called on a Null_Iir node - assert node != 0 + """Return the kind of a node in the IIR tree.""" + + if node == Null_Iir: + raise ValueError("Parameter 'node' must not be 'Null_iir'.") + kind: int = nodes.Get_Kind(node) return nodes.Iir_Kind(kind) @@ -62,13 +79,21 @@ def GetIirKindOfNode(node: Iir) -> nodes.Iir_Kind: @export def GetNameOfNode(node: Iir) -> str: """Return the python string from node :obj:`node` identifier.""" + + if node == Null_Iir: + raise ValueError("Parameter 'node' must not be 'Null_iir'.") + identifier = nodes.Get_Identifier(node) return name_table.Get_Name_Ptr(identifier) @export def GetModeOfNode(node: Iir) -> Mode: - """Return the mode of a :obj:`port`.""" + """Return the mode of a :obj:`node`.""" + + if node == Null_Iir: + raise ValueError("Parameter 'node' must not be 'Null_iir'.") + try: return __MODE_TRANSLATION[nodes.Get_Mode(node)] except KeyError: @@ -77,6 +102,11 @@ def GetModeOfNode(node: Iir) -> Mode: @export def GetPositionOfNode(node: Iir) -> Position: + """Return the source code position of a IIR node.""" + + if node == Null_Iir: + raise ValueError("Parameter 'node' must not be 'Null_iir'.") + location = nodes.Get_Location(node) file = files_map.Location_To_File(location) fileName = name_table.Get_Name_Ptr(files_map.Get_File_Name(file)) -- cgit v1.2.3 From cebb4aec31557a9235ff6c5666fd6b71864788eb Mon Sep 17 00:00:00 2001 From: Patrick Lehmann Date: Tue, 22 Jun 2021 22:02:30 +0200 Subject: Report file and line of an error reported by libghdl. --- pyGHDL/dom/_Utils.py | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) (limited to 'pyGHDL/dom/_Utils.py') diff --git a/pyGHDL/dom/_Utils.py b/pyGHDL/dom/_Utils.py index f413351b4..a39638559 100644 --- a/pyGHDL/dom/_Utils.py +++ b/pyGHDL/dom/_Utils.py @@ -59,10 +59,19 @@ def CheckForErrors() -> None: errors = [] if errorCount != 0: for i in range(errorCount): - errors.append(errorout_memory.Get_Error_Message(i + 1)) - - raise DOMException("Error raised in libghdl.") \ - from LibGHDLException("libghdl: Internal error.", errors) + rec = errorout_memory.Get_Error_Record(i + 1) + fileName = name_table.Get_Name_Ptr(files_map.Get_File_Name(rec.file)) + message = errorout_memory.Get_Error_Message(i + 1) + + errors.append( + "{file}:{line}:{column}: {msg}".format( + file=fileName, line=rec.line, column=rec.offset, msg=message + ) + ) + + raise DOMException("Error raised in libghdl.") from LibGHDLException( + "libghdl: Internal error.", errors + ) @export -- cgit v1.2.3 From 700a2e85da31c53067b4b4139b1a0c2f78818c68 Mon Sep 17 00:00:00 2001 From: Patrick Lehmann Date: Wed, 23 Jun 2021 11:52:41 +0200 Subject: First primitive handling of selected names. --- pyGHDL/dom/_Utils.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) (limited to 'pyGHDL/dom/_Utils.py') diff --git a/pyGHDL/dom/_Utils.py b/pyGHDL/dom/_Utils.py index a39638559..1c109c9dc 100644 --- a/pyGHDL/dom/_Utils.py +++ b/pyGHDL/dom/_Utils.py @@ -96,6 +96,23 @@ def GetNameOfNode(node: Iir) -> str: return name_table.Get_Name_Ptr(identifier) +@export +def GetSelectedName(node: Iir): + names = [] + kind = GetIirKindOfNode(node) + if kind == nodes.Iir_Kind.Simple_Name: + return GetNameOfNode(node) + + while kind != nodes.Iir_Kind.Simple_Name: + names.append(GetNameOfNode(node)) + node = nodes.Get_Prefix(node) + kind = GetIirKindOfNode(node) + + names.append(GetNameOfNode(node)) + + return reversed(names) + + @export def GetModeOfNode(node: Iir) -> Mode: """Return the mode of a :obj:`node`.""" -- cgit v1.2.3