-- Iir to ortho translator. -- Copyright (C) 2002 - 2014 Tristan Gingold -- -- GHDL is free software; you can redistribute it and/or modify it under -- the terms of the GNU General Public License as published by the Free -- Software Foundation; either version 2, or (at your option) any later -- version. -- -- GHDL is distributed in the hope that it will be useful, but WITHOUT ANY -- WARRANTY; without even the implied warranty of MERCHANTABILITY or -- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -- for more details. -- -- You should have received a copy of the GNU General Public License -- 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. package Trans.Chap7 is -- Generic function to extract a value from a signal. generic with function Read_Value (Sig : O_Enode; Sig_Type : Iir) return O_Enode; function Translate_Signal_Value (Sig : O_Enode; Sig_Type : Iir) return O_Enode; -- Extract the effective value of SIG. function Translate_Signal_Effective_Value (Sig : O_Enode; Sig_Type : Iir) return O_Enode; function Translate_Signal_Driving_Value (Sig : O_Enode; Sig_Type : Iir) return O_Enode; -- Directly set the effective value of SIG with VAL. -- Used only by conversion. procedure Set_Effective_Value (Sig : Mnode; Sig_Type : Iir; Val : Mnode); procedure Set_Driving_Value (Sig : Mnode; Sig_Type : Iir; Val : Mnode); -- Translate expression EXPR into ortho tree. function Translate_Expression (Expr : Iir; Rtype : Iir := Null_Iir) return O_Enode; -- Translate call to function IMP. -- ASSOC_CHAIN is the chain of a associations for this call. -- OBJ, if not NULL_IIR is the protected object. function Translate_Function_Call (Imp : Iir; Assoc_Chain : Iir; Obj : Iir) return O_Enode; -- Translate range and return an lvalue containing the range. -- The node returned can be used only one time. function Translate_Range (Arange : Iir; Range_Type : Iir) return O_Lnode; -- Translate range expression ARANGE and store the result into RES, of -- type RANGE_TYPE. procedure Translate_Range (Res : Mnode; Arange : Iir; Range_Type : Iir); function Translate_Static_Range (Arange : Iir; Range_Type : Iir) return O_Cnode; -- Same as Translate_Range, but for a discrete range (ie: ARANGE -- can be a discrete subtype indication). procedure Translate_Discrete_Range (Res : Mnode; Arange : Iir); -- Return TRUE iff constant declaration DECL can be staticly defined. -- This is of course true if its expression is a locally static literal, -- but can be true in a few cases for aggregates. -- This function belongs to Translation, since it is defined along -- with the translate_static_aggregate procedure. function Is_Static_Constant (Decl : Iir_Constant_Declaration) return Boolean; -- Translate the static expression EXPR into an ortho expression whose -- type must be RES_TYPE. Therefore, an implicite conversion might -- occurs. function Translate_Static_Expression (Expr : Iir; Res_Type : Iir) return O_Cnode; function Translate_Numeric_Literal (Expr : Iir; Res_Type : O_Tnode) return O_Cnode; -- Convert (if necessary) EXPR of type EXPR_TYPE to type ATYPE. function Translate_Implicit_Conv (Expr : O_Enode; Expr_Type : Iir; Atype : Iir; Is_Sig : Object_Kind_Type; Loc : Iir) return O_Enode; function Translate_Type_Conversion (Expr : O_Enode; Expr_Type : Iir; Res_Type : Iir; Loc : Iir) return O_Enode; -- Convert range EXPR into ortho tree. -- If RANGE_TYPE /= NULL_IIR, convert bounds to RANGE_TYPE. --function Translate_Range (Expr : Iir; Range_Type : Iir) return O_Enode; function Translate_Static_Range_Left (Expr : Iir; Range_Type : Iir := Null_Iir) return O_Cnode; function Translate_Static_Range_Right (Expr : Iir; Range_Type : Iir := Null_Iir) return O_Cnode; function Translate_Static_Range_Dir (Expr : Iir) return O_Cnode; function Translate_Static_Range_Length (Expr : Iir) return O_Cnode; -- These functions evaluates left bound/right bound/length of the -- range expression EXPR. function Translate_Range_Expression_Left (Expr : Iir; Range_Type : Iir := Null_Iir) return O_Enode; function Translate_Range_Expression_Right (Expr : Iir; Range_Type : Iir := Null_Iir) return O_Enode; function Translate_Range_Expression_Length (Expr : Iir) return O_Enode; -- Get the length of any range expression (ie maybe an attribute). function Translate_Range_Length (Expr : Iir) return O_Enode; -- Assign AGGR to TARGET of type TARGET_TYPE. procedure Translate_Aggregate (Target : Mnode; Target_Type : Iir; Aggr : Iir); -- Translate implicit functions defined by a type. type Implicit_Subprogram_Infos is private; procedure Init_Implicit_Subprogram_Infos (Infos : out Implicit_Subprogram_Infos); procedure Translate_Implicit_Subprogram (Subprg : Iir; Infos : in out Implicit_Subprogram_Infos); -- Assign EXPR to TARGET. LOC is the location used to report errors. -- FIXME: do the checks. procedure Translate_Assign (Target : Mnode; Expr : Iir; Target_Type : Iir); procedure Translate_Assign (Target : Mnode; Val : O_Enode; Expr : Iir; Target_Type : Iir; Loc : Iir); -- Find the declaration of the predefined function IMP in type -- definition BASE_TYPE. function Find_Predefined_Function (Base_Type : Iir; Imp : Iir_Predefined_Functions) return Iir; function Translate_Lib_Operator (Left, Right : O_Enode; Func : O_Dnode) return O_Enode; private type Implicit_Subprogram_Infos is record Arr_Eq_Info : Subprg_Info_Acc; Rec_Eq_Info : Subprg_Info_Acc; Arr_Cmp_Info : Subprg_Info_Acc; Arr_Shl_Info : Subprg_Info_Acc; Arr_Sha_Info : Subprg_Info_Acc; Arr_Rot_Info : Subprg_Info_Acc; end record; end Trans.Chap7;