aboutsummaryrefslogtreecommitdiffstats
path: root/src/synth/synth-static_oper.adb
diff options
context:
space:
mode:
Diffstat (limited to 'src/synth/synth-static_oper.adb')
-rw-r--r--src/synth/synth-static_oper.adb258
1 files changed, 125 insertions, 133 deletions
diff --git a/src/synth/synth-static_oper.adb b/src/synth/synth-static_oper.adb
index d01261213..be54806b8 100644
--- a/src/synth/synth-static_oper.adb
+++ b/src/synth/synth-static_oper.adb
@@ -54,19 +54,19 @@ package body Synth.Static_Oper is
end case;
end record;
- function Get_Static_Array (V : Value_Acc) return Static_Arr_Type
+ function Get_Static_Array (V : Valtyp) return Static_Arr_Type
is
N : Net;
begin
- case V.Kind is
+ case V.Val.Kind is
when Value_Const =>
- return (Kind => Sarr_Value, Arr => V.C_Val.Arr);
+ return (Kind => Sarr_Value, Arr => V.Val.C_Val.Arr);
when Value_Const_Array =>
- return (Kind => Sarr_Value, Arr => V.Arr);
+ return (Kind => Sarr_Value, Arr => V.Val.Arr);
when Value_Net =>
- N := V.N;
+ N := V.Val.N;
when Value_Wire =>
- N := Synth.Environment.Get_Const_Wire (V.W);
+ N := Synth.Environment.Get_Const_Wire (V.Val.W);
when others =>
raise Internal_Error;
end case;
@@ -117,7 +117,7 @@ package body Synth.Static_Oper is
end Warn_Compare_Meta;
function Synth_Compare_Uns_Uns
- (Left, Right : Value_Acc; Err : Compare_Type; Loc : Node)
+ (Left, Right : Valtyp; Err : Compare_Type; Loc : Node)
return Compare_Type
is
Lw : constant Uns32 := Left.Typ.W;
@@ -174,7 +174,7 @@ package body Synth.Static_Oper is
end Synth_Compare_Uns_Uns;
function Synth_Compare_Uns_Nat
- (Left, Right : Value_Acc; Err : Compare_Type; Loc : Node)
+ (Left, Right : Valtyp; Err : Compare_Type; Loc : Node)
return Compare_Type
is
Lw : constant Uns32 := Left.Typ.W;
@@ -230,7 +230,7 @@ package body Synth.Static_Oper is
end Synth_Compare_Uns_Nat;
function Synth_Compare_Nat_Uns
- (Left, Right : Value_Acc; Err : Compare_Type; Loc : Node)
+ (Left, Right : Valtyp; Err : Compare_Type; Loc : Node)
return Compare_Type
is
Rw : constant Uns32 := Right.Typ.W;
@@ -297,9 +297,9 @@ package body Synth.Static_Oper is
return Create_Vec_Type_By_Length (Prev.W, Prev.Vec_El);
end Create_Res_Bound;
- function Synth_Vector_Dyadic (Left, Right : Value_Acc;
+ function Synth_Vector_Dyadic (Left, Right : Valtyp;
Op : Table_2d;
- Loc : Syn_Src) return Value_Acc
+ Loc : Syn_Src) return Valtyp
is
El_Typ : constant Type_Acc := Left.Typ.Vec_El;
Larr : constant Static_Arr_Type := Get_Static_Array (Left);
@@ -308,7 +308,7 @@ package body Synth.Static_Oper is
begin
if Left.Typ.W /= Right.Typ.W then
Error_Msg_Synth (+Loc, "length of operands mismatch");
- return null;
+ return No_Valtyp;
end if;
Arr := Create_Value_Array (Iir_Index32 (Left.Typ.W));
@@ -328,14 +328,14 @@ package body Synth.Static_Oper is
end Synth_Vector_Dyadic;
procedure To_Std_Logic_Vector
- (Val : Value_Acc; Arr : out Std_Logic_Vector)
+ (Val : Valtyp; Arr : out Std_Logic_Vector)
is
Sarr : constant Static_Arr_Type := Get_Static_Array (Val);
begin
case Sarr.Kind is
when Sarr_Value =>
- for I in Val.Arr.V'Range loop
- Arr (Natural (I)) := Std_Ulogic'Val (Val.Arr.V (I).Scal);
+ for I in Val.Val.Arr.V'Range loop
+ Arr (Natural (I)) := Std_Ulogic'Val (Val.Val.Arr.V (I).Scal);
end loop;
when Sarr_Net =>
for I in Arr'Range loop
@@ -344,8 +344,8 @@ package body Synth.Static_Oper is
end case;
end To_Std_Logic_Vector;
- function To_Value_Acc (Vec : Std_Logic_Vector; El_Typ : Type_Acc)
- return Value_Acc
+ function To_Valtyp (Vec : Std_Logic_Vector; El_Typ : Type_Acc)
+ return Valtyp
is
pragma Assert (Vec'First = 1);
Res_Typ : Type_Acc;
@@ -358,138 +358,130 @@ package body Synth.Static_Oper is
Create_Value_Discrete (Std_Ulogic'Pos (Vec (I)), El_Typ);
end loop;
return Create_Value_Const_Array (Res_Typ, Arr);
- end To_Value_Acc;
+ end To_Valtyp;
- function Synth_Add_Uns_Uns (L, R : Value_Acc; Loc : Syn_Src)
- return Value_Acc
+ function Synth_Add_Uns_Uns (L, R : Valtyp; Loc : Syn_Src) return Valtyp
is
pragma Unreferenced (Loc);
- L_Arr : Std_Logic_Vector (1 .. Natural (L.Arr.Len));
- R_Arr : Std_Logic_Vector (1 .. Natural (R.Arr.Len));
+ L_Arr : Std_Logic_Vector (1 .. Natural (L.Val.Arr.Len));
+ R_Arr : Std_Logic_Vector (1 .. Natural (R.Val.Arr.Len));
begin
To_Std_Logic_Vector (L, L_Arr);
To_Std_Logic_Vector (R, R_Arr);
declare
Res_Arr : constant Std_Logic_Vector := Add_Uns_Uns (L_Arr, R_Arr);
begin
- return To_Value_Acc (Res_Arr, L.Typ.Vec_El);
+ return To_Valtyp (Res_Arr, L.Typ.Vec_El);
end;
end Synth_Add_Uns_Uns;
- function Synth_Add_Sgn_Int (L, R : Value_Acc; Loc : Syn_Src)
- return Value_Acc
+ function Synth_Add_Sgn_Int (L, R : Valtyp; Loc : Syn_Src) return Valtyp
is
pragma Unreferenced (Loc);
- L_Arr : Std_Logic_Vector (1 .. Natural (L.Arr.Len));
- R_Val : constant Int64 := R.Scal;
+ L_Arr : Std_Logic_Vector (1 .. Natural (L.Val.Arr.Len));
+ R_Val : constant Int64 := R.Val.Scal;
begin
To_Std_Logic_Vector (L, L_Arr);
declare
Res_Arr : constant Std_Logic_Vector := Add_Sgn_Int (L_Arr, R_Val);
begin
- return To_Value_Acc (Res_Arr, L.Typ.Vec_El);
+ return To_Valtyp (Res_Arr, L.Typ.Vec_El);
end;
end Synth_Add_Sgn_Int;
- function Synth_Add_Uns_Nat (L, R : Value_Acc; Loc : Syn_Src)
- return Value_Acc
+ function Synth_Add_Uns_Nat (L, R : Valtyp; Loc : Syn_Src) return Valtyp
is
pragma Unreferenced (Loc);
L_Arr : Std_Logic_Vector (1 .. Natural (L.Typ.W));
- R_Val : constant Uns64 := Uns64 (R.Scal);
+ R_Val : constant Uns64 := Uns64 (R.Val.Scal);
begin
To_Std_Logic_Vector (L, L_Arr);
declare
Res_Arr : constant Std_Logic_Vector := Add_Uns_Nat (L_Arr, R_Val);
begin
- return To_Value_Acc (Res_Arr, L.Typ.Vec_El);
+ return To_Valtyp (Res_Arr, L.Typ.Vec_El);
end;
end Synth_Add_Uns_Nat;
- function Synth_Sub_Uns_Uns (L, R : Value_Acc; Loc : Syn_Src)
- return Value_Acc
+ function Synth_Sub_Uns_Uns (L, R : Valtyp; Loc : Syn_Src) return Valtyp
is
pragma Unreferenced (Loc);
- L_Arr : Std_Logic_Vector (1 .. Natural (L.Arr.Len));
- R_Arr : Std_Logic_Vector (1 .. Natural (R.Arr.Len));
+ L_Arr : Std_Logic_Vector (1 .. Natural (L.Val.Arr.Len));
+ R_Arr : Std_Logic_Vector (1 .. Natural (R.Val.Arr.Len));
begin
To_Std_Logic_Vector (L, L_Arr);
To_Std_Logic_Vector (R, R_Arr);
declare
Res_Arr : constant Std_Logic_Vector := Sub_Uns_Uns (L_Arr, R_Arr);
begin
- return To_Value_Acc (Res_Arr, L.Typ.Vec_El);
+ return To_Valtyp (Res_Arr, L.Typ.Vec_El);
end;
end Synth_Sub_Uns_Uns;
- function Synth_Sub_Uns_Nat (L, R : Value_Acc; Loc : Syn_Src)
- return Value_Acc
+ function Synth_Sub_Uns_Nat (L, R : Valtyp; Loc : Syn_Src) return Valtyp
is
pragma Unreferenced (Loc);
- L_Arr : Std_Logic_Vector (1 .. Natural (L.Arr.Len));
- R_Val : constant Uns64 := Uns64 (R.Scal);
+ L_Arr : Std_Logic_Vector (1 .. Natural (L.Val.Arr.Len));
+ R_Val : constant Uns64 := Uns64 (R.Val.Scal);
begin
To_Std_Logic_Vector (L, L_Arr);
declare
Res_Arr : constant Std_Logic_Vector := Sub_Uns_Nat (L_Arr, R_Val);
begin
- return To_Value_Acc (Res_Arr, L.Typ.Vec_El);
+ return To_Valtyp (Res_Arr, L.Typ.Vec_El);
end;
end Synth_Sub_Uns_Nat;
- function Synth_Mul_Uns_Uns (L, R : Value_Acc; Loc : Syn_Src)
- return Value_Acc
+ function Synth_Mul_Uns_Uns (L, R : Valtyp; Loc : Syn_Src) return Valtyp
is
pragma Unreferenced (Loc);
- L_Arr : Std_Logic_Vector (1 .. Natural (L.Arr.Len));
- R_Arr : Std_Logic_Vector (1 .. Natural (R.Arr.Len));
+ L_Arr : Std_Logic_Vector (1 .. Natural (L.Val.Arr.Len));
+ R_Arr : Std_Logic_Vector (1 .. Natural (R.Val.Arr.Len));
begin
To_Std_Logic_Vector (L, L_Arr);
To_Std_Logic_Vector (R, R_Arr);
declare
Res_Arr : constant Std_Logic_Vector := Mul_Uns_Uns (L_Arr, R_Arr);
begin
- return To_Value_Acc (Res_Arr, L.Typ.Vec_El);
+ return To_Valtyp (Res_Arr, L.Typ.Vec_El);
end;
end Synth_Mul_Uns_Uns;
- function Synth_Mul_Nat_Uns (L, R : Value_Acc; Loc : Syn_Src)
- return Value_Acc
+ function Synth_Mul_Nat_Uns (L, R : Valtyp; Loc : Syn_Src) return Valtyp
is
pragma Unreferenced (Loc);
- R_Arr : Std_Logic_Vector (1 .. Natural (R.Arr.Len));
- L_Val : constant Uns64 := Uns64 (L.Scal);
+ R_Arr : Std_Logic_Vector (1 .. Natural (R.Val.Arr.Len));
+ L_Val : constant Uns64 := Uns64 (L.Val.Scal);
begin
To_Std_Logic_Vector (R, R_Arr);
declare
Res_Arr : constant Std_Logic_Vector := Mul_Nat_Uns (L_Val, R_Arr);
begin
- return To_Value_Acc (Res_Arr, R.Typ.Vec_El);
+ return To_Valtyp (Res_Arr, R.Typ.Vec_El);
end;
end Synth_Mul_Nat_Uns;
- function Synth_Mul_Sgn_Sgn (L, R : Value_Acc; Loc : Syn_Src)
- return Value_Acc
+ function Synth_Mul_Sgn_Sgn (L, R : Valtyp; Loc : Syn_Src) return Valtyp
is
pragma Unreferenced (Loc);
- L_Arr : Std_Logic_Vector (1 .. Natural (L.Arr.Len));
- R_Arr : Std_Logic_Vector (1 .. Natural (R.Arr.Len));
+ L_Arr : Std_Logic_Vector (1 .. Natural (L.Val.Arr.Len));
+ R_Arr : Std_Logic_Vector (1 .. Natural (R.Val.Arr.Len));
begin
To_Std_Logic_Vector (L, L_Arr);
To_Std_Logic_Vector (R, R_Arr);
declare
Res_Arr : constant Std_Logic_Vector := Mul_Sgn_Sgn (L_Arr, R_Arr);
begin
- return To_Value_Acc (Res_Arr, L.Typ.Vec_El);
+ return To_Valtyp (Res_Arr, L.Typ.Vec_El);
end;
end Synth_Mul_Sgn_Sgn;
- function Synth_Shift (Val : Value_Acc;
+ function Synth_Shift (Val : Valtyp;
Amt : Uns32;
Right : Boolean;
- Arith : Boolean) return Value_Acc
+ Arith : Boolean) return Valtyp
is
- Len : constant Uns32 := Uns32 (Val.Arr.Len);
+ Len : constant Uns32 := Uns32 (Val.Val.Arr.Len);
Arr : Std_Logic_Vector (1 .. Natural (Len));
Pad : Std_Ulogic;
begin
@@ -519,28 +511,28 @@ package body Synth.Static_Oper is
end loop;
end if;
end if;
- return To_Value_Acc (Arr, Val.Typ.Vec_El);
+ return To_Valtyp (Arr, Val.Typ.Vec_El);
end Synth_Shift;
- function Get_Static_Ulogic (Op : Value_Acc) return Std_Ulogic is
+ function Get_Static_Ulogic (Op : Valtyp) return Std_Ulogic is
begin
return Std_Ulogic'Val (Get_Static_Discrete (Op));
end Get_Static_Ulogic;
function Synth_Static_Dyadic_Predefined (Syn_Inst : Synth_Instance_Acc;
Imp : Node;
- Left : Value_Acc;
- Right : Value_Acc;
- Expr : Node) return Value_Acc
+ Left : Valtyp;
+ Right : Valtyp;
+ Expr : Node) return Valtyp
is
Def : constant Iir_Predefined_Functions :=
Get_Implicit_Definition (Imp);
Res_Typ : constant Type_Acc :=
- Get_Value_Type (Syn_Inst, Get_Type (Expr));
+ Get_Subtype_Object (Syn_Inst, Get_Type (Expr));
begin
case Def is
when Iir_Predefined_Error =>
- return null;
+ return No_Valtyp;
when Iir_Predefined_Boolean_Xor =>
return Create_Value_Discrete
@@ -586,10 +578,10 @@ package body Synth.Static_Oper is
Res_Typ);
when Iir_Predefined_Integer_Rem =>
return Create_Value_Discrete
- (Left.Scal rem Right.Scal, Res_Typ);
+ (Left.Val.Scal rem Right.Val.Scal, Res_Typ);
when Iir_Predefined_Integer_Exp =>
return Create_Value_Discrete
- (Left.Scal ** Natural (Right.Scal), Res_Typ);
+ (Left.Val.Scal ** Natural (Right.Val.Scal), Res_Typ);
when Iir_Predefined_Physical_Minimum
| Iir_Predefined_Integer_Minimum =>
return Create_Value_Discrete
@@ -605,19 +597,19 @@ package body Synth.Static_Oper is
when Iir_Predefined_Integer_Less_Equal
| Iir_Predefined_Physical_Less_Equal =>
return Create_Value_Discrete
- (Boolean'Pos (Left.Scal <= Right.Scal), Boolean_Type);
+ (Boolean'Pos (Left.Val.Scal <= Right.Val.Scal), Boolean_Type);
when Iir_Predefined_Integer_Less
| Iir_Predefined_Physical_Less =>
return Create_Value_Discrete
- (Boolean'Pos (Left.Scal < Right.Scal), Boolean_Type);
+ (Boolean'Pos (Left.Val.Scal < Right.Val.Scal), Boolean_Type);
when Iir_Predefined_Integer_Greater_Equal
| Iir_Predefined_Physical_Greater_Equal =>
return Create_Value_Discrete
- (Boolean'Pos (Left.Scal >= Right.Scal), Boolean_Type);
+ (Boolean'Pos (Left.Val.Scal >= Right.Val.Scal), Boolean_Type);
when Iir_Predefined_Integer_Greater
| Iir_Predefined_Physical_Greater =>
return Create_Value_Discrete
- (Boolean'Pos (Left.Scal > Right.Scal), Boolean_Type);
+ (Boolean'Pos (Left.Val.Scal > Right.Val.Scal), Boolean_Type);
when Iir_Predefined_Integer_Equality
| Iir_Predefined_Physical_Equality =>
return Create_Value_Discrete
@@ -632,55 +624,55 @@ package body Synth.Static_Oper is
when Iir_Predefined_Physical_Real_Mul =>
return Create_Value_Discrete
- (Int64 (Fp64 (Left.Scal) * Right.Fp), Res_Typ);
+ (Int64 (Fp64 (Left.Val.Scal) * Right.Val.Fp), Res_Typ);
when Iir_Predefined_Real_Physical_Mul =>
return Create_Value_Discrete
- (Int64 (Left.Fp * Fp64 (Right.Scal)), Res_Typ);
+ (Int64 (Left.Val.Fp * Fp64 (Right.Val.Scal)), Res_Typ);
when Iir_Predefined_Physical_Real_Div =>
return Create_Value_Discrete
- (Int64 (Fp64 (Left.Scal) / Right.Fp), Res_Typ);
+ (Int64 (Fp64 (Left.Val.Scal) / Right.Val.Fp), Res_Typ);
when Iir_Predefined_Floating_Less =>
return Create_Value_Discrete
- (Boolean'Pos (Left.Fp < Right.Fp), Boolean_Type);
+ (Boolean'Pos (Left.Val.Fp < Right.Val.Fp), Boolean_Type);
when Iir_Predefined_Floating_Less_Equal =>
return Create_Value_Discrete
- (Boolean'Pos (Left.Fp <= Right.Fp), Boolean_Type);
+ (Boolean'Pos (Left.Val.Fp <= Right.Val.Fp), Boolean_Type);
when Iir_Predefined_Floating_Equality =>
return Create_Value_Discrete
- (Boolean'Pos (Left.Fp = Right.Fp), Boolean_Type);
+ (Boolean'Pos (Left.Val.Fp = Right.Val.Fp), Boolean_Type);
when Iir_Predefined_Floating_Inequality =>
return Create_Value_Discrete
- (Boolean'Pos (Left.Fp /= Right.Fp), Boolean_Type);
+ (Boolean'Pos (Left.Val.Fp /= Right.Val.Fp), Boolean_Type);
when Iir_Predefined_Floating_Greater =>
return Create_Value_Discrete
- (Boolean'Pos (Left.Fp > Right.Fp), Boolean_Type);
+ (Boolean'Pos (Left.Val.Fp > Right.Val.Fp), Boolean_Type);
when Iir_Predefined_Floating_Greater_Equal =>
return Create_Value_Discrete
- (Boolean'Pos (Left.Fp >= Right.Fp), Boolean_Type);
+ (Boolean'Pos (Left.Val.Fp >= Right.Val.Fp), Boolean_Type);
when Iir_Predefined_Floating_Plus =>
- return Create_Value_Float (Left.Fp + Right.Fp, Res_Typ);
+ return Create_Value_Float (Left.Val.Fp + Right.Val.Fp, Res_Typ);
when Iir_Predefined_Floating_Minus =>
- return Create_Value_Float (Left.Fp - Right.Fp, Res_Typ);
+ return Create_Value_Float (Left.Val.Fp - Right.Val.Fp, Res_Typ);
when Iir_Predefined_Floating_Mul =>
- return Create_Value_Float (Left.Fp * Right.Fp, Res_Typ);
+ return Create_Value_Float (Left.Val.Fp * Right.Val.Fp, Res_Typ);
when Iir_Predefined_Floating_Div =>
- return Create_Value_Float (Left.Fp / Right.Fp, Res_Typ);
+ return Create_Value_Float (Left.Val.Fp / Right.Val.Fp, Res_Typ);
when Iir_Predefined_Floating_Exp =>
return Create_Value_Float
- (Left.Fp ** Natural (Right.Scal), Res_Typ);
+ (Left.Val.Fp ** Natural (Right.Val.Scal), Res_Typ);
when Iir_Predefined_Array_Array_Concat =>
declare
Ret_Typ : constant Type_Acc :=
- Get_Value_Type (Syn_Inst, Get_Return_Type (Imp));
+ Get_Subtype_Object (Syn_Inst, Get_Return_Type (Imp));
L_Len : constant Iir_Index32 :=
Iir_Index32 (Get_Bound_Length (Left.Typ, 1));
R_Len : constant Iir_Index32 :=
Iir_Index32 (Get_Bound_Length (Right.Typ, 1));
- L : constant Value_Acc := Strip_Alias_Const (Left);
- R : constant Value_Acc := Strip_Alias_Const (Right);
+ L : constant Valtyp := Strip_Alias_Const (Left);
+ R : constant Valtyp := Strip_Alias_Const (Right);
Bnd : Bound_Type;
Res_Typ : Type_Acc;
Arr : Value_Array_Acc;
@@ -692,69 +684,69 @@ package body Synth.Static_Oper is
(Ret_Typ, Bnd);
Arr := Create_Value_Array (L_Len + R_Len);
for I in 1 .. L_Len loop
- Arr.V (I) := L.Arr.V (I);
+ Arr.V (I) := L.Val.Arr.V (I);
end loop;
for I in 1 .. R_Len loop
- Arr.V (L_Len + I) := R.Arr.V (I);
+ Arr.V (L_Len + I) := R.Val.Arr.V (I);
end loop;
return Create_Value_Const_Array (Res_Typ, Arr);
end;
when Iir_Predefined_Element_Array_Concat =>
declare
Ret_Typ : constant Type_Acc :=
- Get_Value_Type (Syn_Inst, Get_Return_Type (Imp));
+ Get_Subtype_Object (Syn_Inst, Get_Return_Type (Imp));
Bnd : Bound_Type;
Res_Typ : Type_Acc;
Arr : Value_Array_Acc;
begin
Bnd := Oper.Create_Bounds_From_Length
(Syn_Inst, Get_Index_Type (Get_Type (Expr), 0),
- 1 + Right.Arr.Len);
+ 1 + Right.Val.Arr.Len);
Res_Typ := Create_Onedimensional_Array_Subtype
(Ret_Typ, Bnd);
- Arr := Create_Value_Array (1 + Right.Arr.Len);
- Arr.V (1) := Left;
- for I in Right.Arr.V'Range loop
- Arr.V (1 + I) := Right.Arr.V (I);
+ Arr := Create_Value_Array (1 + Right.Val.Arr.Len);
+ Arr.V (1) := Left.Val;
+ for I in Right.Val.Arr.V'Range loop
+ Arr.V (1 + I) := Right.Val.Arr.V (I);
end loop;
return Create_Value_Const_Array (Res_Typ, Arr);
end;
when Iir_Predefined_Array_Element_Concat =>
declare
Ret_Typ : constant Type_Acc :=
- Get_Value_Type (Syn_Inst, Get_Return_Type (Imp));
+ Get_Subtype_Object (Syn_Inst, Get_Return_Type (Imp));
Bnd : Bound_Type;
Res_Typ : Type_Acc;
Arr : Value_Array_Acc;
begin
Bnd := Oper.Create_Bounds_From_Length
(Syn_Inst, Get_Index_Type (Get_Type (Expr), 0),
- Left.Arr.Len + 1);
+ Left.Val.Arr.Len + 1);
Res_Typ := Create_Onedimensional_Array_Subtype
(Ret_Typ, Bnd);
- Arr := Create_Value_Array (Left.Arr.Len + 1);
- for I in Left.Arr.V'Range loop
- Arr.V (I) := Left.Arr.V (I);
+ Arr := Create_Value_Array (Left.Val.Arr.Len + 1);
+ for I in Left.Val.Arr.V'Range loop
+ Arr.V (I) := Left.Val.Arr.V (I);
end loop;
- Arr.V (Left.Arr.Len + 1) := Right;
+ Arr.V (Left.Val.Arr.Len + 1) := Right.Val;
return Create_Value_Const_Array (Res_Typ, Arr);
end;
when Iir_Predefined_Array_Equality
| Iir_Predefined_Record_Equality =>
return Create_Value_Discrete
- (Boolean'Pos (Is_Equal (Left, Right)), Boolean_Type);
+ (Boolean'Pos (Is_Equal (Left.Val, Right.Val)), Boolean_Type);
when Iir_Predefined_Array_Inequality
| Iir_Predefined_Record_Inequality =>
return Create_Value_Discrete
- (Boolean'Pos (not Is_Equal (Left, Right)), Boolean_Type);
+ (Boolean'Pos (not Is_Equal (Left.Val, Right.Val)), Boolean_Type);
when Iir_Predefined_Access_Equality =>
return Create_Value_Discrete
- (Boolean'Pos (Left.Acc = Right.Acc), Boolean_Type);
+ (Boolean'Pos (Left.Val.Acc = Right.Val.Acc), Boolean_Type);
when Iir_Predefined_Access_Inequality =>
return Create_Value_Discrete
- (Boolean'Pos (Left.Acc /= Right.Acc), Boolean_Type);
+ (Boolean'Pos (Left.Val.Acc /= Right.Val.Acc), Boolean_Type);
when Iir_Predefined_Ieee_1164_Vector_And
| Iir_Predefined_Ieee_Numeric_Std_And_Uns_Uns
@@ -911,20 +903,20 @@ package body Synth.Static_Oper is
Error_Msg_Synth
(+Expr, "synth_static_dyadic_predefined: unhandled "
& Iir_Predefined_Functions'Image (Def));
- return null;
+ return No_Valtyp;
end case;
end Synth_Static_Dyadic_Predefined;
function Synth_Vector_Monadic
- (Vec : Value_Acc; Op : Table_1d) return Value_Acc
+ (Vec : Valtyp; Op : Table_1d) return Valtyp
is
El_Typ : constant Type_Acc := Vec.Typ.Vec_El;
Arr : Value_Array_Acc;
begin
- Arr := Create_Value_Array (Vec.Arr.Len);
+ Arr := Create_Value_Array (Vec.Val.Arr.Len);
for I in Arr.V'Range loop
declare
- V : constant Std_Ulogic := Std_Ulogic'Val (Vec.Arr.V (I).Scal);
+ V : constant Std_Ulogic := Std_Ulogic'Val (Vec.Val.Arr.V (I).Scal);
begin
Arr.V (I) :=
Create_Value_Discrete (Std_Ulogic'Pos (Op (V)), El_Typ);
@@ -935,16 +927,16 @@ package body Synth.Static_Oper is
end Synth_Vector_Monadic;
function Synth_Vector_Reduce
- (Init : Std_Ulogic; Vec : Value_Acc; Op : Table_2d) return Value_Acc
+ (Init : Std_Ulogic; Vec : Valtyp; Op : Table_2d) return Valtyp
is
El_Typ : constant Type_Acc := Vec.Typ.Vec_El;
Res : Std_Ulogic;
begin
Res := Init;
- for I in Vec.Arr.V'Range loop
+ for I in Vec.Val.Arr.V'Range loop
declare
V : constant Std_Ulogic :=
- Std_Ulogic'Val (Vec.Arr.V (I).Scal);
+ Std_Ulogic'Val (Vec.Val.Arr.V (I).Scal);
begin
Res := Op (Res, V);
end;
@@ -955,39 +947,39 @@ package body Synth.Static_Oper is
function Synth_Static_Monadic_Predefined (Syn_Inst : Synth_Instance_Acc;
Imp : Node;
- Operand : Value_Acc;
- Expr : Node) return Value_Acc
+ Operand : Valtyp;
+ Expr : Node) return Valtyp
is
Def : constant Iir_Predefined_Functions :=
Get_Implicit_Definition (Imp);
Inter_Chain : constant Node :=
Get_Interface_Declaration_Chain (Imp);
Oper_Type : constant Node := Get_Type (Inter_Chain);
- Oper_Typ : constant Type_Acc := Get_Value_Type (Syn_Inst, Oper_Type);
+ Oper_Typ : constant Type_Acc := Get_Subtype_Object (Syn_Inst, Oper_Type);
-- Res_Typ : constant Type_Acc :=
- -- Get_Value_Type (Syn_Inst, Get_Type (Expr));
+ -- Get_Subtype_Object (Syn_Inst, Get_Type (Expr));
begin
case Def is
when Iir_Predefined_Boolean_Not
| Iir_Predefined_Bit_Not =>
- return Create_Value_Discrete (1 - Operand.Scal, Oper_Typ);
+ return Create_Value_Discrete (1 - Operand.Val.Scal, Oper_Typ);
when Iir_Predefined_Integer_Negation
| Iir_Predefined_Physical_Negation =>
- return Create_Value_Discrete (-Operand.Scal, Oper_Typ);
+ return Create_Value_Discrete (-Operand.Val.Scal, Oper_Typ);
when Iir_Predefined_Integer_Absolute
| Iir_Predefined_Physical_Absolute =>
- return Create_Value_Discrete (abs Operand.Scal, Oper_Typ);
+ return Create_Value_Discrete (abs Operand.Val.Scal, Oper_Typ);
when Iir_Predefined_Integer_Identity
| Iir_Predefined_Physical_Identity =>
return Operand;
when Iir_Predefined_Floating_Negation =>
- return Create_Value_Float (-Operand.Fp, Oper_Typ);
+ return Create_Value_Float (-Operand.Val.Fp, Oper_Typ);
when Iir_Predefined_Floating_Identity =>
return Operand;
when Iir_Predefined_Floating_Absolute =>
- return Create_Value_Float (abs Operand.Fp, Oper_Typ);
+ return Create_Value_Float (abs Operand.Val.Fp, Oper_Typ);
when Iir_Predefined_Ieee_1164_Condition_Operator =>
-- Constant std_logic: need to convert.
@@ -995,20 +987,20 @@ package body Synth.Static_Oper is
Val : Uns32;
Zx : Uns32;
begin
- From_Std_Logic (Operand.Scal, Val, Zx);
+ From_Std_Logic (Operand.Val.Scal, Val, Zx);
return Create_Value_Discrete
(Boolean'Pos (Val = 1 and Zx = 0), Boolean_Type);
end;
when Iir_Predefined_Ieee_Numeric_Std_Neg_Sgn =>
declare
- Op_Arr : Std_Logic_Vector (1 .. Natural (Operand.Arr.Len));
+ Op_Arr : Std_Logic_Vector (1 .. Natural (Operand.Val.Arr.Len));
begin
To_Std_Logic_Vector (Operand, Op_Arr);
declare
Res_Arr : constant Std_Logic_Vector := Neg_Sgn (Op_Arr);
begin
- return To_Value_Acc (Res_Arr, Operand.Typ.Vec_El);
+ return To_Valtyp (Res_Arr, Operand.Typ.Vec_El);
end;
end;
@@ -1035,7 +1027,7 @@ package body Synth.Static_Oper is
end Synth_Static_Monadic_Predefined;
function Eval_To_Vector (Arg : Uns64; Sz : Int64; Res_Type : Type_Acc)
- return Value_Acc
+ return Valtyp
is
Len : constant Iir_Index32 := Iir_Index32 (Sz);
El_Type : constant Type_Acc := Get_Array_Element (Res_Type);
@@ -1108,7 +1100,7 @@ package body Synth.Static_Oper is
end Eval_Signed_To_Integer;
function Synth_Static_Predefined_Function_Call
- (Subprg_Inst : Synth_Instance_Acc; Expr : Node) return Value_Acc
+ (Subprg_Inst : Synth_Instance_Acc; Expr : Node) return Valtyp
is
Imp : constant Node := Get_Implementation (Expr);
Def : constant Iir_Predefined_Functions :=
@@ -1121,21 +1113,21 @@ package body Synth.Static_Oper is
begin
Inter := Inter_Chain;
if Inter /= Null_Node then
- Param1 := Get_Value (Subprg_Inst, Inter);
+ Param1 := Get_Value (Subprg_Inst, Inter).Val;
Strip_Const (Param1);
Inter := Get_Chain (Inter);
else
Param1 := null;
end if;
if Inter /= Null_Node then
- Param2 := Get_Value (Subprg_Inst, Inter);
+ Param2 := Get_Value (Subprg_Inst, Inter).Val;
Strip_Const (Param2);
Inter := Get_Chain (Inter);
else
Param2 := null;
end if;
- Res_Typ := Get_Value_Type (Subprg_Inst, Get_Type (Imp));
+ Res_Typ := Get_Subtype_Object (Subprg_Inst, Get_Type (Imp));
case Def is
when Iir_Predefined_Endfile =>
@@ -1224,7 +1216,7 @@ package body Synth.Static_Oper is
Error_Msg_Synth
(+Expr, "unhandled (static) function: "
& Iir_Predefined_Functions'Image (Def));
- return null;
+ return No_Valtyp;
end case;
end Synth_Static_Predefined_Function_Call;