diff options
author | Tristan Gingold <tgingold@free.fr> | 2022-08-22 08:02:14 +0200 |
---|---|---|
committer | Tristan Gingold <tgingold@free.fr> | 2022-08-22 08:02:14 +0200 |
commit | 1189bd7568d77a69385dc4ee62c5db36d800a3b1 (patch) | |
tree | 3b5f435f249ef05211465f5c870106e2804d404c /src/grt | |
parent | 2ed9d9b2fec19dec5f65dcc9df7a9577c489464f (diff) | |
download | ghdl-1189bd7568d77a69385dc4ee62c5db36d800a3b1.tar.gz ghdl-1189bd7568d77a69385dc4ee62c5db36d800a3b1.tar.bz2 ghdl-1189bd7568d77a69385dc4ee62c5db36d800a3b1.zip |
grt-signals: internal refactoring for drivers creation
Diffstat (limited to 'src/grt')
-rw-r--r-- | src/grt/grt-signals.adb | 64 |
1 files changed, 39 insertions, 25 deletions
diff --git a/src/grt/grt-signals.adb b/src/grt/grt-signals.adb index b88aaf026..3dea49b52 100644 --- a/src/grt/grt-signals.adb +++ b/src/grt/grt-signals.adb @@ -338,13 +338,25 @@ package body Grt.Signals is end if; end Check_New_Source; - -- Return TRUE if already present. - function Ghdl_Signal_Add_Driver (Sign : Ghdl_Signal_Ptr; - Trans : Transaction_Acc) - return Boolean - is - Proc : constant Process_Acc := Get_Current_Process; + -- Return True iff signal SIGN has a driver for PROC. + function Has_Driver (Sign : Ghdl_Signal_Ptr; Proc : Process_Acc) + return Boolean is + begin + if Sign.S.Nbr_Drivers /= 0 then + for I in 0 .. Sign.S.Nbr_Drivers - 1 loop + if Sign.S.Drivers (I).Proc = Proc then + return True; + end if; + end loop; + end if; + return False; + end Has_Driver; + -- Add a driver (using TRANS) for signal SIGN and process PROC. + procedure Ghdl_Signal_Add_Driver (Sign : Ghdl_Signal_Ptr; + Proc : Process_Acc; + Trans : Transaction_Acc) + is type Size_T is mod 2**Standard'Address_Size; function Malloc (Size : Size_T) return Driver_Arr_Ptr; @@ -360,18 +372,12 @@ package body Grt.Signals is / System.Storage_Unit); end Size; begin + Check_New_Source (Sign); + if Sign.S.Nbr_Drivers = 0 then - Check_New_Source (Sign); Sign.S.Drivers := Malloc (Size (1)); Sign.S.Nbr_Drivers := 1; else - -- Do not create a driver twice. - for I in 0 .. Sign.S.Nbr_Drivers - 1 loop - if Sign.S.Drivers (I).Proc = Proc then - return True; - end if; - end loop; - Check_New_Source (Sign); Sign.S.Nbr_Drivers := Sign.S.Nbr_Drivers + 1; Sign.S.Drivers := Realloc (Sign.S.Drivers, Size (Sign.S.Nbr_Drivers)); end if; @@ -379,54 +385,62 @@ package body Grt.Signals is (First_Trans => Trans, Last_Trans => Trans, Proc => Proc); - return False; end Ghdl_Signal_Add_Driver; procedure Ghdl_Process_Add_Driver (Sign : Ghdl_Signal_Ptr) is + Proc : constant Process_Acc := Get_Current_Process; Trans : Transaction_Acc; begin + if Has_Driver (Sign, Proc) then + return; + end if; + Trans := new Transaction'(Kind => Trans_Value, Line => 0, Time => 0, Next => null, Val => Read_Value (Sign.Value_Ptr, Sign.Mode)); - if Ghdl_Signal_Add_Driver (Sign, Trans) then - Free (Trans); - end if; + Ghdl_Signal_Add_Driver (Sign, Proc, Trans); end Ghdl_Process_Add_Driver; procedure Ghdl_Process_Add_Port_Driver (Sign : Ghdl_Signal_Ptr; Val : Value_Union) is + Proc : constant Process_Acc := Get_Current_Process; Trans : Transaction_Acc; begin + if Has_Driver (Sign, Proc) then + return; + end if; + Trans := new Transaction'(Kind => Trans_Value, Line => 0, Time => 0, Next => null, Val => Val); - if Ghdl_Signal_Add_Driver (Sign, Trans) then - Free (Trans); - end if; + Ghdl_Signal_Add_Driver (Sign, Proc, Trans); end Ghdl_Process_Add_Port_Driver; procedure Ghdl_Signal_Add_Direct_Driver (Sign : Ghdl_Signal_Ptr; Drv : Ghdl_Value_Ptr) is + Proc : constant Process_Acc := Get_Current_Process; Trans : Transaction_Acc; Trans1 : Transaction_Acc; begin + if Has_Driver (Sign, Proc) then + return; + end if; + -- Create transaction for current driving value. Trans := new Transaction'(Kind => Trans_Value, Line => 0, Time => 0, Next => null, Val => Read_Value (Drv, Sign.Mode)); - if Ghdl_Signal_Add_Driver (Sign, Trans) then - Free (Trans); - return; - end if; + Ghdl_Signal_Add_Driver (Sign, Proc, Trans); + -- Create transaction for the next driving value. Trans1 := new Transaction'(Kind => Trans_Direct, Line => 0, |