diff options
Diffstat (limited to 'src/synth')
-rw-r--r-- | src/synth/elab-vhdl_annotations.adb | 3 | ||||
-rw-r--r-- | src/synth/elab-vhdl_expr.adb | 8 | ||||
-rw-r--r-- | src/synth/elab-vhdl_types.adb | 31 | ||||
-rw-r--r-- | src/synth/synth-vhdl_expr.adb | 6 |
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 |