1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
-- Evaluation of static expressions.
-- 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 Types; use Types;
with Iirs; use Iirs;
package Evaluation is
-- Get the value of a physical integer literal or unit.
function Get_Physical_Value (Expr : Iir) return Iir_Int64;
-- Evaluate (ie compute) expression EXPR.
-- EXPR is required to be a locally static expression, otherwise an error
-- message is generated.
-- The result is a literal.
function Eval_Expr (Expr: Iir) return Iir;
-- Same as Eval_Expr, but do not check that EXPR is locally static.
-- May be used instead of Eval_Expr if you know than EXPR is locally
-- static, or for literals of type std.time.
function Eval_Static_Expr (Expr: Iir) return Iir;
-- Same as Eval_Expr, but if EXPR is not locally static, the result is
-- EXPR. Also, if EXPR is null_iir, then null_iir is returned.
-- The purpose of this function is to evaluate an expression only if it
-- is locally static.
function Eval_Expr_If_Static (Expr : Iir) return Iir;
-- Return TRUE if literal EXPR is in SUB_TYPE bounds.
function Eval_Is_In_Bound (Expr : Iir; Sub_Type : Iir) return Boolean;
-- Emit an error if EXPR violates SUB_TYPE bounds.
procedure Eval_Check_Bound (Expr : Iir; Sub_Type : Iir);
-- Return TRUE if range expression A_RANGE is not included in SUB_TYPE.
function Eval_Is_Range_In_Bound
(A_Range : Iir; Sub_Type : Iir; Any_Dir : Boolean)
return Boolean;
-- Emit an error if A_RANGE is not included in SUB_TYPE.
procedure Eval_Check_Range (A_Range : Iir; Sub_Type : Iir;
Any_Dir : Boolean);
-- Same as Eval_Expr, but a range check with SUB_TYPE is performed after
-- computation.
function Eval_Expr_Check (Expr : Iir; Sub_Type : Iir) return Iir;
-- Call Eval_Expr_Check only if EXPR is static.
function Eval_Expr_Check_If_Static (Expr : Iir; Atype : Iir) return Iir;
-- Return TRUE iff VAL belongs to BOUND.
function Eval_Int_In_Range (Val : Iir_Int64; Bound : Iir) return Boolean;
-- Return the length of the discrete range CONSTRAINT.
function Eval_Discrete_Range_Length (Constraint : Iir) return Iir_Int64;
-- Return the length of SUB_TYPE.
function Eval_Discrete_Type_Length (Sub_Type : Iir) return Iir_Int64;
-- Get the left bound of a range constraint.
-- Note: the range constraint may be an attribute or a subtype.
function Eval_Discrete_Range_Left (Constraint : Iir) return Iir;
-- Return the range_expression of RNG, which is a range or a subtype.
-- Return NULL_IIR if the range constraint is not a range_expression.
function Eval_Range (Rng : Iir) return Iir;
-- Return the position of EXPR, ie the result of sub_type'pos (EXPR), where
-- sub_type is the type of expr.
-- EXPR must be of a discrete subtype.
function Eval_Pos (Expr : Iir) return Iir_Int64;
-- Create an array subtype from LEN and BASE_TYPE, according to rules
-- of LRM93 7.3.2.2. (which are the same as LRM93 7.2.4).
function Create_Unidim_Array_By_Length
(Base_Type : Iir; Len : Iir_Int64; Loc : Iir)
return Iir_Array_Subtype_Definition;
-- Create a subtype of A_TYPE whose length is LEN.
-- This is used to create subtypes for strings or aggregates.
function Create_Range_Subtype_By_Length
(A_Type : Iir; Len : Iir_Int64; Loc : Location_Type)
return Iir;
-- Store into NAME_BUFFER,NAME_LENGTH the simple name, character literal
-- or operator sumbol of ID, using the same format as SIMPLE_NAME
-- attribute.
procedure Eval_Simple_Name (Id : Name_Id);
-- Compare two string literals (of same length).
type Compare_Type is (Compare_Lt, Compare_Eq, Compare_Gt);
function Compare_String_Literals (L, R : Iir) return Compare_Type;
-- Return the local part of 'Instance_Name or 'Path_Name.
type Path_Instance_Name_Type (Len : Natural) is record
-- The node before suffix (entity, architecture or generate iterator).
Path_Instance : Iir;
-- The suffix
Suffix : String (1 .. Len);
end record;
function Get_Path_Instance_Name_Suffix (Attr : Iir)
return Path_Instance_Name_Type;
end Evaluation;
|