aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pyGHDL/dom/Expression.py31
-rw-r--r--pyGHDL/dom/Literal.py10
-rw-r--r--pyGHDL/dom/_Translate.py28
3 files changed, 42 insertions, 27 deletions
diff --git a/pyGHDL/dom/Expression.py b/pyGHDL/dom/Expression.py
index fec347b57..75d288a83 100644
--- a/pyGHDL/dom/Expression.py
+++ b/pyGHDL/dom/Expression.py
@@ -32,19 +32,6 @@
# ============================================================================
from typing import List
-from pyGHDL.dom.Aggregates import (
- OthersAggregateElement,
- SimpleAggregateElement,
- RangedAggregateElement,
- IndexedAggregateElement,
- NamedAggregateElement,
-)
-from pyGHDL.dom.Symbol import EnumerationLiteralSymbol
-from pyGHDL.libghdl import utils
-
-from pyGHDL.dom.Common import DOMException
-from pyGHDL.dom._Utils import GetIirKindOfNode
-from pyGHDL.libghdl.vhdl import nodes
from pydecor import export
from pyVHDLModel.VHDLModel import (
@@ -86,6 +73,20 @@ from pyVHDLModel.VHDLModel import (
AggregateElement,
)
+from pyGHDL.libghdl import utils
+from pyGHDL.libghdl.vhdl import nodes
+from pyGHDL.dom._Utils import GetIirKindOfNode
+from pyGHDL.dom.Common import DOMException
+from pyGHDL.dom.Symbol import EnumerationLiteralSymbol
+from pyGHDL.dom.Aggregates import (
+ OthersAggregateElement,
+ SimpleAggregateElement,
+ RangedAggregateElement,
+ IndexedAggregateElement,
+ NamedAggregateElement,
+)
+
+
__all__ = []
@@ -391,7 +392,7 @@ class Aggregate(VHDLModel_Aggregate):
@classmethod
def parse(cls, node):
- from pyGHDL.dom._Translate import GetExpressionFromNode
+ from pyGHDL.dom._Translate import GetExpressionFromNode, GetRangeFromNode
choices = []
@@ -406,7 +407,7 @@ class Aggregate(VHDLModel_Aggregate):
value = GetExpressionFromNode(nodes.Get_Associated_Expr(item))
choices.append(IndexedAggregateElement(index, value))
elif kind == nodes.Iir_Kind.Choice_By_Range:
- r = GetExpressionFromNode(nodes.Get_Choice_Range(item))
+ r = GetRangeFromNode(nodes.Get_Choice_Range(item))
value = GetExpressionFromNode(nodes.Get_Associated_Expr(item))
choices.append(RangedAggregateElement(r, value))
elif kind == nodes.Iir_Kind.Choice_By_Name:
diff --git a/pyGHDL/dom/Literal.py b/pyGHDL/dom/Literal.py
index 7c722583b..334355b35 100644
--- a/pyGHDL/dom/Literal.py
+++ b/pyGHDL/dom/Literal.py
@@ -39,6 +39,7 @@ from pyVHDLModel.VHDLModel import (
IntegerLiteral as VHDLModel_IntegerLiteral,
FloatingPointLiteral as VHDLModel_FloatingPointLiteral,
CharacterLiteral as VHDLModel_CharacterLiteral,
+ StringLiteral as VHDLModel_StringLiteral,
)
__all__ = []
@@ -67,3 +68,12 @@ class CharacterLiteral(VHDLModel_CharacterLiteral):
identifier = nodes.Get_Identifier(node)
value = name_table.Get_Character(identifier)
return cls(value)
+
+
+@export
+class StringLiteral(VHDLModel_StringLiteral):
+ @classmethod
+ def parse(cls, node):
+ stringID = nodes.Get_String8_Id(node)
+ value = name_table.Get_Name_Ptr(stringID)
+ return cls(value)
diff --git a/pyGHDL/dom/_Translate.py b/pyGHDL/dom/_Translate.py
index 24f056f33..a18f738df 100644
--- a/pyGHDL/dom/_Translate.py
+++ b/pyGHDL/dom/_Translate.py
@@ -46,7 +46,7 @@ from pyGHDL.dom.Symbol import (
SimpleSubTypeSymbol,
ConstrainedSubTypeSymbol,
)
-from pyGHDL.dom.Literal import IntegerLiteral, CharacterLiteral, FloatingPointLiteral
+from pyGHDL.dom.Literal import IntegerLiteral, CharacterLiteral, FloatingPointLiteral, StringLiteral
from pyGHDL.dom.Expression import (
SubtractionExpression,
AdditionExpression,
@@ -56,7 +56,7 @@ from pyGHDL.dom.Expression import (
ExponentiationExpression,
Aggregate,
NegationExpression,
- ParenthesisExpression,
+ ParenthesisExpression, ConcatenationExpression,
)
__all__ = []
@@ -101,16 +101,7 @@ def GetArrayConstraintsFromSubtypeIndication(subTypeIndication) -> List[Constrai
for constraint in flist_iter(nodes.Get_Index_Constraint_List(subTypeIndication)):
constraintKind = GetIirKindOfNode(constraint)
if constraintKind == nodes.Iir_Kind.Range_Expression:
- direction = nodes.Get_Direction(constraint)
- leftBound = nodes.Get_Left_Limit_Expr(constraint)
- rightBound = nodes.Get_Right_Limit_Expr(constraint)
-
- r = Range(
- GetExpressionFromNode(leftBound),
- GetExpressionFromNode(rightBound),
- Direction.DownTo if direction else Direction.To,
- )
- constraints.append(RangeExpression(r))
+ constraints.append(RangeExpression(GetRangeFromNode(constraint)))
elif constraintKind == nodes.Iir_Kind.Attribute_Name:
raise DOMException("[NOT IMPLEMENTED] Attribute name as range.")
elif constraintKind == nodes.Iir_Kind.Simple_Name:
@@ -132,8 +123,10 @@ __EXPRESSION_TRANSLATION = {
nodes.Iir_Kind.Integer_Literal: IntegerLiteral,
nodes.Iir_Kind.Floating_Point_Literal: FloatingPointLiteral,
nodes.Iir_Kind.Character_Literal: CharacterLiteral,
+ nodes.Iir_Kind.String_Literal8: StringLiteral,
nodes.Iir_Kind.Negation_Operator: NegationExpression,
nodes.Iir_Kind.Addition_Operator: AdditionExpression,
+ nodes.Iir_Kind.Concatenation_Operator: ConcatenationExpression,
nodes.Iir_Kind.Not_Operator: InverseExpression,
nodes.Iir_Kind.Parenthesis_Expression: ParenthesisExpression,
nodes.Iir_Kind.Substraction_Operator: SubtractionExpression,
@@ -143,6 +136,17 @@ __EXPRESSION_TRANSLATION = {
nodes.Iir_Kind.Aggregate: Aggregate,
}
+@export
+def GetRangeFromNode(node) -> Range:
+ direction = nodes.Get_Direction(node)
+ leftBound = nodes.Get_Left_Limit_Expr(node)
+ rightBound = nodes.Get_Right_Limit_Expr(node)
+
+ return Range(
+ GetExpressionFromNode(leftBound),
+ GetExpressionFromNode(rightBound),
+ Direction.DownTo if direction else Direction.To,
+ )
@export
def GetExpressionFromNode(node) -> Expression: