aboutsummaryrefslogtreecommitdiffstats
path: root/sem_decls.adb
diff options
context:
space:
mode:
authorTristan Gingold <tgingold@free.fr>2014-11-04 20:14:19 +0100
committerTristan Gingold <tgingold@free.fr>2014-11-04 20:14:19 +0100
commit9c195bf5d86d67ea5eb419ccf6e48dc153e57c68 (patch)
tree575346e529b99e26382b4a06f6ff2caa0b391ab2 /sem_decls.adb
parent184a123f91e07c927292d67462561dc84f3a920d (diff)
downloadghdl-9c195bf5d86d67ea5eb419ccf6e48dc153e57c68.tar.gz
ghdl-9c195bf5d86d67ea5eb419ccf6e48dc153e57c68.tar.bz2
ghdl-9c195bf5d86d67ea5eb419ccf6e48dc153e57c68.zip
Move sources to src/ subdirectory.
Diffstat (limited to 'sem_decls.adb')
-rw-r--r--sem_decls.adb3018
1 files changed, 0 insertions, 3018 deletions
diff --git a/sem_decls.adb b/sem_decls.adb
deleted file mode 100644
index a7c0b4b44..000000000
--- a/sem_decls.adb
+++ /dev/null
@@ -1,3018 +0,0 @@
--- Semantic analysis.
--- Copyright (C) 2002, 2003, 2004, 2005 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 GHDL; see the file COPYING. If not, write to the Free
--- Software Foundation, 59 Temple Place - Suite 330, Boston, MA
--- 02111-1307, USA.
-with Errorout; use Errorout;
-with Types; use Types;
-with Std_Names;
-with Tokens;
-with Flags; use Flags;
-with Std_Package; use Std_Package;
-with Ieee.Std_Logic_1164;
-with Iir_Chains;
-with Evaluation; use Evaluation;
-with Name_Table;
-with Iirs_Utils; use Iirs_Utils;
-with Sem; use Sem;
-with Sem_Expr; use Sem_Expr;
-with Sem_Scopes; use Sem_Scopes;
-with Sem_Names; use Sem_Names;
-with Sem_Specs; use Sem_Specs;
-with Sem_Types; use Sem_Types;
-with Sem_Inst;
-with Xrefs; use Xrefs;
-use Iir_Chains;
-
-package body Sem_Decls is
- -- Emit an error if the type of DECL is a file type, access type,
- -- protected type or if a subelement of DECL is an access type.
- procedure Check_Signal_Type (Decl : Iir)
- is
- Decl_Type : Iir;
- begin
- Decl_Type := Get_Type (Decl);
- if Get_Signal_Type_Flag (Decl_Type) = False then
- Error_Msg_Sem ("type of " & Disp_Node (Decl)
- & " cannot be " & Disp_Node (Decl_Type), Decl);
- case Get_Kind (Decl_Type) is
- when Iir_Kind_File_Type_Definition =>
- null;
- when Iir_Kind_Protected_Type_Declaration =>
- null;
- when Iir_Kind_Access_Type_Definition
- | Iir_Kind_Access_Subtype_Definition =>
- null;
- when Iir_Kinds_Array_Type_Definition
- | Iir_Kind_Record_Type_Definition
- | Iir_Kind_Record_Subtype_Definition =>
- Error_Msg_Sem ("(" & Disp_Node (Decl_Type)
- & " has an access subelement)", Decl);
- when others =>
- Error_Kind ("check_signal_type", Decl_Type);
- end case;
- end if;
- end Check_Signal_Type;
-
- procedure Sem_Interface_Object_Declaration
- (Inter, Last : Iir; Interface_Kind : Interface_Kind_Type)
- is
- A_Type: Iir;
- Default_Value: Iir;
- begin
- -- Avoid the reanalysed duplicated types.
- -- This is not an optimization, since the unanalysed type must have
- -- been freed.
- A_Type := Get_Subtype_Indication (Inter);
- if A_Type = Null_Iir then
- pragma Assert (Last /= Null_Iir);
- Set_Subtype_Indication (Inter, Get_Subtype_Indication (Last));
- A_Type := Get_Type (Last);
- Default_Value := Get_Default_Value (Last);
- else
- A_Type := Sem_Subtype_Indication (A_Type);
- Set_Subtype_Indication (Inter, A_Type);
- A_Type := Get_Type_Of_Subtype_Indication (A_Type);
-
- Default_Value := Get_Default_Value (Inter);
- if Default_Value /= Null_Iir and then A_Type /= Null_Iir then
- Deferred_Constant_Allowed := True;
- Default_Value := Sem_Expression (Default_Value, A_Type);
- Default_Value :=
- Eval_Expr_Check_If_Static (Default_Value, A_Type);
- Deferred_Constant_Allowed := False;
- Check_Read (Default_Value);
- end if;
- end if;
-
- Set_Name_Staticness (Inter, Locally);
- Xref_Decl (Inter);
-
- if A_Type /= Null_Iir then
- Set_Type (Inter, A_Type);
-
- if Get_Kind (Inter) = Iir_Kind_Interface_Signal_Declaration then
- case Get_Signal_Kind (Inter) is
- when Iir_No_Signal_Kind =>
- null;
- when Iir_Bus_Kind =>
- -- FIXME: where this test came from ?
- -- FIXME: from 4.3.1.2 ?
- if False
- and
- (Get_Kind (A_Type) not in Iir_Kinds_Subtype_Definition
- or else Get_Resolution_Indication (A_Type) = Null_Iir)
- then
- Error_Msg_Sem
- (Disp_Node (A_Type) & " of guarded " & Disp_Node (Inter)
- & " is not resolved", Inter);
- end if;
-
- -- LRM 2.1.1.2 Signal parameter
- -- It is an error if the declaration of a formal signal
- -- parameter includes the reserved word BUS.
- if Flags.Vhdl_Std >= Vhdl_93
- and then Interface_Kind in Parameter_Interface_List
- then
- Error_Msg_Sem
- ("signal parameter can't be of kind bus", Inter);
- end if;
- when Iir_Register_Kind =>
- Error_Msg_Sem
- ("interface signal can't be of kind register", Inter);
- end case;
- Set_Type_Has_Signal (A_Type);
- end if;
-
- case Get_Kind (Inter) is
- when Iir_Kind_Interface_Constant_Declaration
- | Iir_Kind_Interface_Signal_Declaration =>
- -- LRM 4.3.2 Interface declarations
- -- For an interface constant declaration or an interface
- -- signal declaration, the subtype indication must define
- -- a subtype that is neither a file type, an access type,
- -- nor a protected type. Moreover, the subtype indication
- -- must not denote a composite type with a subelement that
- -- is a file type, an access type, or a protected type.
- Check_Signal_Type (Inter);
- when Iir_Kind_Interface_Variable_Declaration =>
- case Get_Kind (Get_Base_Type (A_Type)) is
- when Iir_Kind_File_Type_Definition =>
- if Flags.Vhdl_Std >= Vhdl_93 then
- Error_Msg_Sem ("variable formal type can't be a "
- & "file type (vhdl 93)", Inter);
- end if;
- when Iir_Kind_Protected_Type_Declaration =>
- -- LRM 2.1.1.1 Constant and variable parameters
- -- It is an error if the mode of the parameter is
- -- other that INOUT.
- if Get_Mode (Inter) /= Iir_Inout_Mode then
- Error_Msg_Sem
- ("parameter of protected type must be inout", Inter);
- end if;
- when others =>
- null;
- end case;
- when Iir_Kind_Interface_File_Declaration =>
- if Get_Kind (Get_Base_Type (A_Type))
- /= Iir_Kind_File_Type_Definition
- then
- Error_Msg_Sem
- ("file formal type must be a file type", Inter);
- end if;
- when others =>
- -- Inter is not an interface.
- raise Internal_Error;
- end case;
-
- if Default_Value /= Null_Iir then
- Set_Default_Value (Inter, Default_Value);
-
- -- LRM 4.3.2 Interface declarations.
- -- It is an error if a default expression appears in an
- -- interface declaration and any of the following conditions
- -- hold:
- -- - The mode is linkage
- -- - The interface object is a formal signal parameter
- -- - The interface object is a formal variable parameter of
- -- mode other than in
- -- - The subtype indication of the interface declaration
- -- denotes a protected type.
- case Get_Kind (Inter) is
- when Iir_Kind_Interface_Constant_Declaration =>
- null;
- when Iir_Kind_Interface_Signal_Declaration =>
- if Get_Mode (Inter) = Iir_Linkage_Mode then
- Error_Msg_Sem
- ("default expression not allowed for linkage port",
- Inter);
- elsif Interface_Kind in Parameter_Interface_List then
- Error_Msg_Sem ("default expression not allowed"
- & " for signal parameter", Inter);
- end if;
- when Iir_Kind_Interface_Variable_Declaration =>
- if Get_Mode (Inter) /= Iir_In_Mode then
- Error_Msg_Sem
- ("default expression not allowed for"
- & " out or inout variable parameter", Inter);
- elsif Get_Kind (A_Type) = Iir_Kind_Protected_Type_Declaration
- then
- Error_Msg_Sem
- ("default expression not allowed for"
- & " variable parameter of protected type", Inter);
- end if;
- when Iir_Kind_Interface_File_Declaration =>
- raise Internal_Error;
- when others =>
- null;
- end case;
- end if;
- else
- Set_Type (Inter, Error_Type);
- end if;
-
- Sem_Scopes.Add_Name (Inter);
-
- -- By default, interface are not static.
- -- This may be changed just below.
- Set_Expr_Staticness (Inter, None);
-
- case Interface_Kind is
- when Generic_Interface_List =>
- -- LRM93 1.1.1
- -- The generic list in the formal generic clause defines
- -- generic constants whose values may be determined by the
- -- environment.
- if Get_Kind (Inter) /= Iir_Kind_Interface_Constant_Declaration then
- Error_Msg_Sem
- ("generic " & Disp_Node (Inter) & " must be a constant",
- Inter);
- else
- -- LRM93 7.4.2 (Globally static primaries)
- -- 3. a generic constant.
- Set_Expr_Staticness (Inter, Globally);
- end if;
- when Port_Interface_List =>
- if Get_Kind (Inter) /= Iir_Kind_Interface_Signal_Declaration then
- Error_Msg_Sem
- ("port " & Disp_Node (Inter) & " must be a signal", Inter);
- end if;
- when Parameter_Interface_List =>
- if Get_Kind (Inter) = Iir_Kind_Interface_Variable_Declaration
- and then Interface_Kind = Function_Parameter_Interface_List
- then
- Error_Msg_Sem ("variable interface parameter are not "
- & "allowed for a function (use a constant)",
- Inter);
- end if;
-
- -- By default, we suppose a subprogram read the activity of
- -- a signal.
- -- This will be adjusted when the body is analyzed.
- if Get_Kind (Inter) = Iir_Kind_Interface_Signal_Declaration
- and then Get_Mode (Inter) in Iir_In_Modes
- then
- Set_Has_Active_Flag (Inter, True);
- end if;
-
- case Get_Mode (Inter) is
- when Iir_Unknown_Mode =>
- raise Internal_Error;
- when Iir_In_Mode =>
- null;
- when Iir_Inout_Mode
- | Iir_Out_Mode =>
- if Interface_Kind = Function_Parameter_Interface_List
- and then
- Get_Kind (Inter) /= Iir_Kind_Interface_File_Declaration
- then
- Error_Msg_Sem ("mode of a function parameter cannot "
- & "be inout or out", Inter);
- end if;
- when Iir_Buffer_Mode
- | Iir_Linkage_Mode =>
- Error_Msg_Sem ("buffer or linkage mode is not allowed "
- & "for a subprogram parameter", Inter);
- end case;
- end case;
- end Sem_Interface_Object_Declaration;
-
- procedure Sem_Interface_Package_Declaration (Inter : Iir)
- is
- Pkg : Iir;
- begin
- -- LRM08 6.5.5 Interface package declarations
- -- the uninstantiated_package_name shall denote an uninstantiated
- -- package declared in a package declaration.
- Pkg := Sem_Uninstantiated_Package_Name (Inter);
- if Pkg = Null_Iir then
- return;
- end if;
-
- Sem_Inst.Instantiate_Package_Declaration (Inter, Pkg);
-
- if Get_Generic_Map_Aspect_Chain (Inter) /= Null_Iir then
- -- TODO
- raise Internal_Error;
- end if;
-
- Sem_Scopes.Add_Name (Inter);
- end Sem_Interface_Package_Declaration;
-
- procedure Sem_Interface_Chain (Interface_Chain: Iir;
- Interface_Kind : Interface_Kind_Type)
- is
- Inter : Iir;
-
- -- LAST is the last interface declaration that has a type. This is
- -- used to set type and default value for the following declarations
- -- that appeared in a list of identifiers.
- Last : Iir;
- begin
- Last := Null_Iir;
-
- Inter := Interface_Chain;
- while Inter /= Null_Iir loop
- case Get_Kind (Inter) is
- when Iir_Kinds_Interface_Object_Declaration =>
- Sem_Interface_Object_Declaration (Inter, Last, Interface_Kind);
- Last := Inter;
- when Iir_Kind_Interface_Package_Declaration =>
- Sem_Interface_Package_Declaration (Inter);
- when others =>
- raise Internal_Error;
- end case;
- Inter := Get_Chain (Inter);
- end loop;
-
- -- LRM 10.3 Visibility
- -- A declaration is visible only within a certain part of its scope;
- -- this starts at the end of the declaration [...]
-
- -- LRM 4.3.2.1 Interface List
- -- A name that denotes an interface object must not appear in any
- -- interface declaration within the interface list containing the
- -- denotes interface except to declare this object.
-
- -- GHDL: this is achieved by making the interface object visible after
- -- having analyzed the interface list.
- Inter := Interface_Chain;
- while Inter /= Null_Iir loop
- Name_Visible (Inter);
- Inter := Get_Chain (Inter);
- end loop;
- end Sem_Interface_Chain;
-
- -- LRM93 7.2.2
- -- A discrete array is a one-dimensional array whose elements are of a
- -- discrete type.
- function Is_Discrete_Array (Def : Iir) return Boolean
- is
- begin
- case Get_Kind (Def) is
- when Iir_Kind_Array_Type_Definition
- | Iir_Kind_Array_Subtype_Definition =>
- null;
- when others =>
- raise Internal_Error;
- -- return False;
- end case;
- if not Is_One_Dimensional_Array_Type (Def) then
- return False;
- end if;
- if Get_Kind (Get_Element_Subtype (Def))
- not in Iir_Kinds_Discrete_Type_Definition
- then
- return False;
- end if;
- return True;
- end Is_Discrete_Array;
-
- procedure Create_Implicit_File_Primitives
- (Decl : Iir_Type_Declaration; Type_Definition : Iir_File_Type_Definition)
- is
- use Iir_Chains.Interface_Declaration_Chain_Handling;
- Type_Mark : constant Iir := Get_File_Type_Mark (Type_Definition);
- Type_Mark_Type : constant Iir := Get_Type (Type_Mark);
- Proc: Iir_Implicit_Procedure_Declaration;
- Func: Iir_Implicit_Function_Declaration;
- Inter: Iir;
- Loc : Location_Type;
- File_Interface_Kind : Iir_Kind;
- Last_Interface : Iir;
- Last : Iir;
- begin
- Last := Decl;
- Loc := Get_Location (Decl);
-
- if Flags.Vhdl_Std >= Vhdl_93c then
- for I in 1 .. 2 loop
- -- Create the implicit file_open (form 1) declaration.
- -- Create the implicit file_open (form 2) declaration.
- Proc := Create_Iir (Iir_Kind_Implicit_Procedure_Declaration);
- Set_Location (Proc, Loc);
- Set_Parent (Proc, Get_Parent (Decl));
- Set_Identifier (Proc, Std_Names.Name_File_Open);
- Set_Type_Reference (Proc, Decl);
- Set_Visible_Flag (Proc, True);
- Build_Init (Last_Interface);
- case I is
- when 1 =>
- Set_Implicit_Definition (Proc, Iir_Predefined_File_Open);
- when 2 =>
- Set_Implicit_Definition (Proc,
- Iir_Predefined_File_Open_Status);
- -- status : out file_open_status.
- Inter :=
- Create_Iir (Iir_Kind_Interface_Variable_Declaration);
- Set_Location (Inter, Loc);
- Set_Identifier (Inter, Std_Names.Name_Status);
- Set_Type (Inter,
- Std_Package.File_Open_Status_Type_Definition);
- Set_Mode (Inter, Iir_Out_Mode);
- Set_Lexical_Layout (Inter, Iir_Lexical_Has_Type);
- Append (Last_Interface, Proc, Inter);
- end case;
- -- File F : FT
- Inter := Create_Iir (Iir_Kind_Interface_File_Declaration);
- Set_Location (Inter, Loc);
- Set_Identifier (Inter, Std_Names.Name_F);
- Set_Type (Inter, Type_Definition);
- Set_Mode (Inter, Iir_Inout_Mode);
- Set_Lexical_Layout (Inter, Iir_Lexical_Has_Type);
- Append (Last_Interface, Proc, Inter);
- -- External_Name : in STRING
- Inter := Create_Iir (Iir_Kind_Interface_Constant_Declaration);
- Set_Location (Inter, Loc);
- Set_Identifier (Inter, Std_Names.Name_External_Name);
- Set_Type (Inter, Std_Package.String_Type_Definition);
- Set_Mode (Inter, Iir_In_Mode);
- Set_Lexical_Layout (Inter, Iir_Lexical_Has_Type);
- Append (Last_Interface, Proc, Inter);
- -- Open_Kind : in File_Open_Kind := Read_Mode.
- Inter := Create_Iir (Iir_Kind_Interface_Constant_Declaration);
- Set_Location (Inter, Loc);
- Set_Identifier (Inter, Std_Names.Name_Open_Kind);
- Set_Type (Inter, Std_Package.File_Open_Kind_Type_Definition);
- Set_Mode (Inter, Iir_In_Mode);
- Set_Default_Value (Inter,
- Std_Package.File_Open_Kind_Read_Mode);
- Set_Lexical_Layout (Inter, Iir_Lexical_Has_Type);
- Append (Last_Interface, Proc, Inter);
- Compute_Subprogram_Hash (Proc);
- -- Add it to the list.
- Insert_Incr (Last, Proc);
- end loop;
-
- -- Create the implicit file_close declaration.
- Proc := Create_Iir (Iir_Kind_Implicit_Procedure_Declaration);
- Set_Identifier (Proc, Std_Names.Name_File_Close);
- Set_Location (Proc, Loc);
- Set_Parent (Proc, Get_Parent (Decl));
- Set_Implicit_Definition (Proc, Iir_Predefined_File_Close);
- Set_Type_Reference (Proc, Decl);
- Set_Visible_Flag (Proc, True);
- Build_Init (Last_Interface);
- Inter := Create_Iir (Iir_Kind_Interface_File_Declaration);
- Set_Identifier (Inter, Std_Names.Name_F);
- Set_Location (Inter, Loc);
- Set_Type (Inter, Type_Definition);
- Set_Mode (Inter, Iir_Inout_Mode);
- Set_Lexical_Layout (Inter, Iir_Lexical_Has_Type);
- Append (Last_Interface, Proc, Inter);
- Compute_Subprogram_Hash (Proc);
- -- Add it to the list.
- Insert_Incr (Last, Proc);
- end if;
-
- if Flags.Vhdl_Std = Vhdl_87 then
- File_Interface_Kind := Iir_Kind_Interface_Variable_Declaration;
- else
- File_Interface_Kind := Iir_Kind_Interface_File_Declaration;
- end if;
-
- -- Create the implicit procedure read declaration.
- Proc := Create_Iir (Iir_Kind_Implicit_Procedure_Declaration);
- Set_Identifier (Proc, Std_Names.Name_Read);
- Set_Location (Proc, Loc);
- Set_Parent (Proc, Get_Parent (Decl));
- Set_Type_Reference (Proc, Decl);
- Set_Visible_Flag (Proc, True);
- Build_Init (Last_Interface);
- Inter := Create_Iir (File_Interface_Kind);
- Set_Identifier (Inter, Std_Names.Name_F);
- Set_Location (Inter, Loc);
- Set_Type (Inter, Type_Definition);
- Set_Mode (Inter, Iir_In_Mode);
- Set_Lexical_Layout (Inter, Iir_Lexical_Has_Type);
- Append (Last_Interface, Proc, Inter);
- Inter := Create_Iir (Iir_Kind_Interface_Variable_Declaration);
- Set_Identifier (Inter, Std_Names.Name_Value);
- Set_Location (Inter, Loc);
- Set_Subtype_Indication (Inter, Type_Mark);
- Set_Type (Inter, Type_Mark_Type);
- Set_Mode (Inter, Iir_Out_Mode);
- Set_Lexical_Layout (Inter, Iir_Lexical_Has_Type);
- Append (Last_Interface, Proc, Inter);
- if Get_Kind (Type_Mark_Type) in Iir_Kinds_Array_Type_Definition
- and then Get_Constraint_State (Type_Mark_Type) /= Fully_Constrained
- then
- Inter := Create_Iir (Iir_Kind_Interface_Variable_Declaration);
- Set_Identifier (Inter, Std_Names.Name_Length);
- Set_Location (Inter, Loc);
- Set_Type (Inter, Std_Package.Natural_Subtype_Definition);
- Set_Mode (Inter, Iir_Out_Mode);
- Set_Lexical_Layout (Inter, Iir_Lexical_Has_Type);
- Append (Last_Interface, Proc, Inter);
- Set_Implicit_Definition (Proc, Iir_Predefined_Read_Length);
- else
- Set_Implicit_Definition (Proc, Iir_Predefined_Read);
- end if;
- Compute_Subprogram_Hash (Proc);
- -- Add it to the list.
- Insert_Incr (Last, Proc);
-
- -- Create the implicit procedure write declaration.
- Proc := Create_Iir (Iir_Kind_Implicit_Procedure_Declaration);
- Set_Identifier (Proc, Std_Names.Name_Write);
- Set_Location (Proc, Loc);
- Set_Parent (Proc, Get_Parent (Decl));
- Set_Type_Reference (Proc, Decl);
- Set_Visible_Flag (Proc, True);
- Build_Init (Last_Interface);
- Inter := Create_Iir (File_Interface_Kind);
- Set_Identifier (Inter, Std_Names.Name_F);
- Set_Location (Inter, Loc);
- Set_Type (Inter, Type_Definition);
- Set_Mode (Inter, Iir_Out_Mode);
- Set_Name_Staticness (Inter, Locally);
- Set_Expr_Staticness (Inter, None);
- Set_Lexical_Layout (Inter, Iir_Lexical_Has_Type);
- Append (Last_Interface, Proc, Inter);
- Inter := Create_Iir (Iir_Kind_Interface_Constant_Declaration);
- Set_Identifier (Inter, Std_Names.Name_Value);
- Set_Location (Inter, Loc);
- Set_Subtype_Indication (Inter, Type_Mark);
- Set_Type (Inter, Type_Mark_Type);
- Set_Mode (Inter, Iir_In_Mode);
- Set_Lexical_Layout (Inter, Iir_Lexical_Has_Type);
- Append (Last_Interface, Proc, Inter);
- Set_Implicit_Definition (Proc, Iir_Predefined_Write);
- Compute_Subprogram_Hash (Proc);
- -- Add it to the list.
- Insert_Incr (Last, Proc);
-
- -- Create the implicit procedure flush declaration
- if Flags.Vhdl_Std >= Vhdl_08 then
- Proc := Create_Iir (Iir_Kind_Implicit_Procedure_Declaration);
- Set_Identifier (Proc, Std_Names.Name_Flush);
- Set_Location (Proc, Loc);
- Set_Parent (Proc, Get_Parent (Decl));
- Set_Type_Reference (Proc, Decl);
- Set_Visible_Flag (Proc, True);
- Build_Init (Last_Interface);
- Inter := Create_Iir (File_Interface_Kind);
- Set_Identifier (Inter, Std_Names.Name_F);
- Set_Location (Inter, Loc);
- Set_Type (Inter, Type_Definition);
- Set_Name_Staticness (Inter, Locally);
- Set_Expr_Staticness (Inter, None);
- Set_Lexical_Layout (Inter, Iir_Lexical_Has_Type);
- Append (Last_Interface, Proc, Inter);
- Set_Implicit_Definition (Proc, Iir_Predefined_Flush);
- Compute_Subprogram_Hash (Proc);
- -- Add it to the list.
- Insert_Incr (Last, Proc);
- end if;
- -- Create the implicit function endfile declaration.
- Func := Create_Iir (Iir_Kind_Implicit_Function_Declaration);
- Set_Identifier (Func, Std_Names.Name_Endfile);
- Set_Location (Func, Loc);
- Set_Parent (Func, Get_Parent (Decl));
- Set_Type_Reference (Func, Decl);
- Set_Visible_Flag (Func, True);
- Build_Init (Last_Interface);
- Inter := Create_Iir (File_Interface_Kind);
- Set_Identifier (Inter, Std_Names.Name_F);
- Set_Location (Inter, Loc);
- Set_Type (Inter, Type_Definition);
- Set_Mode (Inter, Iir_In_Mode);
- Set_Lexical_Layout (Inter, Iir_Lexical_Has_Type);
- Append (Last_Interface, Func, Inter);
- Set_Return_Type (Func, Std_Package.Boolean_Type_Definition);
- Set_Implicit_Definition (Func, Iir_Predefined_Endfile);
- Compute_Subprogram_Hash (Func);
- -- Add it to the list.
- Insert_Incr (Last, Func);
- end Create_Implicit_File_Primitives;
-
- function Create_Anonymous_Interface (Atype : Iir)
- return Iir_Interface_Constant_Declaration
- is
- Inter : Iir_Interface_Constant_Declaration;
- begin
- Inter := Create_Iir (Iir_Kind_Interface_Constant_Declaration);
- Location_Copy (Inter, Atype);
- Set_Identifier (Inter, Null_Identifier);
- Set_Lexical_Layout (Inter, Iir_Lexical_Has_Type);
- Set_Mode (Inter, Iir_In_Mode);
- Set_Type (Inter, Atype);
- return Inter;
- end Create_Anonymous_Interface;
-
- procedure Create_Implicit_Operations
- (Decl : Iir; Is_Std_Standard : Boolean := False)
- is
- use Std_Names;
- Binary_Chain : Iir;
- Unary_Chain : Iir;
- Type_Definition : Iir;
- Last : Iir;
-
- procedure Add_Operation
- (Name : Name_Id;
- Def : Iir_Predefined_Functions;
- Interface_Chain : Iir;
- Return_Type : Iir)
- is
- Operation : Iir_Implicit_Function_Declaration;
- begin
- Operation := Create_Iir (Iir_Kind_Implicit_Function_Declaration);
- Location_Copy (Operation, Decl);
- Set_Parent (Operation, Get_Parent (Decl));
- Set_Interface_Declaration_Chain (Operation, Interface_Chain);
- Set_Type_Reference (Operation, Decl);
- Set_Return_Type (Operation, Return_Type);
- Set_Implicit_Definition (Operation, Def);
- Set_Identifier (Operation, Name);
- Set_Visible_Flag (Operation, True);
- Compute_Subprogram_Hash (Operation);
- Insert_Incr (Last, Operation);
- end Add_Operation;
-
- procedure Add_Relational (Name : Name_Id; Def : Iir_Predefined_Functions)
- is
- begin
- Add_Operation
- (Name, Def, Binary_Chain, Std_Package.Boolean_Type_Definition);
- end Add_Relational;
-
- procedure Add_Binary (Name : Name_Id; Def : Iir_Predefined_Functions) is
- begin
- Add_Operation (Name, Def, Binary_Chain, Type_Definition);
- end Add_Binary;
-
- procedure Add_Unary (Name : Name_Id; Def : Iir_Predefined_Functions) is
- begin
- Add_Operation (Name, Def, Unary_Chain, Type_Definition);
- end Add_Unary;
-
- procedure Add_To_String (Def : Iir_Predefined_Functions) is
- begin
- Add_Operation (Name_To_String, Def,
- Unary_Chain, String_Type_Definition);
- end Add_To_String;
-
- procedure Add_Min_Max (Name : Name_Id; Def : Iir_Predefined_Functions)
- is
- Left, Right : Iir;
- begin
- Left := Create_Anonymous_Interface (Type_Definition);
- Set_Identifier (Left, Name_L);
- Right := Create_Anonymous_Interface (Type_Definition);
- Set_Identifier (Right, Name_R);
- Set_Chain (Left, Right);
- Add_Operation (Name, Def, Left, Type_Definition);
- end Add_Min_Max;
-
- procedure Add_Vector_Min_Max
- (Name : Name_Id; Def : Iir_Predefined_Functions)
- is
- Left : Iir;
- begin
- Left := Create_Anonymous_Interface (Type_Definition);
- Set_Identifier (Left, Name_L);
- Add_Operation
- (Name, Def, Left, Get_Element_Subtype (Type_Definition));
- end Add_Vector_Min_Max;
-
- procedure Add_Shift_Operators
- is
- Inter_Chain : Iir_Interface_Constant_Declaration;
- Inter_Int : Iir;
- begin
- Inter_Chain := Create_Anonymous_Interface (Type_Definition);
-
- Inter_Int := Create_Iir (Iir_Kind_Interface_Constant_Declaration);
- Location_Copy (Inter_Int, Decl);
- Set_Identifier (Inter_Int, Null_Identifier);
- Set_Mode (Inter_Int, Iir_In_Mode);
- Set_Type (Inter_Int, Std_Package.Integer_Subtype_Definition);
- Set_Lexical_Layout (Inter_Int, Iir_Lexical_Has_Type);
-
- Set_Chain (Inter_Chain, Inter_Int);
-
- Add_Operation
- (Name_Sll, Iir_Predefined_Array_Sll, Inter_Chain, Type_Definition);
- Add_Operation
- (Name_Srl, Iir_Predefined_Array_Srl, Inter_Chain, Type_Definition);
- Add_Operation
- (Name_Sla, Iir_Predefined_Array_Sla, Inter_Chain, Type_Definition);
- Add_Operation
- (Name_Sra, Iir_Predefined_Array_Sra, Inter_Chain, Type_Definition);
- Add_Operation
- (Name_Rol, Iir_Predefined_Array_Rol, Inter_Chain, Type_Definition);
- Add_Operation
- (Name_Ror, Iir_Predefined_Array_Ror, Inter_Chain, Type_Definition);
- end Add_Shift_Operators;
- begin
- Last := Decl;
-
- Type_Definition := Get_Base_Type (Get_Type_Definition (Decl));
- if Get_Kind (Type_Definition) /= Iir_Kind_File_Type_Definition then
- Unary_Chain := Create_Anonymous_Interface (Type_Definition);
- Binary_Chain := Create_Anonymous_Interface (Type_Definition);
- Set_Chain (Binary_Chain, Unary_Chain);
- end if;
-
- case Get_Kind (Type_Definition) is
- when Iir_Kind_Enumeration_Type_Definition =>
- Add_Relational (Name_Op_Equality, Iir_Predefined_Enum_Equality);
- Add_Relational
- (Name_Op_Inequality, Iir_Predefined_Enum_Inequality);
- Add_Relational (Name_Op_Greater, Iir_Predefined_Enum_Greater);
- Add_Relational
- (Name_Op_Greater_Equal, Iir_Predefined_Enum_Greater_Equal);
- Add_Relational (Name_Op_Less, Iir_Predefined_Enum_Less);
- Add_Relational
- (Name_Op_Less_Equal, Iir_Predefined_Enum_Less_Equal);
-
- if Flags.Vhdl_Std >= Vhdl_08 then
- -- LRM08 5.2.6 Predefined operations on scalar types
- -- Given a type declaration that declares a scalar type T, the
- -- following operations are implicitely declared immediately
- -- following the type declaration (except for the TO_STRING
- -- operations in package STANDARD [...])
- Add_Min_Max (Name_Minimum, Iir_Predefined_Enum_Minimum);
- Add_Min_Max (Name_Maximum, Iir_Predefined_Enum_Maximum);
- if not Is_Std_Standard then
- Add_To_String (Iir_Predefined_Enum_To_String);
- end if;
-
- -- LRM08 9.2.3 Relational operators
- -- The matching relational operators are predefined for the
- -- [predefined type BIT and for the] type STD_ULOGIC defined
- -- in package STD_LOGIC_1164.
- if Type_Definition = Ieee.Std_Logic_1164.Std_Ulogic_Type then
- Add_Binary (Name_Op_Match_Equality,
- Iir_Predefined_Std_Ulogic_Match_Equality);
- Add_Binary (Name_Op_Match_Inequality,
- Iir_Predefined_Std_Ulogic_Match_Inequality);
- Add_Binary (Name_Op_Match_Less,
- Iir_Predefined_Std_Ulogic_Match_Less);
- Add_Binary (Name_Op_Match_Less_Equal,
- Iir_Predefined_Std_Ulogic_Match_Less_Equal);
- Add_Binary (Name_Op_Match_Greater,
- Iir_Predefined_Std_Ulogic_Match_Greater);
- Add_Binary (Name_Op_Match_Greater_Equal,
- Iir_Predefined_Std_Ulogic_Match_Greater_Equal);
- end if;
- end if;
-
- when Iir_Kind_Array_Type_Definition
- | Iir_Kind_Array_Subtype_Definition =>
- declare
- Element_Type : Iir;
-
- Element_Array_Inter_Chain : Iir;
- Array_Element_Inter_Chain : Iir;
- Element_Element_Inter_Chain : Iir;
- begin
- Add_Relational
- (Name_Op_Equality, Iir_Predefined_Array_Equality);
- Add_Relational
- (Name_Op_Inequality, Iir_Predefined_Array_Inequality);
- if Is_Discrete_Array (Type_Definition) then
- Add_Relational
- (Name_Op_Greater, Iir_Predefined_Array_Greater);
- Add_Relational
- (Name_Op_Greater_Equal,
- Iir_Predefined_Array_Greater_Equal);
- Add_Relational
- (Name_Op_Less, Iir_Predefined_Array_Less);
- Add_Relational
- (Name_Op_Less_Equal, Iir_Predefined_Array_Less_Equal);
-
- -- LRM08 5.3.2.4 Predefined operations on array types
- -- Given a type declaration that declares a discrete array
- -- type T, the following operatons are implicitly declared
- -- immediately following the type declaration:
- -- function MINIMUM (L, R : T) return T;
- -- function MAXIMUM (L, R : T) return T;
- if Vhdl_Std >= Vhdl_08 then
- Add_Min_Max (Name_Maximum, Iir_Predefined_Array_Maximum);
- Add_Min_Max (Name_Minimum, Iir_Predefined_Array_Minimum);
- end if;
- end if;
-
- Element_Type := Get_Element_Subtype (Type_Definition);
-
- if Is_One_Dimensional_Array_Type (Type_Definition) then
- -- LRM93 7.2.4 Adding operators
- -- The concatenation operator & is predefined for any
- -- one-dimensional array type.
- Add_Operation (Name_Op_Concatenation,
- Iir_Predefined_Array_Array_Concat,
- Binary_Chain,
- Type_Definition);
-
- Element_Array_Inter_Chain :=
- Create_Anonymous_Interface (Element_Type);
- Set_Chain (Element_Array_Inter_Chain, Unary_Chain);
- Add_Operation (Name_Op_Concatenation,
- Iir_Predefined_Element_Array_Concat,
- Element_Array_Inter_Chain,
- Type_Definition);
-
- Array_Element_Inter_Chain :=
- Create_Anonymous_Interface (Type_Definition);
- Set_Chain (Array_Element_Inter_Chain,
- Create_Anonymous_Interface (Element_Type));
- Add_Operation (Name_Op_Concatenation,
- Iir_Predefined_Array_Element_Concat,
- Array_Element_Inter_Chain,
- Type_Definition);
-
- Element_Element_Inter_Chain :=
- Create_Anonymous_Interface (Element_Type);
- Set_Chain (Element_Element_Inter_Chain,
- Create_Anonymous_Interface (Element_Type));
- Add_Operation (Name_Op_Concatenation,
- Iir_Predefined_Element_Element_Concat,
- Element_Element_Inter_Chain,
- Type_Definition);
-
- -- LRM08 5.3.2.4 Predefined operations on array types
- -- In addition, given a type declaration that declares a
- -- one-dimensional array type T whose elements are of a
- -- sclar type E, the following operations are implicitly
- -- declared immediately following the type declaration:
- -- function MINIMUM (L : T) return E;
- -- function MAXIMUM (L : T) return E;
- if Vhdl_Std >= Vhdl_08
- and then (Get_Kind (Element_Type) in
- Iir_Kinds_Scalar_Type_Definition)
- then
- Add_Vector_Min_Max
- (Name_Maximum, Iir_Predefined_Vector_Maximum);
- Add_Vector_Min_Max
- (Name_Minimum, Iir_Predefined_Vector_Minimum);
- end if;
-
- if Element_Type = Std_Package.Boolean_Type_Definition
- or else Element_Type = Std_Package.Bit_Type_Definition
- then
- -- LRM93 7.2.1 Logical operators
- -- LRM08 9.2.2 Logical operators
- -- The binary logical operators AND, OR, NAND, NOR, XOR,
- -- and XNOR, and the unary logical operator NOT are
- -- defined for predefined types BIT and BOOLEAN. They
- -- are also defined for any one-dimensional array type
- -- whose element type is BIT or BOOLEAN.
-
- Add_Unary (Name_Not, Iir_Predefined_TF_Array_Not);
-
- Add_Binary (Name_And, Iir_Predefined_TF_Array_And);
- Add_Binary (Name_Or, Iir_Predefined_TF_Array_Or);
- Add_Binary (Name_Nand, Iir_Predefined_TF_Array_Nand);
- Add_Binary (Name_Nor, Iir_Predefined_TF_Array_Nor);
- Add_Binary (Name_Xor, Iir_Predefined_TF_Array_Xor);
- if Flags.Vhdl_Std > Vhdl_87 then
- Add_Binary (Name_Xnor, Iir_Predefined_TF_Array_Xnor);
-
- -- LRM93 7.2.3 Shift operators
- -- The shift operators SLL, SRL, SLA, SRA, ROL and
- -- ROR are defined for any one-dimensional array type
- -- whose element type is either of the predefined
- -- types BIT or BOOLEAN.
- Add_Shift_Operators;
- end if;
-
- -- LRM08 9.2.2 Logical operators
- -- For the binary operators AND, OR, NAND, NOR, XOR and
- -- XNOR, the operands shall both be [of the same base
- -- type,] or one operand shall be of a scalar type and
- -- the other operand shall be a one-dimensional array
- -- whose element type is the scalar type. The result
- -- type is the same as the base type of the operands if
- -- [both operands are scalars of the same base type or]
- -- both operands are arrays, or the same as the base type
- -- of the array operand if one operand is a scalar and
- -- the other operand is an array.
- if Flags.Vhdl_Std >= Vhdl_08 then
- Add_Operation
- (Name_And, Iir_Predefined_TF_Element_Array_And,
- Element_Array_Inter_Chain, Type_Definition);
- Add_Operation
- (Name_And, Iir_Predefined_TF_Array_Element_And,
- Array_Element_Inter_Chain, Type_Definition);
- Add_Operation
- (Name_Or, Iir_Predefined_TF_Element_Array_Or,
- Element_Array_Inter_Chain, Type_Definition);
- Add_Operation
- (Name_Or, Iir_Predefined_TF_Array_Element_Or,
- Array_Element_Inter_Chain, Type_Definition);
- Add_Operation
- (Name_Nand, Iir_Predefined_TF_Element_Array_Nand,
- Element_Array_Inter_Chain, Type_Definition);
- Add_Operation
- (Name_Nand, Iir_Predefined_TF_Array_Element_Nand,
- Array_Element_Inter_Chain, Type_Definition);
- Add_Operation
- (Name_Nor, Iir_Predefined_TF_Element_Array_Nor,
- Element_Array_Inter_Chain, Type_Definition);
- Add_Operation
- (Name_Nor, Iir_Predefined_TF_Array_Element_Nor,
- Array_Element_Inter_Chain, Type_Definition);
- Add_Operation
- (Name_Xor, Iir_Predefined_TF_Element_Array_Xor,
- Element_Array_Inter_Chain, Type_Definition);
- Add_Operation
- (Name_Xor, Iir_Predefined_TF_Array_Element_Xor,
- Array_Element_Inter_Chain, Type_Definition);
- Add_Operation
- (Name_Xnor, Iir_Predefined_TF_Element_Array_Xnor,
- Element_Array_Inter_Chain, Type_Definition);
- Add_Operation
- (Name_Xnor, Iir_Predefined_TF_Array_Element_Xnor,
- Array_Element_Inter_Chain, Type_Definition);
- end if;
-
- if Flags.Vhdl_Std >= Vhdl_08 then
- -- LRM08 9.2.2 Logical operations
- -- The unary logical operators AND, OR, NAND, NOR,
- -- XOR, and XNOR are referred to as logical reduction
- -- operators. The logical reduction operators are
- -- predefined for any one-dimensional array type whose
- -- element type is BIT or BOOLEAN. The result type
- -- for the logical reduction operators is the same as
- -- the element type of the operand.
- Add_Operation
- (Name_And, Iir_Predefined_TF_Reduction_And,
- Unary_Chain, Element_Type);
- Add_Operation
- (Name_Or, Iir_Predefined_TF_Reduction_Or,
- Unary_Chain, Element_Type);
- Add_Operation
- (Name_Nand, Iir_Predefined_TF_Reduction_Nand,
- Unary_Chain, Element_Type);
- Add_Operation
- (Name_Nor, Iir_Predefined_TF_Reduction_Nor,
- Unary_Chain, Element_Type);
- Add_Operation
- (Name_Xor, Iir_Predefined_TF_Reduction_Xor,
- Unary_Chain, Element_Type);
- Add_Operation
- (Name_Xnor, Iir_Predefined_TF_Reduction_Xnor,
- Unary_Chain, Element_Type);
- end if;
- end if;
-
- -- LRM08 9.2.3 Relational operators
- -- The matching equality and matching inequality operatotrs
- -- are also defined for any one-dimensional array type
- -- whose element type is BIT or STD_ULOGIC.
- if Flags.Vhdl_Std >= Vhdl_08 then
- if Element_Type = Std_Package.Bit_Type_Definition then
- Add_Operation
- (Name_Op_Match_Equality,
- Iir_Predefined_Bit_Array_Match_Equality,
- Binary_Chain, Element_Type);
- Add_Operation
- (Name_Op_Match_Inequality,
- Iir_Predefined_Bit_Array_Match_Inequality,
- Binary_Chain, Element_Type);
- elsif Element_Type = Ieee.Std_Logic_1164.Std_Ulogic_Type
- then
- Add_Operation
- (Name_Op_Match_Equality,
- Iir_Predefined_Std_Ulogic_Array_Match_Equality,
- Binary_Chain, Element_Type);
- Add_Operation
- (Name_Op_Match_Inequality,
- Iir_Predefined_Std_Ulogic_Array_Match_Inequality,
- Binary_Chain, Element_Type);
- end if;
- end if;
-
- -- LRM08 5.3.2.4 Predefined operations on array type
- --
- -- Given a type declaration that declares a one-dimensional
- -- array type T whose element type is a character type that
- -- contains only character literals, the following operation
- -- is implicitely declared immediately following the type
- -- declaration
- if Vhdl_Std >= Vhdl_08
- and then String_Type_Definition /= Null_Iir
- and then (Get_Kind (Element_Type)
- = Iir_Kind_Enumeration_Type_Definition)
- and then Get_Only_Characters_Flag (Element_Type)
- then
- Add_Operation (Name_To_String,
- Iir_Predefined_Array_Char_To_String,
- Unary_Chain,
- String_Type_Definition);
- end if;
- end if;
- end;
-
- when Iir_Kind_Access_Type_Definition =>
- Add_Relational (Name_Op_Equality, Iir_Predefined_Access_Equality);
- Add_Relational
- (Name_Op_Inequality, Iir_Predefined_Access_Inequality);
- declare
- Deallocate_Proc: Iir_Implicit_Procedure_Declaration;
- Var_Interface: Iir_Interface_Variable_Declaration;
- begin
- Deallocate_Proc :=
- Create_Iir (Iir_Kind_Implicit_Procedure_Declaration);
- Set_Identifier (Deallocate_Proc, Std_Names.Name_Deallocate);
- Set_Implicit_Definition
- (Deallocate_Proc, Iir_Predefined_Deallocate);
- Var_Interface :=
- Create_Iir (Iir_Kind_Interface_Variable_Declaration);
- Set_Identifier (Var_Interface, Std_Names.Name_P);
- Set_Type (Var_Interface, Type_Definition);
- Set_Mode (Var_Interface, Iir_Inout_Mode);
- Set_Lexical_Layout (Var_Interface, Iir_Lexical_Has_Type);
- --Set_Purity_State (Deallocate_Proc, Impure);
- Set_Wait_State (Deallocate_Proc, False);
- Set_Type_Reference (Deallocate_Proc, Decl);
- Set_Visible_Flag (Deallocate_Proc, True);
-
- Set_Interface_Declaration_Chain
- (Deallocate_Proc, Var_Interface);
- Compute_Subprogram_Hash (Deallocate_Proc);
- Insert_Incr (Last, Deallocate_Proc);
- end;
-
- when Iir_Kind_Record_Type_Definition =>
- Add_Relational (Name_Op_Equality, Iir_Predefined_Record_Equality);
- Add_Relational
- (Name_Op_Inequality, Iir_Predefined_Record_Inequality);
-
- when Iir_Kind_Integer_Type_Definition =>
- Add_Relational (Name_Op_Equality, Iir_Predefined_Integer_Equality);
- Add_Relational
- (Name_Op_Inequality, Iir_Predefined_Integer_Inequality);
- Add_Relational (Name_Op_Greater, Iir_Predefined_Integer_Greater);
- Add_Relational
- (Name_Op_Greater_Equal, Iir_Predefined_Integer_Greater_Equal);
- Add_Relational (Name_Op_Less, Iir_Predefined_Integer_Less);
- Add_Relational
- (Name_Op_Less_Equal, Iir_Predefined_Integer_Less_Equal);
-
- Add_Binary (Name_Op_Plus, Iir_Predefined_Integer_Plus);
- Add_Binary (Name_Op_Minus, Iir_Predefined_Integer_Minus);
-
- Add_Unary (Name_Op_Minus, Iir_Predefined_Integer_Negation);
- Add_Unary (Name_Op_Plus, Iir_Predefined_Integer_Identity);
-
- Add_Binary (Name_Op_Mul, Iir_Predefined_Integer_Mul);
- Add_Binary (Name_Op_Div, Iir_Predefined_Integer_Div);
- Add_Binary (Name_Mod, Iir_Predefined_Integer_Mod);
- Add_Binary (Name_Rem, Iir_Predefined_Integer_Rem);
-
- Add_Unary (Name_Abs, Iir_Predefined_Integer_Absolute);
-
- declare
- Inter_Chain : Iir;
- begin
- Inter_Chain := Create_Anonymous_Interface (Type_Definition);
- Set_Chain
- (Inter_Chain,
- Create_Anonymous_Interface (Integer_Type_Definition));
- Add_Operation (Name_Op_Exp, Iir_Predefined_Integer_Exp,
- Inter_Chain, Type_Definition);
- end;
-
- if Vhdl_Std >= Vhdl_08 then
- -- LRM08 5.2.6 Predefined operations on scalar types
- -- Given a type declaration that declares a scalar type T, the
- -- following operations are implicitely declared immediately
- -- following the type declaration (except for the TO_STRING
- -- operations in package STANDARD [...])
- Add_Min_Max (Name_Minimum, Iir_Predefined_Integer_Minimum);
- Add_Min_Max (Name_Maximum, Iir_Predefined_Integer_Maximum);
- if not Is_Std_Standard then
- Add_To_String (Iir_Predefined_Integer_To_String);
- end if;
- end if;
-
- when Iir_Kind_Floating_Type_Definition =>
- Add_Relational
- (Name_Op_Equality, Iir_Predefined_Floating_Equality);
- Add_Relational
- (Name_Op_Inequality, Iir_Predefined_Floating_Inequality);
- Add_Relational
- (Name_Op_Greater, Iir_Predefined_Floating_Greater);
- Add_Relational
- (Name_Op_Greater_Equal, Iir_Predefined_Floating_Greater_Equal);
- Add_Relational
- (Name_Op_Less, Iir_Predefined_Floating_Less);
- Add_Relational
- (Name_Op_Less_Equal, Iir_Predefined_Floating_Less_Equal);
-
- Add_Binary (Name_Op_Plus, Iir_Predefined_Floating_Plus);
- Add_Binary (Name_Op_Minus, Iir_Predefined_Floating_Minus);
-
- Add_Unary (Name_Op_Minus, Iir_Predefined_Floating_Negation);
- Add_Unary (Name_Op_Plus, Iir_Predefined_Floating_Identity);
-
- Add_Binary (Name_Op_Mul, Iir_Predefined_Floating_Mul);
- Add_Binary (Name_Op_Div, Iir_Predefined_Floating_Div);
-
- Add_Unary (Name_Abs, Iir_Predefined_Floating_Absolute);
-
- declare
- Inter_Chain : Iir;
- begin
- Inter_Chain := Create_Anonymous_Interface (Type_Definition);
- Set_Chain
- (Inter_Chain,
- Create_Anonymous_Interface (Integer_Type_Definition));
- Add_Operation (Name_Op_Exp, Iir_Predefined_Floating_Exp,
- Inter_Chain, Type_Definition);
- end;
-
- if Vhdl_Std >= Vhdl_08 then
- -- LRM08 5.2.6 Predefined operations on scalar types
- -- Given a type declaration that declares a scalar type T, the
- -- following operations are implicitely declared immediately
- -- following the type declaration (except for the TO_STRING
- -- operations in package STANDARD [...])
- Add_Min_Max (Name_Minimum, Iir_Predefined_Floating_Minimum);
- Add_Min_Max (Name_Maximum, Iir_Predefined_Floating_Maximum);
- if not Is_Std_Standard then
- Add_To_String (Iir_Predefined_Floating_To_String);
- end if;
- end if;
-
- when Iir_Kind_Physical_Type_Definition =>
- Add_Relational
- (Name_Op_Equality, Iir_Predefined_Physical_Equality);
- Add_Relational
- (Name_Op_Inequality, Iir_Predefined_Physical_Inequality);
- Add_Relational
- (Name_Op_Greater, Iir_Predefined_Physical_Greater);
- Add_Relational
- (Name_Op_Greater_Equal, Iir_Predefined_Physical_Greater_Equal);
- Add_Relational
- (Name_Op_Less, Iir_Predefined_Physical_Less);
- Add_Relational
- (Name_Op_Less_Equal, Iir_Predefined_Physical_Less_Equal);
-
- Add_Binary (Name_Op_Plus, Iir_Predefined_Physical_Plus);
- Add_Binary (Name_Op_Minus, Iir_Predefined_Physical_Minus);
-
- Add_Unary (Name_Op_Minus, Iir_Predefined_Physical_Negation);
- Add_Unary (Name_Op_Plus, Iir_Predefined_Physical_Identity);
-
- declare
- Inter_Chain : Iir;
- begin
- Inter_Chain := Create_Anonymous_Interface (Type_Definition);
- Set_Chain
- (Inter_Chain,
- Create_Anonymous_Interface (Integer_Type_Definition));
- Add_Operation (Name_Op_Mul, Iir_Predefined_Physical_Integer_Mul,
- Inter_Chain, Type_Definition);
- Add_Operation (Name_Op_Div, Iir_Predefined_Physical_Integer_Div,
- Inter_Chain, Type_Definition);
- end;
-
- declare
- Inter_Chain : Iir;
- begin
- Inter_Chain :=
- Create_Anonymous_Interface (Integer_Type_Definition);
- Set_Chain (Inter_Chain, Unary_Chain);
- Add_Operation (Name_Op_Mul, Iir_Predefined_Integer_Physical_Mul,
- Inter_Chain, Type_Definition);
- end;
-
- declare
- Inter_Chain : Iir;
- begin
- Inter_Chain := Create_Anonymous_Interface (Type_Definition);
- Set_Chain (Inter_Chain,
- Create_Anonymous_Interface (Real_Type_Definition));
- Add_Operation (Name_Op_Mul, Iir_Predefined_Physical_Real_Mul,
- Inter_Chain, Type_Definition);
- Add_Operation (Name_Op_Div, Iir_Predefined_Physical_Real_Div,
- Inter_Chain, Type_Definition);
- end;
-
- declare
- Inter_Chain : Iir;
- begin
- Inter_Chain :=
- Create_Anonymous_Interface (Real_Type_Definition);
- Set_Chain (Inter_Chain, Unary_Chain);
- Add_Operation (Name_Op_Mul, Iir_Predefined_Real_Physical_Mul,
- Inter_Chain, Type_Definition);
- end;
- Add_Operation (Name_Op_Div, Iir_Predefined_Physical_Physical_Div,
- Binary_Chain,
- Std_Package.Convertible_Integer_Type_Definition);
-
- Add_Unary (Name_Abs, Iir_Predefined_Physical_Absolute);
-
- if Vhdl_Std >= Vhdl_08 then
- -- LRM08 5.2.6 Predefined operations on scalar types
- -- Given a type declaration that declares a scalar type T, the
- -- following operations are implicitely declared immediately
- -- following the type declaration (except for the TO_STRING
- -- operations in package STANDARD [...])
- Add_Min_Max (Name_Minimum, Iir_Predefined_Physical_Minimum);
- Add_Min_Max (Name_Maximum, Iir_Predefined_Physical_Maximum);
- if not Is_Std_Standard then
- Add_To_String (Iir_Predefined_Physical_To_String);
- end if;
- end if;
-
- when Iir_Kind_File_Type_Definition =>
- Create_Implicit_File_Primitives (Decl, Type_Definition);
-
- when Iir_Kind_Protected_Type_Declaration =>
- null;
-
- when others =>
- Error_Kind ("create_predefined_operations", Type_Definition);
- end case;
-
- if not Is_Std_Standard then
- return;
- end if;
- if Decl = Std_Package.Boolean_Type_Declaration then
- Add_Binary (Name_And, Iir_Predefined_Boolean_And);
- Add_Binary (Name_Or, Iir_Predefined_Boolean_Or);
- Add_Binary (Name_Nand, Iir_Predefined_Boolean_Nand);
- Add_Binary (Name_Nor, Iir_Predefined_Boolean_Nor);
- Add_Binary (Name_Xor, Iir_Predefined_Boolean_Xor);
- if Flags.Vhdl_Std > Vhdl_87 then
- Add_Binary (Name_Xnor, Iir_Predefined_Boolean_Xnor);
- end if;
- Add_Unary (Name_Not, Iir_Predefined_Boolean_Not);
- elsif Decl = Std_Package.Bit_Type_Declaration then
- Add_Binary (Name_And, Iir_Predefined_Bit_And);
- Add_Binary (Name_Or, Iir_Predefined_Bit_Or);
- Add_Binary (Name_Nand, Iir_Predefined_Bit_Nand);
- Add_Binary (Name_Nor, Iir_Predefined_Bit_Nor);
- Add_Binary (Name_Xor, Iir_Predefined_Bit_Xor);
- if Flags.Vhdl_Std > Vhdl_87 then
- Add_Binary (Name_Xnor, Iir_Predefined_Bit_Xnor);
- end if;
- Add_Unary (Name_Not, Iir_Predefined_Bit_Not);
- if Flags.Vhdl_Std >= Vhdl_08 then
- Add_Binary (Name_Op_Match_Equality,
- Iir_Predefined_Bit_Match_Equality);
- Add_Binary (Name_Op_Match_Inequality,
- Iir_Predefined_Bit_Match_Inequality);
- Add_Binary (Name_Op_Match_Less,
- Iir_Predefined_Bit_Match_Less);
- Add_Binary (Name_Op_Match_Less_Equal,
- Iir_Predefined_Bit_Match_Less_Equal);
- Add_Binary (Name_Op_Match_Greater,
- Iir_Predefined_Bit_Match_Greater);
- Add_Binary (Name_Op_Match_Greater_Equal,
- Iir_Predefined_Bit_Match_Greater_Equal);
-
- -- LRM08 9.2.9 Condition operator
- -- The unary operator ?? is predefined for type BIT defined in
- -- package STANDARD.
- Add_Operation (Name_Op_Condition, Iir_Predefined_Bit_Condition,
- Unary_Chain, Std_Package.Boolean_Type_Definition);
-
- end if;
- elsif Decl = Std_Package.Universal_Real_Type_Declaration then
- declare
- Inter_Chain : Iir;
- begin
- Inter_Chain := Create_Anonymous_Interface (Type_Definition);
- Set_Chain
- (Inter_Chain,
- Create_Anonymous_Interface (Universal_Integer_Type_Definition));
- Add_Operation (Name_Op_Mul, Iir_Predefined_Universal_R_I_Mul,
- Inter_Chain, Type_Definition);
- Add_Operation (Name_Op_Div, Iir_Predefined_Universal_R_I_Div,
- Inter_Chain, Type_Definition);
- end;
-
- declare
- Inter_Chain : Iir;
- begin
- Inter_Chain :=
- Create_Anonymous_Interface (Universal_Integer_Type_Definition);
- Set_Chain (Inter_Chain, Unary_Chain);
- Add_Operation (Name_Op_Mul, Iir_Predefined_Universal_I_R_Mul,
- Inter_Chain, Type_Definition);
- end;
- end if;
- end Create_Implicit_Operations;
-
- procedure Sem_Type_Declaration (Decl: Iir; Is_Global : Boolean)
- is
- Def: Iir;
- Inter : Name_Interpretation_Type;
- Old_Decl : Iir;
- St_Decl : Iir_Subtype_Declaration;
- Bt_Def : Iir;
- begin
- -- Check if DECL complete a previous incomplete type declaration.
- Inter := Get_Interpretation (Get_Identifier (Decl));
- if Valid_Interpretation (Inter)
- and then Is_In_Current_Declarative_Region (Inter)
- then
- Old_Decl := Get_Declaration (Inter);
- if Get_Kind (Old_Decl) /= Iir_Kind_Type_Declaration
- or else (Get_Kind (Get_Type_Definition (Old_Decl)) /=
- Iir_Kind_Incomplete_Type_Definition)
- then
- Old_Decl := Null_Iir;
- end if;
- else
- Old_Decl := Null_Iir;
- end if;
-
- if Old_Decl = Null_Iir then
- if Get_Kind (Decl) = Iir_Kind_Type_Declaration then
- -- This is necessary at least for enumeration type definition.
- Sem_Scopes.Add_Name (Decl);
- end if;
- else
- -- This is a way to prevent:
- -- type a;
- -- type a is access a;
- -- which is non-sense.
- Set_Visible_Flag (Old_Decl, False);
- end if;
-
- -- Check the definition of the type.
- Def := Get_Type_Definition (Decl);
- if Def = Null_Iir then
- -- Incomplete type declaration
- Def := Create_Iir (Iir_Kind_Incomplete_Type_Definition);
- Location_Copy (Def, Decl);
- Set_Type_Definition (Decl, Def);
- Set_Base_Type (Def, Def);
- Set_Signal_Type_Flag (Def, True);
- Set_Type_Declarator (Def, Decl);
- Set_Visible_Flag (Decl, True);
- Set_Incomplete_Type_List (Def, Create_Iir_List);
- Xref_Decl (Decl);
- else
- -- A complete type declaration.
- if Old_Decl = Null_Iir then
- Xref_Decl (Decl);
- else
- Xref_Body (Decl, Old_Decl);
- end if;
-
- Def := Sem_Type_Definition (Def, Decl);
-
- if Def /= Null_Iir then
- case Get_Kind (Def) is
- when Iir_Kind_Integer_Subtype_Definition
- | Iir_Kind_Floating_Subtype_Definition
- | Iir_Kind_Physical_Subtype_Definition
- | Iir_Kind_Array_Subtype_Definition =>
- -- Some type declaration are in fact subtype declarations.
- St_Decl := Create_Iir (Iir_Kind_Subtype_Declaration);
- Location_Copy (St_Decl, Decl);
- Set_Identifier (St_Decl, Get_Identifier (Decl));
- Set_Type (St_Decl, Def);
- Set_Type_Declarator (Def, St_Decl);
- Set_Chain (St_Decl, Get_Chain (Decl));
- Set_Chain (Decl, St_Decl);
-
- -- The type declaration declares the base type.
- Bt_Def := Get_Base_Type (Def);
- Set_Type_Definition (Decl, Bt_Def);
- Set_Type_Declarator (Bt_Def, Decl);
- Set_Subtype_Definition (Decl, Def);
-
- if Old_Decl = Null_Iir then
- Sem_Scopes.Add_Name (St_Decl);
- else
- Replace_Name (Get_Identifier (Decl), Old_Decl, St_Decl);
- Set_Type_Declarator
- (Get_Type_Definition (Old_Decl), St_Decl);
- end if;
-
- Sem_Scopes.Name_Visible (St_Decl);
-
- -- The implicit subprogram will be added in the
- -- scope just after.
- Create_Implicit_Operations (Decl, False);
-
- when Iir_Kind_Enumeration_Type_Definition
- | Iir_Kind_Array_Type_Definition
- | Iir_Kind_Record_Type_Definition
- | Iir_Kind_Access_Type_Definition
- | Iir_Kind_File_Type_Definition =>
- St_Decl := Null_Iir;
- Set_Type_Declarator (Def, Decl);
-
- Sem_Scopes.Name_Visible (Decl);
-
- -- The implicit subprogram will be added in the
- -- scope just after.
- Create_Implicit_Operations (Decl, False);
-
- when Iir_Kind_Protected_Type_Declaration =>
- Set_Type_Declarator (Def, Decl);
- St_Decl := Null_Iir;
- -- No implicit subprograms.
-
- when others =>
- Error_Kind ("sem_type_declaration", Def);
- end case;
-
- if Old_Decl /= Null_Iir then
- -- Complete the type definition.
- declare
- List : Iir_List;
- El : Iir;
- Old_Def : Iir;
- begin
- Old_Def := Get_Type_Definition (Old_Decl);
- Set_Signal_Type_Flag (Old_Def, Get_Signal_Type_Flag (Def));
- List := Get_Incomplete_Type_List (Old_Def);
- for I in Natural loop
- El := Get_Nth_Element (List, I);
- exit when El = Null_Iir;
- Set_Designated_Type (El, Def);
- end loop;
- -- Complete the incomplete_type_definition node
- -- (set type_declarator and base_type).
-
- Set_Base_Type (Old_Def, Get_Base_Type (Def));
- if St_Decl = Null_Iir then
- Set_Type_Declarator (Old_Def, Decl);
- Replace_Name (Get_Identifier (Decl), Old_Decl, Decl);
- end if;
- end;
- end if;
-
- if Is_Global then
- Set_Type_Has_Signal (Def);
- end if;
- end if;
- end if;
- end Sem_Type_Declaration;
-
- procedure Sem_Subtype_Declaration (Decl: Iir; Is_Global : Boolean)
- is
- Def: Iir;
- Ind : Iir;
- begin
- -- Real hack to skip subtype declarations of anonymous type decls.
- if Get_Visible_Flag (Decl) then
- return;
- end if;
-
- Sem_Scopes.Add_Name (Decl);
- Xref_Decl (Decl);
-
- -- Analyze the definition of the type.
- Ind := Get_Subtype_Indication (Decl);
- Ind := Sem_Subtype_Indication (Ind);
- Set_Subtype_Indication (Decl, Ind);
- Def := Get_Type_Of_Subtype_Indication (Ind);
- if Def = Null_Iir then
- return;
- end if;
-
- if not Is_Anonymous_Type_Definition (Def) then
- -- There is no added constraints and therefore the subtype
- -- declaration is in fact an alias of the type. Create a copy so
- -- that it has its own type declarator.
- Def := Copy_Subtype_Indication (Def);
- Location_Copy (Def, Decl);
- Set_Subtype_Type_Mark (Def, Ind);
- Set_Subtype_Indication (Decl, Def);
- end if;
-
- Set_Type (Decl, Def);
- Set_Type_Declarator (Def, Decl);
- Name_Visible (Decl);
- if Is_Global then
- Set_Type_Has_Signal (Def);
- end if;
- end Sem_Subtype_Declaration;
-
- -- If DECL is a constant declaration, and there is already a constant
- -- declaration in the current scope with the same name, then return it.
- -- Otherwise, return NULL.
- function Get_Deferred_Constant (Decl : Iir) return Iir
- is
- Deferred_Const : Iir;
- Interp : Name_Interpretation_Type;
- begin
- if Get_Kind (Decl) /= Iir_Kind_Constant_Declaration then
- return Null_Iir;
- end if;
- Interp := Get_Interpretation (Get_Identifier (Decl));
- if not Valid_Interpretation (Interp) then
- return Null_Iir;
- end if;
-
- if not Is_In_Current_Declarative_Region (Interp)
- or else Is_Potentially_Visible (Interp)
- then
- -- Deferred and full declarations must be declared in the same
- -- declarative region.
- return Null_Iir;
- end if;
-
- Deferred_Const := Get_Declaration (Interp);
- if Get_Kind (Deferred_Const) /= Iir_Kind_Constant_Declaration then
- return Null_Iir;
- end if;
- -- LRM93 4.3.1.1
- -- The corresponding full constant declaration, which defines the value
- -- of the constant, must appear in the body of the package.
- if Get_Kind (Get_Library_Unit (Get_Current_Design_Unit))
- /= Iir_Kind_Package_Body
- then
- Error_Msg_Sem
- ("full constant declaration must appear in package body", Decl);
- end if;
- return Deferred_Const;
- end Get_Deferred_Constant;
-
- procedure Sem_Object_Declaration (Decl: Iir; Parent : Iir; Last_Decl : Iir)
- is
- Deferred_Const : constant Iir := Get_Deferred_Constant (Decl);
- Atype: Iir;
- Default_Value : Iir;
- Staticness : Iir_Staticness;
- begin
- -- LRM08 12.2 Scope of declarations
- -- Then scope of a declaration [...] extends from the beginning of the
- -- declaration [...]
- if Deferred_Const = Null_Iir then
- Sem_Scopes.Add_Name (Decl);
- Xref_Decl (Decl);
- else
- Xref_Ref (Decl, Deferred_Const);
- end if;
-
- -- Semantize type and default value:
- Atype := Get_Subtype_Indication (Decl);
- if Atype /= Null_Iir then
- Atype := Sem_Subtype_Indication (Atype);
- Set_Subtype_Indication (Decl, Atype);
- Atype := Get_Type_Of_Subtype_Indication (Atype);
- if Atype = Null_Iir then
- Atype := Create_Error_Type (Get_Type (Decl));
- end if;
-
- Default_Value := Get_Default_Value (Decl);
- if Default_Value /= Null_Iir then
- Default_Value := Sem_Expression (Default_Value, Atype);
- if Default_Value = Null_Iir then
- Default_Value :=
- Create_Error_Expr (Get_Default_Value (Decl), Atype);
- end if;
- Check_Read (Default_Value);
- Default_Value := Eval_Expr_Check_If_Static (Default_Value, Atype);
- end if;
- else
- Default_Value := Get_Default_Value (Last_Decl);
- Atype := Get_Type (Last_Decl);
- end if;
-
- Set_Type (Decl, Atype);
- Set_Default_Value (Decl, Default_Value);
- Set_Name_Staticness (Decl, Locally);
- Set_Visible_Flag (Decl, True);
-
- -- LRM93 2.6
- -- The subtype indication given in the full declaration of the deferred
- -- constant must conform to that given in the deferred constant
- -- declaration.
- if Deferred_Const /= Null_Iir
- and then not Are_Trees_Equal (Get_Type (Decl),
- Get_Type (Deferred_Const))
- then
- Error_Msg_Sem
- ("subtype indication doesn't conform with the deferred constant",
- Decl);
- end if;
-
- -- LRM 4.3.1.3
- -- It is an error if a variable declaration declares a variable that is
- -- of a file type.
- --
- -- LRM 4.3.1.1
- -- It is an error if a constant declaration declares a constant that is
- -- of a file type, or an access type, or a composite type which has
- -- subelement that is a file type of an access type.
- --
- -- LRM 4.3.1.2
- -- It is an error if a signal declaration declares a signal that is of
- -- a file type [or an access type].
- case Get_Kind (Atype) is
- when Iir_Kind_File_Type_Definition =>
- Error_Msg_Sem (Disp_Node (Decl) & " cannot be of type file", Decl);
- when others =>
- if Get_Kind (Decl) /= Iir_Kind_Variable_Declaration then
- Check_Signal_Type (Decl);
- end if;
- end case;
-
- if not Check_Implicit_Conversion (Atype, Default_Value) then
- Error_Msg_Sem
- ("default value length does not match object type length", Decl);
- end if;
-
- case Get_Kind (Decl) is
- when Iir_Kind_Constant_Declaration =>
- -- LRM93 4.3.1.1
- -- If the assignment symbol ":=" followed by an expression is not
- -- present in a constant declaration, then the declaration
- -- declares a deferred constant.
- -- Such a constant declaration may only appear in a package
- -- declaration.
- if Deferred_Const /= Null_Iir then
- Set_Deferred_Declaration (Decl, Deferred_Const);
- Set_Deferred_Declaration (Deferred_Const, Decl);
- end if;
- if Default_Value = Null_Iir then
- if Deferred_Const /= Null_Iir then
- Error_Msg_Sem
- ("full constant declaration must have a default value",
- Decl);
- else
- Set_Deferred_Declaration_Flag (Decl, True);
- end if;
- if Get_Kind (Parent) /= Iir_Kind_Package_Declaration then
- Error_Msg_Sem ("a constant must have a default value", Decl);
- end if;
- Set_Expr_Staticness (Decl, Globally);
- else
- -- LRM93 7.4.1: a locally static primary is defined:
- -- A constant (other than deferred constant) explicitly
- -- declared by a constant declaration and initialized
- -- with a locally static expression.
- -- Note: the staticness of the full declaration may be locally.
- if False and Deferred_Const /= Null_Iir then
- -- This is a deferred constant.
- Staticness := Globally;
- else
- Staticness := Min (Get_Expr_Staticness (Default_Value),
- Get_Type_Staticness (Atype));
- -- What about expr staticness of c in:
- -- constant c : bit_vector (a to b) := "01";
- -- where a and b are not locally static ?
- --Staticness := Get_Expr_Staticness (Default_Value);
-
- -- LRM 7.4.2 (Globally static primaries)
- -- 5. a constant
- if Staticness < Globally then
- Staticness := Globally;
- end if;
- end if;
- Set_Expr_Staticness (Decl, Staticness);
- end if;
-
- when Iir_Kind_Signal_Declaration =>
- -- LRM93 4.3.1.2
- -- It is also an error if a guarded signal of a
- -- scalar type is neither a resolved signal nor a
- -- subelement of a resolved signal.
- if Get_Signal_Kind (Decl) /= Iir_No_Signal_Kind
- and then not Get_Resolved_Flag (Atype)
- then
- Error_Msg_Sem
- ("guarded " & Disp_Node (Decl) & " must be resolved", Decl);
- end if;
- Set_Expr_Staticness (Decl, None);
- Set_Has_Disconnect_Flag (Decl, False);
- Set_Type_Has_Signal (Atype);
-
- when Iir_Kind_Variable_Declaration =>
- -- LRM93 4.3.1.3 Variable declarations
- -- Variable declared immediatly within entity declarations,
- -- architectures bodies, packages, packages bodies, and blocks
- -- must be shared variable.
- -- Variables declared immediatly within subprograms and
- -- processes must not be shared variables.
- -- Variables may appear in proteted type bodies; such
- -- variables, which must not be shared variables, represent
- -- shared data.
- case Get_Kind (Parent) is
- when Iir_Kind_Entity_Declaration
- | Iir_Kind_Architecture_Body
- | Iir_Kind_Package_Declaration
- | Iir_Kind_Package_Body
- | Iir_Kind_Block_Statement
- | Iir_Kind_Generate_Statement =>
- if not Get_Shared_Flag (Decl) then
- Error_Msg_Sem
- ("non shared variable declaration not allowed here",
- Decl);
- end if;
- when Iir_Kinds_Process_Statement
- | Iir_Kind_Function_Body
- | Iir_Kind_Procedure_Body =>
- if Get_Shared_Flag (Decl) then
- Error_Msg_Sem
- ("shared variable declaration not allowed here", Decl);
- end if;
- when Iir_Kind_Protected_Type_Body =>
- if Get_Shared_Flag (Decl) then
- Error_Msg_Sem
- ("variable of protected type body must not be shared",
- Decl);
- end if;
- when Iir_Kind_Protected_Type_Declaration =>
- -- This is not allowed, but caught
- -- in sem_protected_type_declaration.
- null;
- when others =>
- Error_Kind ("sem_object_declaration(2)", Parent);
- end case;
-
- if Flags.Vhdl_Std >= Vhdl_00 then
- declare
- Base_Type : Iir;
- Is_Protected : Boolean;
- begin
- Base_Type := Get_Base_Type (Atype);
- Is_Protected :=
- Get_Kind (Base_Type) = Iir_Kind_Protected_Type_Declaration;
-
- -- LRM00 4.3.1.3
- -- The base type of the subtype indication of a
- -- shared variable declaration must be a protected type.
- if Get_Shared_Flag (Decl) and not Is_Protected then
- Error_Msg_Sem
- ("type of a shared variable must be a protected type",
- Decl);
- end if;
-
- -- LRM00 4.3.1.3 Variable declarations
- -- If a given variable appears (directly or indirectly)
- -- within a protected type body, then the base type
- -- denoted by the subtype indication of the variable
- -- declarations must not be a protected type defined by
- -- the protected type body.
- -- FIXME: indirectly ?
- if Is_Protected
- and then Get_Kind (Parent) = Iir_Kind_Protected_Type_Body
- and then Base_Type
- = Get_Protected_Type_Declaration (Parent)
- then
- Error_Msg_Sem
- ("variable type must not be of the protected type body",
- Decl);
- end if;
- end;
- end if;
- Set_Expr_Staticness (Decl, None);
- when others =>
- Error_Kind ("sem_object_declaration", Decl);
- end case;
-
- case Get_Kind (Decl) is
- when Iir_Kind_Constant_Declaration =>
- -- LRM93 §3.2.1.1
- -- For a constant declared by an object declaration, the index
- -- ranges are defined by the initial value, if the subtype of the
- -- constant is unconstrained; otherwise they are defined by this
- -- subtype.
- --if Default_Value = Null_Iir
- -- and then not Sem_Is_Constrained (Atype)
- --then
- -- Error_Msg_Sem ("constant declaration of unconstrained "
- -- & Disp_Node (Atype) & " is not allowed", Decl);
- --end if;
- null;
- --if Deferred_Const = Null_Iir then
- -- Name_Visible (Decl);
- --end if;
-
- when Iir_Kind_Variable_Declaration
- | Iir_Kind_Signal_Declaration =>
- -- LRM93 3.2.1.1 / LRM08 5.3.2.2
- -- For a variable or signal declared by an object declaration, the
- -- subtype indication of the corressponding object declaration
- -- must define a constrained array subtype.
- if not Is_Fully_Constrained_Type (Atype) then
- Error_Msg_Sem
- ("declaration of " & Disp_Node (Decl)
- & " with unconstrained " & Disp_Node (Atype)
- & " is not allowed", Decl);
- if Default_Value /= Null_Iir then
- Error_Msg_Sem ("(even with a default value)", Decl);
- end if;
- end if;
-
- when others =>
- Error_Kind ("sem_object_declaration(2)", Decl);
- end case;
- end Sem_Object_Declaration;
-
- procedure Sem_File_Declaration (Decl: Iir_File_Declaration; Last_Decl : Iir)
- is
- Atype: Iir;
- Logical_Name: Iir;
- Open_Kind : Iir;
- begin
- Sem_Scopes.Add_Name (Decl);
- Set_Expr_Staticness (Decl, None);
- Xref_Decl (Decl);
-
- -- Try to find a type.
- Atype := Get_Subtype_Indication (Decl);
- if Atype /= Null_Iir then
- Atype := Sem_Subtype_Indication (Atype);
- Set_Subtype_Indication (Decl, Atype);
- Atype := Get_Type_Of_Subtype_Indication (Atype);
- if Atype = Null_Iir then
- Atype := Create_Error_Type (Get_Type (Decl));
- end if;
- else
- Atype := Get_Type (Last_Decl);
- end if;
- Set_Type (Decl, Atype);
-
- -- LRM93 4.3.1.4
- -- The subtype indication of a file declaration must define a file
- -- subtype.
- if Get_Kind (Atype) /= Iir_Kind_File_Type_Definition then
- Error_Msg_Sem ("file subtype expected for a file declaration", Decl);
- return;
- end if;
-
- Logical_Name := Get_File_Logical_Name (Decl);
- -- LRM93 4.3.1.4
- -- The file logical name must be an expression of predefined type
- -- STRING.
- if Logical_Name /= Null_Iir then
- Logical_Name := Sem_Expression (Logical_Name, String_Type_Definition);
- if Logical_Name /= Null_Iir then
- Check_Read (Logical_Name);
- Set_File_Logical_Name (Decl, Logical_Name);
- end if;
- end if;
-
- Open_Kind := Get_File_Open_Kind (Decl);
- if Open_Kind /= Null_Iir then
- Open_Kind :=
- Sem_Expression (Open_Kind, File_Open_Kind_Type_Definition);
- if Open_Kind /= Null_Iir then
- Check_Read (Open_Kind);
- Set_File_Open_Kind (Decl, Open_Kind);
- end if;
- else
- -- LRM93 4.3.1.4
- -- If a file open kind expression is not included in the file open
- -- information of a given file declaration, then the default value
- -- of READ_MODE is used during elaboration of the file declaration.
- --
- -- LRM87 4.3.1.4
- -- The default mode is IN, if no mode is specified.
- if Get_Mode (Decl) = Iir_Unknown_Mode then
- if Flags.Vhdl_Std = Vhdl_87 then
- Set_Mode (Decl, Iir_In_Mode);
- else
- null;
- -- Set_File_Open_Kind (Decl, File_Open_Kind_Read_Mode);
- end if;
- end if;
- end if;
- Name_Visible (Decl);
-
- -- LRM 93 2.2
- -- If a pure function is the parent of a given procedure, then
- -- that procedure must not contain a reference to an explicitly
- -- declared file object [...]
- --
- -- A pure function must not contain a reference to an explicitly
- -- declared file.
-
- -- Note: this check is also performed when a file is referenced.
- -- But a file can be declared without being explicitly referenced.
- if Flags.Vhdl_Std > Vhdl_93c then
- declare
- Parent : Iir;
- Spec : Iir;
- begin
- Parent := Get_Parent (Decl);
- case Get_Kind (Parent) is
- when Iir_Kind_Function_Body =>
- Spec := Get_Subprogram_Specification (Parent);
- if Get_Pure_Flag (Spec) then
- Error_Msg_Sem
- ("cannot declare a file in a pure function", Decl);
- end if;
- when Iir_Kind_Procedure_Body =>
- Spec := Get_Subprogram_Specification (Parent);
- Set_Purity_State (Spec, Impure);
- Set_Impure_Depth (Parent, Iir_Depth_Impure);
- when Iir_Kind_Function_Declaration
- | Iir_Kind_Procedure_Declaration =>
- Error_Kind ("sem_file_declaration", Parent);
- when others =>
- null;
- end case;
- end;
- end if;
- end Sem_File_Declaration;
-
- procedure Sem_Attribute_Declaration (Decl: Iir_Attribute_Declaration)
- is
- A_Type : Iir;
- Ident : Name_Id;
- begin
- -- LRM93 4.4
- -- The identifier is said to be the designator of the attribute.
- Ident := Get_Identifier (Decl);
- if Ident in Std_Names.Name_Id_Attributes
- or else (Flags.Vhdl_Std = Vhdl_87
- and then Ident in Std_Names.Name_Id_Vhdl87_Attributes)
- or else (Flags.Vhdl_Std > Vhdl_87
- and then Ident in Std_Names.Name_Id_Vhdl93_Attributes)
- then
- Error_Msg_Sem ("predefined attribute """ & Name_Table.Image (Ident)
- & """ overriden", Decl);
- end if;
- Sem_Scopes.Add_Name (Decl);
- Xref_Decl (Decl);
-
- A_Type := Sem_Type_Mark (Get_Type_Mark (Decl));
- Set_Type_Mark (Decl, A_Type);
- A_Type := Get_Type (A_Type);
- Set_Type (Decl, A_Type);
-
- -- LRM93 4.4 Attribute declarations.
- -- It is an error if the type mark denotes an access type, a file type,
- -- a protected type, or a composite type with a subelement that is
- -- an access type, a file type, or a protected type.
- -- The subtype need not be constrained.
- Check_Signal_Type (Decl);
- Name_Visible (Decl);
- end Sem_Attribute_Declaration;
-
- procedure Sem_Component_Declaration (Component: Iir_Component_Declaration)
- is
- begin
- Sem_Scopes.Add_Name (Component);
- Xref_Decl (Component);
-
- -- LRM 10.1 Declarative region
- -- 6. A component declaration.
- Open_Declarative_Region;
-
- Sem_Interface_Chain
- (Get_Generic_Chain (Component), Generic_Interface_List);
- Sem_Interface_Chain
- (Get_Port_Chain (Component), Port_Interface_List);
-
- Close_Declarative_Region;
-
- Name_Visible (Component);
- end Sem_Component_Declaration;
-
- procedure Sem_Object_Alias_Declaration (Alias: Iir_Object_Alias_Declaration)
- is
- N_Name: constant Iir := Get_Name (Alias);
- N_Type: Iir;
- Name_Type : Iir;
- begin
- -- LRM93 4.3.3.1 Object Aliases.
- -- 1. A signature may not appear in a declaration of an object alias.
- -- FIXME: todo.
- --
- -- 2. The name must be a static name that denotes an object.
- if Get_Name_Staticness (N_Name) < Globally then
- Error_Msg_Sem ("aliased name must be a static name", Alias);
- end if;
-
- -- LRM93 4.3.3.1
- -- The base type of the name specified in an alias declaration must be
- -- the same as the base type of the type mark in the subtype indication
- -- (if the subtype indication is present);
- Name_Type := Get_Type (N_Name);
- N_Type := Get_Subtype_Indication (Alias);
- if N_Type = Null_Iir then
- Set_Type (Alias, Name_Type);
- N_Type := Name_Type;
- else
- -- FIXME: must be analyzed before calling Name_Visibility.
- N_Type := Sem_Subtype_Indication (N_Type);
- Set_Subtype_Indication (Alias, N_Type);
- N_Type := Get_Type_Of_Subtype_Indication (N_Type);
- if N_Type /= Null_Iir then
- Set_Type (Alias, N_Type);
- if Get_Base_Type (N_Type) /= Get_Base_Type (Name_Type) then
- Error_Msg_Sem ("base type of aliased name and name mismatch",
- Alias);
- end if;
- end if;
- end if;
-
- -- LRM93 4.3.3.1
- -- This type must not be a multi-dimensional array type.
- if Get_Kind (N_Type) in Iir_Kinds_Array_Type_Definition then
- if not Is_One_Dimensional_Array_Type (N_Type) then
- Error_Msg_Sem
- ("aliased name must not be a multi-dimensional array type",
- Alias);
- end if;
- if Get_Type_Staticness (N_Type) = Locally
- and then Get_Type_Staticness (Name_Type) = Locally
- and then Eval_Discrete_Type_Length
- (Get_Nth_Element (Get_Index_Subtype_List (N_Type), 0))
- /= Eval_Discrete_Type_Length
- (Get_Nth_Element (Get_Index_Subtype_List (Name_Type), 0))
- then
- Error_Msg_Sem
- ("number of elements not matching in type and name", Alias);
- end if;
- end if;
-
- Set_Name_Staticness (Alias, Get_Name_Staticness (N_Name));
- Set_Expr_Staticness (Alias, Get_Expr_Staticness (N_Name));
- if Is_Signal_Object (N_Name) then
- Set_Type_Has_Signal (N_Type);
- end if;
- end Sem_Object_Alias_Declaration;
-
- function Signature_Match (N_Entity : Iir; Sig : Iir_Signature)
- return Boolean
- is
- List : Iir_List;
- Inter : Iir;
- El : Iir;
- begin
- List := Get_Type_Marks_List (Sig);
- case Get_Kind (N_Entity) is
- when Iir_Kind_Enumeration_Literal =>
- -- LRM93 2.3.2 Signatures
- -- * Similarly, a signature is said to match the parameter and
- -- result type profile of a given enumeration literal if
- -- the signature matches the parameter and result type profile
- -- of the subprogram equivalent to the enumeration literal,
- -- defined in Section 3.1.1
- return List = Null_Iir_List
- and then Get_Type (N_Entity)
- = Get_Type (Get_Return_Type_Mark (Sig));
- when Iir_Kind_Function_Declaration
- | Iir_Kind_Implicit_Function_Declaration =>
- -- LRM93 2.3.2 Signatures
- -- * if the reserved word RETURN is present, the subprogram is
- -- a function and the base type of the type mark following
- -- the reserved word in the signature is the same as the base
- -- type of the return type of the function, [...]
- if Get_Type (Get_Return_Type_Mark (Sig)) /=
- Get_Base_Type (Get_Return_Type (N_Entity))
- then
- return False;
- end if;
- when Iir_Kind_Procedure_Declaration
- | Iir_Kind_Implicit_Procedure_Declaration =>
- -- LRM93 2.3.2 Signatures
- -- * [...] or the reserved word RETURN is absent and the
- -- subprogram is a procedure.
- if Get_Return_Type_Mark (Sig) /= Null_Iir then
- return False;
- end if;
- when others =>
- -- LRM93 2.3.2 Signatures
- -- A signature distinguishes between overloaded subprograms and
- -- overloaded enumeration literals based on their parameter
- -- and result type profiles.
- return False;
- end case;
-
- -- LRM93 2.3.2 Signature
- -- * the number of type marks prior the reserved word RETURN, if any,
- -- matches the number of formal parameters of the subprogram;
- -- * at each parameter position, the base type denoted by the type
- -- mark of the signature is the same as the base type of the
- -- corresponding formal parameter of the subprogram; [and finally, ]
- Inter := Get_Interface_Declaration_Chain (N_Entity);
- if List = Null_Iir_List then
- return Inter = Null_Iir;
- end if;
- for I in Natural loop
- El := Get_Nth_Element (List, I);
- if El = Null_Iir and Inter = Null_Iir then
- return True;
- end if;
- if El = Null_Iir or Inter = Null_Iir then
- return False;
- end if;
- if Get_Base_Type (Get_Type (Inter)) /= Get_Type (El) then
- return False;
- end if;
- Inter := Get_Chain (Inter);
- end loop;
- -- Avoid a spurious warning.
- return False;
- end Signature_Match;
-
- -- Extract from NAME the named entity whose profile matches with SIG.
- function Sem_Signature (Name : Iir; Sig : Iir_Signature) return Iir
- is
- Res : Iir;
- El : Iir;
- List : Iir_List;
- Error : Boolean;
- begin
- -- Sem signature.
- List := Get_Type_Marks_List (Sig);
- if List /= Null_Iir_List then
- for I in Natural loop
- El := Get_Nth_Element (List, I);
- exit when El = Null_Iir;
- El := Sem_Type_Mark (El);
- Replace_Nth_Element (List, I, El);
-
- -- Reuse the Type field of the name for the base type. This is
- -- a deviation from the use of Type in a name, but restricted to
- -- analysis of signatures.
- Set_Type (El, Get_Base_Type (Get_Type (El)));
- end loop;
- end if;
- El := Get_Return_Type_Mark (Sig);
- if El /= Null_Iir then
- El := Sem_Type_Mark (El);
- Set_Return_Type_Mark (Sig, El);
- -- Likewise.
- Set_Type (El, Get_Base_Type (Get_Type (El)));
- end if;
-
- -- FIXME: what to do in case of error ?
- Res := Null_Iir;
- Error := False;
- if Is_Overload_List (Name) then
- for I in Natural loop
- El := Get_Nth_Element (Get_Overload_List (Name), I);
- exit when El = Null_Iir;
- if Signature_Match (El, Sig) then
- if Res = Null_Iir then
- Res := El;
- else
- Error := True;
- Error_Msg_Sem
- ("cannot resolve signature, many matching subprograms:",
- Sig);
- Error_Msg_Sem ("found: " & Disp_Node (Res), Res);
- end if;
- if Error then
- Error_Msg_Sem ("found: " & Disp_Node (El), El);
- end if;
- end if;
- end loop;
-
- -- Free the overload list (with a workaround as only variables can
- -- be free).
- declare
- Name_Ov : Iir;
- begin
- Name_Ov := Name;
- Free_Overload_List (Name_Ov);
- end;
- else
- if Signature_Match (Name, Sig) then
- Res := Name;
- end if;
- end if;
-
- if Error then
- return Null_Iir;
- end if;
- if Res = Null_Iir then
- Error_Msg_Sem
- ("cannot resolve signature, no matching subprogram", Sig);
- end if;
-
- return Res;
- end Sem_Signature;
-
- -- Create implicit aliases for an alias ALIAS of a type or of a subtype.
- procedure Add_Aliases_For_Type_Alias (Alias : Iir)
- is
- N_Entity : constant Iir := Get_Named_Entity (Get_Name (Alias));
- Def : constant Iir := Get_Base_Type (Get_Type (N_Entity));
- Type_Decl : constant Iir := Get_Type_Declarator (Def);
- Last : Iir;
- El : Iir;
- Enum_List : Iir_Enumeration_Literal_List;
-
- -- Append an implicit alias
- procedure Add_Implicit_Alias (Decl : Iir)
- is
- N_Alias : constant Iir_Non_Object_Alias_Declaration :=
- Create_Iir (Iir_Kind_Non_Object_Alias_Declaration);
- N_Name : constant Iir := Create_Iir (Iir_Kind_Simple_Name);
- begin
- -- Create the name (can be in fact a character literal or a symbol
- -- operator).
- Location_Copy (N_Name, Alias);
- Set_Identifier (N_Name, Get_Identifier (Decl));
- Set_Named_Entity (N_Name, Decl);
-
- Location_Copy (N_Alias, Alias);
- Set_Identifier (N_Alias, Get_Identifier (Decl));
- Set_Name (N_Alias, N_Name);
- Set_Parent (N_Alias, Get_Parent (Alias));
- Set_Implicit_Alias_Flag (N_Alias, True);
-
- Sem_Scopes.Add_Name (N_Alias);
- Set_Visible_Flag (N_Alias, True);
-
- -- Append in the declaration chain.
- Set_Chain (N_Alias, Get_Chain (Last));
- Set_Chain (Last, N_Alias);
- Last := N_Alias;
- end Add_Implicit_Alias;
- begin
- Last := Alias;
-
- if Get_Kind (Def) = Iir_Kind_Enumeration_Type_Definition then
- -- LRM93 4.3.3.2 Non-Object Aliases
- -- 3. If the name denotes an enumeration type, then one
- -- implicit alias declaration for each of the
- -- literals of the type immediatly follows the alias
- -- declaration for the enumeration type; [...]
- --
- -- LRM08 6.6.3 Nonobject aliases
- -- c) If the name denotes an enumeration type of a subtype of an
- -- enumeration type, then one implicit alias declaration for each
- -- of the litereals of the base type immediately follows the
- -- alias declaration for the enumeration type; [...]
- Enum_List := Get_Enumeration_Literal_List (Def);
- for I in Natural loop
- El := Get_Nth_Element (Enum_List, I);
- exit when El = Null_Iir;
- -- LRM93 4.3.3.2 Non-Object Aliases
- -- [...] each such implicit declaration has, as its alias
- -- designator, the simple name or character literal of the
- -- literal, and has, as its name, a name constructed by taking
- -- the name of the alias for the enumeration type and
- -- substituting the simple name or character literal being
- -- aliased for the simple name of the type. Each implicit
- -- alias has a signature that matches the parameter and result
- -- type profile of the literal being aliased.
- --
- -- LRM08 6.6.3 Nonobject aliases
- -- [...] each such implicit declaration has, as its alias
- -- designator, the simple name or character literal of the
- -- literal and has, as its name, a name constructed by taking
- -- the name of the alias for the enumeration type or subtype
- -- and substituing the simple name or character literal being
- -- aliased for the simple name of the type or subtype. Each
- -- implicit alias has a signature that matches the parameter
- -- and result type profile of the literal being aliased.
- Add_Implicit_Alias (El);
- end loop;
- end if;
-
- -- LRM93 4.3.3.2 Non-Object Aliases
- -- 4. Alternatively, if the name denotes a physical type
- -- [...]
- -- GHDL: this is not possible, since a physical type is
- -- anonymous (LRM93 is buggy on this point).
- --
- -- LRM08 6.6.3 Nonobject aliases
- -- d) Alternatively, if the name denotes a subtype of a physical type,
- -- [...]
- if Get_Kind (Def) = Iir_Kind_Physical_Type_Definition then
- -- LRM08 6.3.3 Nonobject aliases
- -- [...] then one implicit alias declaration for each of the
- -- units of the base type immediately follows the alias
- -- declaration for the physical type; each such implicit
- -- declaration has, as its alias designator, the simple name of
- -- the unit and has, as its name, a name constructed by taking
- -- the name of the alias for the subtype of the physical type
- -- and substituting the simple name of the unit being aliased for
- -- the simple name of the subtype.
- El := Get_Unit_Chain (Def);
- while El /= Null_Iir loop
- Add_Implicit_Alias (El);
- El := Get_Chain (El);
- end loop;
- end if;
-
- -- LRM93 4.3.3.2 Non-Object Aliases
- -- 5. Finally, if the name denotes a type, then implicit
- -- alias declarations for each predefined operator
- -- for the type immediatly follow the explicit alias
- -- declaration for the type, and if present, any
- -- implicit alias declarations for literals or units
- -- of the type.
- -- Each implicit alias has a signature that matches the
- -- parameter and result type profule of the implicit
- -- operator being aliased.
- --
- -- LRM08 6.6.3 Nonobject aliases
- -- e) Finally, if the name denotes a type of a subtype, then implicit
- -- alias declarations for each predefined operation for the type
- -- immediately follow the explicit alias declaration for the type or
- -- subtype and, if present, any implicit alias declarations for
- -- literals or units of the type. Each implicit alias has a
- -- signature that matches the parameter and result type profile of
- -- the implicit operation being aliased.
- El := Get_Chain (Type_Decl);
- while El /= Null_Iir loop
- case Get_Kind (El) is
- when Iir_Kind_Implicit_Function_Declaration
- | Iir_Kind_Implicit_Procedure_Declaration =>
- exit when Get_Type_Reference (El) /= Type_Decl;
- when others =>
- exit;
- end case;
- Add_Implicit_Alias (El);
- El := Get_Chain (El);
- end loop;
- end Add_Aliases_For_Type_Alias;
-
- procedure Sem_Non_Object_Alias_Declaration
- (Alias : Iir_Non_Object_Alias_Declaration)
- is
- use Std_Names;
- N_Entity : constant Iir := Get_Named_Entity (Get_Name (Alias));
- Id : Name_Id;
- begin
- case Get_Kind (N_Entity) is
- when Iir_Kind_Function_Declaration
- | Iir_Kind_Implicit_Function_Declaration
- | Iir_Kind_Procedure_Declaration
- | Iir_Kind_Implicit_Procedure_Declaration =>
- -- LRM93 4.3.3.2 Non-Object Aliases
- -- 2. A signature is required if the name denotes a subprogram
- -- (including an operator) or enumeration literal.
- if Get_Alias_Signature (Alias) = Null_Iir then
- Error_Msg_Sem ("signature required for subprogram", Alias);
- end if;
- when Iir_Kind_Enumeration_Literal =>
- if Get_Alias_Signature (Alias) = Null_Iir then
- Error_Msg_Sem ("signature required for enumeration literal",
- Alias);
- end if;
- when Iir_Kind_Type_Declaration =>
- Add_Aliases_For_Type_Alias (Alias);
- when Iir_Kind_Subtype_Declaration =>
- -- LRM08 6.6.3 Nonobject aliases
- -- ... or a subtype ...
- if Flags.Vhdl_Std >= Vhdl_08 then
- Add_Aliases_For_Type_Alias (Alias);
- end if;
- when Iir_Kinds_Object_Declaration =>
- raise Internal_Error;
- when Iir_Kind_Attribute_Declaration
- | Iir_Kind_Component_Declaration =>
- null;
- when Iir_Kind_Terminal_Declaration =>
- null;
- when others =>
- Error_Kind ("sem_non_object_alias_declaration", N_Entity);
- end case;
-
- Id := Get_Identifier (Alias);
-
- case Id is
- when Name_Characters =>
- -- LRM 4.3.3 Alias declarations
- -- If the alias designator is a character literal, the
- -- name must denote an enumeration literal.
- if Get_Kind (N_Entity) /= Iir_Kind_Enumeration_Literal then
- Error_Msg_Sem
- ("alias of a character must denote an enumeration literal",
- Alias);
- return;
- end if;
- when Name_Id_Operators
- | Name_Shift_Operators
- | Name_Word_Operators =>
- -- LRM 4.3.3 Alias declarations
- -- If the alias designator is an operator symbol, the
- -- name must denote a function, and that function then
- -- overloads the operator symbol. In this latter case,
- -- the operator symbol and the function both must meet the
- -- requirements of 2.3.1.
- if Get_Kind (N_Entity) not in Iir_Kinds_Function_Declaration then
- Error_Msg_Sem
- ("alias of an operator must denote a function", Alias);
- return;
- end if;
- Check_Operator_Requirements (Id, N_Entity);
- when others =>
- null;
- end case;
- end Sem_Non_Object_Alias_Declaration;
-
- function Sem_Alias_Declaration (Alias : Iir) return Iir
- is
- use Std_Names;
- Name : Iir;
- Sig : Iir_Signature;
- N_Entity : Iir;
- Res : Iir;
- begin
- Xref_Decl (Alias);
-
- Name := Get_Name (Alias);
- if Get_Kind (Name) = Iir_Kind_Signature then
- Sig := Name;
- Name := Get_Signature_Prefix (Sig);
- Sem_Name (Name);
- Set_Signature_Prefix (Sig, Name);
- else
- Sem_Name (Name);
- Sig := Null_Iir;
- end if;
-
- N_Entity := Get_Named_Entity (Name);
- if N_Entity = Error_Mark then
- return Alias;
- end if;
-
- if Is_Overload_List (N_Entity) then
- if Sig = Null_Iir then
- Error_Msg_Sem
- ("signature required for alias of a subprogram", Alias);
- return Alias;
- end if;
- end if;
-
- if Sig /= Null_Iir then
- N_Entity := Sem_Signature (N_Entity, Sig);
- end if;
- if N_Entity = Null_Iir then
- return Alias;
- end if;
-
- Set_Named_Entity (Name, N_Entity);
- Set_Name (Alias, Finish_Sem_Name (Name));
-
- if Is_Object_Name (N_Entity) then
- -- Object alias declaration.
-
- Sem_Scopes.Add_Name (Alias);
- Name_Visible (Alias);
-
- if Sig /= Null_Iir then
- Error_Msg_Sem ("signature not allowed for object alias", Sig);
- end if;
- Sem_Object_Alias_Declaration (Alias);
- return Alias;
- else
- -- Non object alias declaration.
-
- if Get_Type (Alias) /= Null_Iir then
- Error_Msg_Sem
- ("subtype indication not allowed for non-object alias", Alias);
- end if;
- if Get_Subtype_Indication (Alias) /= Null_Iir then
- Error_Msg_Sem
- ("subtype indication shall not appear in a nonobject alias",
- Alias);
- end if;
-
- Res := Create_Iir (Iir_Kind_Non_Object_Alias_Declaration);
- Location_Copy (Res, Alias);
- Set_Parent (Res, Get_Parent (Alias));
- Set_Chain (Res, Get_Chain (Alias));
- Set_Identifier (Res, Get_Identifier (Alias));
- Set_Name (Res, Name);
- Set_Alias_Signature (Res, Sig);
-
- Sem_Scopes.Add_Name (Res);
- Name_Visible (Res);
-
- Free_Iir (Alias);
-
- Sem_Non_Object_Alias_Declaration (Res);
- return Res;
- end if;
- end Sem_Alias_Declaration;
-
- procedure Sem_Group_Template_Declaration
- (Decl : Iir_Group_Template_Declaration)
- is
- begin
- Sem_Scopes.Add_Name (Decl);
- Sem_Scopes.Name_Visible (Decl);
- Xref_Decl (Decl);
- end Sem_Group_Template_Declaration;
-
- procedure Sem_Group_Declaration (Group : Iir_Group_Declaration)
- is
- use Tokens;
-
- Constituent_List : Iir_Group_Constituent_List;
- Template : Iir_Group_Template_Declaration;
- Template_Name : Iir;
- Class, Prev_Class : Token_Type;
- El : Iir;
- El_Name : Iir;
- El_Entity : Iir_Entity_Class;
- begin
- Sem_Scopes.Add_Name (Group);
- Xref_Decl (Group);
-
- Template_Name := Sem_Denoting_Name (Get_Group_Template_Name (Group));
- Set_Group_Template_Name (Group, Template_Name);
- Template := Get_Named_Entity (Template_Name);
- if Get_Kind (Template) /= Iir_Kind_Group_Template_Declaration then
- Error_Class_Match (Template_Name, "group template");
- return;
- end if;
- Constituent_List := Get_Group_Constituent_List (Group);
- El_Entity := Get_Entity_Class_Entry_Chain (Template);
- Prev_Class := Tok_Eof;
- for I in Natural loop
- El := Get_Nth_Element (Constituent_List, I);
- exit when El = Null_Iir;
-
- Sem_Name (El);
-
- if El_Entity = Null_Iir then
- Error_Msg_Sem
- ("too many elements in group constituent list", Group);
- exit;
- end if;
-
- Class := Get_Entity_Class (El_Entity);
- if Class = Tok_Box then
- -- LRM93 4.6
- -- An entity class entry that includes a box (<>) allows zero
- -- or more group constituents to appear in this position in the
- -- corresponding group declaration.
- Class := Prev_Class;
- else
- Prev_Class := Class;
- El_Entity := Get_Chain (El_Entity);
- end if;
-
- El_Name := Get_Named_Entity (El);
- if Is_Error (El_Name) then
- null;
- elsif Is_Overload_List (El_Name) then
- Error_Overload (El_Name);
- else
- El := Finish_Sem_Name (El);
- Replace_Nth_Element (Constituent_List, I, El);
- El_Name := Get_Named_Entity (El);
-
- -- LRM93 4.7
- -- It is an error if the class of any group constituent in the
- -- group constituent list is not the same as the class specified
- -- by the corresponding entity class entry in the entity class
- -- entry list of the group template.
- if Get_Entity_Class_Kind (El_Name) /= Class then
- Error_Msg_Sem
- ("constituent not of class '" & Tokens.Image (Class) & ''',
- El);
- end if;
- end if;
- end loop;
-
- -- End of entity_class list reached or zero or more constituent allowed.
- if not (El_Entity = Null_Iir
- or else Get_Entity_Class (El_Entity) = Tok_Box)
- then
- Error_Msg_Sem
- ("not enough elements in group constituent list", Group);
- end if;
- Set_Visible_Flag (Group, True);
- end Sem_Group_Declaration;
-
- function Sem_Scalar_Nature_Definition (Def : Iir; Decl : Iir) return Iir
- is
- function Sem_Scalar_Nature_Typemark (T : Iir; Name : String) return Iir
- is
- Res : Iir;
- begin
- Res := Sem_Type_Mark (T);
- Res := Get_Type (Res);
- if Is_Error (Res) then
- return Real_Type_Definition;
- end if;
- -- LRM93 3.5.1
- -- The type marks must denote floating point types
- case Get_Kind (Res) is
- when Iir_Kind_Floating_Subtype_Definition
- | Iir_Kind_Floating_Type_Definition =>
- return Res;
- when others =>
- Error_Msg_Sem (Name & "type must be a floating point type", T);
- return Real_Type_Definition;
- end case;
- end Sem_Scalar_Nature_Typemark;
-
- Tm : Iir;
- Ref : Iir;
- begin
- Tm := Get_Across_Type (Def);
- Tm := Sem_Scalar_Nature_Typemark (Tm, "across");
- Set_Across_Type (Def, Tm);
-
- Tm := Get_Through_Type (Def);
- Tm := Sem_Scalar_Nature_Typemark (Tm, "through");
- Set_Through_Type (Def, Tm);
-
- -- Declare the reference
- Ref := Get_Reference (Def);
- Set_Nature (Ref, Def);
- Set_Chain (Ref, Get_Chain (Decl));
- Set_Chain (Decl, Ref);
-
- return Def;
- end Sem_Scalar_Nature_Definition;
-
- function Sem_Nature_Definition (Def : Iir; Decl : Iir) return Iir
- is
- begin
- case Get_Kind (Def) is
- when Iir_Kind_Scalar_Nature_Definition =>
- return Sem_Scalar_Nature_Definition (Def, Decl);
- when others =>
- Error_Kind ("sem_nature_definition", Def);
- return Null_Iir;
- end case;
- end Sem_Nature_Definition;
-
- procedure Sem_Nature_Declaration (Decl : Iir)
- is
- Def : Iir;
- begin
- Def := Get_Nature (Decl);
- if Def /= Null_Iir then
- Sem_Scopes.Add_Name (Decl);
- Xref_Decl (Decl);
-
- Def := Sem_Nature_Definition (Def, Decl);
- if Def /= Null_Iir then
- Set_Nature_Declarator (Def, Decl);
- Sem_Scopes.Name_Visible (Decl);
- end if;
- end if;
- end Sem_Nature_Declaration;
-
- procedure Sem_Terminal_Declaration (Decl : Iir; Last_Decl : Iir)
- is
- Def, Nature : Iir;
- begin
- Sem_Scopes.Add_Name (Decl);
- Xref_Decl (Decl);
-
- Def := Get_Nature (Decl);
-
- if Def = Null_Iir then
- Nature := Get_Nature (Last_Decl);
- else
- Nature := Sem_Subnature_Indication (Def);
- end if;
-
- if Nature /= Null_Iir then
- Set_Nature (Decl, Nature);
- Sem_Scopes.Name_Visible (Decl);
- end if;
- end Sem_Terminal_Declaration;
-
- procedure Sem_Branch_Quantity_Declaration (Decl : Iir; Last_Decl : Iir)
- is
- Plus_Name : Iir;
- Minus_Name : Iir;
- Branch_Type : Iir;
- Value : Iir;
- Is_Second : Boolean;
- begin
- Sem_Scopes.Add_Name (Decl);
- Xref_Decl (Decl);
-
- Plus_Name := Get_Plus_Terminal (Decl);
- if Plus_Name = Null_Iir then
- -- List of identifier.
- Is_Second := True;
- Plus_Name := Get_Plus_Terminal (Last_Decl);
- Minus_Name := Get_Minus_Terminal (Last_Decl);
- Value := Get_Default_Value (Last_Decl);
- else
- Is_Second := False;
- Plus_Name := Sem_Terminal_Name (Plus_Name);
- Minus_Name := Get_Minus_Terminal (Decl);
- if Minus_Name /= Null_Iir then
- Minus_Name := Sem_Terminal_Name (Minus_Name);
- end if;
- Value := Get_Default_Value (Decl);
- end if;
- Set_Plus_Terminal (Decl, Plus_Name);
- Set_Minus_Terminal (Decl, Minus_Name);
- case Get_Kind (Decl) is
- when Iir_Kind_Across_Quantity_Declaration =>
- Branch_Type := Get_Across_Type (Get_Nature (Plus_Name));
- when Iir_Kind_Through_Quantity_Declaration =>
- Branch_Type := Get_Through_Type (Get_Nature (Plus_Name));
- when others =>
- raise Program_Error;
- end case;
- Set_Type (Decl, Branch_Type);
-
- if not Is_Second and then Value /= Null_Iir then
- Value := Sem_Expression (Value, Branch_Type);
- end if;
- Set_Default_Value (Decl, Value);
-
- -- TODO: tolerance
-
- Sem_Scopes.Name_Visible (Decl);
- end Sem_Branch_Quantity_Declaration;
-
- procedure Sem_Declaration_Chain (Parent : Iir)
- is
- Decl: Iir;
- Last_Decl : Iir;
- Attr_Spec_Chain : Iir;
-
- -- Used for list of identifiers in object declarations to get the type
- -- and default value for the following declarations.
- Last_Obj_Decl : Iir;
-
- -- If IS_GLOBAL is set, then declarations may be seen outside of unit.
- -- This must be set for entities and packages (except when
- -- Flags.Flag_Whole_Analyze is set).
- Is_Global : Boolean;
- begin
- case Get_Kind (Parent) is
- when Iir_Kind_Entity_Declaration
- | Iir_Kind_Package_Declaration =>
- Is_Global := not Flags.Flag_Whole_Analyze;
- when others =>
- Is_Global := False;
- end case;
-
- -- Due to implicit declarations, the list can grow during sem.
- Decl := Get_Declaration_Chain (Parent);
- Last_Decl := Null_Iir;
- Attr_Spec_Chain := Null_Iir;
- Last_Obj_Decl := Null_Iir;
-
- while Decl /= Null_Iir loop
- case Get_Kind (Decl) is
- when Iir_Kind_Type_Declaration
- | Iir_Kind_Anonymous_Type_Declaration =>
- Sem_Type_Declaration (Decl, Is_Global);
- when Iir_Kind_Subtype_Declaration =>
- Sem_Subtype_Declaration (Decl, Is_Global);
- when Iir_Kind_Signal_Declaration =>
- Sem_Object_Declaration (Decl, Parent, Last_Obj_Decl);
- Last_Obj_Decl := Decl;
- when Iir_Kind_Constant_Declaration =>
- Sem_Object_Declaration (Decl, Parent, Last_Obj_Decl);
- Last_Obj_Decl := Decl;
- when Iir_Kind_Variable_Declaration =>
- Sem_Object_Declaration (Decl, Parent, Last_Obj_Decl);
- Last_Obj_Decl := Decl;
- when Iir_Kind_File_Declaration =>
- Sem_File_Declaration (Decl, Last_Obj_Decl);
- Last_Obj_Decl := Decl;
- when Iir_Kind_Attribute_Declaration =>
- Sem_Attribute_Declaration (Decl);
- when Iir_Kind_Attribute_Specification =>
- Sem_Attribute_Specification (Decl, Parent);
- if Get_Entity_Name_List (Decl) in Iir_Lists_All_Others then
- Set_Attribute_Specification_Chain (Decl, Attr_Spec_Chain);
- Attr_Spec_Chain := Decl;
- end if;
- when Iir_Kind_Component_Declaration =>
- Sem_Component_Declaration (Decl);
- when Iir_Kind_Function_Declaration =>
- Sem_Subprogram_Declaration (Decl);
- if Is_Global
- and then Is_A_Resolution_Function (Decl, Null_Iir)
- then
- Set_Resolution_Function_Flag (Decl, True);
- end if;
- when Iir_Kind_Procedure_Declaration =>
- Sem_Subprogram_Declaration (Decl);
- when Iir_Kind_Function_Body
- | Iir_Kind_Procedure_Body =>
- Sem_Subprogram_Body (Decl);
- when Iir_Kind_Implicit_Function_Declaration
- | Iir_Kind_Implicit_Procedure_Declaration =>
- Sem_Scopes.Add_Name (Decl);
- -- Implicit subprogram are already visible.
- when Iir_Kind_Non_Object_Alias_Declaration =>
- -- Added by Sem_Alias_Declaration. Need to check that no
- -- existing attribute specification apply to them.
- null;
- when Iir_Kind_Object_Alias_Declaration =>
- declare
- Res : Iir;
- begin
- Res := Sem_Alias_Declaration (Decl);
- if Res /= Decl then
- -- Replace DECL with RES.
- if Last_Decl = Null_Iir then
- Set_Declaration_Chain (Parent, Res);
- else
- Set_Chain (Last_Decl, Res);
- end if;
- Decl := Res;
-
- -- An alias may add new alias declarations. Do not skip
- -- them: check that no existing attribute specifications
- -- apply to them.
- end if;
- end;
- when Iir_Kind_Use_Clause =>
- Sem_Use_Clause (Decl);
- when Iir_Kind_Configuration_Specification =>
- null;
- when Iir_Kind_Disconnection_Specification =>
- Sem_Disconnection_Specification (Decl);
- when Iir_Kind_Group_Template_Declaration =>
- Sem_Group_Template_Declaration (Decl);
- when Iir_Kind_Group_Declaration =>
- Sem_Group_Declaration (Decl);
- when Iir_Kinds_Signal_Attribute =>
- -- Added by sem, so nothing to do.
- null;
- when Iir_Kind_Protected_Type_Body =>
- Sem_Protected_Type_Body (Decl);
- when Iir_Kind_Nature_Declaration =>
- Sem_Nature_Declaration (Decl);
- when Iir_Kind_Terminal_Declaration =>
- Sem_Terminal_Declaration (Decl, Last_Obj_Decl);
- Last_Obj_Decl := Decl;
- when Iir_Kind_Across_Quantity_Declaration
- | Iir_Kind_Through_Quantity_Declaration =>
- Sem_Branch_Quantity_Declaration (Decl, Last_Obj_Decl);
- Last_Obj_Decl := Decl;
- when others =>
- Error_Kind ("sem_declaration_chain", Decl);
- end case;
- if Attr_Spec_Chain /= Null_Iir then
- Check_Post_Attribute_Specification (Attr_Spec_Chain, Decl);
- end if;
- Last_Decl := Decl;
- Decl := Get_Chain (Decl);
- end loop;
- end Sem_Declaration_Chain;
-
- procedure Check_Full_Declaration (Decls_Parent : Iir; Decl: Iir)
- is
- El: Iir;
-
- -- If set, emit a warning if a declaration is not used.
- Check_Unused : Boolean;
- begin
- -- LRM 3.5 Protected types.
- -- Each protected type declaration appearing immediatly within a given
- -- declaration region must have exactly one corresponding protected type
- -- body appearing immediatly within the same declarative region and
- -- textually subsequent to the protected type declaration.
-
- -- LRM 3.3.1 Incomplete type declarations
- -- For each incomplete type declaration, there must be a corresponding
- -- full type declaration with the same identifier. This full type
- -- declaration must occur later and immediatly within the same
- -- declarative part as the incomplete type declaration to which it
- -- correspinds.
-
- -- LRM 4.3.1.1 Constant declarations
- -- If the assignment symbol ":=" followed by an expression is not
- -- present in a constant declaration, then the declaration declares a
- -- deferred constant. Such a constant declaration must appear in a
- -- package declaration. The corresponding full constant declaration,
- -- which defines the value of the constant, must appear in the body of
- -- the package (see 2.6).
-
- -- LRM 2.2 Subprogram bodies
- -- If both a declaration and a body are given, [...]. Furthermore,
- -- both the declaration and the body must occur immediatly within the
- -- same declaration region.
-
- -- Set Check_Unused.
- Check_Unused := False;
- if Flags.Warn_Unused then
- case Get_Kind (Decl) is
- when Iir_Kind_Entity_Declaration =>
- -- May be used in architecture.
- null;
- when Iir_Kind_Architecture_Body
- | Iir_Kind_Block_Statement
- | Iir_Kind_Generate_Statement =>
- -- Might be used in a configuration.
- -- FIXME: create a second level of warning.
- null;
- when Iir_Kind_Package_Body
- | Iir_Kind_Protected_Type_Body =>
- -- Check only for declarations of the body.
- if Decls_Parent = Decl then
- Check_Unused := True;
- end if;
- when Iir_Kind_Function_Body
- | Iir_Kind_Procedure_Body
- | Iir_Kind_Process_Statement
- | Iir_Kind_Sensitized_Process_Statement =>
- Check_Unused := True;
- when others =>
- -- Note: Check_Full_Declaration is not called
- -- for package declarations or protected type declarations.
- Error_Kind ("check_full_declaration", Decl);
- end case;
- end if;
-
- El := Get_Declaration_Chain (Decls_Parent);
- while El /= Null_Iir loop
- case Get_Kind (El) is
- when Iir_Kind_Constant_Declaration =>
- if Get_Deferred_Declaration_Flag (El) then
- if Get_Deferred_Declaration (El) = Null_Iir then
- Error_Msg_Sem ("missing value for constant declared at "
- & Disp_Location (El), Decl);
- else
- -- Remove from visibility the full declaration of the
- -- constant.
- -- FIXME: this is not a check!
- Set_Deferred_Declaration (El, Null_Iir);
- end if;
- end if;
- when Iir_Kind_Function_Declaration
- | Iir_Kind_Procedure_Declaration =>
- if Get_Subprogram_Body (El) = Null_Iir then
- Error_Msg_Sem ("missing body for " & Disp_Node (El)
- & " declared at "
- & Disp_Location (El), Decl);
- end if;
- when Iir_Kind_Type_Declaration =>
- declare
- Def : Iir;
- begin
- Def := Get_Type_Definition (El);
- if Get_Kind (Def) = Iir_Kind_Incomplete_Type_Definition
- and then Get_Type_Declarator (Def) = El
- then
- Error_Msg_Sem ("missing full type declaration for "
- & Disp_Node (El), El);
- elsif Get_Kind (Def) = Iir_Kind_Protected_Type_Declaration
- and then Get_Protected_Type_Body (Def) = Null_Iir
- then
- Error_Msg_Sem ("missing protected type body for "
- & Disp_Node (El), El);
- end if;
- end;
- when others =>
- null;
- end case;
-
- if Check_Unused then
- -- All subprograms declared in the specification (package or
- -- protected type) have only their *body* in the body.
- -- Therefore, they don't appear as declaration in body.
- -- Only private subprograms appears as declarations.
- case Get_Kind (El) is
- when Iir_Kind_Function_Declaration
- | Iir_Kind_Procedure_Declaration =>
- if not Get_Use_Flag (El)
- and then not Is_Second_Subprogram_Specification (El)
- then
- Warning_Msg_Sem
- (Disp_Node (El) & " is never referenced", El);
- end if;
- when others =>
- null;
- end case;
- end if;
-
- El := Get_Chain (El);
- end loop;
- end Check_Full_Declaration;
-
- procedure Sem_Iterator (Iterator : Iir_Iterator_Declaration;
- Staticness : Iir_Staticness)
- is
- It_Range: constant Iir := Get_Discrete_Range (Iterator);
- It_Type : Iir;
- A_Range: Iir;
- begin
- Xref_Decl (Iterator);
-
- A_Range := Sem_Discrete_Range_Integer (It_Range);
- if A_Range = Null_Iir then
- Set_Type (Iterator, Create_Error_Type (It_Range));
- return;
- end if;
-
- Set_Discrete_Range (Iterator, A_Range);
-
- It_Type := Range_To_Subtype_Indication (A_Range);
- Set_Subtype_Indication (Iterator, It_Type);
- Set_Type (Iterator, Get_Type_Of_Subtype_Indication (It_Type));
-
- Set_Expr_Staticness (Iterator, Staticness);
- end Sem_Iterator;
-end Sem_Decls;