aboutsummaryrefslogtreecommitdiffstats
path: root/src/vhdl/vhdl-sem_expr.ads
diff options
context:
space:
mode:
authorTristan Gingold <tgingold@free.fr>2019-05-05 07:18:49 +0200
committerTristan Gingold <tgingold@free.fr>2019-05-05 08:05:10 +0200
commit53fcf00d88d1a3b34c7833aa4c421ea52f3e03dd (patch)
tree1d54f41e948b16a5ff6ad0cedafccf978a13bd89 /src/vhdl/vhdl-sem_expr.ads
parentd1f0fedf7882cf1b15ea6450da5bbd878d007a98 (diff)
downloadghdl-53fcf00d88d1a3b34c7833aa4c421ea52f3e03dd.tar.gz
ghdl-53fcf00d88d1a3b34c7833aa4c421ea52f3e03dd.tar.bz2
ghdl-53fcf00d88d1a3b34c7833aa4c421ea52f3e03dd.zip
vhdl: move sem* packages to vhdl children.
Diffstat (limited to 'src/vhdl/vhdl-sem_expr.ads')
-rw-r--r--src/vhdl/vhdl-sem_expr.ads270
1 files changed, 270 insertions, 0 deletions
diff --git a/src/vhdl/vhdl-sem_expr.ads b/src/vhdl/vhdl-sem_expr.ads
new file mode 100644
index 000000000..4e96aa5be
--- /dev/null
+++ b/src/vhdl/vhdl-sem_expr.ads
@@ -0,0 +1,270 @@
+-- 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 Ada.Unchecked_Deallocation;
+with Types; use Types;
+with Iirs; use Iirs;
+
+package Vhdl.Sem_Expr is
+ -- Set semantic to EXPR.
+ -- Replace simple_name with the referenced node,
+ -- Set type to nodes,
+ -- Resolve overloading
+
+ Deferred_Constant_Allowed : Boolean := False;
+
+ -- Analyze an expression (other than a range) with a possible overloading.
+ -- Sem_expression_ov (and therefore sem_expression) must be called *once*
+ -- for each expression node with A_TYPE1 not null and at most *once* with
+ -- A_TYPE1 null.
+ --
+ -- When A_TYPE1 is null, sem_expression_ov find all possible types
+ -- of the expression. If there is only one possible type (ie, overloading
+ -- is non-existant or solved), then the type of the expression is set,
+ -- and the node is completly analyzed. Sem_expression_ov must not
+ -- be called for such a node.
+ -- If there is several possible types (ie overloaded), then the type is
+ -- set with a list of overload. To finishes the semantisation,
+ -- sem_expression_ov must be called again with A_TYPE1 set to the
+ -- expected type.
+ --
+ -- If A_TYPE1 is set, sem_expression_ov must finishes the analyze of the
+ -- expression, and set its type, which is not necessary a base type.
+ -- A_TYPE1 must be a base type.
+ --
+ -- In case of error, it displays a message and return null_iir.
+ -- In case of success, it returns the analyzed expression, which can
+ -- be different from EXPR (eg, a character literal is transformed into an
+ -- enumeration literal).
+ function Sem_Expression_Ov (Expr: Iir; A_Type1: Iir) return Iir;
+
+ -- If A_TYPE is not null, then EXPR must be of type A_TYPE.
+ -- Return null in case of error.
+ function Sem_Expression (Expr: Iir; A_Type: Iir) return Iir;
+
+ -- Same as Sem_Expression, but also implicitly choose an universal type
+ -- if overloaded.
+ function Sem_Expression_Universal (Expr : Iir) return Iir;
+
+ -- Same as Sem_Expression but specialized for a case expression.
+ -- (Handle specific overloading rules).
+ function Sem_Case_Expression (Expr : Iir) return Iir;
+
+ -- Sem COND as a condition. COND must have not been analyzed.
+ -- In VHDL08, this follows 9.2.9 Condition operator.
+ -- In VHDL87 and 93, type of COND must be a boolean.
+ -- A check is made that COND can be read.
+ function Sem_Condition (Cond : Iir) return Iir;
+
+ -- Insert a call to condition operator.
+ function Insert_Condition_Operator (Cond : Iir) return Iir;
+
+ -- Same as Sem_Expression but knowing that the type of EXPR must be a
+ -- composite type. Used for expressions in assignment statement when the
+ -- target is an aggregate.
+ function Sem_Composite_Expression (Expr : Iir) return Iir;
+
+ -- Return True iif INTER is allowed to be read. Follow rules of
+ -- LRM08 6.5.2 Interface object declarations.
+ function Can_Interface_Be_Read (Inter : Iir) return Boolean;
+
+ -- Return True iif INTER is allowed to be updated. Follow rules of
+ -- LRM08 6.5.2 Interface object declarations.
+ function Can_Interface_Be_Updated (Inter : Iir) return Boolean;
+
+ -- Check EXPR can be read.
+ procedure Check_Read (Expr : Iir);
+
+ -- Check EXPR can be updated.
+ procedure Check_Update (Expr : Iir);
+
+ -- For a procedure call, A_TYPE must be null.
+ function Sem_Subprogram_Call (Expr: Iir; A_Type: Iir) return Iir;
+
+ -- If EXPR is a node for an expression, then return EXPR.
+ -- Otherwise, emit an error message using LOC as location
+ -- and return NULL_IIR.
+ -- If EXPR is NULL_IIR, NULL_IIR is silently returned.
+ function Check_Is_Expression (Expr : Iir; Loc : Iir) return Iir;
+
+ -- Analyze a procedure_call or a concurrent_procedure_call_statement.
+ -- A procedure call is not an expression but because most of the code
+ -- for procedure call is common with function call, procedure calls are
+ -- handled in this package.
+ procedure Sem_Procedure_Call (Call : Iir_Procedure_Call; Stmt : Iir);
+
+ -- Analyze a range (ie a range attribute or a range expression). If
+ -- ANY_DIR is true, the range can't be a null range (slice vs subtype,
+ -- used in static evaluation). A_TYPE may be Null_Iir.
+ -- Return Null_Iir in case of error, or EXPR analyzed (and evaluated if
+ -- possible).
+ function Sem_Range_Expression (Expr: Iir; A_Type: Iir; Any_Dir : Boolean)
+ return Iir;
+
+ -- Analyze a discrete range. If ANY_DIR is true, the range can't be a
+ -- null range (slice vs subtype -- used in static evaluation). A_TYPE may
+ -- be Null_Iir. Return Null_Iir in case of error.
+ function Sem_Discrete_Range_Expression
+ (Expr: Iir; A_Type: Iir; Any_Dir: Boolean) return Iir;
+
+ -- Analyze a discrete range and convert to integer if both bounds are
+ -- universal integer types, according to rules of LRM 3.2.1.1
+ function Sem_Discrete_Range_Integer (Expr: Iir) return Iir;
+
+ -- Transform LIT into a physical_literal.
+ -- LIT can be either a not analyzed physical literal or
+ -- a simple name that is a physical unit. In the later case, a physical
+ -- literal is created.
+ function Sem_Physical_Literal (Lit: Iir) return Iir;
+
+ type Annex_Array is array (Natural range <>) of Int32;
+ type Annex_Array_Acc is access Annex_Array;
+ procedure Free_Annex_Array is new Ada.Unchecked_Deallocation
+ (Annex_Array, Annex_Array_Acc);
+
+ -- Various info and sorted array for choices.
+ type Choice_Info_Type is record
+ -- Number of choices by expression or by range.
+ Nbr_Choices : Natural;
+
+ -- Number of alternatives
+ Nbr_Alternatives : Natural;
+
+ -- Set to the others choice is present.
+ Others_Choice : Iir;
+
+ -- Array of sorted choices.
+ Arr : Iir_Array_Acc;
+
+ -- Allocated and deallocated by the user. If not null, it will be
+ -- reordered when ARR is sorted.
+ Annex_Arr : Annex_Array_Acc;
+ end record;
+
+ -- Compute the number of locally static choices (excluding others) and
+ -- set Has_Others.
+ procedure Count_Choices (Info : out Choice_Info_Type; Choice_Chain : Iir);
+
+ -- Allocate and fill INFO.ARR.
+ procedure Fill_Choices_Array (Info : in out Choice_Info_Type;
+ Choice_Chain : Iir);
+
+ -- Sort INFO.ARR. Only for one-dimensional strings.
+ procedure Sort_String_Choices (Info : in out Choice_Info_Type);
+
+ -- Likewise for discrete choices.
+ procedure Sort_Discrete_Choices (Info : in out Choice_Info_Type);
+
+ -- CHOICES_CHAIN is a chain of choices (none, expression, range or
+ -- others). It is an in-out as it may be mutated (from expression to
+ -- range).
+ -- If IS_SUB_RANGE is true, then SUB_TYPE may not be fully convered,
+ -- otherwise, SUB_TYPE must be fully covered.
+ -- This is used when the subtype of an aggregate must be determined.
+ -- SUB_TYPE is the discrete subtype.
+ -- Emit a message if:
+ -- * the SUB_TYPE is not fully covered by the choices
+ -- * the choices are not mutually exclusif (an element is present twice)
+ -- * OTHERS is not the last choice, or is present several times.
+ --
+ -- If there is at least one named choice, LOW and HIGH are set with the
+ -- lowest and highest index.
+ -- If LOW and HIGH are set, they are locally static.
+ --
+ -- Unidimensional strings are not handled here but by
+ -- sem_string_choices_range.
+ --
+ -- TODO:
+ -- * be smarter if only positional choices (do not create the list).
+ -- * smarter messages.
+ procedure Sem_Choices_Range (Choice_Chain : in out Iir;
+ Choice_Type : Iir;
+ Low : out Iir;
+ High : out Iir;
+ Loc : Location_Type;
+ Is_Sub_Range : Boolean;
+ Is_Case_Stmt : Boolean);
+
+ -- Check that the values of CHOICE_CHAIN are a continuous range, and
+ -- extract the lower LOW and upper HIGH bound (useful to create the
+ -- corresponding subtype). The values must be of type SUB_TYPE, and if
+ -- IS_SUB_RANGE True, they must be within SUB_TYPE.
+ -- The choices must be locally static.
+ -- If REORDER_CHOICES is true, CHOICE_CHAIN is ordered.
+ procedure Sem_Check_Continuous_Choices (Choice_Chain : Iir;
+ Choice_Type : Iir;
+ Low : out Iir;
+ High : out Iir;
+ Loc : Location_Type;
+ Is_Sub_Range : Boolean);
+
+ -- Analyze CHOICE_LIST when the choice expression SEL is of a
+ -- one-dimensional character array type.
+ procedure Sem_String_Choices_Range (Choice_Chain : Iir; Sel : Iir);
+
+ type Compatibility_Level is
+ (Not_Compatible, Via_Conversion, Fully_Compatible);
+
+ -- LEFT are RIGHT must be really a type (not a subtype).
+ function Are_Basetypes_Compatible (Left: Iir; Right: Iir)
+ return Compatibility_Level;
+
+ -- Return TRUE iif types of LEFT and RIGHT are compatible.
+ function Are_Nodes_Compatible (Left: Iir; Right: Iir)
+ return Compatibility_Level;
+
+ -- Return TRUE iff the type of EXPR is compatible with A_TYPE
+ function Is_Expr_Compatible (A_Type : Iir; Expr : Iir)
+ return Compatibility_Level;
+
+ -- LIST1, LIST2 are either a type node or an overload list of types.
+ -- Return THE type which is compatible with LIST1 are LIST2.
+ -- Return null_iir if there is no such type or if there are several types.
+ function Search_Compatible_Type (List1, List2 : Iir) return Iir;
+
+ -- Return the intersection of LIST1 and LIST2.
+ -- This function accept wildcard types.
+ function Compatible_Types_Intersect (List1, List2 : Iir) return Iir;
+
+ -- Return True if an expression is not analyzed (its type is not set).
+ -- All expressions from the parser are not analyzed.
+ function Is_Expr_Not_Analyzed (Expr : Iir) return Boolean;
+ pragma Inline (Is_Expr_Not_Analyzed);
+
+ -- Return True if an expression is fully analyzed: its type is set to
+ -- either a type definition, or to an error type.
+ -- Some expressions can be partially analyzed: either set to an overload
+ -- list or to a wildcard type.
+ function Is_Expr_Fully_Analyzed (Expr : Iir) return Boolean;
+ pragma Inline (Is_Expr_Fully_Analyzed);
+
+ -- Analyze EXPR using ATYPE.
+ -- If EXPR is not analyzed, EXPR is analyzed using type constraints from
+ -- ATYPE.
+ -- If ATYPE is a defined type (neither an overload list nor a wildcard
+ -- type), EXPR will be fully analyzed (possibly with an error).
+ -- If EXPR is partially or fully analyzed, ATYPE must not be null_iir and
+ -- it is checked with the types of EXPR. EXPR may become fully analyzed.
+ function Sem_Expression_Wildcard
+ (Expr : Iir; Atype : Iir; Force_Constrained : Boolean := False)
+ return Iir;
+
+ -- To be used after Sem_Expression_Wildcard to update list ATYPE of
+ -- possible types.
+ procedure Merge_Wildcard_Type (Expr : Iir; Atype : in out Iir);
+end Vhdl.Sem_Expr;