diff options
author | Tristan Gingold <gingold@adacore.com> | 2015-12-16 09:38:00 +0100 |
---|---|---|
committer | Tristan Gingold <gingold@adacore.com> | 2015-12-18 17:16:27 +0100 |
commit | e8a965f0f42749f7fbcaaee966e24a55fb45d886 (patch) | |
tree | 448d507f7074f78e80dd4afe5b983609a08396ca /src/vhdl/translate/trans-chap7.adb | |
parent | 4680da5edb910910c4a31438798bff0bc6e51380 (diff) | |
download | ghdl-e8a965f0f42749f7fbcaaee966e24a55fb45d886.tar.gz ghdl-e8a965f0f42749f7fbcaaee966e24a55fb45d886.tar.bz2 ghdl-e8a965f0f42749f7fbcaaee966e24a55fb45d886.zip |
Pass signal values to interfaces. 'sigptr' optimization.
Improve simulation speed by about 20%.
Diffstat (limited to 'src/vhdl/translate/trans-chap7.adb')
-rw-r--r-- | src/vhdl/translate/trans-chap7.adb | 163 |
1 files changed, 64 insertions, 99 deletions
diff --git a/src/vhdl/translate/trans-chap7.adb b/src/vhdl/translate/trans-chap7.adb index 7de8c1c94..8ce2b8aca 100644 --- a/src/vhdl/translate/trans-chap7.adb +++ b/src/vhdl/translate/trans-chap7.adb @@ -1937,15 +1937,16 @@ package body Trans.Chap7 is is Enums : constant Iir_List := Get_Enumeration_Literal_List (Get_Base_Type (Get_Type (Left))); - Name : Mnode; + Sig : Mnode; + Val : Mnode; begin - Name := Stabilize (Chap6.Translate_Name (Left), True); + Chap6.Translate_Signal_Name (Left, Sig, Val); return New_Dyadic_Op (ON_And, - New_Value (Chap14.Get_Signal_Field (Name, Ghdl_Signal_Event_Field)), + New_Value (Chap14.Get_Signal_Field (Sig, Ghdl_Signal_Event_Field)), New_Compare_Op (ON_Eq, - New_Value (New_Access_Element (M2E (Name))), + M2E (Val), New_Lit (Get_Ortho_Expr (Get_Nth_Element (Enums, Boolean'Pos (Is_Rising)))), Std_Boolean_Type_Node)); @@ -3485,82 +3486,94 @@ package body Trans.Chap7 is end case; end Translate_Type_Conversion; - function Translate_Fat_Array_Type_Conversion - (Expr : O_Enode; Expr_Type : Iir; Res_Type : Iir; Loc : Iir) - return O_Enode + procedure Translate_Type_Conversion_Bounds + (Res : Mnode; Src : Mnode; Res_Type : Iir; Src_Type : Iir; Loc : Iir) is - Res_Info : constant Type_Info_Acc := Get_Info (Res_Type); - Expr_Info : constant Type_Info_Acc := Get_Info (Expr_Type); - Res_Indexes : constant Iir_List := - Get_Index_Subtype_List (Res_Type); - Expr_Indexes : constant Iir_List := - Get_Index_Subtype_List (Expr_Type); - + Res_Indexes : constant Iir_List := Get_Index_Subtype_List (Res_Type); + Src_Indexes : constant Iir_List := Get_Index_Subtype_List (Src_Type); Res_Base_Type : constant Iir := Get_Base_Type (Res_Type); - Expr_Base_Type : constant Iir := Get_Base_Type (Expr_Type); + Src_Base_Type : constant Iir := Get_Base_Type (Src_Type); Res_Base_Indexes : constant Iir_List := Get_Index_Subtype_List (Res_Base_Type); - Expr_Base_Indexes : constant Iir_List := - Get_Index_Subtype_List (Expr_Base_Type); - Res : Mnode; - E : Mnode; - Bounds : O_Dnode; + Src_Base_Indexes : constant Iir_List := + Get_Index_Subtype_List (Src_Base_Type); + R_El : Iir; - E_El : Iir; + S_El : Iir; begin - Res := Create_Temp (Res_Info, Mode_Value); - Bounds := Create_Temp (Res_Info.T.Bounds_Type); - E := Stabilize (E2M (Expr, Expr_Info, Mode_Value)); - Open_Temp; - -- Set base. - New_Assign_Stmt - (M2Lp (Chap3.Get_Array_Base (Res)), - New_Convert_Ov (M2Addr (Chap3.Get_Array_Base (E)), - Res_Info.T.Base_Ptr_Type (Mode_Value))); - -- Set bounds. - New_Assign_Stmt - (M2Lp (Chap3.Get_Array_Bounds (Res)), - New_Address (New_Obj (Bounds), Res_Info.T.Bounds_Ptr_Type)); - -- Convert bounds. for I in Natural loop R_El := Get_Index_Type (Res_Indexes, I); - E_El := Get_Index_Type (Expr_Indexes, I); - exit when R_El = Null_Iir; + S_El := Get_Index_Type (Src_Indexes, I); + exit when S_El = Null_Iir; declare Rb_Ptr : Mnode; - Eb_Ptr : Mnode; + Sb_Ptr : Mnode; Ee : O_Enode; Same_Index_Type : constant Boolean := (Get_Index_Type (Res_Base_Indexes, I) - = Get_Index_Type (Expr_Base_Indexes, I)); + = Get_Index_Type (Src_Base_Indexes, I)); begin Open_Temp; - Rb_Ptr := Stabilize - (Chap3.Get_Array_Range (Res, Res_Type, I + 1)); - Eb_Ptr := Stabilize - (Chap3.Get_Array_Range (E, Expr_Type, I + 1)); + Rb_Ptr := Stabilize (Chap3.Bounds_To_Range (Res, Res_Type, I + 1)); + Sb_Ptr := Stabilize (Chap3.Bounds_To_Range (Src, Src_Type, I + 1)); -- Convert left and right (unless they have the same type - -- this is an optimization but also this deals with null -- array in common cases). - Ee := M2E (Chap3.Range_To_Left (Eb_Ptr)); + Ee := M2E (Chap3.Range_To_Left (Sb_Ptr)); if not Same_Index_Type then - Ee := Translate_Type_Conversion (Ee, E_El, R_El, Loc); + Ee := Translate_Type_Conversion (Ee, S_El, R_El, Loc); end if; New_Assign_Stmt (M2Lv (Chap3.Range_To_Left (Rb_Ptr)), Ee); - Ee := M2E (Chap3.Range_To_Right (Eb_Ptr)); + Ee := M2E (Chap3.Range_To_Right (Sb_Ptr)); if not Same_Index_Type then - Ee := Translate_Type_Conversion (Ee, E_El, R_El, Loc); + Ee := Translate_Type_Conversion (Ee, S_El, R_El, Loc); end if; New_Assign_Stmt (M2Lv (Chap3.Range_To_Right (Rb_Ptr)), Ee); -- Copy Dir and Length. New_Assign_Stmt (M2Lv (Chap3.Range_To_Dir (Rb_Ptr)), - M2E (Chap3.Range_To_Dir (Eb_Ptr))); + M2E (Chap3.Range_To_Dir (Sb_Ptr))); New_Assign_Stmt (M2Lv (Chap3.Range_To_Length (Rb_Ptr)), - M2E (Chap3.Range_To_Length (Eb_Ptr))); + M2E (Chap3.Range_To_Length (Sb_Ptr))); Close_Temp; end; end loop; + end Translate_Type_Conversion_Bounds; + + function Translate_Fat_Array_Type_Conversion + (Expr : O_Enode; Expr_Type : Iir; Res_Type : Iir; Loc : Iir) + return O_Enode + is + Res_Info : constant Type_Info_Acc := Get_Info (Res_Type); + Expr_Info : constant Type_Info_Acc := Get_Info (Expr_Type); + + Res : Mnode; + E : Mnode; + Bounds : O_Dnode; + begin + Res := Create_Temp (Res_Info, Mode_Value); + Bounds := Create_Temp (Res_Info.T.Bounds_Type); + + Open_Temp; + E := Stabilize (E2M (Expr, Expr_Info, Mode_Value)); + + -- Set base. + New_Assign_Stmt + (M2Lp (Chap3.Get_Array_Base (Res)), + New_Convert_Ov (M2Addr (Chap3.Get_Array_Base (E)), + Res_Info.T.Base_Ptr_Type (Mode_Value))); + -- Set bounds. + New_Assign_Stmt + (M2Lp (Chap3.Get_Array_Bounds (Res)), + New_Address (New_Obj (Bounds), Res_Info.T.Bounds_Ptr_Type)); + + -- Convert bounds. + Translate_Type_Conversion_Bounds + (Dv2M (Bounds, Res_Info, Mode_Value, + Res_Info.T.Bounds_Type, Res_Info.T.Bounds_Ptr_Type), + Stabilize (Chap3.Get_Array_Bounds (E)), + Res_Type, Expr_Type, Loc); + Close_Temp; return M2E (Res); end Translate_Fat_Array_Type_Conversion; @@ -3598,25 +3611,6 @@ package body Trans.Chap7 is null; end Sig2val_Finish_Data_Composite; - procedure Translate_Signal_Assign_Effective_Non_Composite - (Targ : Mnode; Targ_Type : Iir; Data : Mnode) - is - pragma Unreferenced (Targ_Type); - begin - New_Assign_Stmt (New_Access_Element (M2E (Targ)), M2E (Data)); - end Translate_Signal_Assign_Effective_Non_Composite; - - procedure Translate_Signal_Assign_Effective is new Foreach_Non_Composite - (Data_Type => Mnode, - Composite_Data_Type => Mnode, - Do_Non_Composite => Translate_Signal_Assign_Effective_Non_Composite, - Prepare_Data_Array => Sig2val_Prepare_Composite, - Update_Data_Array => Sig2val_Update_Data_Array, - Finish_Data_Array => Sig2val_Finish_Data_Composite, - Prepare_Data_Record => Sig2val_Prepare_Composite, - Update_Data_Record => Sig2val_Update_Data_Record, - Finish_Data_Record => Sig2val_Finish_Data_Composite); - procedure Translate_Signal_Assign_Driving_Non_Composite (Targ : Mnode; Targ_Type : Iir; Data: Mnode) is begin @@ -3703,22 +3697,6 @@ package body Trans.Chap7 is end if; end Translate_Signal_Value; - -- Get the effective value of a simple signal SIG. - function Read_Signal_Value (Sig : O_Enode; Sig_Type : Iir) return O_Enode - is - pragma Unreferenced (Sig_Type); - begin - return New_Value (New_Access_Element (Sig)); - end Read_Signal_Value; - - -- Get the value of signal SIG. - function Translate_Signal is new Translate_Signal_Value - (Read_Value => Read_Signal_Value); - - function Translate_Signal_Effective_Value - (Sig : O_Enode; Sig_Type : Iir) return O_Enode - renames Translate_Signal; - function Read_Signal_Driving_Value (Sig : O_Enode; Sig_Type : Iir) return O_Enode is begin @@ -3733,9 +3711,6 @@ package body Trans.Chap7 is (Sig : O_Enode; Sig_Type : Iir) return O_Enode renames Translate_Signal_Driving_Value_1; - procedure Set_Effective_Value - (Sig : Mnode; Sig_Type : Iir; Val : Mnode) - renames Translate_Signal_Assign_Effective; procedure Set_Driving_Value (Sig : Mnode; Sig_Type : Iir; Val : Mnode) renames Translate_Signal_Assign_Driving; @@ -3895,16 +3870,7 @@ package body Trans.Chap7 is | Iir_Kind_Guard_Signal_Declaration | Iir_Kind_Attribute_Value | Iir_Kind_Attribute_Name => - declare - L : Mnode; - begin - L := Chap6.Translate_Name (Expr); - - Res := M2E (L); - if Get_Object_Kind (L) = Mode_Signal then - Res := Translate_Signal (Res, Expr_Type); - end if; - end; + Res := M2E (Chap6.Translate_Name (Expr, Mode_Value)); when Iir_Kind_Iterator_Declaration => declare @@ -3974,9 +3940,8 @@ package body Trans.Chap7 is when Iir_Kind_Type_Conversion => declare - Conv_Expr : Iir; + Conv_Expr : constant Iir := Get_Expression (Expr); begin - Conv_Expr := Get_Expression (Expr); Res := Translate_Type_Conversion (Translate_Expression (Conv_Expr), Get_Type (Conv_Expr), Expr_Type, Expr); |