aboutsummaryrefslogtreecommitdiffstats
path: root/pyGHDL
diff options
context:
space:
mode:
authorPatrick Lehmann <Patrick.Lehmann@plc2.de>2022-12-26 09:14:46 +0100
committerPatrick Lehmann <Patrick.Lehmann@plc2.de>2022-12-26 09:14:46 +0100
commit283418269b3f5e351415dc6e8946437a1781941c (patch)
tree89b1ecc594327051efb064d4672dbf4b37382137 /pyGHDL
parent4be45cbc3b4fc20eae8f817fce7bd508d6964691 (diff)
downloadghdl-283418269b3f5e351415dc6e8946437a1781941c.tar.gz
ghdl-283418269b3f5e351415dc6e8946437a1781941c.tar.bz2
ghdl-283418269b3f5e351415dc6e8946437a1781941c.zip
New handling of symbols.
Diffstat (limited to 'pyGHDL')
-rw-r--r--pyGHDL/dom/DesignUnit.py49
-rw-r--r--pyGHDL/dom/_Utils.py31
2 files changed, 41 insertions, 39 deletions
diff --git a/pyGHDL/dom/DesignUnit.py b/pyGHDL/dom/DesignUnit.py
index 3e3784dde..8ccdb91bb 100644
--- a/pyGHDL/dom/DesignUnit.py
+++ b/pyGHDL/dom/DesignUnit.py
@@ -69,7 +69,7 @@ from pyGHDL.libghdl import utils
from pyGHDL.libghdl._types import Iir
from pyGHDL.libghdl.vhdl import nodes
from pyGHDL.dom import DOMMixin, Position, DOMException
-from pyGHDL.dom._Utils import GetNameOfNode, GetDocumentationOfNode, GetIirKindOfNode
+from pyGHDL.dom._Utils import GetNameOfNode, GetDocumentationOfNode, GetPackageMemberSymbol
from pyGHDL.dom._Translate import (
GetGenericsFromChainedNodes,
GetPortsFromChainedNodes,
@@ -77,7 +77,7 @@ from pyGHDL.dom._Translate import (
GetConcurrentStatementsFromChainedNodes,
)
from pyGHDL.dom.Names import SimpleName
-from pyGHDL.dom.Symbol import EntitySymbol, LibraryReferenceSymbol, PackageReferenceSymbol, PackageMembersReferenceSymbol, AllPackageMembersReferenceSymbol, ContextReferenceSymbol
+from pyGHDL.dom.Symbol import EntitySymbol, ContextReferenceSymbol, LibraryReferenceSymbol
@export
@@ -94,41 +94,10 @@ class UseClause(VHDLModel_UseClause, DOMMixin):
DOMMixin.__init__(self, useNode)
@classmethod
- def GetPackageMemberSymbol(cls, node: Iir) -> Union[PackageMembersReferenceSymbol, AllPackageMembersReferenceSymbol]:
- kind = GetIirKindOfNode(node)
- prefixName = cls.GetPackageSymbol(nodes.Get_Prefix(node))
- if kind == nodes.Iir_Kind.Selected_Name:
- name = GetNameOfNode(node)
- return PackageMembersReferenceSymbol(node, name, prefixName)
- elif kind == nodes.Iir_Kind.Selected_By_All_Name:
- return AllPackageMembersReferenceSymbol(node, prefixName)
- else:
- raise DOMException()
-
- @classmethod
- def GetPackageSymbol(cls, node: Iir) -> PackageReferenceSymbol:
- kind = GetIirKindOfNode(node)
- if kind == nodes.Iir_Kind.Selected_Name:
- name = GetNameOfNode(node)
- prefixName = cls.GetLibrarySymbol(nodes.Get_Prefix(node))
- return PackageReferenceSymbol(node, name, prefixName)
- else:
- raise DOMException()
-
- @classmethod
- def GetLibrarySymbol(cls, node: Iir) -> LibraryReferenceSymbol:
- kind = GetIirKindOfNode(node)
- if kind == nodes.Iir_Kind.Simple_Name:
- name = GetNameOfNode(node)
- return LibraryReferenceSymbol(node, name)
- else:
- raise DOMException()
-
- @classmethod
def parse(cls, useNode: Iir):
- uses = [cls.GetPackageMemberSymbol(nodes.Get_Selected_Name(useNode))]
+ uses = [GetPackageMemberSymbol(nodes.Get_Selected_Name(useNode))]
for use in utils.chain_iter(nodes.Get_Use_Clause_Chain(useNode)):
- uses.append(cls.GetPackageMemberSymbol(nodes.Get_Selected_Name(use)))
+ uses.append(GetPackageMemberSymbol(nodes.Get_Selected_Name(use)))
return cls(useNode, uses)
@@ -328,11 +297,10 @@ class Context(VHDLModel_Context, DOMMixin):
self,
node: Iir,
identifier: str,
- libraryReferences: Iterable[LibraryClause] = None,
- packageReferences: Iterable[UseClause] = None,
+ references: Iterable[Union[LibraryClause, UseClause]] = None,
documentation: str = None,
):
- super().__init__(identifier, libraryReferences, packageReferences, documentation)
+ super().__init__(identifier, references, documentation)
DOMMixin.__init__(self, node)
@classmethod
@@ -347,7 +315,8 @@ class Context(VHDLModel_Context, DOMMixin):
for item in utils.chain_iter(nodes.Get_Context_Items(contextNode)):
kind = GetIirKindOfNode(item)
if kind is nodes.Iir_Kind.Library_Clause:
- names.append(SimpleName(item, GetNameOfNode(item)))
+ libraryIdentifier = GetNameOfNode(item)
+ names.append(LibraryReferenceSymbol(item, libraryIdentifier))
if nodes.Get_Has_Identifier_List(item):
continue
@@ -355,6 +324,8 @@ class Context(VHDLModel_Context, DOMMixin):
names = []
elif kind is nodes.Iir_Kind.Use_Clause:
items.append(UseClause.parse(item))
+ elif kind is nodes.Iir_Kind.Context_Reference:
+ items.append(ContextReference.parse(item))
else:
pos = Position.parse(item)
raise DOMException(f"Unknown context item kind '{kind.name}' in context at line {pos.Line}.")
diff --git a/pyGHDL/dom/_Utils.py b/pyGHDL/dom/_Utils.py
index 8bc1f34a0..87dd227a8 100644
--- a/pyGHDL/dom/_Utils.py
+++ b/pyGHDL/dom/_Utils.py
@@ -30,8 +30,11 @@
#
# SPDX-License-Identifier: GPL-2.0-or-later
# ============================================================================
+from typing import Union
+
from pyTooling.Decorators import export
+from pyGHDL.dom.Symbol import LibraryReferenceSymbol, PackageReferenceSymbol, PackageMembersReferenceSymbol, AllPackageMembersReferenceSymbol
from pyVHDLModel.SyntaxModel import Mode
from pyGHDL.libghdl import LibGHDLException, name_table, errorout_memory, files_map, file_comments
@@ -134,3 +137,31 @@ def GetModeOfNode(node: Iir) -> Mode:
return __MODE_TRANSLATION[nodes.Get_Mode(node)]
except KeyError as ex:
raise DOMException(f"Unknown mode '{ex.args[0]}'.") from ex
+
+def GetPackageMemberSymbol(node: Iir) -> Union[PackageMembersReferenceSymbol, AllPackageMembersReferenceSymbol]:
+ kind = GetIirKindOfNode(node)
+ prefixName = GetPackageSymbol(nodes.Get_Prefix(node))
+ if kind == nodes.Iir_Kind.Selected_Name:
+ name = GetNameOfNode(node)
+ return PackageMembersReferenceSymbol(node, name, prefixName)
+ elif kind == nodes.Iir_Kind.Selected_By_All_Name:
+ return AllPackageMembersReferenceSymbol(node, prefixName)
+ else:
+ raise DOMException()
+
+def GetPackageSymbol(node: Iir) -> PackageReferenceSymbol:
+ kind = GetIirKindOfNode(node)
+ if kind == nodes.Iir_Kind.Selected_Name:
+ name = GetNameOfNode(node)
+ prefixName = GetLibrarySymbol(nodes.Get_Prefix(node))
+ return PackageReferenceSymbol(node, name, prefixName)
+ else:
+ raise DOMException()
+
+def GetLibrarySymbol(node: Iir) -> LibraryReferenceSymbol:
+ kind = GetIirKindOfNode(node)
+ if kind == nodes.Iir_Kind.Simple_Name:
+ name = GetNameOfNode(node)
+ return LibraryReferenceSymbol(node, name)
+ else:
+ raise DOMException()