aboutsummaryrefslogtreecommitdiffstats
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
parent4be45cbc3b4fc20eae8f817fce7bd508d6964691 (diff)
downloadghdl-283418269b3f5e351415dc6e8946437a1781941c.tar.gz
ghdl-283418269b3f5e351415dc6e8946437a1781941c.tar.bz2
ghdl-283418269b3f5e351415dc6e8946437a1781941c.zip
New handling of symbols.
-rw-r--r--pyGHDL/dom/DesignUnit.py49
-rw-r--r--pyGHDL/dom/_Utils.py31
-rw-r--r--testsuite/pyunit/dom/examples/StopWatch/StopWatch.ctx.vhdl21
-rw-r--r--testsuite/pyunit/dom/examples/StopWatch/Utilities.ctx.vhdl12
4 files changed, 74 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()
diff --git a/testsuite/pyunit/dom/examples/StopWatch/StopWatch.ctx.vhdl b/testsuite/pyunit/dom/examples/StopWatch/StopWatch.ctx.vhdl
new file mode 100644
index 000000000..1a40718aa
--- /dev/null
+++ b/testsuite/pyunit/dom/examples/StopWatch/StopWatch.ctx.vhdl
@@ -0,0 +1,21 @@
+-- Author: Patrick Lehmann
+-- License: MIT
+--
+-- A generic counter module used in the StopWatch example.
+--
+library IEEE;
+use IEEE.std_logic_1164.all;
+use IEEE.numeric_std.all;
+
+-- Package with stop watch specific types.
+package StopWatch_pkg is
+ subtype T_BCD is unsigned(3 downto 0);
+ type T_BCD_Vector is array(natural range <>) of T_BCD;
+
+ type T_DIGIT_CONFIGURATION is record
+ Modulo : positive;
+ Dot : std_logic;
+ end record;
+
+ type T_STOPWATCH_CONFIGURATION is array(natural range <>) of T_DIGIT_CONFIGURATION;
+end package;
diff --git a/testsuite/pyunit/dom/examples/StopWatch/Utilities.ctx.vhdl b/testsuite/pyunit/dom/examples/StopWatch/Utilities.ctx.vhdl
new file mode 100644
index 000000000..e6551cffd
--- /dev/null
+++ b/testsuite/pyunit/dom/examples/StopWatch/Utilities.ctx.vhdl
@@ -0,0 +1,12 @@
+-- Author: Patrick Lehmann
+-- License: MIT
+--
+-- A generic counter module used in the StopWatch example.
+--
+context StopWatch_ctx is
+ library IEEE;
+ use IEEE.std_logic_1164.all,
+ IEEE.numeric_std.all;
+
+ use work.StopWatch_pkg.all;
+end context;