diff options
Diffstat (limited to 'src/synth/synth-vhdl_expr.ads')
-rw-r--r-- | src/synth/synth-vhdl_expr.ads | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/src/synth/synth-vhdl_expr.ads b/src/synth/synth-vhdl_expr.ads new file mode 100644 index 000000000..c6726732e --- /dev/null +++ b/src/synth/synth-vhdl_expr.ads @@ -0,0 +1,152 @@ +-- Expressions synthesis. +-- Copyright (C) 2017 Tristan Gingold +-- +-- This file is part of GHDL. +-- +-- This program 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 of the License, or +-- (at your option) any later version. +-- +-- This program 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 this program. If not, see <gnu.org/licenses>. + +with Ada.Unchecked_Deallocation; + +with Types; use Types; + +with PSL.Types; +with Vhdl.Nodes; use Vhdl.Nodes; + +with Netlists; use Netlists; +with Netlists.Builders; use Netlists.Builders; + +with Synth.Source; +with Synth.Objtypes; use Synth.Objtypes; +with Synth.Values; use Synth.Values; +with Synth.Vhdl_Context; use Synth.Vhdl_Context; + +package Synth.Vhdl_Expr is + -- Perform a subtype conversion. Check constraints. + function Synth_Subtype_Conversion (Ctxt : Context_Acc; + Vt : Valtyp; + Dtype : Type_Acc; + Bounds : Boolean; + Loc : Source.Syn_Src) + return Valtyp; + + -- For a static value V, return the value. + function Get_Static_Discrete (V : Valtyp) return Int64; + + -- Return the memory (as a memtyp) of static value V. + function Get_Value_Memtyp (V : Valtyp) return Memtyp; + + -- Return True only if discrete value V is known to be positive or 0. + -- False means either not positive or unknown. + function Is_Positive (V : Valtyp) return Boolean; + + -- Return the bounds of a one dimensional array/vector type and the + -- width of the element. + procedure Get_Onedimensional_Array_Bounds + (Typ : Type_Acc; Bnd : out Bound_Type; El_Typ : out Type_Acc); + + -- Create an array subtype from bound BND. + function Create_Onedimensional_Array_Subtype + (Btyp : Type_Acc; Bnd : Bound_Type) return Type_Acc; + + procedure From_Std_Logic (Enum : Int64; Val : out Uns32; Zx : out Uns32); + procedure From_Bit (Enum : Int64; Val : out Uns32); + procedure To_Logic + (Enum : Int64; Etype : Type_Acc; Val : out Uns32; Zx : out Uns32); + + -- Try to match: clk'event and clk = X + -- or: clk = X and clk'event + -- where X is '0' or '1'. + function Synth_Clock_Edge + (Syn_Inst : Synth_Instance_Acc; Left, Right : Node) return Net; + + procedure Concat_Array + (Ctxt : Context_Acc; Arr : in out Net_Array; N : out Net); + + -- Synthesize EXPR. The expression must be self-constrained. + -- If EN is not No_Net, the execution is controlled by EN. This is used + -- for assertions and checks. + function Synth_Expression + (Syn_Inst : Synth_Instance_Acc; Expr : Node) return Valtyp; + + -- Same as Synth_Expression, but the expression may be constrained by + -- EXPR_TYPE. + function Synth_Expression_With_Type (Syn_Inst : Synth_Instance_Acc; + Expr : Node; + Expr_Type : Type_Acc) return Valtyp; + + -- Use base type of EXPR to synthesize EXPR. Useful when the type of + -- EXPR is defined by itself or a range. + function Synth_Expression_With_Basetype (Syn_Inst : Synth_Instance_Acc; + Expr : Node) return Valtyp; + + function Synth_PSL_Expression + (Syn_Inst : Synth_Instance_Acc; Expr : PSL.Types.PSL_Node) return Net; + + function Synth_Bounds_From_Range (Syn_Inst : Synth_Instance_Acc; + Atype : Node) return Bound_Type; + + function Synth_Array_Bounds (Syn_Inst : Synth_Instance_Acc; + Atype : Node; + Dim : Dim_Type) return Bound_Type; + + function Build_Discrete_Range_Type + (L : Int64; R : Int64; Dir : Direction_Type) return Discrete_Range_Type; + function Synth_Discrete_Range_Expression + (Syn_Inst : Synth_Instance_Acc; Rng : Node) return Discrete_Range_Type; + function Synth_Float_Range_Expression + (Syn_Inst : Synth_Instance_Acc; Rng : Node) return Float_Range_Type; + + procedure Synth_Discrete_Range (Syn_Inst : Synth_Instance_Acc; + Bound : Node; + Rng : out Discrete_Range_Type); + + procedure Synth_Slice_Suffix (Syn_Inst : Synth_Instance_Acc; + Name : Node; + Pfx_Bnd : Bound_Type; + El_Typ : Type_Acc; + Res_Bnd : out Bound_Type; + Inp : out Net; + Off : out Value_Offsets); + + -- If VOFF is No_Net then OFF is valid, if VOFF is not No_Net then + -- OFF is 0. + procedure Synth_Indexed_Name (Syn_Inst : Synth_Instance_Acc; + Name : Node; + Pfx_Type : Type_Acc; + Voff : out Net; + Off : out Value_Offsets); + + -- Return the type of EXPR (an object) without evaluating it (except when + -- needed, like bounds of a slice). + function Synth_Type_Of_Object (Syn_Inst : Synth_Instance_Acc; Expr : Node) + return Type_Acc; + + -- Conversion to logic vector. + + type Digit_Index is new Natural; + type Logvec_Array is array (Digit_Index range <>) of Logic_32; + type Logvec_Array_Acc is access Logvec_Array; + + procedure Free_Logvec_Array is new Ada.Unchecked_Deallocation + (Logvec_Array, Logvec_Array_Acc); + + -- Convert W bits from OFF of VAL to a Logvec_Array. + -- OFF and W are offset and width in bit representation. + procedure Value2logvec (Val : Memtyp; + Off : Uns32; + W : Width; + Vec : in out Logvec_Array; + Vec_Off : in out Uns32; + Has_Zx : in out Boolean); +end Synth.Vhdl_Expr; |