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.adb284
1 files changed, 148 insertions, 136 deletions
diff --git a/src/synth/synth-values.adb b/src/synth/synth-values.adb
index 92587fd55..01e460c77 100644
--- a/src/synth/synth-values.adb
+++ b/src/synth/synth-values.adb
@@ -22,14 +22,16 @@ with Ada.Unchecked_Conversion;
with System;
package body Synth.Values is
+ function To_Bound_Array_Acc is new Ada.Unchecked_Conversion
+ (System.Address, Bound_Array_Acc);
+
+ function To_Type_Acc is new Ada.Unchecked_Conversion
+ (System.Address, Type_Acc);
+
function To_Value_Acc is new Ada.Unchecked_Conversion
(System.Address, Value_Acc);
function To_Value_Array_Acc is new Ada.Unchecked_Conversion
(System.Address, Values.Value_Array_Acc);
- function To_Value_Bound_Acc is new Ada.Unchecked_Conversion
- (System.Address, Value_Bound_Acc);
- function To_Value_Bound_Array_Acc is new Ada.Unchecked_Conversion
- (System.Address, Value_Bound_Array_Acc);
function Is_Equal (L, R : Value_Acc) return Boolean is
begin
@@ -40,8 +42,93 @@ package body Synth.Values is
raise Internal_Error;
end Is_Equal;
- function Create_Value_Wire (W : Wire_Id; Bnd : Value_Bound_Acc)
- return Value_Acc
+ 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)));
+ end Create_Bit_Type;
+
+ function Create_Discrete_Type (Rng : Discrete_Range_Type) 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);
+ begin
+ return To_Type_Acc (Alloc (Current_Pool, (Kind => Type_Discrete,
+ 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,
+ 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,
+ Vbound => Bnd,
+ Vec_El => El_Type)));
+ end Create_Vector_Type;
+
+ function Create_Vec_Type_By_Length (Len : Width; El : Type_Acc)
+ return Type_Acc is
+ begin
+ return Create_Vector_Type ((Dir => Iir_Downto,
+ W => 0,
+ Left => Int32 (Len) - 1,
+ Right => 0,
+ Len => Len),
+ El);
+ end Create_Vec_Type_By_Length;
+
+ function Create_Bound_Array (Ndims : Iir_Index32) 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);
+ begin
+ return To_Type_Acc (Alloc (Current_Pool, (Kind => Type_Array,
+ Abounds => Bnd,
+ Arr_El => El_Type)));
+ end Create_Array_Type;
+
+ function Create_Value_Wire (W : Wire_Id; Wtype : Type_Acc) return Value_Acc
is
subtype Value_Type_Wire is Value_Type (Values.Value_Wire);
function Alloc is new Areapools.Alloc_On_Pool_Addr (Value_Type_Wire);
@@ -49,17 +136,17 @@ package body Synth.Values is
return To_Value_Acc (Alloc (Current_Pool,
(Kind => Value_Wire,
W => W,
- W_Bound => Bnd)));
+ Typ => Wtype)));
end Create_Value_Wire;
- function Create_Value_Net (N : Net; Bnd : Value_Bound_Acc) return Value_Acc
+ function Create_Value_Net (N : Net; Ntype : Type_Acc) return Value_Acc
is
subtype Value_Type_Net is Value_Type (Value_Net);
function Alloc is new Areapools.Alloc_On_Pool_Addr (Value_Type_Net);
begin
return To_Value_Acc
(Alloc (Current_Pool,
- Value_Type_Net'(Kind => Value_Net, N => N, N_Bound => Bnd)));
+ Value_Type_Net'(Kind => Value_Net, N => N, Typ => Ntype)));
end Create_Value_Net;
function Create_Value_Mux2 (Cond : Value_Acc; T : Value_Acc; F : Value_Acc)
@@ -67,28 +154,35 @@ package body Synth.Values is
is
subtype Value_Type_Mux2 is Value_Type (Value_Mux2);
function Alloc is new Areapools.Alloc_On_Pool_Addr (Value_Type_Mux2);
+ pragma Assert (T.Typ = F.Typ);
begin
return To_Value_Acc
(Alloc (Current_Pool,
- (Kind => Value_Mux2, M_Cond => Cond, M_T => T, M_F => F)));
+ (Kind => Value_Mux2,
+ Typ => T.Typ,
+ M_Cond => Cond, M_T => T, M_F => F)));
end Create_Value_Mux2;
- function Create_Value_Discrete (Val : Int64) return Value_Acc
+ function Create_Value_Discrete (Val : Int64; Vtype : Type_Acc)
+ return Value_Acc
is
subtype Value_Type_Discrete is Value_Type (Value_Discrete);
function Alloc is new Areapools.Alloc_On_Pool_Addr (Value_Type_Discrete);
begin
return To_Value_Acc (Alloc (Current_Pool,
- (Kind => Value_Discrete, Scal => Val)));
+ (Kind => Value_Discrete, Scal => Val,
+ Typ => Vtype)));
end Create_Value_Discrete;
- function Create_Value_Float (Val : Fp64) return Value_Acc
+ function Create_Value_Float (Val : Fp64; Vtype : Type_Acc) return Value_Acc
is
subtype Value_Type_Float is Value_Type (Value_Float);
function Alloc is new Areapools.Alloc_On_Pool_Addr (Value_Type_Float);
begin
return To_Value_Acc (Alloc (Current_Pool,
- (Kind => Value_Float, Fp => Val)));
+ (Kind => Value_Float,
+ Typ => Vtype,
+ Fp => Val)));
end Create_Value_Float;
function Create_Value_Array (Len : Iir_Index32) return Value_Array_Acc
@@ -118,8 +212,7 @@ package body Synth.Values is
return To_Value_Array_Acc (Res);
end Create_Value_Array;
- function Create_Value_Array (Bounds : Value_Bound_Array_Acc;
- Arr : Value_Array_Acc)
+ function Create_Value_Array (Bounds : Type_Acc; Arr : Value_Array_Acc)
return Value_Acc
is
subtype Value_Type_Array is Value_Type (Value_Array);
@@ -129,7 +222,7 @@ package body Synth.Values is
begin
Res := To_Value_Acc (Alloc (Current_Pool,
(Kind => Value_Array,
- Arr => Arr, Bounds => Bounds)));
+ Arr => Arr, Typ => Bounds)));
return Res;
end Create_Value_Array;
@@ -138,16 +231,22 @@ package body Synth.Values is
Len : Width;
begin
Len := 1;
- for I in Arr.Bounds.D'Range loop
- Len := Len * Arr.Bounds.D (I).Len;
- end loop;
+ case Arr.Typ.Kind is
+ when Type_Array =>
+ for I in Arr.Typ.Abounds.D'Range loop
+ Len := Len * Arr.Typ.Abounds.D (I).Len;
+ end loop;
+ when Type_Vector =>
+ Len := Arr.Typ.Vbound.Len;
+ when others =>
+ raise Internal_Error;
+ end case;
Arr.Arr := Create_Value_Array (Iir_Index32 (Len));
end Create_Array_Data;
- function Create_Value_Array (Bounds : Value_Bound_Array_Acc)
- return Value_Acc
+ function Create_Value_Array (Bounds : Type_Acc) return Value_Acc
is
Res : Value_Acc;
begin
@@ -156,48 +255,6 @@ package body Synth.Values is
return Res;
end Create_Value_Array;
- function Create_Value_Bound_Array (Ndim : Iir_Index32)
- return Value_Bound_Array_Acc
- is
- use System;
- subtype Data_Type is Value_Bound_Array (Ndim);
- 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_Value_Bound_Array_Acc (Res);
- end Create_Value_Bound_Array;
-
- function Create_Value_Bounds (Bounds : Value_Bound_Array_Acc)
- return Value_Acc
- is
- subtype Value_Type_Bounds is Value_Type (Value_Bounds);
- function Alloc is new Areapools.Alloc_On_Pool_Addr (Value_Type_Bounds);
-
- Res : Value_Acc;
- begin
- Res := To_Value_Acc (Alloc (Current_Pool,
- (Kind => Value_Bounds,
- Bnds => Bounds)));
- return Res;
- end Create_Value_Bounds;
-
function Create_Value_Instance (Inst : Instance_Id) return Value_Acc
is
subtype Value_Type_Instance is Value_Type (Value_Instance);
@@ -205,72 +262,25 @@ package body Synth.Values is
begin
return To_Value_Acc
(Alloc (Current_Pool,
- (Kind => Value_Instance, Instance => Inst)));
+ (Kind => Value_Instance, Instance => Inst, Typ => null)));
end Create_Value_Instance;
- function Create_Value_Range (Rng : Value_Range_Type) return Value_Acc
- is
- subtype Value_Type_Range is Value_Type (Value_Range);
- function Alloc is new Areapools.Alloc_On_Pool_Addr (Value_Type_Range);
- begin
- return To_Value_Acc (Alloc (Current_Pool,
- (Kind => Value_Range, Rng => Rng)));
- end Create_Value_Range;
-
- function Create_Value_Fp_Range (Rng : Value_Fp_Range_Type) return Value_Acc
+ function Create_Value_Subtype (Typ : Type_Acc) return Value_Acc
is
- subtype Value_Type_Fp_Range is Value_Type (Value_Fp_Range);
- function Alloc is new Areapools.Alloc_On_Pool_Addr (Value_Type_Fp_Range);
+ subtype Value_Type_Subtype is Value_Type (Value_Subtype);
+ function Alloc is new Areapools.Alloc_On_Pool_Addr (Value_Type_Subtype);
begin
return To_Value_Acc (Alloc (Current_Pool,
- (Kind => Value_Fp_Range, Fp_Rng => Rng)));
- end Create_Value_Fp_Range;
-
- function Create_Value_Bound (Dir : Iir_Direction; Left, Right : Value_Acc)
- return Value_Bound_Acc is
- begin
- pragma Assert (Left.Kind = Right.Kind);
- case Left.Kind is
- when Value_Discrete =>
- declare
- Len : Int64;
- begin
- case Dir is
- when Iir_To =>
- Len := Right.Scal - Left.Scal + 1;
- when Iir_Downto =>
- Len := Left.Scal - Right.Scal + 1;
- end case;
- if Len < 0 then
- Len := 0;
- end if;
- return Create_Value_Bound
- ((Dir, Int32 (Left.Scal), Int32 (Right.Scal),
- Len => Uns32 (Len)));
- end;
- when others =>
- raise Internal_Error;
- end case;
- end Create_Value_Bound;
-
- function Create_Value_Bound (Bnd : Value_Bound_Type) return Value_Bound_Acc
- is
- function Alloc is new Areapools.Alloc_On_Pool_Addr (Value_Bound_Type);
- begin
- return To_Value_Bound_Acc (Alloc (Current_Pool, Bnd));
- end Create_Value_Bound;
+ (Kind => Value_Subtype, Typ => Typ)));
+ end Create_Value_Subtype;
function Copy (Src: in Value_Acc) return Value_Acc
is
Res: Value_Acc;
begin
case Src.Kind is
- when Value_Range =>
- Res := Create_Value_Range (Src.Rng);
- when Value_Fp_Range =>
- Res := Create_Value_Fp_Range (Src.Fp_Rng);
when Value_Wire =>
- Res := Create_Value_Wire (Src.W, Src.W_Bound);
+ Res := Create_Value_Wire (Src.W, Src.Typ);
when others =>
raise Internal_Error;
end case;
@@ -289,28 +299,30 @@ package body Synth.Values is
return Res;
end Unshare;
- function Extract_Bound (Val : Value_Acc) return Value_Bound_Acc is
+ function Extract_Bound (Val : Value_Acc) return Type_Acc is
begin
- case Val.Kind is
- when Value_Net =>
- return Val.N_Bound;
- when Value_Wire =>
- return Val.W_Bound;
- when Value_Array =>
- -- For constants.
- pragma Assert (Val.Bounds.Len = 1);
- return Val.Bounds.D (1);
+ return Val.Typ;
+ end Extract_Bound;
+
+ function Get_Type_Width (Atype : Type_Acc) return Width is
+ begin
+ case Atype.Kind is
+ when Type_Bit =>
+ return 1;
+ when Type_Discrete =>
+ return Atype.Drange.W;
+ when Type_Vector =>
+ return Atype.Vbound.Len;
when others =>
raise Internal_Error;
end case;
- end Extract_Bound;
+ end Get_Type_Width;
- function Get_Bound_Width (Bnd : Value_Bound_Acc) return Width is
+ procedure Init is
begin
- if Bnd = null then
- return 1;
- else
- return Bnd.Len;
- end if;
- end Get_Bound_Width;
+ Instance_Pool := Global_Pool'Access;
+ Boolean_Type := Create_Bit_Type;
+ Logic_Type := Create_Bit_Type;
+ Bit_Type := Create_Bit_Type;
+ end Init;
end Synth.Values;