aboutsummaryrefslogtreecommitdiffstats
path: root/src/synth/synth-values.adb
diff options
context:
space:
mode:
Diffstat (limited to 'src/synth/synth-values.adb')
-rw-r--r--src/synth/synth-values.adb525
1 files changed, 2 insertions, 523 deletions
diff --git a/src/synth/synth-values.adb b/src/synth/synth-values.adb
index e0d56174b..47a354078 100644
--- a/src/synth/synth-values.adb
+++ b/src/synth/synth-values.adb
@@ -22,28 +22,14 @@ with Ada.Unchecked_Conversion;
with System;
with System.Storage_Elements;
-with Mutils; use Mutils;
-
with Netlists.Utils;
-package body Synth.Values is
- function To_Bound_Array_Acc is new Ada.Unchecked_Conversion
- (System.Address, Bound_Array_Acc);
-
- function To_Rec_El_Array_Acc is new Ada.Unchecked_Conversion
- (System.Address, Rec_El_Array_Acc);
-
- function To_Type_Acc is new Ada.Unchecked_Conversion
- (System.Address, Type_Acc);
+with Vhdl.Nodes; use Vhdl.Nodes;
+package body Synth.Values is
function To_Value_Acc is new Ada.Unchecked_Conversion
(System.Address, Value_Acc);
- function "+" (L, R : Value_Offsets) return Value_Offsets is
- begin
- return (L.Net_Off + R.Net_Off, L.Mem_Off + R.Mem_Off);
- end "+";
-
function Is_Static (Val : Value_Acc) return Boolean is
begin
case Val.Kind is
@@ -79,26 +65,6 @@ package body Synth.Values is
end case;
end Is_Static_Val;
- function Is_Bounded_Type (Typ : Type_Acc) return Boolean is
- begin
- case Typ.Kind is
- when Type_Bit
- | Type_Logic
- | Type_Discrete
- | Type_Float
- | Type_Vector
- | Type_Slice
- | Type_Array
- | Type_Record
- | Type_Access
- | Type_File =>
- return True;
- when Type_Unbounded_Array
- | Type_Unbounded_Vector =>
- return False;
- end case;
- end Is_Bounded_Type;
-
function Strip_Alias_Const (V : Value_Acc) return Value_Acc
is
Res : Value_Acc;
@@ -157,427 +123,6 @@ package body Synth.Values is
end case;
end Is_Equal;
- function Are_Types_Equal (L, R : Type_Acc) return Boolean is
- begin
- if L.Kind /= R.Kind
- or else L.W /= R.W
- then
- return False;
- end if;
- if L = R then
- return True;
- end if;
-
- case L.Kind is
- when Type_Bit
- | Type_Logic =>
- return True;
- when Type_Discrete =>
- return L.Drange = R.Drange;
- when Type_Float =>
- return L.Frange = R.Frange;
- when Type_Vector =>
- return L.Vbound = R.Vbound
- and then Are_Types_Equal (L.Vec_El, R.Vec_El);
- when Type_Unbounded_Vector =>
- return Are_Types_Equal (L.Uvec_El, R.Uvec_El);
- when Type_Slice =>
- return Are_Types_Equal (L.Slice_El, R.Slice_El);
- when Type_Array =>
- if L.Abounds.Ndim /= R.Abounds.Ndim then
- return False;
- end if;
- for I in L.Abounds.D'Range loop
- if L.Abounds.D (I) /= R.Abounds.D (I) then
- return False;
- end if;
- end loop;
- return Are_Types_Equal (L.Arr_El, R.Arr_El);
- when Type_Unbounded_Array =>
- return L.Uarr_Ndim = R.Uarr_Ndim
- and then Are_Types_Equal (L.Uarr_El, R.Uarr_El);
- when Type_Record =>
- if L.Rec.Len /= R.Rec.Len then
- return False;
- end if;
- for I in L.Rec.E'Range loop
- if not Are_Types_Equal (L.Rec.E (I).Typ, R.Rec.E (I).Typ) then
- return False;
- end if;
- end loop;
- return True;
- when Type_Access =>
- return Are_Types_Equal (L.Acc_Acc, R.Acc_Acc);
- when Type_File =>
- return Are_Types_Equal (L.File_Typ, R.File_Typ);
- end case;
- end Are_Types_Equal;
-
- function Discrete_Range_Width (Rng : Discrete_Range_Type) return Width
- is
- Lo, Hi : Int64;
- W : Width;
- begin
- case Rng.Dir is
- when Iir_To =>
- Lo := Rng.Left;
- Hi := Rng.Right;
- when Iir_Downto =>
- Lo := Rng.Right;
- Hi := Rng.Left;
- end case;
- if Lo > Hi then
- -- Null range.
- W := 0;
- elsif Lo >= 0 then
- -- Positive.
- W := Width (Clog2 (Uns64 (Hi) + 1));
- elsif Lo = Int64'First then
- -- Handle possible overflow.
- W := 64;
- elsif Hi < 0 then
- -- Negative only.
- W := Width (Clog2 (Uns64 (-Lo))) + 1;
- else
- declare
- Wl : constant Width := Width (Clog2 (Uns64 (-Lo)));
- Wh : constant Width := Width (Clog2 (Uns64 (Hi)));
- begin
- W := Width'Max (Wl, Wh) + 1;
- end;
- end if;
- return W;
- end Discrete_Range_Width;
-
- function Create_Bit_Type return Type_Acc
- is
- subtype Bit_Type_Type is Type_Type (Type_Bit);
- function Alloc is new Areapools.Alloc_On_Pool_Addr (Bit_Type_Type);
- begin
- return To_Type_Acc (Alloc (Current_Pool, (Kind => Type_Bit,
- Is_Synth => True,
- Al => 0,
- Sz => 1,
- W => 1)));
- end Create_Bit_Type;
-
- function Create_Logic_Type return Type_Acc
- is
- subtype Logic_Type_Type is Type_Type (Type_Logic);
- function Alloc is new Areapools.Alloc_On_Pool_Addr (Logic_Type_Type);
- begin
- return To_Type_Acc (Alloc (Current_Pool, (Kind => Type_Logic,
- Is_Synth => True,
- Al => 0,
- Sz => 1,
- W => 1)));
- end Create_Logic_Type;
-
- function Create_Discrete_Type (Rng : Discrete_Range_Type;
- Sz : Size_Type;
- W : Width)
- return Type_Acc
- is
- subtype Discrete_Type_Type is Type_Type (Type_Discrete);
- function Alloc is new Areapools.Alloc_On_Pool_Addr (Discrete_Type_Type);
- Al : Palign_Type;
- begin
- if Sz <= 1 then
- Al := 0;
- elsif Sz <= 4 then
- Al := 2;
- else
- pragma Assert (Sz <= 8);
- Al := 3;
- end if;
- return To_Type_Acc (Alloc (Current_Pool, (Kind => Type_Discrete,
- Is_Synth => True,
- Al => Al,
- Sz => Sz,
- W => W,
- Drange => Rng)));
- end Create_Discrete_Type;
-
- function Create_Float_Type (Rng : Float_Range_Type) return Type_Acc
- is
- subtype Float_Type_Type is Type_Type (Type_Float);
- function Alloc is new Areapools.Alloc_On_Pool_Addr (Float_Type_Type);
- begin
- return To_Type_Acc (Alloc (Current_Pool, (Kind => Type_Float,
- Is_Synth => True,
- Al => 3,
- Sz => 8,
- W => 64,
- Frange => Rng)));
- end Create_Float_Type;
-
- function Create_Vector_Type (Bnd : Bound_Type; El_Type : Type_Acc)
- return Type_Acc
- is
- subtype Vector_Type_Type is Type_Type (Type_Vector);
- function Alloc is new Areapools.Alloc_On_Pool_Addr (Vector_Type_Type);
- begin
- return To_Type_Acc
- (Alloc (Current_Pool, (Kind => Type_Vector,
- Is_Synth => True,
- Al => El_Type.Al,
- Sz => El_Type.Sz * Size_Type (Bnd.Len),
- W => Bnd.Len,
- Vbound => Bnd,
- Vec_El => El_Type)));
- end Create_Vector_Type;
-
- function Create_Slice_Type (Len : Uns32; El_Type : Type_Acc)
- return Type_Acc
- is
- subtype Slice_Type_Type is Type_Type (Type_Slice);
- function Alloc is new Areapools.Alloc_On_Pool_Addr (Slice_Type_Type);
- begin
- return To_Type_Acc (Alloc (Current_Pool,
- (Kind => Type_Slice,
- Is_Synth => El_Type.Is_Synth,
- Al => El_Type.Al,
- Sz => Size_Type (Len) * El_Type.Sz,
- W => Len * El_Type.W,
- Slice_El => El_Type)));
- end Create_Slice_Type;
-
- function Create_Vec_Type_By_Length (Len : Width; El : Type_Acc)
- return Type_Acc is
- begin
- return Create_Vector_Type ((Dir => Iir_Downto,
- Left => Int32 (Len) - 1,
- Right => 0,
- Len => Len),
- El);
- end Create_Vec_Type_By_Length;
-
- function Create_Bound_Array (Ndims : Dim_Type) return Bound_Array_Acc
- is
- use System;
- subtype Data_Type is Bound_Array (Ndims);
- Res : Address;
- begin
- -- Manually allocate the array to handle large arrays without
- -- creating a large temporary value.
- Areapools.Allocate
- (Current_Pool.all, Res,
- Data_Type'Size / Storage_Unit, Data_Type'Alignment);
-
- declare
- -- Discard the warnings for no pragma Import as we really want
- -- to use the default initialization.
- pragma Warnings (Off);
- Addr1 : constant Address := Res;
- Init : Data_Type;
- for Init'Address use Addr1;
- pragma Warnings (On);
- begin
- null;
- end;
-
- return To_Bound_Array_Acc (Res);
- end Create_Bound_Array;
-
- function Create_Array_Type (Bnd : Bound_Array_Acc; El_Type : Type_Acc)
- return Type_Acc
- is
- subtype Array_Type_Type is Type_Type (Type_Array);
- function Alloc is new Areapools.Alloc_On_Pool_Addr (Array_Type_Type);
- L : Uns32;
- begin
- L := 1;
- for I in Bnd.D'Range loop
- L := L * Bnd.D (I).Len;
- end loop;
- return To_Type_Acc (Alloc (Current_Pool,
- (Kind => Type_Array,
- Is_Synth => El_Type.Is_Synth,
- Al => El_Type.Al,
- Sz => El_Type.Sz * Size_Type (L),
- W => El_Type.W * L,
- Abounds => Bnd,
- Arr_El => El_Type)));
- end Create_Array_Type;
-
- function Create_Unbounded_Array (Ndim : Dim_Type; El_Type : Type_Acc)
- return Type_Acc
- is
- subtype Unbounded_Type_Type is Type_Type (Type_Unbounded_Array);
- function Alloc is new Areapools.Alloc_On_Pool_Addr (Unbounded_Type_Type);
- begin
- return To_Type_Acc (Alloc (Current_Pool, (Kind => Type_Unbounded_Array,
- Is_Synth => El_Type.Is_Synth,
- Al => El_Type.Al,
- Sz => 0,
- W => 0,
- Uarr_Ndim => Ndim,
- Uarr_El => El_Type)));
- end Create_Unbounded_Array;
-
- function Create_Unbounded_Vector (El_Type : Type_Acc) return Type_Acc
- is
- subtype Unbounded_Type_Type is Type_Type (Type_Unbounded_Vector);
- function Alloc is new Areapools.Alloc_On_Pool_Addr (Unbounded_Type_Type);
- begin
- return To_Type_Acc (Alloc (Current_Pool, (Kind => Type_Unbounded_Vector,
- Is_Synth => El_Type.Is_Synth,
- Al => El_Type.Al,
- Sz => 0,
- W => 0,
- Uvec_El => El_Type)));
- end Create_Unbounded_Vector;
-
- function Get_Array_Element (Arr_Type : Type_Acc) return Type_Acc is
- begin
- case Arr_Type.Kind is
- when Type_Vector =>
- return Arr_Type.Vec_El;
- when Type_Array =>
- return Arr_Type.Arr_El;
- when Type_Unbounded_Array =>
- return Arr_Type.Uarr_El;
- when Type_Unbounded_Vector =>
- return Arr_Type.Uvec_El;
- when others =>
- raise Internal_Error;
- end case;
- end Get_Array_Element;
-
- function Get_Array_Bound (Typ : Type_Acc; Dim : Dim_Type)
- return Bound_Type is
- begin
- case Typ.Kind is
- when Type_Vector =>
- if Dim /= 1 then
- raise Internal_Error;
- end if;
- return Typ.Vbound;
- when Type_Array =>
- return Typ.Abounds.D (Dim);
- when others =>
- raise Internal_Error;
- end case;
- end Get_Array_Bound;
-
- function Get_Range_Length (Rng : Discrete_Range_Type) return Uns32
- is
- Len : Int64;
- begin
- case Rng.Dir is
- when Iir_To =>
- Len := Rng.Right - Rng.Left + 1;
- when Iir_Downto =>
- Len := Rng.Left - Rng.Right + 1;
- end case;
- if Len < 0 then
- return 0;
- else
- return Uns32 (Len);
- end if;
- end Get_Range_Length;
-
- function Create_Rec_El_Array (Nels : Iir_Index32) return Rec_El_Array_Acc
- is
- use System;
- subtype Data_Type is Rec_El_Array (Nels);
- Res : Address;
- begin
- -- Manually allocate the array to handle large arrays without
- -- creating a large temporary value.
- Areapools.Allocate
- (Current_Pool.all, Res,
- Data_Type'Size / Storage_Unit, Data_Type'Alignment);
-
- declare
- -- Discard the warnings for no pragma Import as we really want
- -- to use the default initialization.
- pragma Warnings (Off);
- Addr1 : constant Address := Res;
- Init : Data_Type;
- for Init'Address use Addr1;
- pragma Warnings (On);
- begin
- null;
- end;
-
- return To_Rec_El_Array_Acc (Res);
- end Create_Rec_El_Array;
-
- function Align (Off : Size_Type; Al : Palign_Type) return Size_Type
- is
- Mask : constant Size_Type := 2 ** Natural (Al) - 1;
- begin
- return (Off + Mask) and not Mask;
- end Align;
-
- function Create_Record_Type (Els : Rec_El_Array_Acc)
- return Type_Acc
- is
- subtype Record_Type_Type is Type_Type (Type_Record);
- function Alloc is new Areapools.Alloc_On_Pool_Addr (Record_Type_Type);
- Is_Synth : Boolean;
- W : Width;
- Al : Palign_Type;
- Sz : Size_Type;
- begin
- -- Layout the record.
- Is_Synth := True;
- Al := 0;
- Sz := 0;
- W := 0;
- for I in Els.E'Range loop
- declare
- E : Rec_El_Type renames Els.E (I);
- begin
- -- For nets.
- E.Boff := W;
- Is_Synth := Is_Synth and E.Typ.Is_Synth;
- W := W + E.Typ.W;
-
- -- For memory.
- Al := Palign_Type'Max (Al, E.Typ.Al);
- Sz := Align (Sz, E.Typ.Al);
- E.Moff := Sz;
- Sz := Sz + E.Typ.Sz;
- end;
- end loop;
- Sz := Align (Sz, Al);
-
- return To_Type_Acc (Alloc (Current_Pool, (Kind => Type_Record,
- Is_Synth => Is_Synth,
- Al => Al,
- Sz => Sz,
- W => W,
- Rec => Els)));
- end Create_Record_Type;
-
- function Create_Access_Type (Acc_Type : Type_Acc) return Type_Acc
- is
- subtype Access_Type_Type is Type_Type (Type_Access);
- function Alloc is new Areapools.Alloc_On_Pool_Addr (Access_Type_Type);
- begin
- return To_Type_Acc (Alloc (Current_Pool, (Kind => Type_Access,
- Is_Synth => False,
- Al => 2,
- Sz => 4,
- W => 32,
- Acc_Acc => Acc_Type)));
- end Create_Access_Type;
-
- function Create_File_Type (File_Type : Type_Acc) return Type_Acc
- is
- subtype File_Type_Type is Type_Type (Type_File);
- function Alloc is new Areapools.Alloc_On_Pool_Addr (File_Type_Type);
- begin
- return To_Type_Acc (Alloc (Current_Pool, (Kind => Type_File,
- Is_Synth => False,
- Al => 2,
- Sz => 4,
- W => 32,
- File_Typ => File_Type)));
- end Create_File_Type;
-
function Create_Value_Wire (W : Wire_Id) return Value_Acc
is
subtype Value_Type_Wire is Value_Type (Values.Value_Wire);
@@ -764,64 +309,6 @@ package body Synth.Values is
return Res;
end Unshare;
- function Get_Type_Width (Atype : Type_Acc) return Width is
- begin
- pragma Assert (Atype.Kind /= Type_Unbounded_Array);
- return Atype.W;
- end Get_Type_Width;
-
- function Get_Bound_Length (T : Type_Acc; Dim : Dim_Type) return Width is
- begin
- case T.Kind is
- when Type_Vector =>
- if Dim /= 1 then
- raise Internal_Error;
- end if;
- return T.Vbound.Len;
- when Type_Slice =>
- if Dim /= 1 then
- raise Internal_Error;
- end if;
- return T.W;
- when Type_Array =>
- return T.Abounds.D (Dim).Len;
- when others =>
- raise Internal_Error;
- end case;
- end Get_Bound_Length;
-
- function Is_Matching_Bounds (L, R : Type_Acc) return Boolean is
- begin
- case L.Kind is
- when Type_Bit
- | Type_Logic
- | Type_Discrete
- | Type_Float =>
- pragma Assert (L.Kind = R.Kind);
- return True;
- when Type_Vector
- | Type_Slice =>
- return Get_Bound_Length (L, 1) = Get_Bound_Length (R, 1);
- when Type_Array =>
- for I in L.Abounds.D'Range loop
- if Get_Bound_Length (L, I) /= Get_Bound_Length (R, I) then
- return False;
- end if;
- end loop;
- return True;
- when Type_Unbounded_Array
- | Type_Unbounded_Vector =>
- raise Internal_Error;
- when Type_Record =>
- -- FIXME: handle vhdl-08
- return True;
- when Type_Access =>
- return True;
- when Type_File =>
- raise Internal_Error;
- end case;
- end Is_Matching_Bounds;
-
type Ghdl_U8_Ptr is access all Ghdl_U8;
function To_U8_Ptr is
new Ada.Unchecked_Conversion (Memory_Ptr, Ghdl_U8_Ptr);
@@ -1134,12 +621,4 @@ package body Synth.Values is
raise Internal_Error;
end case;
end Get_Memtyp;
-
- procedure Init is
- begin
- Instance_Pool := Global_Pool'Access;
- Boolean_Type := Create_Bit_Type;
- Logic_Type := Create_Logic_Type;
- Bit_Type := Create_Bit_Type;
- end Init;
end Synth.Values;