From 283418269b3f5e351415dc6e8946437a1781941c Mon Sep 17 00:00:00 2001 From: Patrick Lehmann Date: Mon, 26 Dec 2022 09:14:46 +0100 Subject: New handling of symbols. --- pyGHDL/dom/DesignUnit.py | 49 +++++----------------- pyGHDL/dom/_Utils.py | 31 ++++++++++++++ .../dom/examples/StopWatch/StopWatch.ctx.vhdl | 21 ++++++++++ .../dom/examples/StopWatch/Utilities.ctx.vhdl | 12 ++++++ 4 files changed, 74 insertions(+), 39 deletions(-) create mode 100644 testsuite/pyunit/dom/examples/StopWatch/StopWatch.ctx.vhdl create mode 100644 testsuite/pyunit/dom/examples/StopWatch/Utilities.ctx.vhdl 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 @@ -93,42 +93,11 @@ class UseClause(VHDLModel_UseClause, DOMMixin): super().__init__(symbols) 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; -- cgit v1.2.3