diff options
-rw-r--r-- | src/grt/grt-signals.adb | 88 | ||||
-rw-r--r-- | src/grt/grt-signals.ads | 2 |
2 files changed, 50 insertions, 40 deletions
diff --git a/src/grt/grt-signals.adb b/src/grt/grt-signals.adb index a3223923f..6c2dd4898 100644 --- a/src/grt/grt-signals.adb +++ b/src/grt/grt-signals.adb @@ -635,7 +635,7 @@ package body Grt.Signals is -- Unused but well-known signal which always terminate - -- ghdl_signal_active_chain. + -- signal_active_chain. -- As a consequence, every element of the chain has a link field set to -- a non-null value (this is of course not true for SIGNAL_END). This may -- be used to quickly check if a signal is in the list. @@ -644,20 +644,21 @@ package body Grt.Signals is Signal_End_Decl'Unrestricted_access; -- List of signals that will be active in the next delta cycle. - Ghdl_Signal_Active_Chain : Ghdl_Signal_Ptr; + Signal_Active_Chain : Ghdl_Signal_Ptr; -- List of implicit signals that will be active in the next cycle. - -- They are put in a different chain (other than ghdl_signal_active_chain), + -- They are put in a different chain (other than signal_active_chain), -- because their handling is different. FIXME: try to merge them ? - Ghdl_Implicit_Signal_Active_Chain : Ghdl_Signal_Ptr; + Implicit_Signal_Active_Chain : Ghdl_Signal_Ptr; -- List of signals whose 'Active flag must be cleared. A signal is added -- to this list by Mark_Active and removed by Reset_Active_Flag at the - -- beginning of the next cycle. + -- beginning of the next cycle. This list is null-terminated, as it uses + -- Alink (instead of Link) to link elements of the list. Active_Clear_List : Ghdl_Signal_Ptr := null; -- List of signals whose Update flag on the net has to be cleared. - -- Update_Clear_List : Ghdl_Signal_Ptr; + Update_Clear_Chain : Ghdl_Signal_Ptr; -- List of signals which have projected waveforms in the future (beyond -- the next delta cycle). @@ -680,17 +681,25 @@ package body Grt.Signals is -- -- It is also used internally by Run_Propagation to keep the list of nets -- whose update flag has to be cleared. - procedure Add_Active_Chain (Sig : Ghdl_Signal_Ptr); - pragma Inline (Add_Active_Chain); + procedure Insert_Active_Chain (Sig : Ghdl_Signal_Ptr); + pragma Inline (Insert_Active_Chain); - procedure Add_Active_Chain (Sig : Ghdl_Signal_Ptr) is + procedure Insert_Active_Chain (Sig : Ghdl_Signal_Ptr) is begin if Sig.Link = null then -- Use Grt.Threads.Atomic_Insert ? - Sig.Link := Ghdl_Signal_Active_Chain; - Ghdl_Signal_Active_Chain := Sig; + Sig.Link := Signal_Active_Chain; + Signal_Active_Chain := Sig; end if; - end Add_Active_Chain; + end Insert_Active_Chain; + + procedure Insert_Update_Clear_Chain (Sig : Ghdl_Signal_Ptr) is + begin + if Sig.Link = null then + Sig.Link := Update_Clear_Chain; + Update_Clear_Chain := Sig; + end if; + end Insert_Update_Clear_Chain; procedure Ghdl_Signal_Start_Assign (Sign : Ghdl_Signal_Ptr; Reject : Std_Time; @@ -712,7 +721,7 @@ package body Grt.Signals is if After = 0 then -- Put SIGN on the active list if the transaction is scheduled -- for the next delta cycle. - Add_Active_Chain (Sign); + Insert_Active_Chain (Sign); else -- AFTER > 0. -- Put SIGN on the future list. @@ -866,14 +875,14 @@ package body Grt.Signals is if Sign.Link /= null and then not Has_Transaction_In_Next_Delta (Sign) then - if Ghdl_Signal_Active_Chain = Sign then + if Signal_Active_Chain = Sign then -- At the head of the chain. -- FIXME: this is not atomic. - Ghdl_Signal_Active_Chain := Sign.Link; + Signal_Active_Chain := Sign.Link; else -- In the middle of the chain. declare - Prev : Ghdl_Signal_Ptr := Ghdl_Signal_Active_Chain; + Prev : Ghdl_Signal_Ptr := Signal_Active_Chain; begin while Prev.Link /= Sign loop Prev := Prev.Link; @@ -925,7 +934,7 @@ package body Grt.Signals is procedure Ghdl_Signal_Direct_Assign (Sign : Ghdl_Signal_Ptr) is begin - Add_Active_Chain (Sign); + Insert_Active_Chain (Sign); -- Must be always set (as Sign.Link may be set by a regular driver). Sign.Flags.Is_Direct_Active := True; @@ -1921,7 +1930,7 @@ package body Grt.Signals is Next_Sig : Ghdl_Signal_Ptr; begin -- Free active_chain. - Sig := Ghdl_Signal_Active_Chain; + Sig := Signal_Active_Chain; loop Next_Sig := Sig.Link; exit when Next_Sig = null; @@ -1929,7 +1938,7 @@ package body Grt.Signals is Sig := Next_Sig; end loop; pragma Assert (Sig = Signal_End); - Ghdl_Signal_Active_Chain := Sig; + Signal_Active_Chain := Sig; end Flush_Active_Chain; function Find_Next_Time (Tn : Std_Time) return Std_Time @@ -1946,7 +1955,7 @@ package body Grt.Signals is if Trans.Time = Res then -- Put to active list. - Add_Active_Chain (Sig); + Insert_Active_Chain (Sig); elsif Trans.Time < Res then -- A transaction is scheduled before all the previous one. Clear -- the active chain, and put simply Sig on it. @@ -1955,7 +1964,7 @@ package body Grt.Signals is Res := Trans.Time; -- Put sig on the list. - Add_Active_Chain (Sig); + Insert_Active_Chain (Sig); end if; if Res = Current_Time then -- Must have been in the active list. @@ -1966,13 +1975,13 @@ package body Grt.Signals is pragma Assert (Tn >= Current_Time); -- If there is signals in the active list, then next cycle is a delta -- cycle, so next time is current_time. - if Ghdl_Signal_Active_Chain.Link /= null then + if Signal_Active_Chain.Link /= null then return Current_Time; end if; if Force_Value_First /= null then return Current_Time; end if; - if Ghdl_Implicit_Signal_Active_Chain.Link /= null then + if Implicit_Signal_Active_Chain.Link /= null then return Current_Time; end if; @@ -2969,7 +2978,7 @@ package body Grt.Signals is end if; if Sig.S.Time = 0 then - Add_Active_Chain (Sig); + Insert_Update_Clear_Chain (Sig); end if; end if; end Delayed_Implicit_Process; @@ -3051,7 +3060,7 @@ package body Grt.Signals is Propagation.Table (Net).Updated := True; -- And put it on the active chain to clear the update flag (this is not -- the regular use of the active chain). - Add_Active_Chain (Sig_Net); + Insert_Update_Clear_Chain (Sig_Net); I := Net + 1; loop @@ -3137,8 +3146,8 @@ package body Grt.Signals is when Imp_Forward => Sig := Propagation.Table (I).Sig; if Sig.Link = null then - Sig.Link := Ghdl_Implicit_Signal_Active_Chain; - Ghdl_Implicit_Signal_Active_Chain := Sig; + Sig.Link := Implicit_Signal_Active_Chain; + Implicit_Signal_Active_Chain := Sig; end if; when Imp_Delayed => Sig := Propagation.Table (I).Sig; @@ -3240,7 +3249,7 @@ package body Grt.Signals is if Sig.S.Time = 0 then -- Signal is active in the next cycle. If Time > 0, it -- has been put in Future_List during creation. - Add_Active_Chain (Sig); + Insert_Update_Clear_Chain (Sig); end if; else -- LRM02 12.6.3 @@ -3367,7 +3376,7 @@ package body Grt.Signals is -- This is a little HACK as the code just below handles all -- the cases, but we are only interesting in the case for -- defined net (with propagation). - Add_Active_Chain (Sig); + Insert_Active_Chain (Sig); end if; Next_Fv := Fv.Next; @@ -3380,8 +3389,8 @@ package body Grt.Signals is end if; -- Extract and reset the chain of active signals. - Sig := Ghdl_Signal_Active_Chain; - Ghdl_Signal_Active_Chain := Signal_End; + Sig := Signal_Active_Chain; + Signal_Active_Chain := Signal_End; -- For each active signals. while Sig.S.Mode_Sig /= Mode_End loop @@ -3457,17 +3466,17 @@ package body Grt.Signals is -- active), and signals may have been appended during the previous -- cycle (because a signal is not anymore active). loop - Sig := Ghdl_Implicit_Signal_Active_Chain; + Sig := Implicit_Signal_Active_Chain; exit when Sig.Link = null; - Ghdl_Implicit_Signal_Active_Chain := Sig.Link; + Implicit_Signal_Active_Chain := Sig.Link; Sig.Link := null; Run_Propagation (Sig); end loop; -- Un-mark updated. - Sig := Ghdl_Signal_Active_Chain; - Ghdl_Signal_Active_Chain := Signal_End; + Sig := Update_Clear_Chain; + Update_Clear_Chain := Signal_End; while Sig.Link /= null loop Propagation.Table (Sig.Net).Updated := False; Next_Sig := Sig.Link; @@ -3485,8 +3494,8 @@ package body Grt.Signals is begin Trans := Sig.S.Attr_Trans.Next; if Trans /= null and then Trans.Time = Current_Time then - Sig.Link := Ghdl_Implicit_Signal_Active_Chain; - Ghdl_Implicit_Signal_Active_Chain := Sig; + Sig.Link := Implicit_Signal_Active_Chain; + Implicit_Signal_Active_Chain := Sig; end if; end; when others => @@ -3648,9 +3657,10 @@ package body Grt.Signals is procedure Init is begin - Ghdl_Signal_Active_Chain := Signal_End; - Ghdl_Implicit_Signal_Active_Chain := Signal_End; + Signal_Active_Chain := Signal_End; + Implicit_Signal_Active_Chain := Signal_End; Future_List := Signal_End; + Update_Clear_Chain := Signal_End; end Init; end Grt.Signals; diff --git a/src/grt/grt-signals.ads b/src/grt/grt-signals.ads index 61a38d38c..522521a37 100644 --- a/src/grt/grt-signals.ads +++ b/src/grt/grt-signals.ads @@ -704,7 +704,7 @@ package Grt.Signals is -- -- Assignment using direct driver: -- * the driver value is set - -- * put the signal on the ghdl_signal_active_chain, if the signal will + -- * put the signal on the signal_active_chain, if the signal will -- be active and if not already on the chain. procedure Ghdl_Signal_Add_Direct_Driver (Sign : Ghdl_Signal_Ptr; Drv : Ghdl_Value_Ptr); |