diff options
| -rw-r--r-- | pyGHDL/dom/DesignUnit.py | 49 | ||||
| -rw-r--r-- | pyGHDL/dom/_Utils.py | 31 | ||||
| -rw-r--r-- | testsuite/pyunit/dom/examples/StopWatch/StopWatch.ctx.vhdl | 21 | ||||
| -rw-r--r-- | testsuite/pyunit/dom/examples/StopWatch/Utilities.ctx.vhdl | 12 | 
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; | 
