aboutsummaryrefslogtreecommitdiffstats
path: root/src/grt/grt-vcd.adb
diff options
context:
space:
mode:
authorTristan Gingold <tgingold@free.fr>2021-06-07 06:02:42 +0200
committerTristan Gingold <tgingold@free.fr>2021-06-07 06:02:42 +0200
commitc9bab05d5af5da3e42af6f08b0a8000391ce0766 (patch)
tree7792b1213143ea0020a998770d947980c221ef54 /src/grt/grt-vcd.adb
parent2cf1465a532c8f089215193a5f9f189f5684eaf0 (diff)
downloadghdl-c9bab05d5af5da3e42af6f08b0a8000391ce0766.tar.gz
ghdl-c9bab05d5af5da3e42af6f08b0a8000391ce0766.tar.bz2
ghdl-c9bab05d5af5da3e42af6f08b0a8000391ce0766.zip
grt-vpi: improve support of arrays
Diffstat (limited to 'src/grt/grt-vcd.adb')
-rw-r--r--src/grt/grt-vcd.adb32
1 files changed, 17 insertions, 15 deletions
diff --git a/src/grt/grt-vcd.adb b/src/grt/grt-vcd.adb
index ff0d69424..c08176a27 100644
--- a/src/grt/grt-vcd.adb
+++ b/src/grt/grt-vcd.adb
@@ -343,6 +343,7 @@ package body Grt.Vcd is
Bounds : Address;
Kind : Vcd_Var_Type;
+ Arr_Rti : Ghdl_Rtin_Type_Array_Acc;
Irange : Ghdl_Range_Ptr;
Val : Vcd_Value_Kind;
begin
@@ -363,32 +364,21 @@ package body Grt.Vcd is
| Ghdl_Rtik_Type_E8
| Ghdl_Rtik_Subtype_Scalar =>
Kind := Rti_To_Vcd_Kind (Rti);
- Irange := null;
when Ghdl_Rtik_Subtype_Array =>
declare
St : constant Ghdl_Rtin_Subtype_Composite_Acc :=
To_Ghdl_Rtin_Subtype_Composite_Acc (Rti);
- Arr_Rti : constant Ghdl_Rtin_Type_Array_Acc :=
- To_Ghdl_Rtin_Type_Array_Acc (St.Basetype);
- Idx_Rti : constant Ghdl_Rti_Access :=
- Get_Base_Type (Arr_Rti.Indexes (0));
begin
+ Arr_Rti := To_Ghdl_Rtin_Type_Array_Acc (St.Basetype);
Kind := Rti_Array_To_Vcd_Kind (Arr_Rti);
+ pragma Assert (Bounds = Null_Address);
Bounds := Loc_To_Addr (St.Common.Depth, St.Layout,
Avhpi_Get_Context (Sig));
Bounds := Array_Layout_To_Bounds (Bounds);
- Extract_Range (Bounds, Idx_Rti, Irange);
end;
when Ghdl_Rtik_Type_Array =>
- declare
- Arr_Rti : constant Ghdl_Rtin_Type_Array_Acc :=
- To_Ghdl_Rtin_Type_Array_Acc (Rti);
- Idx_Rti : constant Ghdl_Rti_Access :=
- Get_Base_Type (Arr_Rti.Indexes (0));
- begin
- Kind := Rti_Array_To_Vcd_Kind (Arr_Rti);
- Extract_Range (Bounds, Idx_Rti, Irange);
- end;
+ Arr_Rti := To_Ghdl_Rtin_Type_Array_Acc (Rti);
+ Kind := Rti_Array_To_Vcd_Kind (Arr_Rti);
when others =>
Kind := Vcd_Bad;
end case;
@@ -425,6 +415,18 @@ package body Grt.Vcd is
return;
end case;
+ -- For vectors: extract range.
+ Irange := null;
+ if Kind in Vcd_Var_Vectors then
+ declare
+ Idx_Rti : constant Ghdl_Rti_Access :=
+ Get_Base_Type (Arr_Rti.Indexes (0));
+ begin
+ Extract_Range (Bounds, Idx_Rti, Irange);
+ end;
+ end if;
+
+ -- Build the info.
case Kind is
when Vcd_Bad
| Vcd_Struct =>