aboutsummaryrefslogtreecommitdiffstats
path: root/src/synth
diff options
context:
space:
mode:
Diffstat (limited to 'src/synth')
-rw-r--r--src/synth/elab-vhdl_annotations.adb3
-rw-r--r--src/synth/elab-vhdl_expr.adb8
-rw-r--r--src/synth/elab-vhdl_types.adb31
-rw-r--r--src/synth/synth-vhdl_expr.adb6
4 files changed, 39 insertions, 9 deletions
diff --git a/src/synth/elab-vhdl_annotations.adb b/src/synth/elab-vhdl_annotations.adb
index 3871631c6..8a4620ddd 100644
--- a/src/synth/elab-vhdl_annotations.adb
+++ b/src/synth/elab-vhdl_annotations.adb
@@ -293,7 +293,8 @@ package body Elab.Vhdl_Annotations is
Annotate_Protected_Type_Declaration (Block_Info, Def);
when Iir_Kind_Incomplete_Type_Definition
- | Iir_Kind_Subtype_Attribute =>
+ | Iir_Kind_Subtype_Attribute
+ | Iir_Kind_Element_Attribute =>
null;
when Iir_Kind_Foreign_Vector_Type_Definition =>
diff --git a/src/synth/elab-vhdl_expr.adb b/src/synth/elab-vhdl_expr.adb
index dff8f0b9d..bef85b306 100644
--- a/src/synth/elab-vhdl_expr.adb
+++ b/src/synth/elab-vhdl_expr.adb
@@ -533,6 +533,14 @@ package body Elab.Vhdl_Expr is
return Val.Typ;
end;
+ when Iir_Kind_Element_Attribute =>
+ declare
+ Pfx : Type_Acc;
+ begin
+ Pfx := Exec_Name_Subtype (Syn_Inst, Get_Prefix (Name));
+ return Pfx.Arr_El;
+ end;
+
when others =>
Error_Kind ("exec_name_subtype", Name);
end case;
diff --git a/src/synth/elab-vhdl_types.adb b/src/synth/elab-vhdl_types.adb
index 3749d10b9..69aa18a3e 100644
--- a/src/synth/elab-vhdl_types.adb
+++ b/src/synth/elab-vhdl_types.adb
@@ -83,24 +83,32 @@ package body Elab.Vhdl_Types is
return (Get_Direction (Rng), Read_Fp64 (L), Read_Fp64 (R));
end Synth_Float_Range_Expression;
- function Synth_Array_Attribute (Syn_Inst : Synth_Instance_Acc; Attr : Node)
- return Bound_Type
+ -- Return the type of the prefix for an array attribute.
+ function Synth_Array_Attribute_Prefix
+ (Syn_Inst : Synth_Instance_Acc; Attr : Node) return Type_Acc
is
Prefix_Name : constant Iir := Get_Prefix (Attr);
Prefix : constant Iir := Strip_Denoting_Name (Prefix_Name);
- Dim : constant Natural :=
- Vhdl.Evaluation.Eval_Attribute_Parameter_Or_1 (Attr);
- Typ : Type_Acc;
begin
-- Prefix is an array object or an array subtype.
if Get_Kind (Prefix) = Iir_Kind_Subtype_Declaration then
-- TODO: does this cover all the cases ?
- Typ := Get_Subtype_Object (Syn_Inst, Get_Subtype_Indication (Prefix));
+ return Get_Subtype_Object (Syn_Inst, Get_Subtype_Indication (Prefix));
else
-- The expression cannot be fully executed as it can be a signal
-- (whose evaluation is not allowed during elaboration).
- Typ := Exec_Name_Subtype (Syn_Inst, Prefix_Name);
+ return Exec_Name_Subtype (Syn_Inst, Prefix);
end if;
+ end Synth_Array_Attribute_Prefix;
+
+ function Synth_Array_Attribute (Syn_Inst : Synth_Instance_Acc; Attr : Node)
+ return Bound_Type
+ is
+ Dim : constant Natural :=
+ Vhdl.Evaluation.Eval_Attribute_Parameter_Or_1 (Attr);
+ Typ : Type_Acc;
+ begin
+ Typ := Synth_Array_Attribute_Prefix (Syn_Inst, Attr);
for I in 2 .. Dim loop
Typ := Typ.Arr_El;
@@ -796,6 +804,15 @@ package body Elab.Vhdl_Types is
pragma Assert (T.Is_Global);
return T;
end;
+ when Iir_Kind_Element_Attribute =>
+ declare
+ T : Type_Acc;
+ begin
+ T := Synth_Array_Attribute_Prefix (Syn_Inst, Atype);
+ pragma Assert (T.Is_Global);
+ -- Always a bounded array/vector.
+ return T.Arr_El;
+ end;
when others =>
Error_Kind ("elab_declaration_type", Atype);
end case;
diff --git a/src/synth/synth-vhdl_expr.adb b/src/synth/synth-vhdl_expr.adb
index 884fe9e16..21bf95b18 100644
--- a/src/synth/synth-vhdl_expr.adb
+++ b/src/synth/synth-vhdl_expr.adb
@@ -717,7 +717,11 @@ package body Synth.Vhdl_Expr is
when Type_Record =>
pragma Assert (Vtype.Kind = Type_Record);
-- TODO: check elements.
- return Vt;
+ if Bounds then
+ return Reshape_Value (Vt, Dtype);
+ else
+ return Vt;
+ end if;
when Type_Unbounded_Record =>
pragma Assert (Vtype.Kind = Type_Record);
-- TODO: check elements