summaryrefslogtreecommitdiff
path: root/translate/grt/grt-signals.adb
diff options
context:
space:
mode:
Diffstat (limited to 'translate/grt/grt-signals.adb')
-rw-r--r--translate/grt/grt-signals.adb63
1 files changed, 22 insertions, 41 deletions
diff --git a/translate/grt/grt-signals.adb b/translate/grt/grt-signals.adb
index 590aced..d939a97 100644
--- a/translate/grt/grt-signals.adb
+++ b/translate/grt/grt-signals.adb
@@ -84,7 +84,7 @@ package body Grt.Signals is
(Mode : Mode_Type;
Init_Val : Value_Union;
Mode_Sig : Mode_Signal_Type;
- Resolv_Proc : System.Address;
+ Resolv_Proc : Resolver_Acc;
Resolv_Inst : System.Address)
return Ghdl_Signal_Ptr
is
@@ -95,7 +95,7 @@ package body Grt.Signals is
Sig_Table.Increment_Last;
if Current_Resolv = null then
- if Resolv_Proc /= Null_Address then
+ if Resolv_Proc /= null then
Resolv := new Resolved_Signal_Type'
(Resolv_Proc => Resolv_Proc,
Resolv_Inst => Resolv_Inst,
@@ -106,7 +106,7 @@ package body Grt.Signals is
Resolv := null;
end if;
else
- if Resolv_Proc /= Null_Address then
+ if Resolv_Proc /= null then
-- Only one resolution function is allowed!
Internal_Error ("create_signal");
end if;
@@ -209,7 +209,7 @@ package body Grt.Signals is
end if;
end Ghdl_Signal_Merge_Rti;
- procedure Ghdl_Signal_Create_Resolution (Proc : System.Address;
+ procedure Ghdl_Signal_Create_Resolution (Proc : Resolver_Acc;
Instance : System.Address;
Sig : System.Address;
Nbr_Sig : Ghdl_Index_Type)
@@ -815,7 +815,7 @@ package body Grt.Signals is
function Ghdl_Create_Signal_B2
(Init_Val : Ghdl_B2;
- Resolv_Func : System.Address;
+ Resolv_Func : Resolver_Acc;
Resolv_Inst : System.Address)
return Ghdl_Signal_Ptr
is
@@ -886,7 +886,7 @@ package body Grt.Signals is
function Ghdl_Create_Signal_E8
(Init_Val : Ghdl_E8;
- Resolv_Func : System.Address;
+ Resolv_Func : Resolver_Acc;
Resolv_Inst : System.Address)
return Ghdl_Signal_Ptr
is
@@ -957,7 +957,7 @@ package body Grt.Signals is
function Ghdl_Create_Signal_E32
(Init_Val : Ghdl_E32;
- Resolv_Func : System.Address;
+ Resolv_Func : Resolver_Acc;
Resolv_Inst : System.Address)
return Ghdl_Signal_Ptr
is
@@ -1030,7 +1030,7 @@ package body Grt.Signals is
function Ghdl_Create_Signal_I32
(Init_Val : Ghdl_I32;
- Resolv_Func : System.Address;
+ Resolv_Func : Resolver_Acc;
Resolv_Inst : System.Address)
return Ghdl_Signal_Ptr
is
@@ -1103,7 +1103,7 @@ package body Grt.Signals is
function Ghdl_Create_Signal_I64
(Init_Val : Ghdl_I64;
- Resolv_Func : System.Address;
+ Resolv_Func : Resolver_Acc;
Resolv_Inst : System.Address)
return Ghdl_Signal_Ptr
is
@@ -1176,7 +1176,7 @@ package body Grt.Signals is
function Ghdl_Create_Signal_F64
(Init_Val : Ghdl_F64;
- Resolv_Func : System.Address;
+ Resolv_Func : Resolver_Acc;
Resolv_Inst : System.Address)
return Ghdl_Signal_Ptr
is
@@ -1330,7 +1330,7 @@ package body Grt.Signals is
-- Note: bit and boolean are both mode_b2.
Res := Create_Signal
(Mode_B2, Value_Union'(Mode => Mode_B2, B2 => True),
- Mode, Null_Address, Null_Address);
+ Mode, null, Null_Address);
Last_Implicit_Signal := Res;
@@ -1400,7 +1400,7 @@ package body Grt.Signals is
(To_Ghdl_Rti_Access (Guard_Rti'Address));
Res := Create_Signal
(Mode_B2, Value_Union'(Mode => Mode_B2, B2 => Proc.all (This)),
- Mode_Guard, Null_Address, Null_Address);
+ Mode_Guard, null, Null_Address);
Res.S.Guard_Func := Proc;
Res.S.Guard_Instance := This;
Last_Implicit_Signal := Res;
@@ -1420,7 +1420,7 @@ package body Grt.Signals is
Res : Ghdl_Signal_Ptr;
begin
Res := Create_Signal (Sig.Mode, Sig.Value,
- Mode_Delayed, Null_Address, Null_Address);
+ Mode_Delayed, null, Null_Address);
Res.S.Time := Val;
if Val > 0 then
Res.Flink := Future_List;
@@ -1744,25 +1744,6 @@ package body Grt.Signals is
-- return Length;
-- end Get_Nbr_Non_Null_Source;
- type Resolver_Acc is access procedure
- (Instance : System.Address;
- Val : System.Address;
- Bool_Vec : System.Address;
- Vec_Len : Ghdl_Index_Type;
- Nbr_Drv : Ghdl_Index_Type;
- Nbr_Ports : Ghdl_Index_Type);
-
- -- On some platforms, GNAT use a descriptor (instead of a trampoline) for
- -- nested subprograms. This descriptor contains the address of the
- -- subprogram and the address of the chain. An unaligned pointer to this
- -- descriptor (address + 1) is then used for 'Access, and every indirect
- -- call check for unaligned address.
- --
- -- Disable this feature (as a resolver is never a nested subprogram), so
- -- code generated by ghdl is compatible with ghdl runtimes built with
- -- gnat.
- pragma Convention (C, Resolver_Acc);
-
function To_Resolver_Acc is new Ada.Unchecked_Conversion
(Source => System.Address, Target => Resolver_Acc);
@@ -1811,13 +1792,12 @@ package body Grt.Signals is
end if;
-- Call the procedure.
- To_Resolver_Acc (Resolv.Resolv_Proc).all
- (Resolv.Resolv_Inst,
- Resolv.Resolv_Ptr,
- Vec'Address,
- Length,
- Sig.S.Nbr_Drivers,
- Sig.Nbr_Ports);
+ Resolv.Resolv_Proc.all (Resolv.Resolv_Inst,
+ Resolv.Resolv_Ptr,
+ Vec'Address,
+ Length,
+ Sig.S.Nbr_Drivers,
+ Sig.Nbr_Ports);
end Compute_Resolved_Signal;
type Conversion_Func_Acc is access procedure (Instance : System.Address);
@@ -2559,8 +2539,9 @@ package body Grt.Signals is
if Resolv /= null
and then Resolv.Sig_Range.First = I
and then Resolv.Sig_Range.Last = I
- and then (Resolv.Resolv_Proc
- = Ieee_Std_Logic_1164_Resolved_Resolv_Ptr)
+ and then
+ (Resolv.Resolv_Proc
+ = To_Resolver_Acc (Ieee_Std_Logic_1164_Resolved_Resolv_Ptr))
and then Sig.S.Nbr_Drivers + Sig.Nbr_Ports <= 1
then
-- Optimization: remove resolver if there is at most one