aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorTristan Gingold <tgingold@free.fr>2020-04-18 09:25:09 +0200
committerTristan Gingold <tgingold@free.fr>2020-04-18 09:25:09 +0200
commit1abd7e0a8e028feaba2a97cbba5666113bb85114 (patch)
tree29d4ee6f6e5bc580b7829b2afa5c5ddb7a9440cc /src
parent242f1e9dff861198e0fd317f494cc5d78d159d81 (diff)
downloadghdl-1abd7e0a8e028feaba2a97cbba5666113bb85114.tar.gz
ghdl-1abd7e0a8e028feaba2a97cbba5666113bb85114.tar.bz2
ghdl-1abd7e0a8e028feaba2a97cbba5666113bb85114.zip
vhdl-prints: handle evaluated expression for qualified_expression.
Diffstat (limited to 'src')
-rw-r--r--src/vhdl/vhdl-prints.adb35
-rw-r--r--src/vhdl/vhdl-utils.adb28
-rw-r--r--src/vhdl/vhdl-utils.ads5
3 files changed, 52 insertions, 16 deletions
diff --git a/src/vhdl/vhdl-prints.adb b/src/vhdl/vhdl-prints.adb
index 22bfa05cd..f1d2d7a79 100644
--- a/src/vhdl/vhdl-prints.adb
+++ b/src/vhdl/vhdl-prints.adb
@@ -4442,6 +4442,24 @@ package body Vhdl.Prints is
end case;
end Disp_Vhdl;
+ procedure Print_Qualified_Expression (Ctxt : in out Ctxt_Class; Expr: Iir)
+ is
+ Qexpr : constant Iir := Strip_Literal_Origin (Get_Expression (Expr));
+ Has_Paren : constant Boolean :=
+ Get_Kind (Qexpr) = Iir_Kind_Parenthesis_Expression
+ or else Get_Kind (Qexpr) = Iir_Kind_Aggregate;
+ begin
+ Print (Ctxt, Get_Type_Mark (Expr));
+ Disp_Token (Ctxt, Tok_Tick);
+ if not Has_Paren then
+ Disp_Token (Ctxt, Tok_Left_Paren);
+ end if;
+ Print (Ctxt, Qexpr);
+ if not Has_Paren then
+ Disp_Token (Ctxt, Tok_Right_Paren);
+ end if;
+ end Print_Qualified_Expression;
+
procedure Print (Ctxt : in out Ctxt_Class; Expr: Iir)
is
Orig : Iir;
@@ -4571,22 +4589,7 @@ package body Vhdl.Prints is
Print (Ctxt, Get_Expression (Expr));
Disp_Token (Ctxt, Tok_Right_Paren);
when Iir_Kind_Qualified_Expression =>
- declare
- Qexpr : constant Iir := Get_Expression (Expr);
- Has_Paren : constant Boolean :=
- Get_Kind (Qexpr) = Iir_Kind_Parenthesis_Expression
- or else Get_Kind (Qexpr) = Iir_Kind_Aggregate;
- begin
- Print (Ctxt, Get_Type_Mark (Expr));
- Disp_Token (Ctxt, Tok_Tick);
- if not Has_Paren then
- Disp_Token (Ctxt, Tok_Left_Paren);
- end if;
- Print (Ctxt, Qexpr);
- if not Has_Paren then
- Disp_Token (Ctxt, Tok_Right_Paren);
- end if;
- end;
+ Print_Qualified_Expression (Ctxt, Expr);
when Iir_Kind_Allocator_By_Expression =>
Disp_Token (Ctxt, Tok_New);
Print (Ctxt, Get_Expression (Expr));
diff --git a/src/vhdl/vhdl-utils.adb b/src/vhdl/vhdl-utils.adb
index 40b4f7947..461f301f4 100644
--- a/src/vhdl/vhdl-utils.adb
+++ b/src/vhdl/vhdl-utils.adb
@@ -34,6 +34,34 @@ package body Vhdl.Utils is
return Get_Kind (N) = Iir_Kind_Overflow_Literal;
end Is_Overflow_Literal;
+ function Strip_Literal_Origin (N : Iir) return Iir
+ is
+ Orig : Iir;
+ begin
+ if N = Null_Iir then
+ return N;
+ end if;
+ case Get_Kind (N) is
+ when Iir_Kind_String_Literal8
+ | Iir_Kind_Integer_Literal
+ | Iir_Kind_Floating_Point_Literal
+ | Iir_Kind_Physical_Int_Literal
+ | Iir_Kind_Physical_Fp_Literal
+ | Iir_Kind_Simple_Aggregate
+ | Iir_Kind_Overflow_Literal
+ | Iir_Kind_Enumeration_Literal
+ | Iir_Kind_Aggregate =>
+ Orig := Get_Literal_Origin (N);
+ if Orig /= Null_Iir then
+ return Orig;
+ else
+ return N;
+ end if;
+ when others =>
+ return N;
+ end case;
+ end Strip_Literal_Origin;
+
function List_To_Flist (L : Iir_List) return Iir_Flist
is
Len : constant Natural := Get_Nbr_Elements (L);
diff --git a/src/vhdl/vhdl-utils.ads b/src/vhdl/vhdl-utils.ads
index 4ca9d83e3..e7de3a76c 100644
--- a/src/vhdl/vhdl-utils.ads
+++ b/src/vhdl/vhdl-utils.ads
@@ -32,6 +32,11 @@ package Vhdl.Utils is
function Is_Overflow_Literal (N : Iir) return Boolean;
pragma Inline (Is_Overflow_Literal);
+ -- If N is a literal and has a literal origin, return the literal origin.
+ -- Otherwise return N.
+ -- In other words, return the node as it was.
+ function Strip_Literal_Origin (N : Iir) return Iir;
+
-- Find LIT in the list of identifiers or characters LIST.
-- Return the literal (whose name is LIT) or null_iir if not found.
function Find_Name_In_Chain (Chain: Iir; Lit: Name_Id) return Iir;