aboutsummaryrefslogtreecommitdiffstats
path: root/pyGHDL/dom/_Utils.py
diff options
context:
space:
mode:
Diffstat (limited to 'pyGHDL/dom/_Utils.py')
-rw-r--r--pyGHDL/dom/_Utils.py66
1 files changed, 61 insertions, 5 deletions
diff --git a/pyGHDL/dom/_Utils.py b/pyGHDL/dom/_Utils.py
index e75c5f36a..1c109c9dc 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
@@ -52,9 +54,33 @@ __MODE_TRANSLATION = {
@export
+def CheckForErrors() -> None:
+ errorCount = errorout_memory.Get_Nbr_Messages()
+ errors = []
+ if errorCount != 0:
+ for i in range(errorCount):
+ 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
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 +88,38 @@ 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 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:`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 +128,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))