diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/grt/grt-signals.ads | 4 | ||||
-rw-r--r-- | src/simul/simul-vhdl_simul.adb | 87 |
2 files changed, 51 insertions, 40 deletions
diff --git a/src/grt/grt-signals.ads b/src/grt/grt-signals.ads index 125cbff7f..b1fa0977e 100644 --- a/src/grt/grt-signals.ads +++ b/src/grt/grt-signals.ads @@ -604,7 +604,11 @@ package Grt.Signals is Rej : Std_Time; Val : Value_Union; After : Std_Time); + procedure Ghdl_Signal_Next_Assign (Sign : Ghdl_Signal_Ptr; + Val : Value_Union; + After : Std_Time); + -- For B1 function Ghdl_Create_Signal_B1 (Val_Ptr : Ghdl_Value_Ptr; Resolv_Func : Resolver_Acc; Resolv_Inst : System.Address) diff --git a/src/simul/simul-vhdl_simul.adb b/src/simul/simul-vhdl_simul.adb index 383203e92..fb0efee72 100644 --- a/src/simul/simul-vhdl_simul.adb +++ b/src/simul/simul-vhdl_simul.adb @@ -192,18 +192,27 @@ package body Simul.Vhdl_Simul is return Val; end To_Ghdl_Value; - procedure Start_Assign_Value_To_Signal (Target: Memtyp; - Rej : Std_Time; - After : Std_Time; - Val : Memtyp) is + procedure Assign_Value_To_Signal (Target: Memtyp; + Is_Start : Boolean; + Rej : Std_Time; + After : Std_Time; + Val : Memtyp) + is + Sig : Ghdl_Signal_Ptr; begin case Target.Typ.Kind is when Type_Logic | Type_Bit | Type_Discrete | Type_Float => - Ghdl_Signal_Start_Assign_Any - (Read_Sig (Target.Mem), Rej, To_Ghdl_Value (Val), After); + Sig := Read_Sig (Target.Mem); + if Is_Start then + Ghdl_Signal_Start_Assign_Any + (Sig, Rej, To_Ghdl_Value (Val), After); + else + Ghdl_Signal_Next_Assign + (Sig, To_Ghdl_Value (Val), After); + end if; when Type_Vector | Type_Array => declare @@ -212,9 +221,9 @@ package body Simul.Vhdl_Simul is begin pragma Assert (Val.Typ.Abound.Len = Len); for I in 1 .. Len loop - Start_Assign_Value_To_Signal + Assign_Value_To_Signal ((El, Sig_Index (Target.Mem, (Len - I) * El.W)), - Rej, After, + Is_Start, Rej, After, (Val.Typ.Arr_El, Val.Mem + Size_Type (I - 1) * El.Sz)); end loop; end; @@ -223,16 +232,16 @@ package body Simul.Vhdl_Simul is declare E : Rec_El_Type renames Val.Typ.Rec.E (I); begin - Start_Assign_Value_To_Signal + Assign_Value_To_Signal ((E.Typ, Sig_Index (Target.Mem, E.Offs.Net_Off)), - Rej, After, + Is_Start, Rej, After, (E.Typ, Val.Mem + E.Offs.Mem_Off)); end; end loop; when others => raise Internal_Error; end case; - end Start_Assign_Value_To_Signal; + end Assign_Value_To_Signal; procedure Add_Source (Typ : Type_Acc; Sig : Memory_Ptr; Val : Memory_Ptr) is begin @@ -741,6 +750,7 @@ package body Simul.Vhdl_Simul is is use Synth.Vhdl_Expr; V_Aft : Std_Time; + Start : Boolean; procedure Execute_Signal_Assignment (Inst : Synth_Instance_Acc; Target : Target_Info; @@ -755,17 +765,12 @@ package body Simul.Vhdl_Simul is Val : Valtyp; Loc : Node) is - V : Valtyp; Sig : Memtyp; begin - V := Synth_Subtype_Conversion - (Inst, Val, Target.Targ_Type, False, Loc); - pragma Unreferenced (Val); - case Target.Kind is when Target_Aggregate => Execute_Aggregate_Signal_Assignment - (Inst, Target.Aggr, Target.Targ_Type, V, Loc); + (Inst, Target.Aggr, Target.Targ_Type, Val, Loc); when Target_Simple => declare @@ -776,8 +781,8 @@ package body Simul.Vhdl_Simul is Sig_Index (E.Sig, Target.Off.Net_Off)); end; - Start_Assign_Value_To_Signal - (Sig, V_Aft, V_Aft, Get_Value_Memtyp (V)); + Assign_Value_To_Signal + (Sig, Start, V_Aft, V_Aft, Get_Value_Memtyp (Val)); when Target_Memory => raise Internal_Error; @@ -795,22 +800,26 @@ package body Simul.Vhdl_Simul is end if; Wf := Waveform; - Aft := Get_Time (Wf); - if Aft /= Null_Node then - Val := Synth_Expression (Inst, Aft); - V_Aft := Std_Time (Read_I64 (Val.Val.Mem)); - else - V_Aft := 0; - end if; + Start := True; + loop + Aft := Get_Time (Wf); + if Aft /= Null_Node then + Val := Synth_Expression (Inst, Aft); + V_Aft := Std_Time (Read_I64 (Val.Val.Mem)); + else + V_Aft := 0; + end if; - Val := Synth_Expression_With_Type - (Inst, Get_We_Value (Wf), Target.Targ_Type); - Execute_Signal_Assignment (Inst, Target, Val, Wf); - Wf := Get_Chain (Wf); + Val := Synth_Expression_With_Type + (Inst, Get_We_Value (Wf), Target.Targ_Type); + Val := Synth_Subtype_Conversion + (Inst, Val, Target.Targ_Type, False, Wf); + Execute_Signal_Assignment (Inst, Target, Val, Wf); - if Wf /= Null_Node then - raise Internal_Error; - end if; + Wf := Get_Chain (Wf); + exit when Wf = Null_Node; + Start := False; + end loop; end Execute_Waveform_Assignment; procedure Execute_Simple_Signal_Assignment (Inst : Synth_Instance_Acc; @@ -1231,8 +1240,8 @@ package body Simul.Vhdl_Simul is begin Val := Synth_Expression_With_Type (Proc.Inst, Get_Actual (Proc.Proc), Drv.Typ); - Start_Assign_Value_To_Signal - ((Drv.Typ, Sig.Sig), 0, 0, Get_Value_Memtyp (Val)); + Assign_Value_To_Signal + ((Drv.Typ, Sig.Sig), True, 0, 0, Get_Value_Memtyp (Val)); end Execute_Expression_Association; function To_Process_State_Acc is new Ada.Unchecked_Conversion @@ -1448,7 +1457,7 @@ package body Simul.Vhdl_Simul is return; end if; - Instance_Pool := Global_Pool'Access; +-- Instance_Pool := Global_Pool'Access; -- Current_Process := No_Process; Mark (Marker, Expr_Pool); @@ -1532,8 +1541,8 @@ package body Simul.Vhdl_Simul is E.States.all := Nvec; end if; - Instance_Pool := null; - Current_Process := null; +-- Instance_Pool := null; +-- Current_Process := null; end PSL_Process_Executer; procedure PSL_Assert_Finalizer (Self : Grt.Processes.Instance_Acc) @@ -2720,8 +2729,6 @@ package body Simul.Vhdl_Simul is end loop; end if; - Grt.Processes.Simulation_Finish; - Grt.Main.Run_Finish (Status); exception -- when Debugger_Quit => |