-- Values in 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, write to the Free Software -- Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, -- MA 02110-1301, USA. with Types; use Types; with Netlists; use Netlists; with Synth.Environment; use Synth.Environment; with Simul.Environments; use Simul.Environments; with Vhdl.Nodes; use Vhdl.Nodes; package Synth.Values is -- Values is how signals and variables are decomposed. This is similar to -- values in simulation, but simplified (no need to handle files, -- accesses...) type Value_Kind is ( -- Value is for a vector or a bit, and is the output of a gate. Value_Net, -- Also a vector or a bit, but from an object. Has to be transformed -- into a net. Value_Wire, Value_Mux2, -- A non-vector array. Value_Array, -- A record. Value_Record, -- A known value (from simulation). Value_Lit ); type Value_Type (Kind : Value_Kind); type Value_Acc is access Value_Type; type Value_Type_Array is array (Iir_Index32 range <>) of Value_Acc; type Value_Array_Type (Len : Iir_Index32) is record V : Value_Type_Array (1 .. Len); end record; type Value_Array_Acc is access Value_Array_Type; type Value_Range is record Dir : Iir_Direction; Len : Width; Left : Int32; Right : Int32; end record; type Value_Range_Acc is access Value_Range; No_Range : constant Value_Range_Acc := null; type Value_Type (Kind : Value_Kind) is record case Kind is when Value_Net => N : Net; N_Range : Value_Range_Acc; when Value_Wire => W : Wire_Id; W_Range : Value_Range_Acc; when Value_Mux2 => M_Cond : Value_Acc; M_T : Value_Acc; M_F : Value_Acc; when Value_Lit => Lit : Simul.Environments.Iir_Value_Literal_Acc; Lit_Type : Iir; when Value_Array => Arr : Value_Array_Acc; Bounds : Value_Bounds_Array_Acc; when Value_Record => Rec : Value_Array_Acc; end case; end record; -- Create a Value_Net. function Create_Value_Net (N : Net; Rng : Value_Range_Acc) return Value_Acc; -- Create a Value_Wire. For a bit wire, RNG must be null. function Create_Value_Wire (W : Wire_Id; Rng : Value_Range_Acc) return Value_Acc; -- Create a mux2. function Create_Value_Mux2 (Cond : Value_Acc; T : Value_Acc; F : Value_Acc) return Value_Acc; -- Create a Value_Lit. function Create_Value_Lit (Val : Iir_Value_Literal_Acc; Typ : Iir) return Value_Acc; -- Create a Value_Array. function Create_Array_Value (Bounds : Value_Bounds_Array_Acc) return Value_Acc; -- Allocate the ARR component of the Value_Type ARR, using BOUNDS. procedure Create_Array_Data (Arr : Value_Acc); -- Allocate a Value_Range. function Create_Range_Value (Rng : Value_Range) return Value_Range_Acc; -- Create a Value_Range from a simulation bound. function Bounds_To_Range (Val : Iir_Value_Literal_Acc) return Value_Range_Acc; end Synth.Values;