diff options
-rw-r--r-- | disp_tree.adb | 10 | ||||
-rw-r--r-- | iirs.ads | 6 | ||||
-rw-r--r-- | sem.adb | 8 | ||||
-rw-r--r-- | translate/ghdldrv/Makefile | 18 | ||||
-rw-r--r-- | translate/ghdldrv/ghdlrun.adb | 4 | ||||
-rw-r--r-- | translate/grt/ghdl_main.adb | 3 | ||||
-rw-r--r-- | translate/grt/grt-images.adb | 14 | ||||
-rw-r--r-- | translate/grt/grt-images.ads | 8 | ||||
-rw-r--r-- | translate/grt/grt-types.ads | 5 | ||||
-rw-r--r-- | translate/trans_decls.ads | 3 | ||||
-rw-r--r-- | translate/translation.adb | 365 |
11 files changed, 372 insertions, 72 deletions
diff --git a/disp_tree.adb b/disp_tree.adb index db2102a33..1bd6cd118 100644 --- a/disp_tree.adb +++ b/disp_tree.adb @@ -349,14 +349,17 @@ package body Disp_Tree is Disp_Decl_Ident; when Iir_Kind_File_Type_Definition => Put ("file_type_definition"); - Disp_Identifier (Get_Type_Declarator (Tree)); + Disp_Decl_Ident; when Iir_Kind_Subtype_Definition => Put_Line ("subtype_definition"); when Iir_Kind_Physical_Type_Definition => Put ("physical_type_definition"); - Disp_Identifier (Get_Type_Declarator (Tree)); + Disp_Decl_Ident; when Iir_Kind_Physical_Subtype_Definition => Put_Line ("physical_subtype_definition"); + when Iir_Kind_Protected_Type_Declaration => + Put ("protected_type_declaration"); + Disp_Decl_Ident; when Iir_Kind_Scalar_Nature_Definition => Put ("scalar_nature_definition"); @@ -1429,6 +1432,9 @@ package body Disp_Tree is Header ("file type mark:"); Disp_Tree_Flat (Get_File_Type_Mark (Tree), Ntab); when Iir_Kind_Protected_Type_Declaration => + if Flat_Decl then + return; + end if; Header ("staticness: ", False); Disp_Type_Staticness (Tree); Header ("declarator:"); @@ -3751,9 +3751,9 @@ package Iirs is Iir_Predefined_Array_Rol, Iir_Predefined_Array_Ror, - -- Predefined operators for one dimensional array. - -- For bit and boolean type, the operations are the same. For a neutral - -- noun, we use TF (for True/False) instead of Bit, Boolean or Logic. + -- Predefined operators for one dimensional array. + -- For bit and boolean type, the operations are the same. For a neutral + -- noun, we use TF (for True/False) instead of Bit, Boolean or Logic. Iir_Predefined_TF_Array_And, Iir_Predefined_TF_Array_Or, Iir_Predefined_TF_Array_Nand, @@ -1445,11 +1445,12 @@ package body Sem is procedure Set_Subprogram_Overload_Number (Decl : Iir) is + Id : constant Name_Id := Get_Identifier (Decl); Inter : Name_Interpretation_Type; Prev : Iir; Num : Iir_Int32; begin - Inter := Get_Interpretation (Get_Identifier (Decl)); + Inter := Get_Interpretation (Id); while Valid_Interpretation (Inter) and then Is_In_Current_Declarative_Region (Inter) loop @@ -1479,8 +1480,11 @@ package body Sem is -- Implicit declarations aren't taken into account (as they -- are mangled differently). Inter := Get_Next_Interpretation (Inter); + when Iir_Kind_Enumeration_Literal => + -- Enumeration literal are ignored for overload number. + Inter := Get_Next_Interpretation (Inter); when others => - -- Can be an enumeration literal or an error. + -- An error ? Set_Overload_Number (Decl, 0); return; end case; diff --git a/translate/ghdldrv/Makefile b/translate/ghdldrv/Makefile index fc243125e..c4464268d 100644 --- a/translate/ghdldrv/Makefile +++ b/translate/ghdldrv/Makefile @@ -15,7 +15,7 @@ # along with GCC; see the file COPYING. If not, write to the Free # Software Foundation, 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. -GNATFLAGS=-gnaty3befhkmr -gnata -gnatwae -aI../.. -aI.. -aI../../psl -aI../grt -aO.. -g -gnatf -gnat05 +GNATFLAGS=-gnaty3befhkmr -gnata -gnatwael -aI../.. -aI.. -aI../../psl -aI../grt -aO.. -g -gnatf -gnat05 GRT_FLAGS=-g LIB_CFLAGS=-g -O2 GNATMAKE=gnatmake @@ -142,18 +142,32 @@ else $(RM) std_standard.s endif +$(LIB08_DIR)/std/std_standard.o: $(GHDL1) +ifeq ($(GHDL),ghdl_llvm) + $(GHDL1) --std=08 -quiet $(LIB_CFLAGS) -c -o $@ --compile-standard +else + $(GHDL1) --std=08 -quiet $(LIB_CFLAGS) -o std_standard.s \ + --compile-standard + $(CC) -c -o $@ std_standard.s + $(RM) std_standard.s +endif + install.v93: std.v93 ieee.v93 synopsys.v93 mentor.v93 install.v87: std.v87 ieee.v87 synopsys.v87 install.v08: std.v08 ieee.v08 install.standard: $(LIB93_DIR)/std/std_standard.o \ - $(LIB87_DIR)/std/std_standard.o + $(LIB87_DIR)/std/std_standard.o \ + $(LIB08_DIR)/std/std_standard.o grt.links: cd ../lib; ln -sf $(GRTSRCDIR)/grt.lst .; ln -sf $(GRTSRCDIR)/libgrt.a .; ln -sf $(GRTSRCDIR)/grt.ver . install.all: install.v87 install.v93 install.standard +install.gcc: + $(MAKE) GHDL=ghdl_gcc install.v08 #install.v87 install.v93 install.v08 + install.mcode: $(MAKE) GHDL=ghdl_mcode install.v87 install.v93 install.v08 diff --git a/translate/ghdldrv/ghdlrun.adb b/translate/ghdldrv/ghdlrun.adb index cc01c83d6..5bcb2b748 100644 --- a/translate/ghdldrv/ghdlrun.adb +++ b/translate/ghdldrv/ghdlrun.adb @@ -553,6 +553,10 @@ package body Ghdlrun is Grt.Images.Ghdl_To_String_F64'Address); Def (Trans_Decls.Ghdl_To_String_F64_Digits, Grt.Images.Ghdl_To_String_F64_Digits'Address); + Def (Trans_Decls.Ghdl_BV_To_Ostring, + Grt.Images.Ghdl_BV_To_Ostring'Address); + Def (Trans_Decls.Ghdl_BV_To_Hstring, + Grt.Images.Ghdl_BV_To_Hstring'Address); -- Find untruncated_text_read, if any. Decl := Find_Untruncated_Text_Read; diff --git a/translate/grt/ghdl_main.adb b/translate/grt/ghdl_main.adb index 256d4299b..ce5b67d7e 100644 --- a/translate/grt/ghdl_main.adb +++ b/translate/grt/ghdl_main.adb @@ -27,8 +27,11 @@ with Grt.Options; use Grt.Options; with Grt.Main; with Grt.Types; use Grt.Types; +-- Some files are only referenced from compiled code. With it here so that +-- they get compiled during build (and elaborated). pragma Warnings (Off); with Grt.Rtis_Binding; +with Grt.Std_Logic_1164; pragma Warnings (On); diff --git a/translate/grt/grt-images.adb b/translate/grt/grt-images.adb index e3d66c186..49bce9d75 100644 --- a/translate/grt/grt-images.adb +++ b/translate/grt/grt-images.adb @@ -165,6 +165,20 @@ package body Grt.Images is Return_String (Res, Str (1 .. P)); end Ghdl_To_String_F64_Digits; + procedure Ghdl_BV_To_Ostring (Res : Std_String_Ptr; + Base : Std_Bit_Vector_Basep; + Len : Ghdl_Index_Type) is + begin + raise Program_Error; + end Ghdl_BV_To_Ostring; + + procedure Ghdl_BV_To_Hstring (Res : Std_String_Ptr; + Base : Std_Bit_Vector_Basep; + Len : Ghdl_Index_Type) is + begin + raise Program_Error; + end Ghdl_BV_To_Hstring; + -- procedure Ghdl_Image_F64 (Res : Std_String_Ptr; Val : Ghdl_F64) -- is -- -- Sign (1) + digit (1) + dot (1) + digits (15) + exp (1) + sign (1) diff --git a/translate/grt/grt-images.ads b/translate/grt/grt-images.ads index cd97fe944..a5d8415a3 100644 --- a/translate/grt/grt-images.ads +++ b/translate/grt/grt-images.ads @@ -46,6 +46,12 @@ package Grt.Images is procedure Ghdl_To_String_F64 (Res : Std_String_Ptr; Val : Ghdl_F64); procedure Ghdl_To_String_F64_Digits (Res : Std_String_Ptr; Val : Ghdl_F64; Nbr_Digits : Ghdl_I32); + procedure Ghdl_BV_To_Ostring (Res : Std_String_Ptr; + Base : Std_Bit_Vector_Basep; + Len : Ghdl_Index_Type); + procedure Ghdl_BV_To_Hstring (Res : Std_String_Ptr; + Base : Std_Bit_Vector_Basep; + Len : Ghdl_Index_Type); private pragma Export (Ada, Ghdl_Image_B1, "__ghdl_image_b1"); pragma Export (C, Ghdl_Image_E8, "__ghdl_image_e8"); @@ -58,4 +64,6 @@ private pragma Export (C, Ghdl_To_String_I32, "__ghdl_to_string_i32"); pragma Export (C, Ghdl_To_String_F64, "__ghdl_to_string_f64"); pragma Export (C, Ghdl_To_String_F64_Digits, "__ghdl_to_string_f64_digits"); + pragma Export (C, Ghdl_BV_To_Ostring, "__ghdl_bv_to_ostring"); + pragma Export (C, Ghdl_BV_To_Hstring, "__ghdl_bv_to_hstring"); end Grt.Images; diff --git a/translate/grt/grt-types.ads b/translate/grt/grt-types.ads index 18ea2b9f3..96bd97b51 100644 --- a/translate/grt/grt-types.ads +++ b/translate/grt/grt-types.ads @@ -86,6 +86,11 @@ package Grt.Types is function To_Std_String_Ptr is new Ada.Unchecked_Conversion (Source => Address, Target => Std_String_Ptr); + type Std_Bit is ('0', '1'); + type Std_Bit_Vector_Uncons is array (Ghdl_Index_Type range <>) of Std_Bit; + subtype Std_Bit_Vector_Base is Std_Bit_Vector_Uncons (Ghdl_Index_Type); + type Std_Bit_Vector_Basep is access all Std_Bit_Vector_Base; + -- An unconstrained array. -- It is in fact a fat pointer to the base and the bounds. type Ghdl_Uc_Array is record diff --git a/translate/trans_decls.ads b/translate/trans_decls.ads index 88e09af11..5ee9989da 100644 --- a/translate/trans_decls.ads +++ b/translate/trans_decls.ads @@ -230,6 +230,9 @@ package Trans_Decls is Ghdl_To_String_I32 : O_Dnode; Ghdl_To_String_F64 : O_Dnode; Ghdl_To_String_F64_Digits : O_Dnode; + Ghdl_BV_To_String : O_Dnode; + Ghdl_BV_To_Ostring : O_Dnode; + Ghdl_BV_To_Hstring : O_Dnode; -- Register a package Ghdl_Rti_Add_Package : O_Dnode; diff --git a/translate/translation.adb b/translate/translation.adb index ecae9d7eb..17d140903 100644 --- a/translate/translation.adb +++ b/translate/translation.adb @@ -2438,7 +2438,7 @@ package body Translation is -- Generate code to increment/decrement a ghdl_index_type variable V. procedure Inc_Var (V : O_Dnode); - --procedure Dec_Var (V : O_Lnode); + procedure Dec_Var (V : O_Dnode); -- Generate code to exit from loop LABEL iff COND is true. procedure Gen_Exit_When (Label : O_Snode; Cond : O_Enode); @@ -3312,17 +3312,17 @@ package body Translation is begin New_Assign_Stmt (New_Obj (V), New_Dyadic_Op (ON_Add_Ov, - New_Value (New_Obj (V)), + New_Obj_Value (V), New_Lit (Ghdl_Index_1))); end Inc_Var; --- procedure Dec_Var (V : O_Lnode) is --- begin --- New_Assign_Stmt --- (V, New_Dyadic_Op (ON_Sub_Ov, --- New_Value (V), --- New_Unsigned_Literal (Ghdl_Index_Type, 1))); --- end Dec_Var; + procedure Dec_Var (V : O_Dnode) is + begin + New_Assign_Stmt (New_Obj (V), + New_Dyadic_Op (ON_Sub_Ov, + New_Obj_Value (V), + New_Lit (Ghdl_Index_1))); + end Dec_Var; procedure Init_Var (V : O_Dnode) is begin @@ -7195,12 +7195,12 @@ package body Translation is ----------------- -- protected -- ----------------- + procedure Translate_Protected_Type (Def : Iir_Protected_Type_Declaration) is - Info : Type_Info_Acc; + Info : constant Type_Info_Acc := Get_Info (Def); + Mark : Id_Mark_Type; begin - Info := Get_Info (Def); - New_Uncomplete_Record_Type (Info.Ortho_Type (Mode_Value)); New_Type_Decl (Create_Identifier, Info.Ortho_Type (Mode_Value)); @@ -7221,14 +7221,17 @@ package body Translation is -- This is just use to set overload number on subprograms, and to -- translate interfaces. + Push_Identifier_Prefix + (Mark, Get_Identifier (Get_Type_Declarator (Def))); Chap4.Translate_Declaration_Chain (Def); + Pop_Identifier_Prefix (Mark); end Translate_Protected_Type; procedure Translate_Protected_Type_Subprograms (Def : Iir_Protected_Type_Declaration) is + Info : constant Type_Info_Acc := Get_Info (Def); El : Iir; - Info : Type_Info_Acc; Inter_List : O_Inter_List; Mark : Id_Mark_Type; Prev_Subprg_Instance : Chap2.Subprg_Instance_Stack; @@ -7236,8 +7239,6 @@ package body Translation is Push_Identifier_Prefix (Mark, Get_Identifier (Get_Type_Declarator (Def))); - Info := Get_Info (Def); - -- Init. Start_Function_Decl (Inter_List, Create_Identifier ("INIT"), Global_Storage, @@ -7282,13 +7283,11 @@ package body Translation is procedure Translate_Protected_Type_Body (Bod : Iir) is - Decl : Iir_Protected_Type_Declaration; + Decl : constant Iir_Protected_Type_Declaration := + Get_Protected_Type_Declaration (Bod); + Info : constant Type_Info_Acc := Get_Info (Decl); Mark : Id_Mark_Type; - Info : Type_Info_Acc; begin - Decl := Get_Protected_Type_Declaration (Bod); - Info := Get_Info (Decl); - Push_Identifier_Prefix (Mark, Get_Identifier (Bod)); -- Create the object type @@ -7328,13 +7327,13 @@ package body Translation is procedure Translate_Protected_Type_Body_Subprograms (Bod : Iir) is - Decl : Iir; - Info : Type_Info_Acc; + Mark : Id_Mark_Type; + Decl : constant Iir := Get_Protected_Type_Declaration (Bod); + Info : constant Type_Info_Acc := Get_Info (Decl); Final : Boolean; Prev_Subprg_Instance : Chap2.Subprg_Instance_Stack; begin - Decl := Get_Protected_Type_Declaration (Bod); - Info := Get_Info (Decl); + Push_Identifier_Prefix (Mark, Get_Identifier (Bod)); -- Subprograms of BOD. Chap2.Push_Subprg_Instance (Info.Ortho_Type (Mode_Value), @@ -7350,6 +7349,8 @@ package body Translation is (Prev_Subprg_Instance, Info.T.Prot_Subprg_Instance_Field); Chap2.Pop_Subprg_Instance (Wki_Obj, Prev_Subprg_Instance); + Pop_Identifier_Prefix (Mark); + if Global_Storage = O_Storage_External then return; end if; @@ -13014,22 +13015,20 @@ package body Translation is function Translate_Indexed_Name_Init (Prefix_Orig : Mnode; Expr : Iir) return Indexed_Name_Data is + Prefix_Type : constant Iir := Get_Type (Get_Prefix (Expr)); + Prefix_Info : constant Type_Info_Acc := Get_Info (Prefix_Type); + Index_List : constant Iir_List := Get_Index_List (Expr); + Type_List : constant Iir_List := Get_Index_Subtype_List (Prefix_Type); + Nbr_Dim : constant Natural := Get_Nbr_Elements (Index_List); Prefix : Mnode; - Prefix_Type : Iir; Index : Iir; - Index_List : Iir_List; - Type_List : Iir_List; Offset : O_Dnode; R : O_Enode; Length : O_Enode; Itype : Iir; Ibasetype : Iir; - Prefix_Info : Type_Info_Acc; - Nbr_Dim : Natural; Range_Ptr : Mnode; begin - Prefix_Type := Get_Type (Get_Prefix (Expr)); - Prefix_Info := Get_Info (Prefix_Type); case Prefix_Info.Type_Mode is when Type_Mode_Fat_Array => Prefix := Stabilize (Prefix_Orig); @@ -13038,9 +13037,6 @@ package body Translation is when others => raise Internal_Error; end case; - Index_List := Get_Index_List (Expr); - Type_List := Get_Index_Subtype_List (Prefix_Type); - Nbr_Dim := Get_Nbr_Elements (Index_List); Offset := Create_Temp (Ghdl_Index_Type); for Dim in 1 .. Nbr_Dim loop Index := Get_Nth_Element (Index_List, Dim - 1); @@ -13137,23 +13133,23 @@ package body Translation is (Prefix : Mnode; Expr : Iir_Slice_Name; Data : out Slice_Name_Data) is -- Type of the prefix. - Prefix_Type : Iir; + Prefix_Type : constant Iir := Get_Type (Get_Prefix (Expr)); -- Type info of the prefix. Prefix_Info : Type_Info_Acc; + -- Type of the first (and only) index of the prefix array type. + Index_Type : constant Iir := Get_Index_Type (Prefix_Type, 0); + -- Type of the slice. - Slice_Type : Iir; + Slice_Type : constant Iir := Get_Type (Expr); Slice_Info : Type_Info_Acc; - -- Type of the first (and only) index of the prefix array type. - Index_Type : Iir; - -- True iff the direction of the slice is known at compile time. Static_Range : Boolean; -- Suffix of the slice (discrete range). - Expr_Range : Iir; + Expr_Range : constant Iir := Get_Suffix (Expr); -- Variable pointing to the prefix. Prefix_Var : Mnode; @@ -13169,15 +13165,10 @@ package body Translation is Unsigned_Diff : O_Dnode; If_Blk1 : O_If_Block; begin - -- Evaluate the prefix. - Slice_Type := Get_Type (Expr); - Expr_Range := Get_Suffix (Expr); - Prefix_Type := Get_Type (Get_Prefix (Expr)); - Index_Type := Get_Index_Type (Prefix_Type, 0); - -- Evaluate slice bounds. Chap3.Create_Array_Subtype (Slice_Type, True); + -- The info may have just been created. Prefix_Info := Get_Info (Prefix_Type); Slice_Info := Get_Info (Slice_Type); @@ -15089,6 +15080,179 @@ package body Translation is return New_Address (New_Obj (Res), Std_String_Ptr_Node); end Translate_To_String; + function Translate_Bv_To_String + (Subprg : O_Dnode; Val : O_Enode; Val_Type : Iir) + return O_Enode + is + Arr : Mnode; + begin + Arr := Stabilize (E2M (Val, Get_Info (Val_Type), Mode_Value)); + return Translate_To_String + (Subprg, + M2E (Chap3.Get_Array_Base (Arr)), + M2E (Chap3.Range_To_Length + (Chap3.Get_Array_Range (Arr, Val_Type, 1)))); + end Translate_Bv_To_String; + + subtype Predefined_Boolean_Logical is Iir_Predefined_Functions range + Iir_Predefined_Boolean_And .. Iir_Predefined_Boolean_Xnor; + + function Translate_Predefined_Logical + (Op : Predefined_Boolean_Logical; Left, Right : O_Enode) + return O_Enode is + begin + case Op is + when Iir_Predefined_Boolean_And => + return New_Dyadic_Op (ON_And, Left, Right); + when Iir_Predefined_Boolean_Or => + return New_Dyadic_Op (ON_Or, Left, Right); + when Iir_Predefined_Boolean_Nand => + return New_Monadic_Op + (ON_Not, New_Dyadic_Op (ON_And, Left, Right)); + when Iir_Predefined_Boolean_Nor => + return New_Monadic_Op + (ON_Not, New_Dyadic_Op (ON_Or, Left, Right)); + when Iir_Predefined_Boolean_Xor => + return New_Dyadic_Op (ON_Xor, Left, Right); + when Iir_Predefined_Boolean_Xnor => + return New_Monadic_Op + (ON_Not, New_Dyadic_Op (ON_Xor, Left, Right)); + end case; + end Translate_Predefined_Logical; + + function Translate_Predefined_TF_Array_Element + (Op : Predefined_Boolean_Logical; + Left, Right : Iir; + Res_Type : Iir) + return O_Enode + is + Arr_Type : constant Iir := Get_Type (Left); + Res_Info : constant Type_Info_Acc := Get_Info (Res_Type); + Base_Ptr_Type : constant O_Tnode := + Res_Info.T.Base_Ptr_Type (Mode_Value); + Arr : Mnode; + El : O_Dnode; + Base : O_Dnode; + Len : O_Dnode; + Label : O_Snode; + Res : Mnode; + begin + -- Translate the array. + Arr := Stabilize (E2M (Translate_Expression (Left), + Get_Info (Arr_Type), Mode_Value)); + + -- Extract its length. + Len := Create_Temp_Init + (Ghdl_Index_Type, + M2E (Chap3.Range_To_Length + (Chap3.Get_Array_Range (Arr, Arr_Type, 1)))); + + -- Allocate the result array. + Base := Create_Temp_Init + (Base_Ptr_Type, + Gen_Alloc (Alloc_Stack, New_Obj_Value (Len), Base_Ptr_Type)); + + Open_Temp; + -- Translate the element. + El := Create_Temp_Init (Get_Ortho_Type (Get_Type (Right), Mode_Value), + Translate_Expression (Right)); + -- Create: + -- loop + -- exit when LEN = 0; + -- LEN := LEN - 1; + -- BASE[LEN] := EL op ARR[LEN]; + -- end loop; + Start_Loop_Stmt (Label); + Gen_Exit_When (Label, New_Compare_Op (ON_Eq, New_Obj_Value (Len), + New_Lit (Ghdl_Index_0), + Ghdl_Bool_Type)); + Dec_Var (Len); + New_Assign_Stmt + (New_Indexed_Acc_Value (New_Obj (Base), + New_Obj_Value (Len)), + Translate_Predefined_Logical + (Op, + New_Obj_Value (El), + M2E (Chap3.Index_Base (Chap3.Get_Array_Base (Arr), + Arr_Type, New_Obj_Value (Len))))); + Finish_Loop_Stmt (Label); + Close_Temp; + + Res := Create_Temp (Res_Info, Mode_Value); + New_Assign_Stmt (M2Lp (Chap3.Get_Array_Base (Res)), + New_Obj_Value (Base)); + New_Assign_Stmt (M2Lp (Chap3.Get_Array_Bounds (Res)), + M2Addr (Chap3.Get_Array_Bounds (Arr))); + + return M2E (Res); + end Translate_Predefined_TF_Array_Element; + + function Translate_Predefined_TF_Reduction + (Op : Predefined_Boolean_Logical; Operand : Iir; Res_Type : Iir) + return O_Enode + is + Arr_Type : constant Iir := Get_Type (Operand); + Enums : constant Iir_List := + Get_Enumeration_Literal_List (Get_Base_Type (Res_Type)); + Init_Enum : Iir; + + Res : O_Dnode; + Arr_Expr : O_Enode; + Arr : Mnode; + Len : O_Dnode; + Label : O_Snode; + begin + case Op is + when Iir_Predefined_Boolean_And + | Iir_Predefined_Boolean_Nand => + Init_Enum := Get_Nth_Element (Enums, 1); + when Iir_Predefined_Boolean_Or + | Iir_Predefined_Boolean_Nor + | Iir_Predefined_Boolean_Xor + | Iir_Predefined_Boolean_Xnor => + Init_Enum := Get_Nth_Element (Enums, 0); + end case; + + Res := Create_Temp_Init (Get_Ortho_Type (Res_Type, Mode_Value), + New_Lit (Get_Ortho_Expr (Init_Enum))); + + Open_Temp; + -- Translate the array. Note that Translate_Expression may create + -- the info for the array type, so be sure to call it before calling + -- Get_Info. + Arr_Expr := Translate_Expression (Operand); + Arr := Stabilize (E2M (Arr_Expr, Get_Info (Arr_Type), Mode_Value)); + + -- Extract its length. + Len := Create_Temp_Init + (Ghdl_Index_Type, + M2E (Chap3.Range_To_Length + (Chap3.Get_Array_Range (Arr, Arr_Type, 1)))); + + -- Create: + -- loop + -- exit when LEN = 0; + -- LEN := LEN - 1; + -- RES := RES op ARR[LEN]; + -- end loop; + Start_Loop_Stmt (Label); + Gen_Exit_When (Label, New_Compare_Op (ON_Eq, New_Obj_Value (Len), + New_Lit (Ghdl_Index_0), + Ghdl_Bool_Type)); + Dec_Var (Len); + New_Assign_Stmt + (New_Obj (Res), + Translate_Predefined_Logical + (Op, + New_Obj_Value (Res), + M2E (Chap3.Index_Base (Chap3.Get_Array_Base (Arr), + Arr_Type, New_Obj_Value (Len))))); + Finish_Loop_Stmt (Label); + Close_Temp; + + return New_Obj_Value (Res); + end Translate_Predefined_TF_Reduction; + function Translate_Predefined_Operator (Imp : Iir_Implicit_Function_Declaration; Left, Right : Iir; @@ -15119,18 +15283,79 @@ package body Translation is -- Right operand of shortcur operators may not be evaluated. return Translate_Shortcut_Operator (Imp, Left, Right); + -- Operands of min/max are evaluated in a declare block. when Iir_Predefined_Enum_Minimum | Iir_Predefined_Integer_Minimum | Iir_Predefined_Floating_Minimum | Iir_Predefined_Physical_Minimum => - -- Operands of min/max are evaluated in a declare block. return Translate_Scalar_Min_Max (ON_Le, Left, Right, Res_Type); when Iir_Predefined_Enum_Maximum | Iir_Predefined_Integer_Maximum | Iir_Predefined_Floating_Maximum | Iir_Predefined_Physical_Maximum => - -- Operands of min/max are evaluated in a declare block. return Translate_Scalar_Min_Max (ON_Ge, Left, Right, Res_Type); + + -- Avoid implicit conversion of the array parameters to the + -- unbounded type for optimizing purpose. FIXME: should do the + -- same for the result. + when Iir_Predefined_TF_Array_Element_And => + return Translate_Predefined_TF_Array_Element + (Iir_Predefined_Boolean_And, Left, Right, Res_Type); + when Iir_Predefined_TF_Element_Array_And => + return Translate_Predefined_TF_Array_Element + (Iir_Predefined_Boolean_And, Right, Left, Res_Type); + when Iir_Predefined_TF_Array_Element_Or => + return Translate_Predefined_TF_Array_Element + (Iir_Predefined_Boolean_Or, Left, Right, Res_Type); + when Iir_Predefined_TF_Element_Array_Or => + return Translate_Predefined_TF_Array_Element + (Iir_Predefined_Boolean_Or, Right, Left, Res_Type); + when Iir_Predefined_TF_Array_Element_Nand => + return Translate_Predefined_TF_Array_Element + (Iir_Predefined_Boolean_Nand, Left, Right, Res_Type); + when Iir_Predefined_TF_Element_Array_Nand => + return Translate_Predefined_TF_Array_Element + (Iir_Predefined_Boolean_Nand, Right, Left, Res_Type); + when Iir_Predefined_TF_Array_Element_Nor => + return Translate_Predefined_TF_Array_Element + (Iir_Predefined_Boolean_Nor, Left, Right, Res_Type); + when Iir_Predefined_TF_Element_Array_Nor => + return Translate_Predefined_TF_Array_Element + (Iir_Predefined_Boolean_Nor, Right, Left, Res_Type); + when Iir_Predefined_TF_Array_Element_Xor => + return Translate_Predefined_TF_Array_Element + (Iir_Predefined_Boolean_Xor, Left, Right, Res_Type); + when Iir_Predefined_TF_Element_Array_Xor => + return Translate_Predefined_TF_Array_Element + (Iir_Predefined_Boolean_Xor, Right, Left, Res_Type); + when Iir_Predefined_TF_Array_Element_Xnor => + return Translate_Predefined_TF_Array_Element + (Iir_Predefined_Boolean_Xnor, Left, Right, Res_Type); + when Iir_Predefined_TF_Element_Array_Xnor => + return Translate_Predefined_TF_Array_Element + (Iir_Predefined_Boolean_Xnor, Right, Left, Res_Type); + + -- Avoid implicit conversion of the array parameters to the + -- unbounded type for optimizing purpose. + when Iir_Predefined_TF_Reduction_And => + return Translate_Predefined_TF_Reduction + (Iir_Predefined_Boolean_And, Left, Res_Type); + when Iir_Predefined_TF_Reduction_Or => + return Translate_Predefined_TF_Reduction + (Iir_Predefined_Boolean_Or, Left, Res_Type); + when Iir_Predefined_TF_Reduction_Nand => + return Translate_Predefined_TF_Reduction + (Iir_Predefined_Boolean_Nand, Left, Res_Type); + when Iir_Predefined_TF_Reduction_Nor => + return Translate_Predefined_TF_Reduction + (Iir_Predefined_Boolean_Nor, Left, Res_Type); + when Iir_Predefined_TF_Reduction_Xor => + return Translate_Predefined_TF_Reduction + (Iir_Predefined_Boolean_Xor, Left, Res_Type); + when Iir_Predefined_TF_Reduction_Xnor => + return Translate_Predefined_TF_Reduction + (Iir_Predefined_Boolean_Xnor, Left, Res_Type); + when others => null; end case; @@ -15189,8 +15414,8 @@ package body Translation is case Kind is when Iir_Predefined_Bit_Xnor | Iir_Predefined_Boolean_Xnor => - return New_Monadic_Op - (ON_Not, New_Dyadic_Op (ON_Xor, Left_Tree, Right_Tree)); + return Translate_Predefined_Logical + (Iir_Predefined_Boolean_Xnor, Left_Tree, Right_Tree); when Iir_Predefined_Bit_Condition => return New_Compare_Op (ON_Eq, Left_Tree, New_Lit (Get_Ortho_Expr (Bit_1)), @@ -15442,6 +15667,12 @@ package body Translation is (Ghdl_To_String_F64_Digits, New_Convert_Ov (Left_Tree, Ghdl_Real_Type), New_Convert_Ov (Right_Tree, Ghdl_I32_Type)); + when Iir_Predefined_Bit_Vector_To_Ostring => + return Translate_Bv_To_String + (Ghdl_BV_To_Ostring, Left_Tree, Left_Type); + when Iir_Predefined_Bit_Vector_To_Hstring => + return Translate_Bv_To_String + (Ghdl_BV_To_Hstring, Left_Tree, Left_Type); when others => Ada.Text_IO.Put_Line @@ -28882,21 +29113,20 @@ package body Translation is Finish_Subprogram_Decl (Interfaces, Subprg); end Create_Std_Ulogic_Match_Subprogram; - -- procedure __ghdl_to_string_NAME (res : std_string_ptr_node; - -- val : VAL_TYPE; - -- ARG2_NAME : ARG2_TYPE); + -- procedure NAME (res : std_string_ptr_node; + -- val : VAL_TYPE; + -- ARG2_NAME : ARG2_TYPE); procedure Create_To_String_Subprogram (Name : String; Subprg : out O_Dnode; Val_Type : O_Tnode; - Arg2_Type : O_Tnode; - Arg2_Name : String) + Arg2_Type : O_Tnode := O_Tnode_Null; + Arg2_Name : String := "") is Interfaces : O_Inter_List; Param : O_Dnode; begin Start_Procedure_Decl - (Interfaces, Get_Identifier ("__ghdl_to_string_" & Name), - O_Storage_External); + (Interfaces, Get_Identifier (Name), O_Storage_External); New_Interface_Decl (Interfaces, Param, Get_Identifier ("res"), Std_String_Ptr_Node); New_Interface_Decl @@ -29704,14 +29934,23 @@ package body Translation is -- Create To_String subprograms. Create_To_String_Subprogram - ("i32", Ghdl_To_String_I32, Ghdl_I32_Type, - O_Tnode_Null, ""); + ("__ghdl_to_string_i32", Ghdl_To_String_I32, Ghdl_I32_Type); Create_To_String_Subprogram - ("f64", Ghdl_To_String_F64, Ghdl_Real_Type, - O_Tnode_Null, ""); + ("__ghdl_to_string_f64", Ghdl_To_String_F64, Ghdl_Real_Type); Create_To_String_Subprogram - ("f64_digits", Ghdl_To_String_F64_Digits, Ghdl_Real_Type, - Ghdl_I32_Type, "nbr_digits"); + ("__ghdl_to_string_f64_digits", Ghdl_To_String_F64_Digits, + Ghdl_Real_Type, Ghdl_I32_Type, "nbr_digits"); + declare + Bv_Base_Ptr : constant O_Tnode := + Get_Info (Bit_Vector_Type_Definition).T.Base_Ptr_Type (Mode_Value); + begin + Create_To_String_Subprogram + ("__ghdl_bv_to_ostring", Ghdl_BV_To_Ostring, + Bv_Base_Ptr, Ghdl_Index_Type, "len"); + Create_To_String_Subprogram + ("__ghdl_bv_to_hstring", Ghdl_BV_To_Hstring, + Bv_Base_Ptr, Ghdl_Index_Type, "len"); + end; end Post_Initialize; procedure Translate_Type_Implicit_Subprograms (Decl : in out Iir) |