aboutsummaryrefslogtreecommitdiffstats
path: root/src/synth/elab-vhdl_expr.adb
diff options
context:
space:
mode:
authorTristan Gingold <tgingold@free.fr>2022-05-30 04:13:42 +0200
committerTristan Gingold <tgingold@free.fr>2022-05-30 04:13:42 +0200
commit196b09e4568e70bcfb435375e47b77df154fc29f (patch)
tree1272024aaf6d1635415872ad8846dce589af6f62 /src/synth/elab-vhdl_expr.adb
parentc8bd4ded49e392ad89e2ac5e5282386bb23e527d (diff)
downloadghdl-196b09e4568e70bcfb435375e47b77df154fc29f.tar.gz
ghdl-196b09e4568e70bcfb435375e47b77df154fc29f.tar.bz2
ghdl-196b09e4568e70bcfb435375e47b77df154fc29f.zip
synth-vhdl_eval: handle more operators
Diffstat (limited to 'src/synth/elab-vhdl_expr.adb')
-rw-r--r--src/synth/elab-vhdl_expr.adb30
1 files changed, 8 insertions, 22 deletions
diff --git a/src/synth/elab-vhdl_expr.adb b/src/synth/elab-vhdl_expr.adb
index 20af6434b..76a9a59e8 100644
--- a/src/synth/elab-vhdl_expr.adb
+++ b/src/synth/elab-vhdl_expr.adb
@@ -36,6 +36,7 @@ with Synth.Vhdl_Stmts; use Synth.Vhdl_Stmts;
with Synth.Vhdl_Oper; use Synth.Vhdl_Oper;
with Synth.Vhdl_Aggr;
with Synth.Vhdl_Expr; use Synth.Vhdl_Expr;
+with Synth.Vhdl_Eval; use Synth.Vhdl_Eval;
with Grt.Types;
with Grt.To_Strings;
@@ -323,29 +324,10 @@ package body Elab.Vhdl_Expr is
return Str (First .. Str'Last) & ' ' & Name_Table.Image (Id);
end;
when others =>
- Error_Kind ("execute_image_attribute", Expr_Type);
+ Error_Kind ("synth_image_attribute_str", Expr_Type);
end case;
end Synth_Image_Attribute_Str;
- function String_To_Valtyp (Str : String; Styp : Type_Acc) return Valtyp
- is
- Len : constant Natural := Str'Length;
- Bnd : Bound_Type;
- Typ : Type_Acc;
- Res : Valtyp;
- begin
- Bnd := (Dir => Dir_To, Left => 1, Right => Int32 (Len),
- Len => Uns32 (Len));
- Typ := Create_Array_Type (Bnd, True, Styp.Uarr_El);
-
- Res := Create_Value_Memory (Typ);
- for I in Str'Range loop
- Write_U8 (Res.Val.Mem + Size_Type (I - Str'First),
- Character'Pos (Str (I)));
- end loop;
- return Res;
- end String_To_Valtyp;
-
function Exec_Image_Attribute (Syn_Inst : Synth_Instance_Acc; Attr : Node)
return Valtyp
is
@@ -353,6 +335,7 @@ package body Elab.Vhdl_Expr is
Etype : constant Node := Get_Type (Attr);
V : Valtyp;
Dtype : Type_Acc;
+ Res : Memtyp;
begin
-- The parameter is expected to be static.
V := Exec_Expression (Syn_Inst, Param);
@@ -366,8 +349,9 @@ package body Elab.Vhdl_Expr is
end if;
Strip_Const (V);
- return String_To_Valtyp
+ Res := String_To_Memtyp
(Synth_Image_Attribute_Str (V, Get_Type (Param)), Dtype);
+ return Create_Value_Memtyp (Res);
end Exec_Image_Attribute;
function Exec_Instance_Name_Attribute
@@ -377,9 +361,11 @@ package body Elab.Vhdl_Expr is
Atyp : constant Type_Acc := Get_Subtype_Object (Syn_Inst, Atype);
Name : constant Path_Instance_Name_Type :=
Get_Path_Instance_Name_Suffix (Attr);
+ Res : Memtyp;
begin
-- Return a truncated name, as the prefix is not completly known.
- return String_To_Valtyp (Name.Suffix, Atyp);
+ Res := String_To_Memtyp (Name.Suffix, Atyp);
+ return Create_Value_Memtyp (Res);
end Exec_Instance_Name_Attribute;
-- Convert index IDX in PFX to an offset.