aboutsummaryrefslogtreecommitdiffstats
path: root/pyGHDL/dom/_Translate.py
diff options
context:
space:
mode:
authorPatrick Lehmann <Patrick.Lehmann@plc2.de>2021-08-17 20:14:13 +0200
committerumarcor <unai.martinezcorral@ehu.eus>2021-08-23 16:35:36 +0200
commit8c0f8e0ad95c53beac983546550222117c6a639c (patch)
tree650acf22884b74848bce6eb63f98d64eea442de0 /pyGHDL/dom/_Translate.py
parentf8d7ac62564e4bdefb35e58178c4df1b4feae844 (diff)
downloadghdl-8c0f8e0ad95c53beac983546550222117c6a639c.tar.gz
ghdl-8c0f8e0ad95c53beac983546550222117c6a639c.tar.bz2
ghdl-8c0f8e0ad95c53beac983546550222117c6a639c.zip
Handle associations.
Diffstat (limited to 'pyGHDL/dom/_Translate.py')
-rw-r--r--pyGHDL/dom/_Translate.py46
1 files changed, 45 insertions, 1 deletions
diff --git a/pyGHDL/dom/_Translate.py b/pyGHDL/dom/_Translate.py
index 133d9386f..e7e862039 100644
--- a/pyGHDL/dom/_Translate.py
+++ b/pyGHDL/dom/_Translate.py
@@ -30,7 +30,7 @@
#
# SPDX-License-Identifier: GPL-2.0-or-later
# ============================================================================
-from typing import List, Generator
+from typing import List, Generator, Type
from pydecor import export
@@ -56,6 +56,7 @@ from pyVHDLModel.SyntaxModel import (
Name,
ConcurrentStatement,
SequentialStatement,
+ AssociationItem,
)
from pyGHDL.libghdl import utils, name_table
@@ -159,6 +160,9 @@ from pyGHDL.dom.Concurrent import (
CaseGenerateStatement,
ConcurrentSimpleSignalAssignment,
ConcurrentProcedureCall,
+ GenericAssociationItem,
+ PortAssociationItem,
+ ParameterAssociationItem,
)
from pyGHDL.dom.Subprogram import Function, Procedure
from pyGHDL.dom.Misc import Alias
@@ -654,6 +658,46 @@ def GetParameterFromChainedNodes(
yield param
+def GetMapAspect(
+ mapAspect: Iir, cls: Type, entity: str
+) -> Generator[AssociationItem, None, None]:
+ for generic in utils.chain_iter(mapAspect):
+ kind = GetIirKindOfNode(generic)
+ if kind is nodes.Iir_Kind.Association_Element_By_Expression:
+ formalNode = nodes.Get_Formal(generic)
+ if formalNode is nodes.Null_Iir:
+ formal = None
+ else:
+ formal = GetNameFromNode(formalNode)
+
+ actual = GetExpressionFromNode(nodes.Get_Actual(generic))
+
+ yield cls(generic, actual, formal)
+ else:
+ pos = Position.parse(generic)
+ raise DOMException(
+ "Unknown association kind '{kind}' in {entity} map at line {line}.".format(
+ kind=kind.name, entity=entity, line=pos.Line
+ )
+ )
+
+
+def GetGenericMapAspect(
+ genericMapAspect: Iir,
+) -> Generator[AssociationItem, None, None]:
+ return GetMapAspect(genericMapAspect, GenericAssociationItem, "generic")
+
+
+def GetPortMapAspect(portMapAspect: Iir) -> Generator[AssociationItem, None, None]:
+ return GetMapAspect(portMapAspect, PortAssociationItem, "port")
+
+
+def GetParameterMapAspect(
+ parameterMapAspect: Iir,
+) -> Generator[AssociationItem, None, None]:
+ return GetMapAspect(parameterMapAspect, ParameterAssociationItem, "parameter")
+
+
def GetDeclaredItemsFromChainedNodes(
nodeChain: Iir, entity: str, name: str
) -> Generator[ModelEntity, None, None]: