aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/synth/elab-vhdl_types.adb10
-rw-r--r--src/vhdl/vhdl-annotations.adb23
2 files changed, 28 insertions, 5 deletions
diff --git a/src/synth/elab-vhdl_types.adb b/src/synth/elab-vhdl_types.adb
index 7d726d154..54bd3469b 100644
--- a/src/synth/elab-vhdl_types.adb
+++ b/src/synth/elab-vhdl_types.adb
@@ -198,6 +198,8 @@ package body Elab.Vhdl_Types is
function Synth_Record_Type_Definition
(Syn_Inst : Synth_Instance_Acc; Def : Node) return Type_Acc
is
+ Is_Subtype : constant Boolean :=
+ Get_Kind (Def) = Iir_Kind_Record_Subtype_Definition;
El_List : constant Node_Flist := Get_Elements_Declaration_List (Def);
Rec_Els : Rec_El_Array_Acc;
El : Node;
@@ -210,7 +212,13 @@ package body Elab.Vhdl_Types is
for I in Flist_First .. Flist_Last (El_List) loop
El := Get_Nth_Element (El_List, I);
El_Type := Get_Type (El);
- El_Typ := Synth_Subtype_Indication_If_Anonymous (Syn_Inst, El_Type);
+ if Is_Subtype then
+ Synth_Subtype_Indication_If_Anonymous (Syn_Inst, El_Type);
+ El_Typ := Get_Subtype_Object (Syn_Inst, El_Type);
+ else
+ El_Typ := Synth_Subtype_Indication_If_Anonymous
+ (Syn_Inst, El_Type);
+ end if;
Rec_Els.E (Iir_Index32 (I + 1)).Typ := El_Typ;
end loop;
diff --git a/src/vhdl/vhdl-annotations.adb b/src/vhdl/vhdl-annotations.adb
index 630f3ef84..9fc9788bf 100644
--- a/src/vhdl/vhdl-annotations.adb
+++ b/src/vhdl/vhdl-annotations.adb
@@ -340,8 +340,8 @@ package body Vhdl.Annotations is
then
-- This subtype has created a new anonymous subtype for the
-- element.
- Annotate_Type_Definition
- (Block_Info, Get_Element_Subtype (Def));
+ El := Get_Element_Subtype (Def);
+ Annotate_Type_Definition (Block_Info, El);
end if;
if Flag_Synthesis then
-- For the bounds.
@@ -378,8 +378,23 @@ package body Vhdl.Annotations is
when Iir_Kind_Record_Subtype_Definition =>
if Flag_Synthesis then
- -- For the offsets.
- Create_Object_Info (Block_Info, Def, Kind_Type);
+ declare
+ List : constant Iir_Flist :=
+ Get_Elements_Declaration_List (Def);
+ El : Iir;
+ El_Type : Iir;
+ begin
+ for I in Flist_First .. Flist_Last (List) loop
+ El := Get_Nth_Element (List, I);
+ if Get_Subtype_Indication (El) /= Null_Iir then
+ El_Type := Get_Type (El);
+ Annotate_Anonymous_Type_Definition
+ (Block_Info, El_Type);
+ end if;
+ end loop;
+ -- For the offsets.
+ Create_Object_Info (Block_Info, Def, Kind_Type);
+ end;
end if;
when Iir_Kind_Access_Type_Definition =>