aboutsummaryrefslogtreecommitdiffstats
path: root/src/synth
diff options
context:
space:
mode:
authorTristan Gingold <tgingold@free.fr>2022-11-30 05:19:54 +0100
committerTristan Gingold <tgingold@free.fr>2022-11-30 05:30:00 +0100
commitf54124861d2488e234887fc020ce0455f2a41d1d (patch)
treecfe0a3a25370cf17310188318e1caa8041014b27 /src/synth
parent68713e749e55679c6cf334a9a8d6da058672026e (diff)
downloadghdl-f54124861d2488e234887fc020ce0455f2a41d1d.tar.gz
ghdl-f54124861d2488e234887fc020ce0455f2a41d1d.tar.bz2
ghdl-f54124861d2488e234887fc020ce0455f2a41d1d.zip
synth-vhdl_oper: complete rework on predefined functions.
The same subprogram now handle all the predefined functions.
Diffstat (limited to 'src/synth')
-rw-r--r--src/synth/synth-vhdl_oper.adb1214
-rw-r--r--src/synth/synth-vhdl_oper.ads2
2 files changed, 571 insertions, 645 deletions
diff --git a/src/synth/synth-vhdl_oper.adb b/src/synth/synth-vhdl_oper.adb
index c631ee25f..1b463e62c 100644
--- a/src/synth/synth-vhdl_oper.adb
+++ b/src/synth/synth-vhdl_oper.adb
@@ -417,45 +417,202 @@ package body Synth.Vhdl_Oper is
return Create_Value_Net (N, Res_Typ);
end Synth_Compare_Xxx_Xxx;
- function Synth_Dyadic_Operation (Syn_Inst : Synth_Instance_Acc;
- Imp : Node;
- Left : Valtyp;
- Right : Valtyp;
- Expr : Node) return Valtyp
+ function Synth_Shift_Rotate (Ctxt : Context_Acc;
+ Id : Shift_Rotate_Module_Id;
+ Left, Right : Valtyp;
+ Expr : Node) return Valtyp
+ is
+ L : constant Net := Get_Net (Ctxt, Left);
+ N : Net;
+ begin
+ N := Build_Shift_Rotate (Ctxt, Id, L, Get_Net (Ctxt, Right));
+ Set_Location (N, Expr);
+ return Create_Value_Net (N, Create_Res_Bound (Left));
+ end Synth_Shift_Rotate;
+
+ function Synth_Find_Bit (Syn_Inst : Synth_Instance_Acc;
+ Left, Right : Valtyp;
+ Res_Typ : Type_Acc;
+ Leftmost : Boolean;
+ Expr : Node) return Valtyp
+ is
+ Ctxt : constant Context_Acc := Get_Build (Syn_Inst);
+ pragma Assert (Left.Typ.Kind = Type_Vector);
+ Len : constant Uns32 := Left.Typ.Abound.Len;
+ Max : Int32;
+ Rng : Discrete_Range_Type;
+ W : Uns32;
+ Typ : Type_Acc;
+ R_Net : Net;
+ L_Net : Net;
+ Res : Net;
+ begin
+ if Len = 0 then
+ return Create_Value_Int (-1, Res_Typ);
+ end if;
+
+ -- The intermediate result is computed using the least number of bits,
+ -- which must represent all positive values in the bounds using a
+ -- signed word (so that -1 is also represented).
+ Max := Int32'Max (Left.Typ.Abound.Left, Left.Typ.Abound.Right);
+ W := Netlists.Utils.Clog2 (Uns32 (Max)) + 1;
+ Rng := (Dir => Dir_To,
+ Is_Signed => True,
+ Left => -1,
+ Right => Int64 (Max));
+ Typ := Create_Discrete_Type (Rng, Res_Typ.Sz, W);
+
+ R_Net := Get_Net (Ctxt, Right);
+ L_Net := Get_Net (Ctxt, Left);
+ Res := Build2_Const_Int (Ctxt, -1, W);
+ for I in 0 .. Len - 1 loop
+ declare
+ Pos : Uns32;
+ V : Int64;
+ Sel : Net;
+ begin
+ if Leftmost then
+ -- Iterate from the right to the left.
+ Pos := I;
+ if Left.Typ.Abound.Dir = Dir_To then
+ V := Int64 (Left.Typ.Abound.Right) - Int64 (I);
+ else
+ V := Int64 (Left.Typ.Abound.Right) + Int64 (I);
+ end if;
+ else
+ Pos := Len - I - 1;
+ if Left.Typ.Abound.Dir = Dir_To then
+ V := Int64 (Left.Typ.Abound.Left) + Int64 (I);
+ else
+ V := Int64 (Left.Typ.Abound.Left) - Int64 (I);
+ end if;
+ end if;
+ Sel := Build2_Compare (Ctxt, Id_Eq,
+ Build2_Extract (Ctxt, L_Net, Pos, 1),
+ R_Net);
+ Set_Location (Sel, Expr);
+ Res := Build_Mux2 (Ctxt, Sel, Res, Build2_Const_Int (Ctxt, V, W));
+ Set_Location (Res, Expr);
+ end;
+ end loop;
+
+ return Synth_Subtype_Conversion (Syn_Inst, Create_Value_Net (Res, Typ),
+ Res_Typ, False, Expr);
+ end Synth_Find_Bit;
+
+ -- Resize ARG to SIZE bits according to IS_SIGNED.
+ function Synth_Resize (Ctxt : Context_Acc;
+ Arg : Valtyp;
+ Size : Width;
+ Is_Signed : Boolean;
+ Loc : Node) return Valtyp
+ is
+ N : Net;
+ begin
+ N := Get_Net (Ctxt, Arg);
+ N := Build2_Resize (Ctxt, N, Size, Is_Signed, Get_Location (Loc));
+ return Create_Value_Net
+ (N, Create_Vec_Type_By_Length (Size, Logic_Type));
+ end Synth_Resize;
+
+ function Synth_Minmax (Ctxt : Context_Acc;
+ Left, Right : Valtyp;
+ Res_Typ : Type_Acc;
+ Id : Compare_Module_Id;
+ Expr : Node) return Valtyp
+ is
+ L : constant Net := Get_Net (Ctxt, Left);
+ R : constant Net := Get_Net (Ctxt, Right);
+ Sel, N : Net;
+ begin
+ Sel := Build2_Compare (Ctxt, Id, L, R);
+ Set_Location (Sel, Expr);
+ N := Build_Mux2 (Ctxt, Sel, R, L);
+ Set_Location (N, Expr);
+ return Create_Value_Net (N, Res_Typ);
+ end Synth_Minmax;
+
+ function Synth_Vec_Reduce_Monadic (Ctxt : Context_Acc;
+ Id : Reduce_Module_Id;
+ Neg : Boolean;
+ Operand : Valtyp;
+ Loc : Node) return Valtyp
+ is
+ Op: constant Net := Get_Net (Ctxt, Operand);
+ N : Net;
+ begin
+ N := Build_Reduce (Ctxt, Id, Op);
+ Set_Location (N, Loc);
+ if Neg then
+ N := Build_Monadic (Ctxt, Id_Not, N);
+ Set_Location (N, Loc);
+ end if;
+ return Create_Value_Net (N, Operand.Typ.Arr_El);
+ end Synth_Vec_Reduce_Monadic;
+
+ function Synth_Dynamic_Predefined_Call (Syn_Inst : Synth_Instance_Acc;
+ Imp : Node;
+ L, R : Valtyp;
+ Expr : Node) return Valtyp
is
Ctxt : constant Context_Acc := Get_Build (Syn_Inst);
Def : constant Iir_Predefined_Functions :=
Get_Implicit_Definition (Imp);
- Inter_Chain : constant Node :=
- Get_Interface_Declaration_Chain (Imp);
- Expr_Type : constant Node := Get_Type (Expr);
- Left_Type : constant Node := Get_Type (Inter_Chain);
- Right_Type : constant Node := Get_Type (Get_Chain (Inter_Chain));
- Left_Typ : constant Type_Acc :=
- Get_Subtype_Object (Syn_Inst, Left_Type);
- Expr_Typ : constant Type_Acc := Get_Subtype_Object (Syn_Inst, Expr_Type);
+ Res_Typ : constant Type_Acc :=
+ Get_Subtype_Object (Syn_Inst, Get_Type (Imp));
+
+ function Synth_Bit_Monadic (Id : Monadic_Module_Id) return Valtyp
+ is
+ N : Net;
+ begin
+ N := Build_Monadic (Ctxt, Id, Get_Net (Ctxt, L));
+ Set_Location (N, Expr);
+ return Create_Value_Net (N, L.Typ);
+ end Synth_Bit_Monadic;
+
+ function Synth_Vec_Monadic (Id : Monadic_Module_Id) return Valtyp
+ is
+ Op : constant Net := Get_Net (Ctxt, L);
+ N : Net;
+ begin
+ N := Build_Monadic (Ctxt, Id, Op);
+ Set_Location (N, Expr);
+ return Create_Value_Net (N, Create_Res_Bound (L));
+ end Synth_Vec_Monadic;
+
+ function Synth_Vec_Reduce_Monadic
+ (Id : Reduce_Module_Id; Neg : Boolean := False) return Valtyp
+ is
+ Op: constant Net := Get_Net (Ctxt, L);
+ N : Net;
+ begin
+ N := Build_Reduce (Ctxt, Id, Op);
+ Set_Location (N, Expr);
+ if Neg then
+ N := Build_Monadic (Ctxt, Id_Not, N);
+ Set_Location (N, Expr);
+ end if;
+ return Create_Value_Net (N, L.Typ.Arr_El);
+ end Synth_Vec_Reduce_Monadic;
function Synth_Bit_Dyadic (Id : Dyadic_Module_Id) return Valtyp
is
N : Net;
begin
- N := Build_Dyadic
- (Ctxt, Id, Get_Net (Ctxt, Left), Get_Net (Ctxt, Right));
+ N := Build_Dyadic (Ctxt, Id, Get_Net (Ctxt, L), Get_Net (Ctxt, R));
Set_Location (N, Expr);
- return Create_Value_Net (N, Left.Typ);
+ return Create_Value_Net (N, L.Typ);
end Synth_Bit_Dyadic;
- function Synth_Compare (Id : Compare_Module_Id; Res_Type : Type_Acc)
+ function Synth_Compare (Id : Compare_Module_Id; Result_Type : Type_Acc)
return Valtyp
is
N : Net;
begin
- pragma Assert (Left_Type = Right_Type);
- pragma Assert (Res_Type = Expr_Typ);
- N := Build2_Compare
- (Ctxt, Id, Get_Net (Ctxt, Left), Get_Net (Ctxt, Right));
+ pragma Assert (Result_Type = Res_Typ);
+ N := Build2_Compare (Ctxt, Id, Get_Net (Ctxt, L), Get_Net (Ctxt, R));
Set_Location (N, Expr);
- return Create_Value_Net (N, Res_Type);
+ return Create_Value_Net (N, Result_Type);
end Synth_Compare;
function Synth_Compare_Array (Id : Compare_Module_Id;
@@ -463,17 +620,16 @@ package body Synth.Vhdl_Oper is
is
Ln, Rn, N : Net;
begin
- if Left.Typ.Kind = Type_Vector then
- Ln := Get_Net (Ctxt, Left);
- Rn := Get_Net (Ctxt, Right);
+ if L.Typ.Kind = Type_Vector then
+ Ln := Get_Net (Ctxt, L);
+ Rn := Get_Net (Ctxt, R);
Warning_Msg_Synth
(+Expr, "comparing non-numeric vector is unexpected");
- if Left.Typ.W = Right.Typ.W then
+ if L.Typ.W = R.Typ.W then
N := Build2_Compare (Ctxt, Id, Ln, Rn);
- elsif Left.Typ.W < Right.Typ.W then
+ elsif L.Typ.W < R.Typ.W then
-- Truncate right.
- Rn := Build_Extract
- (Ctxt, Rn, Right.Typ.W - Left.Typ.W, Left.Typ.W);
+ Rn := Build_Extract (Ctxt, Rn, R.Typ.W - L.Typ.W, L.Typ.W);
-- Because it has been truncated, it cannot be equal.
if Id = Id_Ule then
N := Build2_Compare (Ctxt, Id_Ult, Ln, Rn);
@@ -495,16 +651,16 @@ package body Synth.Vhdl_Oper is
(Id : Compare_Module_Id; Res_Type : Type_Acc) return Valtyp is
begin
return Synth_Compare_Xxx_Xxx
- (Ctxt, Id, Width'Max (Left.Typ.W, Right.Typ.W),
- Left, Right, False, False, Res_Type, Expr);
+ (Ctxt, Id, Width'Max (L.Typ.W, R.Typ.W),
+ L, R, False, False, Res_Type, Expr);
end Synth_Compare_Uns_Uns;
function Synth_Compare_Sgn_Sgn
(Id : Compare_Module_Id; Res_Type : Type_Acc) return Valtyp is
begin
return Synth_Compare_Xxx_Xxx
- (Ctxt, Id, Width'Max (Left.Typ.W, Right.Typ.W),
- Left, Right, True, True, Res_Type, Expr);
+ (Ctxt, Id, Width'Max (L.Typ.W, R.Typ.W),
+ L, R, True, True, Res_Type, Expr);
end Synth_Compare_Sgn_Sgn;
-- For std_logic_arith
@@ -512,8 +668,8 @@ package body Synth.Vhdl_Oper is
(Id : Compare_Module_Id; Res_Typ : Type_Acc) return Valtyp is
begin
return Synth_Compare_Xxx_Xxx
- (Ctxt, Id, Width'Max (Left.Typ.W + 1, Right.Typ.W),
- Left, Right, False, True, Res_Typ, Expr);
+ (Ctxt, Id, Width'Max (L.Typ.W + 1, R.Typ.W),
+ L, R, False, True, Res_Typ, Expr);
end Synth_Compare_Uns_Sgn;
-- For std_logic_arith
@@ -521,40 +677,36 @@ package body Synth.Vhdl_Oper is
(Id : Compare_Module_Id; Res_Typ : Type_Acc) return Valtyp is
begin
return Synth_Compare_Xxx_Xxx
- (Ctxt, Id, Width'Max (Left.Typ.W, Right.Typ.W + 1),
- Left, Right, True, False, Res_Typ, Expr);
+ (Ctxt, Id, Width'Max (L.Typ.W, R.Typ.W + 1),
+ L, R, True, False, Res_Typ, Expr);
end Synth_Compare_Sgn_Uns;
function Synth_Compare_Uns_Nat
(Id : Compare_Module_Id; Res_Typ : Type_Acc) return Valtyp is
begin
return Synth_Compare_Xxx_Xxx
- (Ctxt, Id, Left.Typ.W,
- Left, Right, False, False, Res_Typ, Expr);
+ (Ctxt, Id, L.Typ.W, L, R, False, False, Res_Typ, Expr);
end Synth_Compare_Uns_Nat;
function Synth_Compare_Nat_Uns
(Id : Compare_Module_Id; Res_Typ : Type_Acc) return Valtyp is
begin
return Synth_Compare_Xxx_Xxx
- (Ctxt, Id, Right.Typ.W,
- Left, Right, False, False, Res_Typ, Expr);
+ (Ctxt, Id, R.Typ.W, L, R, False, False, Res_Typ, Expr);
end Synth_Compare_Nat_Uns;
function Synth_Compare_Sgn_Int
(Id : Compare_Module_Id; Res_Typ : Type_Acc) return Valtyp is
begin
return Synth_Compare_Xxx_Xxx
- (Ctxt, Id, Left.Typ.W,
- Left, Right, True, True, Res_Typ, Expr);
+ (Ctxt, Id, L.Typ.W, L, R, True, True, Res_Typ, Expr);
end Synth_Compare_Sgn_Int;
function Synth_Compare_Int_Sgn
(Id : Compare_Module_Id; Res_Typ : Type_Acc) return Valtyp is
begin
return Synth_Compare_Xxx_Xxx
- (Ctxt, Id, Right.Typ.W,
- Left, Right, True, True, Res_Typ, Expr);
+ (Ctxt, Id, R.Typ.W, L, R, True, True, Res_Typ, Expr);
end Synth_Compare_Int_Sgn;
-- For std_logic_arith
@@ -562,8 +714,7 @@ package body Synth.Vhdl_Oper is
(Id : Compare_Module_Id; Res_Typ : Type_Acc) return Valtyp is
begin
return Synth_Compare_Xxx_Xxx
- (Ctxt, Id, Left.Typ.W + 1,
- Left, Right, False, True, Res_Typ, Expr);
+ (Ctxt, Id, L.Typ.W + 1, L, R, False, True, Res_Typ, Expr);
end Synth_Compare_Uns_Int;
-- For std_logic_arith
@@ -571,34 +722,30 @@ package body Synth.Vhdl_Oper is
(Id : Compare_Module_Id; Res_Typ : Type_Acc) return Valtyp is
begin
return Synth_Compare_Xxx_Xxx
- (Ctxt, Id, Right.Typ.W + 1,
- Left, Right, True, False, Res_Typ, Expr);
+ (Ctxt, Id, R.Typ.W + 1, L, R, True, False, Res_Typ, Expr);
end Synth_Compare_Int_Uns;
function Synth_Vec_Dyadic (Id : Dyadic_Module_Id) return Valtyp
is
N : Net;
begin
- if Left.Typ.W /= Right.Typ.W then
+ if L.Typ.W /= R.Typ.W then
Error_Msg_Synth
(Syn_Inst, Expr, "operands don't have the same length");
return No_Valtyp;
end if;
- N := Build_Dyadic (Ctxt, Id,
- Get_Net (Ctxt, Left), Get_Net (Ctxt, Right));
+ N := Build_Dyadic (Ctxt, Id, Get_Net (Ctxt, L), Get_Net (Ctxt, R));
Set_Location (N, Expr);
- return Create_Value_Net (N, Create_Res_Bound (Left));
+ return Create_Value_Net (N, Create_Res_Bound (L));
end Synth_Vec_Dyadic;
function Synth_Int_Dyadic (Id : Dyadic_Module_Id) return Valtyp
is
- Etype : constant Type_Acc := Get_Subtype_Object (Syn_Inst, Expr_Type);
N : Net;
begin
- N := Build_Dyadic
- (Ctxt, Id, Get_Net (Ctxt, Left), Get_Net (Ctxt, Right));
+ N := Build_Dyadic (Ctxt, Id, Get_Net (Ctxt, L), Get_Net (Ctxt, R));
Set_Location (N, Expr);
- return Create_Value_Net (N, Etype);
+ return Create_Value_Net (N, Res_Typ);
end Synth_Int_Dyadic;
type Oper_Kind is (Oper_Left, Oper_Right);
@@ -606,18 +753,18 @@ package body Synth.Vhdl_Oper is
function Synth_Udivmod (Id : Dyadic_Module_Id; Vec : Oper_Kind)
return Valtyp
is
- W : constant Width := Width'Max (Left.Typ.W, Right.Typ.W);
+ W : constant Width := Width'Max (L.Typ.W, R.Typ.W);
L1, R1 : Net;
Res_Typ : Type_Acc;
N : Net;
begin
- L1 := Synth_Uresize (Ctxt, Left, W, Expr);
- R1 := Synth_Uresize (Ctxt, Right, W, Expr);
+ L1 := Synth_Uresize (Ctxt, L, W, Expr);
+ R1 := Synth_Uresize (Ctxt, R, W, Expr);
case Vec is
when Oper_Left =>
- Res_Typ := Left.Typ;
+ Res_Typ := L.Typ;
when Oper_Right =>
- Res_Typ := Right.Typ;
+ Res_Typ := R.Typ;
end case;
Res_Typ := Create_Vec_Type_By_Length (Res_Typ.W, Res_Typ.Arr_El);
N := Build_Dyadic (Ctxt, Id, L1, R1);
@@ -629,18 +776,18 @@ package body Synth.Vhdl_Oper is
function Synth_Sdivmod (Id : Dyadic_Module_Id; Vec : Oper_Kind)
return Valtyp
is
- W : constant Width := Width'Max (Left.Typ.W, Right.Typ.W);
+ W : constant Width := Width'Max (L.Typ.W, R.Typ.W);
L1, R1 : Net;
Res_Typ : Type_Acc;
N : Net;
begin
- L1 := Synth_Sresize (Ctxt, Left, W, Expr);
- R1 := Synth_Sresize (Ctxt, Right, W, Expr);
+ L1 := Synth_Sresize (Ctxt, L, W, Expr);
+ R1 := Synth_Sresize (Ctxt, R, W, Expr);
case Vec is
when Oper_Left =>
- Res_Typ := Left.Typ;
+ Res_Typ := L.Typ;
when Oper_Right =>
- Res_Typ := Right.Typ;
+ Res_Typ := R.Typ;
end case;
Res_Typ := Create_Vec_Type_By_Length (Res_Typ.W, Res_Typ.Arr_El);
N := Build_Dyadic (Ctxt, Id, L1, R1);
@@ -655,14 +802,14 @@ package body Synth.Vhdl_Oper is
L1, R1 : Net;
N, Nn, Nr1, Cond : Net;
begin
- L1 := Get_Net (Ctxt, Left);
- R1 := Get_Net (Ctxt, Right);
+ L1 := Get_Net (Ctxt, L);
+ R1 := Get_Net (Ctxt, R);
-- Handle the case when the RHS is positive.
N := Build_Shift_Rotate (Ctxt, Sh_Pos, L1, R1);
Set_Location (N, Expr);
- if not Is_Positive (Right) then
+ if not Is_Positive (R) then
-- If we cannot trivially prove that the RHS is positive, also
-- handle the case when it could be negative.
-- At worst, the optimizer will remove that part.
@@ -679,7 +826,7 @@ package body Synth.Vhdl_Oper is
Set_Location (N, Expr);
end if;
- return Create_Value_Net (N, Create_Res_Bound (Left));
+ return Create_Value_Net (N, Create_Res_Bound (L));
end Synth_Shift;
function Synth_Rotation (Id : Module_Id) return Valtyp
@@ -689,38 +836,122 @@ package body Synth.Vhdl_Oper is
L1, R1 : Net;
N : Net;
begin
- if Is_Static_Val (Right.Val) then
- Amt := Get_Static_Discrete (Right);
+ if Is_Static_Val (R.Val) then
+ Amt := Get_Static_Discrete (R);
if Amt < 0 then
raise Internal_Error;
end if;
- Amt := Amt mod Int64 (Left.Typ.W);
- R1 := Build_Const_UB32 (Ctxt, Uns32 (Amt), Right.Typ.W);
+ Amt := Amt mod Int64 (L.Typ.W);
+ R1 := Build_Const_UB32 (Ctxt, Uns32 (Amt), R.Typ.W);
Set_Location (R1, Expr);
else
-- The amount should be positive.
- R1 := Get_Net (Ctxt, Right);
- Ww := Netlists.Utils.Clog2 (Left.Typ.W);
- if Right.Typ.W >= Ww then
- if Mutils.Is_Power2 (Uns64 (Left.Typ.W)) then
+ R1 := Get_Net (Ctxt, R);
+ Ww := Netlists.Utils.Clog2 (L.Typ.W);
+ if R.Typ.W >= Ww then
+ if Mutils.Is_Power2 (Uns64 (L.Typ.W)) then
R1 := Build2_Trunc (Ctxt, Id_Utrunc, R1, Ww, +Expr);
else
Error_Msg_Synth
(Syn_Inst, Expr,
"vector length of rotation must be a power of 2");
- return Left;
+ return L;
end if;
end if;
end if;
- L1 := Get_Net (Ctxt, Left);
+ L1 := Get_Net (Ctxt, L);
N := Build_Shift_Rotate (Ctxt, Id, L1, R1);
Set_Location (N, Expr);
- return Create_Value_Net (N, Create_Res_Bound (Left));
+ return Create_Value_Net (N, Create_Res_Bound (L));
end Synth_Rotation;
+
+ -- Resize L to R bit according to IS_SIGNED.
+ function Synth_Conv_Vector (Is_Signed : Boolean) return Valtyp
+ is
+ Size_Vt : Valtyp;
+ Size : Width;
+ begin
+ Size_Vt := R;
+ Strip_Const (Size_Vt);
+ if not Is_Static (Size_Vt.Val) then
+ Error_Msg_Synth
+ (Get_Caller_Instance (Syn_Inst), Expr,
+ "size parameter must be constant");
+ return No_Valtyp;
+ end if;
+ Size := Uns32 (Read_Discrete (Size_Vt));
+ return Synth_Resize (Ctxt, L, Size, Is_Signed, Expr);
+ end Synth_Conv_Vector;
begin
case Def is
when Iir_Predefined_Error =>
return No_Valtyp;
+ when Iir_Predefined_Ieee_1164_Scalar_Not =>
+ return Synth_Bit_Monadic (Id_Not);
+ when Iir_Predefined_Boolean_Not
+ | Iir_Predefined_Bit_Not =>
+ return Synth_Bit_Monadic (Id_Not);
+ when Iir_Predefined_Ieee_1164_Vector_Not
+ | Iir_Predefined_Ieee_Numeric_Std_Not_Uns
+ | Iir_Predefined_Ieee_Numeric_Std_Not_Sgn =>
+ return Synth_Vec_Monadic (Id_Not);
+ when Iir_Predefined_Ieee_Numeric_Std_Neg_Uns
+ | Iir_Predefined_Ieee_Numeric_Std_Neg_Sgn
+ | Iir_Predefined_Ieee_Std_Logic_Arith_Neg_Sgn_Sgn
+ | Iir_Predefined_Ieee_Std_Logic_Arith_Neg_Sgn_Slv
+ | Iir_Predefined_Ieee_Std_Logic_Signed_Neg_Slv =>
+ return Synth_Vec_Monadic (Id_Neg);
+ when Iir_Predefined_Ieee_Numeric_Std_Abs_Sgn
+ | Iir_Predefined_Ieee_Std_Logic_Arith_Abs_Sgn_Sgn
+ | Iir_Predefined_Ieee_Std_Logic_Arith_Abs_Sgn_Slv
+ | Iir_Predefined_Ieee_Std_Logic_Signed_Abs_Slv =>
+ return Synth_Vec_Monadic (Id_Abs);
+
+ when Iir_Predefined_Ieee_1164_And_Suv
+ | Iir_Predefined_Ieee_Numeric_Std_And_Sgn
+ | Iir_Predefined_Ieee_Numeric_Std_And_Uns =>
+ return Synth_Vec_Reduce_Monadic (Id_Red_And);
+ when Iir_Predefined_Ieee_1164_Nand_Suv
+ | Iir_Predefined_Ieee_Numeric_Std_Nand_Sgn
+ | Iir_Predefined_Ieee_Numeric_Std_Nand_Uns =>
+ return Synth_Vec_Reduce_Monadic (Id_Red_And, True);
+ when Iir_Predefined_Ieee_1164_Or_Suv
+ | Iir_Predefined_Ieee_Numeric_Std_Or_Sgn
+ | Iir_Predefined_Ieee_Numeric_Std_Or_Uns =>
+ return Synth_Vec_Reduce_Monadic (Id_Red_Or);
+ when Iir_Predefined_Ieee_1164_Nor_Suv
+ | Iir_Predefined_Ieee_Numeric_Std_Nor_Sgn
+ | Iir_Predefined_Ieee_Numeric_Std_Nor_Uns =>
+ return Synth_Vec_Reduce_Monadic (Id_Red_Or, True);
+ when Iir_Predefined_Ieee_1164_Xor_Suv
+ | Iir_Predefined_Ieee_Numeric_Std_Xor_Sgn
+ | Iir_Predefined_Ieee_Numeric_Std_Xor_Uns =>
+ return Synth_Vec_Reduce_Monadic (Id_Red_Xor);
+ when Iir_Predefined_Ieee_1164_Xnor_Suv
+ | Iir_Predefined_Ieee_Numeric_Std_Xnor_Sgn
+ | Iir_Predefined_Ieee_Numeric_Std_Xnor_Uns =>
+ return Synth_Vec_Reduce_Monadic (Id_Red_Xor, True);
+
+ when Iir_Predefined_Ieee_Std_Logic_Arith_Id_Uns_Uns
+ | Iir_Predefined_Ieee_Std_Logic_Arith_Id_Uns_Slv
+ | Iir_Predefined_Ieee_Std_Logic_Arith_Id_Sgn_Sgn
+ | Iir_Predefined_Ieee_Std_Logic_Arith_Id_Sgn_Slv
+ | Iir_Predefined_Ieee_Std_Logic_Unsigned_Id_Slv
+ | Iir_Predefined_Ieee_Std_Logic_Signed_Id_Slv =>
+ -- Unary "+": nop
+ return Create_Value_Net (Get_Net (Ctxt, L), Create_Res_Bound (L));
+
+ when Iir_Predefined_Ieee_1164_Condition_Operator
+ | Iir_Predefined_Bit_Condition =>
+ return Create_Value_Net (Get_Net (Ctxt, L), Res_Typ);
+ when Iir_Predefined_Integer_Negation =>
+ declare
+ N : Net;
+ begin
+ N := Build_Monadic (Ctxt, Id_Neg, Get_Net (Ctxt, L));
+ Set_Location (N, Expr);
+ return Create_Value_Net (N, L.Typ);
+ end;
when Iir_Predefined_Bit_And
| Iir_Predefined_Boolean_And
@@ -781,60 +1012,58 @@ package body Synth.Vhdl_Oper is
when Iir_Predefined_Ieee_1164_And_Suv_Log
| Iir_Predefined_Ieee_Numeric_Std_And_Uns_Log
| Iir_Predefined_Ieee_Numeric_Std_And_Sgn_Log =>
- return Synth_Dyadic_Vec_Log (Ctxt, Id_And, Left, Right, Expr);
+ return Synth_Dyadic_Vec_Log (Ctxt, Id_And, L, R, Expr);
when Iir_Predefined_Ieee_1164_And_Log_Suv
| Iir_Predefined_Ieee_Numeric_Std_And_Log_Uns
| Iir_Predefined_Ieee_Numeric_Std_And_Log_Sgn =>
- return Synth_Dyadic_Vec_Log (Ctxt, Id_And, Right, Left, Expr);
+ return Synth_Dyadic_Vec_Log (Ctxt, Id_And, R, L, Expr);
when Iir_Predefined_Ieee_1164_Nand_Suv_Log
| Iir_Predefined_Ieee_Numeric_Std_Nand_Uns_Log
| Iir_Predefined_Ieee_Numeric_Std_Nand_Sgn_Log =>
- return Synth_Dyadic_Vec_Log (Ctxt, Id_Nand, Left, Right, Expr);
+ return Synth_Dyadic_Vec_Log (Ctxt, Id_Nand, L, R, Expr);
when Iir_Predefined_Ieee_1164_Nand_Log_Suv
| Iir_Predefined_Ieee_Numeric_Std_Nand_Log_Uns
| Iir_Predefined_Ieee_Numeric_Std_Nand_Log_Sgn =>
- return Synth_Dyadic_Vec_Log (Ctxt, Id_Nand, Right, Left, Expr);
+ return Synth_Dyadic_Vec_Log (Ctxt, Id_Nand, R, L, Expr);
when Iir_Predefined_Ieee_1164_Or_Suv_Log
| Iir_Predefined_Ieee_Numeric_Std_Or_Uns_Log
| Iir_Predefined_Ieee_Numeric_Std_Or_Sgn_Log =>
- return Synth_Dyadic_Vec_Log (Ctxt, Id_Or, Left, Right, Expr);
+ return Synth_Dyadic_Vec_Log (Ctxt, Id_Or, L, R, Expr);
when Iir_Predefined_Ieee_1164_Or_Log_Suv
| Iir_Predefined_Ieee_Numeric_Std_Or_Log_Uns
| Iir_Predefined_Ieee_Numeric_Std_Or_Log_Sgn =>
- return Synth_Dyadic_Vec_Log (Ctxt, Id_Or, Right, Left, Expr);
+ return Synth_Dyadic_Vec_Log (Ctxt, Id_Or, R, L, Expr);
when Iir_Predefined_Ieee_1164_Nor_Suv_Log
| Iir_Predefined_Ieee_Numeric_Std_Nor_Uns_Log
| Iir_Predefined_Ieee_Numeric_Std_Nor_Sgn_Log =>
- return Synth_Dyadic_Vec_Log (Ctxt, Id_Nor, Left, Right, Expr);
+ return Synth_Dyadic_Vec_Log (Ctxt, Id_Nor, L, R, Expr);
when Iir_Predefined_Ieee_1164_Nor_Log_Suv
| Iir_Predefined_Ieee_Numeric_Std_Nor_Log_Uns
| Iir_Predefined_Ieee_Numeric_Std_Nor_Log_Sgn =>
- return Synth_Dyadic_Vec_Log (Ctxt, Id_Nor, Right, Left, Expr);
+ return Synth_Dyadic_Vec_Log (Ctxt, Id_Nor, R, L, Expr);
when Iir_Predefined_Ieee_1164_Xor_Suv_Log
| Iir_Predefined_Ieee_Numeric_Std_Xor_Uns_Log
| Iir_Predefined_Ieee_Numeric_Std_Xor_Sgn_Log =>
- return Synth_Dyadic_Vec_Log (Ctxt, Id_Xor, Left, Right, Expr);
+ return Synth_Dyadic_Vec_Log (Ctxt, Id_Xor, L, R, Expr);
when Iir_Predefined_Ieee_1164_Xor_Log_Suv
| Iir_Predefined_Ieee_Numeric_Std_Xor_Log_Uns
| Iir_Predefined_Ieee_Numeric_Std_Xor_Log_Sgn =>
- return Synth_Dyadic_Vec_Log (Ctxt, Id_Xor, Right, Left, Expr);
+ return Synth_Dyadic_Vec_Log (Ctxt, Id_Xor, R, L, Expr);
when Iir_Predefined_Ieee_1164_Xnor_Suv_Log
| Iir_Predefined_Ieee_Numeric_Std_Xnor_Uns_Log
| Iir_Predefined_Ieee_Numeric_Std_Xnor_Sgn_Log =>
- return Synth_Dyadic_Vec_Log (Ctxt, Id_Xnor, Left, Right, Expr);
+ return Synth_Dyadic_Vec_Log (Ctxt, Id_Xnor, L, R, Expr);
when Iir_Predefined_Ieee_1164_Xnor_Log_Suv
| Iir_Predefined_Ieee_Numeric_Std_Xnor_Log_Uns
| Iir_Predefined_Ieee_Numeric_Std_Xnor_Log_Sgn =>
- return Synth_Dyadic_Vec_Log (Ctxt, Id_Xnor, Right, Left, Expr);
+ return Synth_Dyadic_Vec_Log (Ctxt, Id_Xnor, R, L, Expr);
when Iir_Predefined_Enum_Equality =>
- if Left_Typ = Bit_Type
- or else Left_Typ = Logic_Type
- then
- if Is_Static (Left.Val) then
- return Synth_Bit_Eq_Const (Ctxt, Left, Right, Expr);
- elsif Is_Static (Right.Val) then
- return Synth_Bit_Eq_Const (Ctxt, Right, Left, Expr);
+ if L.Typ = Bit_Type or else L.Typ = Logic_Type then
+ if Is_Static (L.Val) then
+ return Synth_Bit_Eq_Const (Ctxt, L, R, Expr);
+ elsif Is_Static (R.Val) then
+ return Synth_Bit_Eq_Const (Ctxt, R, L, Expr);
end if;
end if;
return Synth_Compare (Id_Eq, Boolean_Type);
@@ -865,7 +1094,7 @@ package body Synth.Vhdl_Oper is
when Iir_Predefined_Array_Equality
| Iir_Predefined_Record_Equality =>
- if not Is_Matching_Bounds (Left.Typ, Right.Typ) then
+ if not Is_Matching_Bounds (L.Typ, R.Typ) then
Warning_Msg_Synth
(+Expr,
"length of '=' operands doesn't match, result is false");
@@ -877,19 +1106,19 @@ package body Synth.Vhdl_Oper is
Cst, Oper : Valtyp;
Res : Net;
begin
- if Left.Typ.W /= Right.Typ.W then
+ if L.Typ.W /= R.Typ.W then
Error_Msg_Synth
(Syn_Inst, Expr,
"operands of ?= don't have the same size");
return Create_Value_Discrete (0, Bit_Type);
end if;
- if Is_Static (Left.Val) then
- Cst := Left;
- Oper := Right;
- elsif Is_Static (Right.Val) then
- Cst := Right;
- Oper := Left;
+ if Is_Static (L.Val) then
+ Cst := L;
+ Oper := R;
+ elsif Is_Static (R.Val) then
+ Cst := R;
+ Oper := L;
else
Warning_Msg_Synth
(+Expr, "no operand of ?= is constant, handled like =");
@@ -897,7 +1126,7 @@ package body Synth.Vhdl_Oper is
end if;
Res := Synth_Match (Ctxt, Cst, Oper, Expr);
if Res = No_Net then
- return Create_Value_Discrete (Std_Logic_X_Pos, Expr_Typ);
+ return Create_Value_Discrete (Std_Logic_X_Pos, Res_Typ);
else
return Create_Value_Net (Res, Logic_Type);
end if;
@@ -907,18 +1136,18 @@ package body Synth.Vhdl_Oper is
Cst, Oper : Valtyp;
Res : Net;
begin
- if Left.Typ.W /= Right.Typ.W then
+ if L.Typ.W /= R.Typ.W then
Error_Msg_Synth (Syn_Inst, Expr,
"operands of ?/= don't have the same size");
return Create_Value_Discrete (1, Bit_Type);
end if;
- if Is_Static (Left.Val) then
- Cst := Left;
- Oper := Right;
- elsif Is_Static (Right.Val) then
- Cst := Right;
- Oper := Left;
+ if Is_Static (L.Val) then
+ Cst := L;
+ Oper := R;
+ elsif Is_Static (R.Val) then
+ Cst := R;
+ Oper := L;
else
Warning_Msg_Synth
(+Expr, "no operand of ?/= is constant, handled like /=");
@@ -926,14 +1155,14 @@ package body Synth.Vhdl_Oper is
end if;
Res := Synth_Match (Ctxt, Cst, Oper, Expr, Id_Ne);
if Res = No_Net then
- return Create_Value_Discrete (Std_Logic_X_Pos, Expr_Typ);
+ return Create_Value_Discrete (Std_Logic_X_Pos, Res_Typ);
else
return Create_Value_Net (Res, Logic_Type);
end if;
end;
when Iir_Predefined_Array_Inequality
| Iir_Predefined_Record_Inequality =>
- if not Is_Matching_Bounds (Left.Typ, Right.Typ) then
+ if not Is_Matching_Bounds (L.Typ, R.Typ) then
Warning_Msg_Synth
(+Expr,
"length of '/=' operands doesn't match, result is true");
@@ -951,94 +1180,94 @@ package body Synth.Vhdl_Oper is
when Iir_Predefined_Array_Element_Concat =>
declare
- L : constant Net := Get_Net (Ctxt, Left);
- Le_Typ : constant Type_Acc := Get_Array_Element (Left.Typ);
+ Ln : constant Net := Get_Net (Ctxt, L);
+ Le_Typ : constant Type_Acc := Get_Array_Element (L.Typ);
El_Typ : Type_Acc;
Bnd : Bound_Type;
- Res_Typ : Type_Acc;
+ Result_Typ : Type_Acc;
N : Net;
begin
- Check_Matching_Bounds (Le_Typ, Right.Typ, Expr);
- N := Build2_Concat2 (Ctxt, L, Get_Net (Ctxt, Right));
+ Check_Matching_Bounds (Le_Typ, R.Typ, Expr);
+ N := Build2_Concat2 (Ctxt, Ln, Get_Net (Ctxt, R));
Set_Location (N, Expr);
Bnd := Create_Bounds_From_Length
(Syn_Inst,
Get_Index_Type (Get_Type (Expr), 0),
- Iir_Index32 (Get_Bound_Length (Left.Typ) + 1));
+ Iir_Index32 (Get_Bound_Length (L.Typ) + 1));
El_Typ := Unshare_Type_Expr (Le_Typ,
- Get_Array_Element (Expr_Typ));
- Res_Typ := Create_Onedimensional_Array_Subtype
- (Expr_Typ, Bnd, El_Typ);
- return Create_Value_Net (N, Res_Typ);
+ Get_Array_Element (Res_Typ));
+ Result_Typ := Create_Onedimensional_Array_Subtype
+ (Res_Typ, Bnd, El_Typ);
+ return Create_Value_Net (N, Result_Typ);
end;
when Iir_Predefined_Element_Array_Concat =>
declare
- R : constant Net := Get_Net (Ctxt, Right);
- Re_Typ : constant Type_Acc := Get_Array_Element (Right.Typ);
+ Rn : constant Net := Get_Net (Ctxt, R);
+ Re_Typ : constant Type_Acc := Get_Array_Element (R.Typ);
El_Typ : Type_Acc;
Bnd : Bound_Type;
- Res_Typ : Type_Acc;
+ Result_Typ : Type_Acc;
N : Net;
begin
- Check_Matching_Bounds (Left.Typ, Re_Typ, Expr);
- N := Build2_Concat2 (Ctxt, Get_Net (Ctxt, Left), R);
+ Check_Matching_Bounds (L.Typ, Re_Typ, Expr);
+ N := Build2_Concat2 (Ctxt, Get_Net (Ctxt, L), Rn);
Set_Location (N, Expr);
Bnd := Create_Bounds_From_Length
(Syn_Inst,
Get_Index_Type (Get_Type (Expr), 0),
- Iir_Index32 (Get_Bound_Length (Right.Typ) + 1));
+ Iir_Index32 (Get_Bound_Length (R.Typ) + 1));
El_Typ := Unshare_Type_Expr (Re_Typ,
- Get_Array_Element (Expr_Typ));
- Res_Typ := Create_Onedimensional_Array_Subtype
- (Expr_Typ, Bnd, El_Typ);
- return Create_Value_Net (N, Res_Typ);
+ Get_Array_Element (Res_Typ));
+ Result_Typ := Create_Onedimensional_Array_Subtype
+ (Res_Typ, Bnd, El_Typ);
+ return Create_Value_Net (N, Result_Typ);
end;
when Iir_Predefined_Element_Element_Concat =>
declare
El_Typ : Type_Acc;
N : Net;
Bnd : Bound_Type;
- Res_Typ : Type_Acc;
+ Result_Typ : Type_Acc;
begin
- Check_Matching_Bounds (Left.Typ, Right.Typ, Expr);
+ Check_Matching_Bounds (L.Typ, R.Typ, Expr);
N := Build2_Concat2
- (Ctxt, Get_Net (Ctxt, Left), Get_Net (Ctxt, Right));
+ (Ctxt, Get_Net (Ctxt, L), Get_Net (Ctxt, R));
Set_Location (N, Expr);
Bnd := Create_Bounds_From_Length
(Syn_Inst, Get_Index_Type (Get_Type (Expr), 0), 2);
- El_Typ := Unshare_Type_Expr (Left.Typ,
- Get_Array_Element (Expr_Typ));
- Res_Typ := Create_Onedimensional_Array_Subtype
- (Expr_Typ, Bnd, El_Typ);
- return Create_Value_Net (N, Res_Typ);
+ El_Typ := Unshare_Type_Expr
+ (L.Typ, Get_Array_Element (Res_Typ));
+ Result_Typ := Create_Onedimensional_Array_Subtype
+ (Res_Typ, Bnd, El_Typ);
+ return Create_Value_Net (N, Result_Typ);
end;
when Iir_Predefined_Array_Array_Concat =>
declare
- Le_Typ : constant Type_Acc := Get_Array_Element (Left.Typ);
- Re_Typ : constant Type_Acc := Get_Array_Element (Right.Typ);
- L : constant Net := Get_Net (Ctxt, Left);
- R : constant Net := Get_Net (Ctxt, Right);
+ Le_Typ : constant Type_Acc := Get_Array_Element (L.Typ);
+ Re_Typ : constant Type_Acc := Get_Array_Element (R.Typ);
+ Ln : constant Net := Get_Net (Ctxt, L);
+ Rn : constant Net := Get_Net (Ctxt, R);
El_Typ : Type_Acc;
Bnd : Bound_Type;
- Res_Typ : Type_Acc;
+ Result_Typ : Type_Acc;
N : Net;
begin
Check_Matching_Bounds (Le_Typ, Re_Typ, Expr);
- N := Build2_Concat2 (Ctxt, L, R);
+ N := Build2_Concat2 (Ctxt, Ln, Rn);
Set_Location (N, Expr);
Bnd := Create_Bounds_From_Length
(Syn_Inst,
Get_Index_Type (Get_Type (Expr), 0),
- Iir_Index32 (Get_Bound_Length (Left.Typ)
- + Get_Bound_Length (Right.Typ)));
+ Iir_Index32 (Get_Bound_Length (L.Typ)
+ + Get_Bound_Length (R.Typ)));
El_Typ := Unshare_Type_Expr (Le_Typ,
- Get_Array_Element (Expr_Typ));
- Res_Typ := Create_Onedimensional_Array_Subtype
- (Expr_Typ, Bnd, El_Typ);
- return Create_Value_Net (N, Res_Typ);
+ Get_Array_Element (Res_Typ));
+ Result_Typ := Create_Onedimensional_Array_Subtype
+ (Res_Typ, Bnd, El_Typ);
+ return Create_Value_Net (N, Result_Typ);
end;
when Iir_Predefined_Integer_Plus =>
return Synth_Int_Dyadic (Id_Add);
@@ -1049,24 +1278,22 @@ package body Synth.Vhdl_Oper is
when Iir_Predefined_Integer_Div =>
return Synth_Int_Dyadic (Id_Sdiv);
when Iir_Predefined_Integer_Mod =>
- if Is_Static_Val (Right.Val) then
+ if Is_Static_Val (R.Val) then
-- Optimize when the divisor is a power of 2.
declare
use Mutils;
- Etype : constant Type_Acc :=
- Get_Subtype_Object (Syn_Inst, Expr_Type);
- R : constant Int64 := Get_Static_Discrete (Right);
+ Rint : constant Int64 := Get_Static_Discrete (R);
Log_R : Natural;
N : Net;
begin
- if R > 0 and then Is_Power2 (Uns64 (R)) then
- Log_R := Clog2 (Uns64 (R));
- pragma Assert (Log_R <= Natural (Left.Typ.W));
- N := Get_Net (Ctxt, Left);
+ if Rint > 0 and then Is_Power2 (Uns64 (Rint)) then
+ Log_R := Clog2 (Uns64 (Rint));
+ pragma Assert (Log_R <= Natural (L.Typ.W));
+ N := Get_Net (Ctxt, L);
N := Build2_Extract (Ctxt, N, 0, Width (Log_R));
- N := Build2_Uresize (Ctxt, N, Left.Typ.W,
- Get_Location (Expr));
- return Create_Value_Net (N, Etype);
+ N := Build2_Uresize
+ (Ctxt, N, L.Typ.W, Get_Location (Expr));
+ return Create_Value_Net (N, Res_Typ);
end if;
end;
end if;
@@ -1119,47 +1346,47 @@ package body Synth.Vhdl_Oper is
| Iir_Predefined_Ieee_Std_Logic_Arith_Add_Log_Sgn_Sgn
| Iir_Predefined_Ieee_Std_Logic_Arith_Add_Log_Sgn_Slv =>
-- "+" (Unsigned, Unsigned)
- return Synth_Dyadic_Uns_Uns (Ctxt, Id_Add, Left, Right, Expr);
+ return Synth_Dyadic_Uns_Uns (Ctxt, Id_Add, L, R, Expr);
when Iir_Predefined_Ieee_Numeric_Std_Add_Uns_Nat =>
-- "+" (Unsigned, Natural)
- return Synth_Dyadic_Uns_Nat (Ctxt, Id_Add, Left, Right, Expr);
+ return Synth_Dyadic_Uns_Nat (Ctxt, Id_Add, L, R, Expr);
when Iir_Predefined_Ieee_Std_Logic_Arith_Add_Uns_Int_Slv
| Iir_Predefined_Ieee_Std_Logic_Arith_Add_Uns_Int_Uns
| Iir_Predefined_Ieee_Std_Logic_Unsigned_Add_Slv_Int =>
-- "+" (Unsigned, Integer)
- return Synth_Dyadic_Sgn_Int (Ctxt, Id_Add, Left, Right, Expr);
+ return Synth_Dyadic_Sgn_Int (Ctxt, Id_Add, L, R, Expr);
when Iir_Predefined_Ieee_Numeric_Std_Add_Nat_Uns
| Iir_Predefined_Ieee_Std_Logic_Arith_Add_Int_Uns_Uns
| Iir_Predefined_Ieee_Std_Logic_Arith_Add_Int_Uns_Slv
| Iir_Predefined_Ieee_Std_Logic_Unsigned_Add_Int_Slv =>
-- "+" (Natural, Unsigned)
- return Synth_Dyadic_Nat_Uns (Ctxt, Id_Add, Left, Right, Expr);
+ return Synth_Dyadic_Nat_Uns (Ctxt, Id_Add, L, R, Expr);
when Iir_Predefined_Ieee_Numeric_Std_Add_Sgn_Int
| Iir_Predefined_Ieee_Std_Logic_Signed_Add_Slv_Int
| Iir_Predefined_Ieee_Std_Logic_Arith_Add_Sgn_Int_Sgn
| Iir_Predefined_Ieee_Std_Logic_Arith_Add_Sgn_Int_Slv =>
-- "+" (Signed, Integer)
- return Synth_Dyadic_Sgn_Int (Ctxt, Id_Add, Left, Right, Expr);
+ return Synth_Dyadic_Sgn_Int (Ctxt, Id_Add, L, R, Expr);
when Iir_Predefined_Ieee_Numeric_Std_Add_Int_Sgn
| Iir_Predefined_Ieee_Std_Logic_Arith_Add_Int_Sgn_Sgn
| Iir_Predefined_Ieee_Std_Logic_Arith_Add_Int_Sgn_Slv
| Iir_Predefined_Ieee_Std_Logic_Signed_Add_Int_Slv =>
-- "+" (Integer, Signed)
- return Synth_Dyadic_Int_Sgn (Ctxt, Id_Add, Left, Right, Expr);
+ return Synth_Dyadic_Int_Sgn (Ctxt, Id_Add, L, R, Expr);
when Iir_Predefined_Ieee_Numeric_Std_Add_Sgn_Sgn
| Iir_Predefined_Ieee_Std_Logic_Arith_Add_Sgn_Sgn_Sgn
| Iir_Predefined_Ieee_Std_Logic_Arith_Add_Sgn_Sgn_Slv
| Iir_Predefined_Ieee_Std_Logic_Signed_Add_Slv_Slv =>
-- "+" (Signed, Signed)
- return Synth_Dyadic_Sgn_Sgn (Ctxt, Id_Add, Left, Right, Expr);
+ return Synth_Dyadic_Sgn_Sgn (Ctxt, Id_Add, L, R, Expr);
when Iir_Predefined_Ieee_Std_Logic_Arith_Add_Uns_Sgn_Sgn
| Iir_Predefined_Ieee_Std_Logic_Arith_Add_Uns_Sgn_Slv =>
-- "+" (Unsigned, Signed)
- return Synth_Dyadic_Uns_Sgn_Sgn (Ctxt, Id_Add, Left, Right, Expr);
+ return Synth_Dyadic_Uns_Sgn_Sgn (Ctxt, Id_Add, L, R, Expr);
when Iir_Predefined_Ieee_Std_Logic_Arith_Add_Sgn_Uns_Sgn
| Iir_Predefined_Ieee_Std_Logic_Arith_Add_Sgn_Uns_Slv =>
-- "+" (Signed, Unsigned)
- return Synth_Dyadic_Sgn_Uns_Sgn (Ctxt, Id_Add, Left, Right, Expr);
+ return Synth_Dyadic_Sgn_Uns_Sgn (Ctxt, Id_Add, L, R, Expr);
when Iir_Predefined_Ieee_Numeric_Std_Sub_Uns_Uns
| Iir_Predefined_Ieee_Numeric_Std_Sub_Uns_Log
@@ -1181,47 +1408,47 @@ package body Synth.Vhdl_Oper is
| Iir_Predefined_Ieee_Std_Logic_Arith_Sub_Log_Sgn_Sgn
| Iir_Predefined_Ieee_Std_Logic_Arith_Sub_Log_Sgn_Slv =>
-- "-" (Unsigned, Unsigned)
- return Synth_Dyadic_Uns_Uns (Ctxt, Id_Sub, Left, Right, Expr);
+ return Synth_Dyadic_Uns_Uns (Ctxt, Id_Sub, L, R, Expr);
when Iir_Predefined_Ieee_Numeric_Std_Sub_Sgn_Sgn
| Iir_Predefined_Ieee_Std_Logic_Arith_Sub_Sgn_Sgn_Sgn
| Iir_Predefined_Ieee_Std_Logic_Arith_Sub_Sgn_Sgn_Slv
| Iir_Predefined_Ieee_Std_Logic_Signed_Sub_Slv_Slv =>
-- "-" (Signed, Signed)
- return Synth_Dyadic_Sgn_Sgn (Ctxt, Id_Sub, Left, Right, Expr);
+ return Synth_Dyadic_Sgn_Sgn (Ctxt, Id_Sub, L, R, Expr);
when Iir_Predefined_Ieee_Numeric_Std_Sub_Uns_Nat =>
-- "-" (Unsigned, Natural)
- return Synth_Dyadic_Uns_Nat (Ctxt, Id_Sub, Left, Right, Expr);
+ return Synth_Dyadic_Uns_Nat (Ctxt, Id_Sub, L, R, Expr);
when Iir_Predefined_Ieee_Std_Logic_Arith_Sub_Uns_Int_Uns
| Iir_Predefined_Ieee_Std_Logic_Arith_Sub_Uns_Int_Slv
| Iir_Predefined_Ieee_Std_Logic_Unsigned_Sub_Slv_Int =>
-- "-" (Unsigned, Integer)
- return Synth_Dyadic_Sgn_Int (Ctxt, Id_Sub, Left, Right, Expr);
+ return Synth_Dyadic_Sgn_Int (Ctxt, Id_Sub, L, R, Expr);
when Iir_Predefined_Ieee_Numeric_Std_Sub_Nat_Uns
| Iir_Predefined_Ieee_Std_Logic_Arith_Sub_Int_Uns_Uns
| Iir_Predefined_Ieee_Std_Logic_Arith_Sub_Int_Uns_Slv
| Iir_Predefined_Ieee_Std_Logic_Unsigned_Sub_Int_Slv =>
-- "-" (Natural, Unsigned)
- return Synth_Dyadic_Nat_Uns (Ctxt, Id_Sub, Left, Right, Expr);
+ return Synth_Dyadic_Nat_Uns (Ctxt, Id_Sub, L, R, Expr);
when Iir_Predefined_Ieee_Numeric_Std_Sub_Sgn_Int
| Iir_Predefined_Ieee_Std_Logic_Arith_Sub_Sgn_Int_Sgn
| Iir_Predefined_Ieee_Std_Logic_Arith_Sub_Sgn_Int_Slv
| Iir_Predefined_Ieee_Std_Logic_Signed_Sub_Slv_Int =>
-- "-" (Signed, Integer)
- return Synth_Dyadic_Sgn_Int (Ctxt, Id_Sub, Left, Right, Expr);
+ return Synth_Dyadic_Sgn_Int (Ctxt, Id_Sub, L, R, Expr);
when Iir_Predefined_Ieee_Numeric_Std_Sub_Int_Sgn
| Iir_Predefined_Ieee_Std_Logic_Arith_Sub_Int_Sgn_Sgn
| Iir_Predefined_Ieee_Std_Logic_Arith_Sub_Int_Sgn_Slv
| Iir_Predefined_Ieee_Std_Logic_Signed_Sub_Int_Slv =>
-- "-" (Integer, Signed)
- return Synth_Dyadic_Int_Sgn (Ctxt, Id_Sub, Left, Right, Expr);
+ return Synth_Dyadic_Int_Sgn (Ctxt, Id_Sub, L, R, Expr);
when Iir_Predefined_Ieee_Std_Logic_Arith_Sub_Uns_Sgn_Sgn
| Iir_Predefined_Ieee_Std_Logic_Arith_Sub_Uns_Sgn_Slv =>
-- "-" (Unsigned, Signed)
- return Synth_Dyadic_Uns_Sgn_Sgn (Ctxt, Id_Sub, Left, Right, Expr);
+ return Synth_Dyadic_Uns_Sgn_Sgn (Ctxt, Id_Sub, L, R, Expr);
when Iir_Predefined_Ieee_Std_Logic_Arith_Sub_Sgn_Uns_Sgn
| Iir_Predefined_Ieee_Std_Logic_Arith_Sub_Sgn_Uns_Slv =>
-- "-" (Signed, Unsigned)
- return Synth_Dyadic_Sgn_Uns_Sgn (Ctxt, Id_Sub, Left, Right, Expr);
+ return Synth_Dyadic_Sgn_Uns_Sgn (Ctxt, Id_Sub, L, R, Expr);
when Iir_Predefined_Ieee_Numeric_Std_Mul_Sgn_Sgn
| Iir_Predefined_Ieee_Std_Logic_Arith_Mul_Sgn_Sgn_Sgn
@@ -1229,48 +1456,40 @@ package body Synth.Vhdl_Oper is
| Iir_Predefined_Ieee_Std_Logic_Signed_Mul_Slv_Slv =>
-- "*" (Signed, Signed)
return Synth_Dyadic_Xxx_Xxx
- (Ctxt, Id_Smul, Left.Typ.W + Right.Typ.W,
- Left, Right, True, True, Expr);
+ (Ctxt, Id_Smul, L.Typ.W + R.Typ.W, L, R, True, True, Expr);
when Iir_Predefined_Ieee_Numeric_Std_Mul_Sgn_Int =>
-- "*" (Signed, Integer)
return Synth_Dyadic_Xxx_Xxx
- (Ctxt, Id_Smul, 2 * Left.Typ.W,
- Left, Right, True, True, Expr);
+ (Ctxt, Id_Smul, 2 * L.Typ.W, L, R, True, True, Expr);
when Iir_Predefined_Ieee_Numeric_Std_Mul_Int_Sgn =>
-- "*" (Integer, Signed)
return Synth_Dyadic_Xxx_Xxx
- (Ctxt, Id_Smul, 2 * Right.Typ.W,
- Left, Right, True, True, Expr);
+ (Ctxt, Id_Smul, 2 * R.Typ.W, L, R, True, True, Expr);
when Iir_Predefined_Ieee_Numeric_Std_Mul_Uns_Uns
| Iir_Predefined_Ieee_Std_Logic_Arith_Mul_Uns_Uns_Uns
| Iir_Predefined_Ieee_Std_Logic_Arith_Mul_Uns_Uns_Slv
| Iir_Predefined_Ieee_Std_Logic_Unsigned_Mul_Slv_Slv =>
-- "*" (unsigned, unsigned)
return Synth_Dyadic_Xxx_Xxx
- (Ctxt, Id_Umul, Left.Typ.W + Right.Typ.W,
- Left, Right, False, False, Expr);
+ (Ctxt, Id_Umul, L.Typ.W + R.Typ.W, L, R, False, False, Expr);
when Iir_Predefined_Ieee_Numeric_Std_Mul_Uns_Nat =>
-- "*" (unsigned, natural)
return Synth_Dyadic_Xxx_Xxx
- (Ctxt, Id_Smul, 2 * Left.Typ.W,
- Left, Right, False, False, Expr);
+ (Ctxt, Id_Smul, 2 * L.Typ.W, L, R, False, False, Expr);
when Iir_Predefined_Ieee_Numeric_Std_Mul_Nat_Uns =>
-- "*" (natural, unsigned)
return Synth_Dyadic_Xxx_Xxx
- (Ctxt, Id_Smul, 2 * Right.Typ.W,
- Left, Right, False, False, Expr);
+ (Ctxt, Id_Smul, 2 * R.Typ.W, L, R, False, False, Expr);
when Iir_Predefined_Ieee_Std_Logic_Arith_Mul_Uns_Sgn_Sgn
| Iir_Predefined_Ieee_Std_Logic_Arith_Mul_Uns_Sgn_Slv =>
-- "*" (unsigned, signed)
return Synth_Dyadic_Xxx_Xxx
- (Ctxt, Id_Smul, Left.Typ.W + 1 + Right.Typ.W,
- Left, Right, False, True, Expr);
+ (Ctxt, Id_Smul, L.Typ.W + 1 + R.Typ.W, L, R, False, True, Expr);
when Iir_Predefined_Ieee_Std_Logic_Arith_Mul_Sgn_Uns_Sgn
| Iir_Predefined_Ieee_Std_Logic_Arith_Mul_Sgn_Uns_Slv =>
-- "*" (signed, unsigned)
return Synth_Dyadic_Xxx_Xxx
- (Ctxt, Id_Smul, Left.Typ.W + Right.Typ.W + 1,
- Left, Right, True, False, Expr);
+ (Ctxt, Id_Smul, L.Typ.W + R.Typ.W + 1, L, R, True, False, Expr);
when Iir_Predefined_Ieee_Numeric_Std_Div_Uns_Uns
| Iir_Predefined_Ieee_Numeric_Std_Div_Uns_Nat =>
@@ -1313,286 +1532,286 @@ package body Synth.Vhdl_Oper is
| Iir_Predefined_Ieee_Std_Logic_Arith_Eq_Uns_Uns
| Iir_Predefined_Ieee_Numeric_Std_Match_Eq_Uns_Uns =>
-- "=" (Unsigned, Unsigned) [resize]
- return Synth_Compare_Uns_Uns (Id_Eq, Expr_Typ);
+ return Synth_Compare_Uns_Uns (Id_Eq, Res_Typ);
when Iir_Predefined_Ieee_Numeric_Std_Eq_Uns_Nat
| Iir_Predefined_Ieee_Numeric_Std_Match_Eq_Uns_Nat
| Iir_Predefined_Ieee_Std_Logic_Unsigned_Eq_Slv_Int =>
-- "=" (Unsigned, Natural)
- return Synth_Compare_Uns_Nat (Id_Eq, Expr_Typ);
+ return Synth_Compare_Uns_Nat (Id_Eq, Res_Typ);
when Iir_Predefined_Ieee_Numeric_Std_Eq_Nat_Uns
| Iir_Predefined_Ieee_Numeric_Std_Match_Eq_Nat_Uns
| Iir_Predefined_Ieee_Std_Logic_Unsigned_Eq_Int_Slv =>
-- "=" (Natural, Unsigned) [resize]
- return Synth_Compare_Nat_Uns (Id_Eq, Expr_Typ);
+ return Synth_Compare_Nat_Uns (Id_Eq, Res_Typ);
when Iir_Predefined_Ieee_Numeric_Std_Eq_Sgn_Int
| Iir_Predefined_Ieee_Std_Logic_Arith_Eq_Sgn_Int
| Iir_Predefined_Ieee_Numeric_Std_Match_Eq_Sgn_Int
| Iir_Predefined_Ieee_Std_Logic_Signed_Eq_Slv_Int =>
-- "=" (Signed, Integer)
- return Synth_Compare_Sgn_Int (Id_Eq, Expr_Typ);
+ return Synth_Compare_Sgn_Int (Id_Eq, Res_Typ);
when Iir_Predefined_Ieee_Numeric_Std_Eq_Sgn_Sgn
| Iir_Predefined_Ieee_Numeric_Std_Match_Eq_Sgn_Sgn
| Iir_Predefined_Ieee_Std_Logic_Arith_Eq_Sgn_Sgn
| Iir_Predefined_Ieee_Std_Logic_Signed_Eq_Slv_Slv =>
-- "=" (Signed, Signed) [resize]
- return Synth_Compare_Sgn_Sgn (Id_Eq, Expr_Typ);
+ return Synth_Compare_Sgn_Sgn (Id_Eq, Res_Typ);
when Iir_Predefined_Ieee_Numeric_Std_Eq_Int_Sgn
| Iir_Predefined_Ieee_Std_Logic_Arith_Eq_Int_Sgn
| Iir_Predefined_Ieee_Numeric_Std_Match_Eq_Int_Sgn
| Iir_Predefined_Ieee_Std_Logic_Signed_Eq_Int_Slv =>
-- "=" (Integer, Signed)
- return Synth_Compare_Int_Sgn (Id_Eq, Expr_Typ);
+ return Synth_Compare_Int_Sgn (Id_Eq, Res_Typ);
when Iir_Predefined_Ieee_Std_Logic_Arith_Eq_Int_Uns =>
-- "=" (Integer, Unsigned)
- return Synth_Compare_Int_Uns (Id_Eq, Expr_Typ);
+ return Synth_Compare_Int_Uns (Id_Eq, Res_Typ);
when Iir_Predefined_Ieee_Std_Logic_Arith_Eq_Uns_Int =>
-- "=" (Unsigned, Integer)
- return Synth_Compare_Uns_Int (Id_Eq, Expr_Typ);
+ return Synth_Compare_Uns_Int (Id_Eq, Res_Typ);
when Iir_Predefined_Ieee_Std_Logic_Arith_Eq_Uns_Sgn =>
-- "=" (Unsigned, Signed)
- return Synth_Compare_Uns_Sgn (Id_Eq, Expr_Typ);
+ return Synth_Compare_Uns_Sgn (Id_Eq, Res_Typ);
when Iir_Predefined_Ieee_Std_Logic_Arith_Eq_Sgn_Uns =>
-- "=" (Signed, Unsigned)
- return Synth_Compare_Sgn_Uns (Id_Eq, Expr_Typ);
+ return Synth_Compare_Sgn_Uns (Id_Eq, Res_Typ);
when Iir_Predefined_Ieee_Numeric_Std_Ne_Uns_Uns
| Iir_Predefined_Ieee_Std_Logic_Unsigned_Ne_Slv_Slv
| Iir_Predefined_Ieee_Std_Logic_Arith_Ne_Uns_Uns
| Iir_Predefined_Ieee_Numeric_Std_Match_Ne_Uns_Uns =>
-- "/=" (Unsigned, Unsigned) [resize]
- return Synth_Compare_Uns_Uns (Id_Ne, Expr_Typ);
+ return Synth_Compare_Uns_Uns (Id_Ne, Res_Typ);
when Iir_Predefined_Ieee_Numeric_Std_Ne_Uns_Nat
| Iir_Predefined_Ieee_Numeric_Std_Match_Ne_Uns_Nat =>
-- "/=" (Unsigned, Natural)
- return Synth_Compare_Uns_Nat (Id_Ne, Expr_Typ);
+ return Synth_Compare_Uns_Nat (Id_Ne, Res_Typ);
when Iir_Predefined_Ieee_Numeric_Std_Ne_Nat_Uns
| Iir_Predefined_Ieee_Numeric_Std_Match_Ne_Nat_Uns
| Iir_Predefined_Ieee_Std_Logic_Unsigned_Ne_Int_Slv =>
-- "/=" (Natural, Unsigned) [resize]
- return Synth_Compare_Nat_Uns (Id_Ne, Expr_Typ);
+ return Synth_Compare_Nat_Uns (Id_Ne, Res_Typ);
when Iir_Predefined_Ieee_Numeric_Std_Ne_Sgn_Sgn
| Iir_Predefined_Ieee_Std_Logic_Arith_Ne_Sgn_Sgn
| Iir_Predefined_Ieee_Numeric_Std_Match_Ne_Sgn_Sgn
| Iir_Predefined_Ieee_Std_Logic_Signed_Ne_Slv_Slv =>
-- "/=" (Signed, Signed) [resize]
- return Synth_Compare_Sgn_Sgn (Id_Ne, Expr_Typ);
+ return Synth_Compare_Sgn_Sgn (Id_Ne, Res_Typ);
when Iir_Predefined_Ieee_Numeric_Std_Ne_Sgn_Int
| Iir_Predefined_Ieee_Std_Logic_Arith_Ne_Sgn_Int
| Iir_Predefined_Ieee_Numeric_Std_Match_Ne_Sgn_Int
| Iir_Predefined_Ieee_Std_Logic_Signed_Ne_Slv_Int =>
-- "/=" (Signed, Integer)
- return Synth_Compare_Sgn_Int (Id_Ne, Expr_Typ);
+ return Synth_Compare_Sgn_Int (Id_Ne, Res_Typ);
when Iir_Predefined_Ieee_Numeric_Std_Ne_Int_Sgn
| Iir_Predefined_Ieee_Std_Logic_Arith_Ne_Int_Sgn
| Iir_Predefined_Ieee_Numeric_Std_Match_Ne_Int_Sgn
| Iir_Predefined_Ieee_Std_Logic_Signed_Ne_Int_Slv =>
-- "/=" (Integer, Signed)
- return Synth_Compare_Int_Sgn (Id_Ne, Expr_Typ);
+ return Synth_Compare_Int_Sgn (Id_Ne, Res_Typ);
when Iir_Predefined_Ieee_Std_Logic_Arith_Ne_Int_Uns =>
-- "/=" (Integer, Unsigned)
- return Synth_Compare_Int_Uns (Id_Ne, Expr_Typ);
+ return Synth_Compare_Int_Uns (Id_Ne, Res_Typ);
when Iir_Predefined_Ieee_Std_Logic_Arith_Ne_Uns_Int
| Iir_Predefined_Ieee_Std_Logic_Unsigned_Ne_Slv_Int =>
-- "/=" (Unsigned, Integer)
- return Synth_Compare_Uns_Int (Id_Ne, Expr_Typ);
+ return Synth_Compare_Uns_Int (Id_Ne, Res_Typ);
when Iir_Predefined_Ieee_Std_Logic_Arith_Ne_Uns_Sgn =>
-- "/=" (Unsigned, Signed)
- return Synth_Compare_Uns_Sgn (Id_Ne, Expr_Typ);
+ return Synth_Compare_Uns_Sgn (Id_Ne, Res_Typ);
when Iir_Predefined_Ieee_Std_Logic_Arith_Ne_Sgn_Uns =>
-- "/=" (Signed, Unsigned)
- return Synth_Compare_Sgn_Uns (Id_Ne, Expr_Typ);
+ return Synth_Compare_Sgn_Uns (Id_Ne, Res_Typ);
when Iir_Predefined_Ieee_Numeric_Std_Lt_Uns_Uns
| Iir_Predefined_Ieee_Numeric_Std_Match_Lt_Uns_Uns
| Iir_Predefined_Ieee_Std_Logic_Unsigned_Lt_Slv_Slv
| Iir_Predefined_Ieee_Std_Logic_Arith_Lt_Uns_Uns =>
-- "<" (Unsigned, Unsigned) [resize]
- return Synth_Compare_Uns_Uns (Id_Ult, Expr_Typ);
+ return Synth_Compare_Uns_Uns (Id_Ult, Res_Typ);
when Iir_Predefined_Ieee_Numeric_Std_Lt_Uns_Nat
| Iir_Predefined_Ieee_Numeric_Std_Match_Lt_Uns_Nat
| Iir_Predefined_Ieee_Std_Logic_Unsigned_Lt_Slv_Int =>
-- "<" (Unsigned, Natural)
- if Is_Static (Right.Val) and then Read_Discrete (Right) = 0 then
+ if Is_Static (R.Val) and then Read_Discrete (R) = 0 then
-- Always false.
- return Create_Value_Discrete (0, Expr_Typ);
+ return Create_Value_Discrete (0, Res_Typ);
end if;
- return Synth_Compare_Uns_Nat (Id_Ult, Expr_Typ);
+ return Synth_Compare_Uns_Nat (Id_Ult, Res_Typ);
when Iir_Predefined_Ieee_Numeric_Std_Lt_Nat_Uns
| Iir_Predefined_Ieee_Numeric_Std_Match_Lt_Nat_Uns
| Iir_Predefined_Ieee_Std_Logic_Unsigned_Lt_Int_Slv =>
-- "<" (Natural, Unsigned) [resize]
- return Synth_Compare_Nat_Uns (Id_Ult, Expr_Typ);
+ return Synth_Compare_Nat_Uns (Id_Ult, Res_Typ);
when Iir_Predefined_Ieee_Numeric_Std_Lt_Sgn_Sgn
| Iir_Predefined_Ieee_Numeric_Std_Match_Lt_Sgn_Sgn
| Iir_Predefined_Ieee_Std_Logic_Arith_Lt_Sgn_Sgn
| Iir_Predefined_Ieee_Std_Logic_Signed_Lt_Slv_Slv =>
-- "<" (Signed, Signed) [resize]
- return Synth_Compare_Sgn_Sgn (Id_Slt, Expr_Typ);
+ return Synth_Compare_Sgn_Sgn (Id_Slt, Res_Typ);
when Iir_Predefined_Ieee_Numeric_Std_Lt_Sgn_Int
| Iir_Predefined_Ieee_Numeric_Std_Match_Lt_Sgn_Int
| Iir_Predefined_Ieee_Std_Logic_Arith_Lt_Sgn_Int
| Iir_Predefined_Ieee_Std_Logic_Signed_Lt_Slv_Int =>
-- "<" (Signed, Integer)
- return Synth_Compare_Sgn_Int (Id_Slt, Expr_Typ);
+ return Synth_Compare_Sgn_Int (Id_Slt, Res_Typ);
when Iir_Predefined_Ieee_Numeric_Std_Lt_Int_Sgn
| Iir_Predefined_Ieee_Numeric_Std_Match_Lt_Int_Sgn
| Iir_Predefined_Ieee_Std_Logic_Arith_Lt_Int_Sgn
| Iir_Predefined_Ieee_Std_Logic_Signed_Lt_Int_Slv =>
-- "<" (Integer, Signed)
- return Synth_Compare_Int_Sgn (Id_Slt, Expr_Typ);
+ return Synth_Compare_Int_Sgn (Id_Slt, Res_Typ);
when Iir_Predefined_Ieee_Std_Logic_Arith_Lt_Int_Uns =>
-- "<" (Integer, Unsigned)
- return Synth_Compare_Int_Uns (Id_Slt, Expr_Typ);
+ return Synth_Compare_Int_Uns (Id_Slt, Res_Typ);
when Iir_Predefined_Ieee_Std_Logic_Arith_Lt_Uns_Int =>
-- "<" (Unsigned, Integer)
- return Synth_Compare_Uns_Int (Id_Slt, Expr_Typ);
+ return Synth_Compare_Uns_Int (Id_Slt, Res_Typ);
when Iir_Predefined_Ieee_Std_Logic_Arith_Lt_Uns_Sgn =>
-- "<" (Unsigned, Signed)
- return Synth_Compare_Uns_Sgn (Id_Slt, Expr_Typ);
+ return Synth_Compare_Uns_Sgn (Id_Slt, Res_Typ);
when Iir_Predefined_Ieee_Std_Logic_Arith_Lt_Sgn_Uns =>
-- "<" (Signed, Unsigned)
- return Synth_Compare_Sgn_Uns (Id_Slt, Expr_Typ);
+ return Synth_Compare_Sgn_Uns (Id_Slt, Res_Typ);
when Iir_Predefined_Ieee_Numeric_Std_Le_Uns_Uns
| Iir_Predefined_Ieee_Std_Logic_Unsigned_Le_Slv_Slv
| Iir_Predefined_Ieee_Numeric_Std_Match_Le_Uns_Uns
| Iir_Predefined_Ieee_Std_Logic_Arith_Le_Uns_Uns =>
-- "<=" (Unsigned, Unsigned) [resize]
- return Synth_Compare_Uns_Uns (Id_Ule, Expr_Typ);
+ return Synth_Compare_Uns_Uns (Id_Ule, Res_Typ);
when Iir_Predefined_Ieee_Numeric_Std_Le_Sgn_Sgn
| Iir_Predefined_Ieee_Numeric_Std_Match_Le_Sgn_Sgn
| Iir_Predefined_Ieee_Std_Logic_Arith_Le_Sgn_Sgn
| Iir_Predefined_Ieee_Std_Logic_Signed_Le_Slv_Slv =>
-- "<=" (Signed, Signed)
- return Synth_Compare_Sgn_Sgn (Id_Sle, Expr_Typ);
+ return Synth_Compare_Sgn_Sgn (Id_Sle, Res_Typ);
when Iir_Predefined_Ieee_Numeric_Std_Le_Uns_Nat
| Iir_Predefined_Ieee_Numeric_Std_Match_Le_Uns_Nat
| Iir_Predefined_Ieee_Std_Logic_Unsigned_Le_Slv_Int =>
-- "<=" (Unsigned, Natural)
- return Synth_Compare_Uns_Nat (Id_Ule, Expr_Typ);
+ return Synth_Compare_Uns_Nat (Id_Ule, Res_Typ);
when Iir_Predefined_Ieee_Numeric_Std_Le_Nat_Uns
| Iir_Predefined_Ieee_Numeric_Std_Match_Le_Nat_Uns
| Iir_Predefined_Ieee_Std_Logic_Unsigned_Le_Int_Slv =>
-- "<=" (Natural, Unsigned) [resize]
- return Synth_Compare_Nat_Uns (Id_Ule, Expr_Typ);
+ return Synth_Compare_Nat_Uns (Id_Ule, Res_Typ);
when Iir_Predefined_Ieee_Numeric_Std_Le_Sgn_Int
| Iir_Predefined_Ieee_Numeric_Std_Match_Le_Sgn_Int
| Iir_Predefined_Ieee_Std_Logic_Arith_Le_Sgn_Int
| Iir_Predefined_Ieee_Std_Logic_Signed_Le_Slv_Int =>
-- "<=" (Signed, Integer)
- return Synth_Compare_Sgn_Int (Id_Sle, Expr_Typ);
+ return Synth_Compare_Sgn_Int (Id_Sle, Res_Typ);
when Iir_Predefined_Ieee_Numeric_Std_Le_Int_Sgn
| Iir_Predefined_Ieee_Numeric_Std_Match_Le_Int_Sgn
| Iir_Predefined_Ieee_Std_Logic_Arith_Le_Int_Sgn
| Iir_Predefined_Ieee_Std_Logic_Signed_Le_Int_Slv =>
-- "<=" (Integer, Signed)
- return Synth_Compare_Int_Sgn (Id_Sle, Expr_Typ);
+ return Synth_Compare_Int_Sgn (Id_Sle, Res_Typ);
when Iir_Predefined_Ieee_Std_Logic_Arith_Le_Int_Uns =>
-- "<=" (Integer, Unsigned)
- return Synth_Compare_Int_Uns (Id_Sle, Expr_Typ);
+ return Synth_Compare_Int_Uns (Id_Sle, Res_Typ);
when Iir_Predefined_Ieee_Std_Logic_Arith_Le_Uns_Int =>
-- "<=" (Unsigned, Integer)
- return Synth_Compare_Uns_Int (Id_Sle, Expr_Typ);
+ return Synth_Compare_Uns_Int (Id_Sle, Res_Typ);
when Iir_Predefined_Ieee_Std_Logic_Arith_Le_Uns_Sgn =>
-- "<=" (Unsigned, Signed)
- return Synth_Compare_Uns_Sgn (Id_Sle, Expr_Typ);
+ return Synth_Compare_Uns_Sgn (Id_Sle, Res_Typ);
when Iir_Predefined_Ieee_Std_Logic_Arith_Le_Sgn_Uns =>
-- "<=" (Signed, Unsigned)
- return Synth_Compare_Sgn_Uns (Id_Sle, Expr_Typ);
+ return Synth_Compare_Sgn_Uns (Id_Sle, Res_Typ);
when Iir_Predefined_Ieee_Numeric_Std_Gt_Uns_Uns
| Iir_Predefined_Ieee_Std_Logic_Unsigned_Gt_Slv_Slv
| Iir_Predefined_Ieee_Std_Logic_Arith_Gt_Uns_Uns
| Iir_Predefined_Ieee_Numeric_Std_Match_Gt_Uns_Uns =>
-- ">" (Unsigned, Unsigned) [resize]
- return Synth_Compare_Uns_Uns (Id_Ugt, Expr_Typ);
+ return Synth_Compare_Uns_Uns (Id_Ugt, Res_Typ);
when Iir_Predefined_Ieee_Numeric_Std_Gt_Uns_Nat
| Iir_Predefined_Ieee_Numeric_Std_Match_Gt_Uns_Nat
| Iir_Predefined_Ieee_Std_Logic_Unsigned_Gt_Slv_Int =>
-- ">" (Unsigned, Natural)
- return Synth_Compare_Uns_Nat (Id_Ugt, Expr_Typ);
+ return Synth_Compare_Uns_Nat (Id_Ugt, Res_Typ);
when Iir_Predefined_Ieee_Numeric_Std_Gt_Nat_Uns
| Iir_Predefined_Ieee_Numeric_Std_Match_Gt_Nat_Uns
| Iir_Predefined_Ieee_Std_Logic_Unsigned_Gt_Int_Slv =>
-- ">" (Natural, Unsigned) [resize]
- return Synth_Compare_Nat_Uns (Id_Ugt, Expr_Typ);
+ return Synth_Compare_Nat_Uns (Id_Ugt, Res_Typ);
when Iir_Predefined_Ieee_Numeric_Std_Gt_Sgn_Sgn
| Iir_Predefined_Ieee_Numeric_Std_Match_Gt_Sgn_Sgn
| Iir_Predefined_Ieee_Std_Logic_Arith_Gt_Sgn_Sgn
| Iir_Predefined_Ieee_Std_Logic_Signed_Gt_Slv_Slv =>
-- ">" (Signed, Signed) [resize]
- return Synth_Compare_Sgn_Sgn (Id_Sgt, Expr_Typ);
+ return Synth_Compare_Sgn_Sgn (Id_Sgt, Res_Typ);
when Iir_Predefined_Ieee_Numeric_Std_Gt_Sgn_Int
| Iir_Predefined_Ieee_Numeric_Std_Match_Gt_Sgn_Int
| Iir_Predefined_Ieee_Std_Logic_Arith_Gt_Sgn_Int
| Iir_Predefined_Ieee_Std_Logic_Signed_Gt_Slv_Int =>
-- ">" (Signed, Integer)
- return Synth_Compare_Sgn_Int (Id_Sgt, Expr_Typ);
+ return Synth_Compare_Sgn_Int (Id_Sgt, Res_Typ);
when Iir_Predefined_Ieee_Numeric_Std_Gt_Int_Sgn
| Iir_Predefined_Ieee_Numeric_Std_Match_Gt_Int_Sgn
| Iir_Predefined_Ieee_Std_Logic_Arith_Gt_Int_Sgn
| Iir_Predefined_Ieee_Std_Logic_Signed_Gt_Int_Slv =>
-- ">" (Integer, Signed)
- return Synth_Compare_Int_Sgn (Id_Sgt, Expr_Typ);
+ return Synth_Compare_Int_Sgn (Id_Sgt, Res_Typ);
when Iir_Predefined_Ieee_Std_Logic_Arith_Gt_Int_Uns =>
-- ">" (Integer, Unsigned)
- return Synth_Compare_Int_Uns (Id_Sgt, Expr_Typ);
+ return Synth_Compare_Int_Uns (Id_Sgt, Res_Typ);
when Iir_Predefined_Ieee_Std_Logic_Arith_Gt_Uns_Int =>
-- ">" (Unsigned, Integer)
- return Synth_Compare_Uns_Int (Id_Sgt, Expr_Typ);
+ return Synth_Compare_Uns_Int (Id_Sgt, Res_Typ);
when Iir_Predefined_Ieee_Std_Logic_Arith_Gt_Uns_Sgn =>
-- ">" (Unsigned, Signed)
- return Synth_Compare_Uns_Sgn (Id_Sgt, Expr_Typ);
+ return Synth_Compare_Uns_Sgn (Id_Sgt, Res_Typ);
when Iir_Predefined_Ieee_Std_Logic_Arith_Gt_Sgn_Uns =>
-- ">" (Signed, Unsigned)
- return Synth_Compare_Sgn_Uns (Id_Sgt, Expr_Typ);
+ return Synth_Compare_Sgn_Uns (Id_Sgt, Res_Typ);
when Iir_Predefined_Ieee_Numeric_Std_Ge_Uns_Uns
| Iir_Predefined_Ieee_Numeric_Std_Match_Ge_Uns_Uns
| Iir_Predefined_Ieee_Std_Logic_Unsigned_Ge_Slv_Slv
| Iir_Predefined_Ieee_Std_Logic_Arith_Ge_Uns_Uns =>
-- ">=" (Unsigned, Unsigned) [resize]
- return Synth_Compare_Uns_Uns (Id_Uge, Expr_Typ);
+ return Synth_Compare_Uns_Uns (Id_Uge, Res_Typ);
when Iir_Predefined_Ieee_Numeric_Std_Ge_Nat_Uns
| Iir_Predefined_Ieee_Numeric_Std_Match_Ge_Nat_Uns
| Iir_Predefined_Ieee_Std_Logic_Unsigned_Ge_Int_Slv =>
-- ">=" (Natural, Unsigned) [resize]
- return Synth_Compare_Nat_Uns (Id_Uge, Expr_Typ);
+ return Synth_Compare_Nat_Uns (Id_Uge, Res_Typ);
when Iir_Predefined_Ieee_Numeric_Std_Ge_Uns_Nat
| Iir_Predefined_Ieee_Numeric_Std_Match_Ge_Uns_Nat
| Iir_Predefined_Ieee_Std_Logic_Unsigned_Ge_Slv_Int =>
-- ">=" (Unsigned, Natural)
- return Synth_Compare_Uns_Nat (Id_Uge, Expr_Typ);
+ return Synth_Compare_Uns_Nat (Id_Uge, Res_Typ);
when Iir_Predefined_Ieee_Numeric_Std_Ge_Sgn_Sgn
| Iir_Predefined_Ieee_Numeric_Std_Match_Ge_Sgn_Sgn
| Iir_Predefined_Ieee_Std_Logic_Arith_Ge_Sgn_Sgn
| Iir_Predefined_Ieee_Std_Logic_Signed_Ge_Slv_Slv =>
-- ">=" (Signed, Signed) [resize]
- return Synth_Compare_Sgn_Sgn (Id_Sge, Expr_Typ);
+ return Synth_Compare_Sgn_Sgn (Id_Sge, Res_Typ);
when Iir_Predefined_Ieee_Numeric_Std_Ge_Sgn_Int
| Iir_Predefined_Ieee_Numeric_Std_Match_Ge_Sgn_Int
| Iir_Predefined_Ieee_Std_Logic_Arith_Ge_Sgn_Int
| Iir_Predefined_Ieee_Std_Logic_Signed_Ge_Slv_Int =>
-- ">=" (Signed, Integer)
- return Synth_Compare_Sgn_Int (Id_Sge, Expr_Typ);
+ return Synth_Compare_Sgn_Int (Id_Sge, Res_Typ);
when Iir_Predefined_Ieee_Numeric_Std_Ge_Int_Sgn
| Iir_Predefined_Ieee_Numeric_Std_Match_Ge_Int_Sgn
| Iir_Predefined_Ieee_Std_Logic_Arith_Ge_Int_Sgn
| Iir_Predefined_Ieee_Std_Logic_Signed_Ge_Int_Slv =>
-- ">=" (Integer, Signed)
- return Synth_Compare_Int_Sgn (Id_Sge, Expr_Typ);
+ return Synth_Compare_Int_Sgn (Id_Sge, Res_Typ);
when Iir_Predefined_Ieee_Std_Logic_Arith_Ge_Int_Uns =>
-- ">=" (Integer, Unsigned)
- return Synth_Compare_Int_Uns (Id_Sge, Expr_Typ);
+ return Synth_Compare_Int_Uns (Id_Sge, Res_Typ);
when Iir_Predefined_Ieee_Std_Logic_Arith_Ge_Uns_Int =>
-- ">=" (Unsigned, Integer)
- return Synth_Compare_Uns_Int (Id_Sge, Expr_Typ);
+ return Synth_Compare_Uns_Int (Id_Sge, Res_Typ);
when Iir_Predefined_Ieee_Std_Logic_Arith_Ge_Uns_Sgn =>
-- ">=" (Unsigned, Signed)
- return Synth_Compare_Uns_Sgn (Id_Sge, Expr_Typ);
+ return Synth_Compare_Uns_Sgn (Id_Sge, Res_Typ);
when Iir_Predefined_Ieee_Std_Logic_Arith_Ge_Sgn_Uns =>
-- ">=" (Signed, Unsigned)
- return Synth_Compare_Sgn_Uns (Id_Sge, Expr_Typ);
+ return Synth_Compare_Sgn_Uns (Id_Sge, Res_Typ);
when Iir_Predefined_Ieee_Numeric_Std_Sra_Sgn_Int =>
return Synth_Shift (Id_Asr, Id_Lsl);
@@ -1617,377 +1836,6 @@ package body Synth.Vhdl_Oper is
| Iir_Predefined_Ieee_1164_Vector_Rol =>
return Synth_Rotation (Id_Rol);
- when others =>
- Error_Msg_Synth
- (Syn_Inst, Expr, "synth_dyadic_operation: unhandled "
- & Iir_Predefined_Functions'Image (Def));
- return No_Valtyp;
- end case;
- end Synth_Dyadic_Operation;
-
- function Synth_Dyadic_Operation (Syn_Inst : Synth_Instance_Acc;
- Imp : Node;
- Left_Expr : Node;
- Right_Expr : Node;
- Expr : Node) return Valtyp
- is
- Inter_Chain : constant Node :=
- Get_Interface_Declaration_Chain (Imp);
- Expr_Type : constant Node := Get_Type (Expr);
- Left_Type : constant Node := Get_Type (Inter_Chain);
- Right_Type : constant Node := Get_Type (Get_Chain (Inter_Chain));
- Left_Typ : constant Type_Acc :=
- Get_Subtype_Object (Syn_Inst, Left_Type);
- Right_Typ : constant Type_Acc :=
- Get_Subtype_Object (Syn_Inst, Right_Type);
- Expr_Typ : constant Type_Acc := Get_Subtype_Object (Syn_Inst, Expr_Type);
- Srec : Memtyp;
- Left : Valtyp;
- Right : Valtyp;
- begin
- Left := Synth_Expression_With_Type (Syn_Inst, Left_Expr, Left_Typ);
- if Left = No_Valtyp then
- return No_Valtyp;
- end if;
- Left := Synth_Subtype_Conversion (Syn_Inst, Left, Left_Typ, False, Expr);
- Right := Synth_Expression_With_Type (Syn_Inst, Right_Expr, Right_Typ);
- if Right = No_Valtyp then
- return No_Valtyp;
- end if;
- Right := Synth_Subtype_Conversion
- (Syn_Inst, Right, Right_Typ, False, Expr);
-
- if Is_Static_Val (Left.Val) and Is_Static_Val (Right.Val) then
- Srec := Eval_Static_Predefined_Function_Call
- (Syn_Inst, Get_Value_Memtyp (Left), Get_Value_Memtyp (Right),
- Expr_Typ, Expr);
- if Srec = Null_Memtyp then
- return No_Valtyp;
- end if;
- return Create_Value_Memtyp (Srec);
- else
- Strip_Const (Left);
- Strip_Const (Right);
- return Synth_Dyadic_Operation (Syn_Inst, Imp, Left, Right, Expr);
- end if;
- end Synth_Dyadic_Operation;
-
- function Synth_Monadic_Operation (Syn_Inst : Synth_Instance_Acc;
- Imp : Node;
- Operand : Valtyp;
- Loc : Node) return Valtyp
- is
- Ctxt : constant Context_Acc := Get_Build (Syn_Inst);
- Def : constant Iir_Predefined_Functions :=
- Get_Implicit_Definition (Imp);
-
- function Synth_Bit_Monadic (Id : Monadic_Module_Id) return Valtyp
- is
- N : Net;
- begin
- N := Build_Monadic (Ctxt, Id, Get_Net (Ctxt, Operand));
- Set_Location (N, Loc);
- return Create_Value_Net (N, Operand.Typ);
- end Synth_Bit_Monadic;
-
- function Synth_Vec_Monadic (Id : Monadic_Module_Id) return Valtyp
- is
- Op: constant Net := Get_Net (Ctxt, Operand);
- N : Net;
- begin
- N := Build_Monadic (Ctxt, Id, Op);
- Set_Location (N, Loc);
- return Create_Value_Net (N, Create_Res_Bound (Operand));
- end Synth_Vec_Monadic;
-
- function Synth_Vec_Reduce_Monadic
- (Id : Reduce_Module_Id; Neg : Boolean := False) return Valtyp
- is
- Op: constant Net := Get_Net (Ctxt, Operand);
- N : Net;
- begin
- N := Build_Reduce (Ctxt, Id, Op);
- Set_Location (N, Loc);
- if Neg then
- N := Build_Monadic (Ctxt, Id_Not, N);
- Set_Location (N, Loc);
- end if;
- return Create_Value_Net (N, Operand.Typ.Arr_El);
- end Synth_Vec_Reduce_Monadic;
- begin
- case Def is
- when Iir_Predefined_Error =>
- return No_Valtyp;
- when Iir_Predefined_Ieee_1164_Scalar_Not =>
- return Synth_Bit_Monadic (Id_Not);
- when Iir_Predefined_Boolean_Not
- | Iir_Predefined_Bit_Not =>
- return Synth_Bit_Monadic (Id_Not);
- when Iir_Predefined_Ieee_1164_Vector_Not
- | Iir_Predefined_Ieee_Numeric_Std_Not_Uns
- | Iir_Predefined_Ieee_Numeric_Std_Not_Sgn =>
- return Synth_Vec_Monadic (Id_Not);
- when Iir_Predefined_Ieee_Numeric_Std_Neg_Uns
- | Iir_Predefined_Ieee_Numeric_Std_Neg_Sgn
- | Iir_Predefined_Ieee_Std_Logic_Arith_Neg_Sgn_Sgn
- | Iir_Predefined_Ieee_Std_Logic_Arith_Neg_Sgn_Slv
- | Iir_Predefined_Ieee_Std_Logic_Signed_Neg_Slv =>
- return Synth_Vec_Monadic (Id_Neg);
- when Iir_Predefined_Ieee_Numeric_Std_Abs_Sgn
- | Iir_Predefined_Ieee_Std_Logic_Arith_Abs_Sgn_Sgn
- | Iir_Predefined_Ieee_Std_Logic_Arith_Abs_Sgn_Slv
- | Iir_Predefined_Ieee_Std_Logic_Signed_Abs_Slv =>
- return Synth_Vec_Monadic (Id_Abs);
-
- when Iir_Predefined_Ieee_1164_And_Suv
- | Iir_Predefined_Ieee_Numeric_Std_And_Sgn
- | Iir_Predefined_Ieee_Numeric_Std_And_Uns =>
- return Synth_Vec_Reduce_Monadic (Id_Red_And);
- when Iir_Predefined_Ieee_1164_Nand_Suv
- | Iir_Predefined_Ieee_Numeric_Std_Nand_Sgn
- | Iir_Predefined_Ieee_Numeric_Std_Nand_Uns =>
- return Synth_Vec_Reduce_Monadic (Id_Red_And, True);
- when Iir_Predefined_Ieee_1164_Or_Suv
- | Iir_Predefined_Ieee_Numeric_Std_Or_Sgn
- | Iir_Predefined_Ieee_Numeric_Std_Or_Uns =>
- return Synth_Vec_Reduce_Monadic (Id_Red_Or);
- when Iir_Predefined_Ieee_1164_Nor_Suv
- | Iir_Predefined_Ieee_Numeric_Std_Nor_Sgn
- | Iir_Predefined_Ieee_Numeric_Std_Nor_Uns =>
- return Synth_Vec_Reduce_Monadic (Id_Red_Or, True);
- when Iir_Predefined_Ieee_1164_Xor_Suv
- | Iir_Predefined_Ieee_Numeric_Std_Xor_Sgn
- | Iir_Predefined_Ieee_Numeric_Std_Xor_Uns =>
- return Synth_Vec_Reduce_Monadic (Id_Red_Xor);
- when Iir_Predefined_Ieee_1164_Xnor_Suv
- | Iir_Predefined_Ieee_Numeric_Std_Xnor_Sgn
- | Iir_Predefined_Ieee_Numeric_Std_Xnor_Uns =>
- return Synth_Vec_Reduce_Monadic (Id_Red_Xor, True);
-
- when Iir_Predefined_Ieee_Std_Logic_Arith_Id_Uns_Uns
- | Iir_Predefined_Ieee_Std_Logic_Arith_Id_Uns_Slv
- | Iir_Predefined_Ieee_Std_Logic_Arith_Id_Sgn_Sgn
- | Iir_Predefined_Ieee_Std_Logic_Arith_Id_Sgn_Slv
- | Iir_Predefined_Ieee_Std_Logic_Unsigned_Id_Slv
- | Iir_Predefined_Ieee_Std_Logic_Signed_Id_Slv =>
- -- Unary "+": nop
- return Create_Value_Net (Get_Net (Ctxt, Operand),
- Create_Res_Bound (Operand));
-
- when Iir_Predefined_Ieee_1164_Condition_Operator
- | Iir_Predefined_Bit_Condition =>
- return Create_Value_Net
- (Get_Net (Ctxt, Operand),
- Get_Subtype_Object (Syn_Inst, Get_Type (Imp)));
- when Iir_Predefined_Integer_Negation =>
- declare
- N : Net;
- begin
- N := Build_Monadic (Ctxt, Id_Neg, Get_Net (Ctxt, Operand));
- Set_Location (N, Loc);
- return Create_Value_Net (N, Operand.Typ);
- end;
-
- when others =>
- Error_Msg_Synth
- (Syn_Inst, Loc,
- "unhandled monadic: " & Iir_Predefined_Functions'Image (Def));
- return No_Valtyp;
- end case;
- end Synth_Monadic_Operation;
-
- function Synth_Monadic_Operation (Syn_Inst : Synth_Instance_Acc;
- Imp : Node;
- Operand_Expr : Node;
- Loc : Node) return Valtyp
- is
- Inter_Chain : constant Node :=
- Get_Interface_Declaration_Chain (Imp);
- Oper_Type : constant Node := Get_Type (Inter_Chain);
- Oper_Typ : constant Type_Acc := Get_Subtype_Object (Syn_Inst, Oper_Type);
- Operand : Valtyp;
- begin
- Operand := Synth_Expression_With_Type (Syn_Inst, Operand_Expr, Oper_Typ);
- if Operand = No_Valtyp then
- return No_Valtyp;
- end if;
- Operand := Synth_Subtype_Conversion
- (Syn_Inst, Operand, Oper_Typ, False, Loc);
- Strip_Const (Operand);
-
- if Is_Static_Val (Operand.Val) then
- return Create_Value_Memtyp
- (Eval_Static_Predefined_Function_Call
- (Syn_Inst, Get_Value_Memtyp (Operand), Null_Memtyp,
- null, Loc));
- else
- return Synth_Monadic_Operation (Syn_Inst, Imp, Operand, Loc);
- end if;
- end Synth_Monadic_Operation;
-
- function Synth_Shift_Rotate (Ctxt : Context_Acc;
- Id : Shift_Rotate_Module_Id;
- Left, Right : Valtyp;
- Expr : Node) return Valtyp
- is
- L : constant Net := Get_Net (Ctxt, Left);
- N : Net;
- begin
- N := Build_Shift_Rotate (Ctxt, Id, L, Get_Net (Ctxt, Right));
- Set_Location (N, Expr);
- return Create_Value_Net (N, Create_Res_Bound (Left));
- end Synth_Shift_Rotate;
-
- function Synth_Find_Bit (Syn_Inst : Synth_Instance_Acc;
- Left, Right : Valtyp;
- Res_Typ : Type_Acc;
- Leftmost : Boolean;
- Expr : Node) return Valtyp
- is
- Ctxt : constant Context_Acc := Get_Build (Syn_Inst);
- pragma Assert (Left.Typ.Kind = Type_Vector);
- Len : constant Uns32 := Left.Typ.Abound.Len;
- Max : Int32;
- Rng : Discrete_Range_Type;
- W : Uns32;
- Typ : Type_Acc;
- R_Net : Net;
- L_Net : Net;
- Res : Net;
- begin
- if Len = 0 then
- return Create_Value_Int (-1, Res_Typ);
- end if;
-
- -- The intermediate result is computed using the least number of bits,
- -- which must represent all positive values in the bounds using a
- -- signed word (so that -1 is also represented).
- Max := Int32'Max (Left.Typ.Abound.Left, Left.Typ.Abound.Right);
- W := Netlists.Utils.Clog2 (Uns32 (Max)) + 1;
- Rng := (Dir => Dir_To,
- Is_Signed => True,
- Left => -1,
- Right => Int64 (Max));
- Typ := Create_Discrete_Type (Rng, Res_Typ.Sz, W);
-
- R_Net := Get_Net (Ctxt, Right);
- L_Net := Get_Net (Ctxt, Left);
- Res := Build2_Const_Int (Ctxt, -1, W);
- for I in 0 .. Len - 1 loop
- declare
- Pos : Uns32;
- V : Int64;
- Sel : Net;
- begin
- if Leftmost then
- -- Iterate from the right to the left.
- Pos := I;
- if Left.Typ.Abound.Dir = Dir_To then
- V := Int64 (Left.Typ.Abound.Right) - Int64 (I);
- else
- V := Int64 (Left.Typ.Abound.Right) + Int64 (I);
- end if;
- else
- Pos := Len - I - 1;
- if Left.Typ.Abound.Dir = Dir_To then
- V := Int64 (Left.Typ.Abound.Left) + Int64 (I);
- else
- V := Int64 (Left.Typ.Abound.Left) - Int64 (I);
- end if;
- end if;
- Sel := Build2_Compare (Ctxt, Id_Eq,
- Build2_Extract (Ctxt, L_Net, Pos, 1),
- R_Net);
- Set_Location (Sel, Expr);
- Res := Build_Mux2 (Ctxt, Sel, Res, Build2_Const_Int (Ctxt, V, W));
- Set_Location (Res, Expr);
- end;
- end loop;
-
- return Synth_Subtype_Conversion (Syn_Inst, Create_Value_Net (Res, Typ),
- Res_Typ, False, Expr);
- end Synth_Find_Bit;
-
- -- Resize ARG to SIZE bits according to IS_SIGNED.
- function Synth_Resize (Ctxt : Context_Acc;
- Arg : Valtyp;
- Size : Width;
- Is_Signed : Boolean;
- Loc : Node) return Valtyp
- is
- N : Net;
- begin
- N := Get_Net (Ctxt, Arg);
- N := Build2_Resize (Ctxt, N, Size, Is_Signed, Get_Location (Loc));
- return Create_Value_Net
- (N, Create_Vec_Type_By_Length (Size, Logic_Type));
- end Synth_Resize;
-
- function Synth_Minmax (Ctxt : Context_Acc;
- Left, Right : Valtyp;
- Res_Typ : Type_Acc;
- Id : Compare_Module_Id;
- Expr : Node) return Valtyp
- is
- L : constant Net := Get_Net (Ctxt, Left);
- R : constant Net := Get_Net (Ctxt, Right);
- Sel, N : Net;
- begin
- Sel := Build2_Compare (Ctxt, Id, L, R);
- Set_Location (Sel, Expr);
- N := Build_Mux2 (Ctxt, Sel, R, L);
- Set_Location (N, Expr);
- return Create_Value_Net (N, Res_Typ);
- end Synth_Minmax;
-
- function Synth_Vec_Reduce_Monadic (Ctxt : Context_Acc;
- Id : Reduce_Module_Id;
- Neg : Boolean;
- Operand : Valtyp;
- Loc : Node) return Valtyp
- is
- Op: constant Net := Get_Net (Ctxt, Operand);
- N : Net;
- begin
- N := Build_Reduce (Ctxt, Id, Op);
- Set_Location (N, Loc);
- if Neg then
- N := Build_Monadic (Ctxt, Id_Not, N);
- Set_Location (N, Loc);
- end if;
- return Create_Value_Net (N, Operand.Typ.Arr_El);
- end Synth_Vec_Reduce_Monadic;
-
- function Synth_Dynamic_Predefined_Call (Subprg_Inst : Synth_Instance_Acc;
- Imp : Node;
- L, R : Valtyp;
- Expr : Node) return Valtyp
- is
- Ctxt : constant Context_Acc := Get_Build (Subprg_Inst);
- Def : constant Iir_Predefined_Functions :=
- Get_Implicit_Definition (Imp);
- Res_Typ : constant Type_Acc :=
- Get_Subtype_Object (Subprg_Inst, Get_Type (Imp));
-
- -- Resize L to R bit according to IS_SIGNED.
- function Synth_Conv_Vector (Is_Signed : Boolean) return Valtyp
- is
- Size_Vt : Valtyp;
- Size : Width;
- begin
- Size_Vt := R;
- Strip_Const (Size_Vt);
- if not Is_Static (Size_Vt.Val) then
- Error_Msg_Synth
- (Get_Caller_Instance (Subprg_Inst), Expr,
- "size parameter must be constant");
- return No_Valtyp;
- end if;
- Size := Uns32 (Read_Discrete (Size_Vt));
- return Synth_Resize (Ctxt, L, Size, Is_Signed, Expr);
- end Synth_Conv_Vector;
- begin
- case Def is
when Iir_Predefined_Endfile =>
declare
Res : Boolean;
@@ -2104,7 +1952,7 @@ package body Synth.Vhdl_Oper is
begin
if not Is_Static (R.Val) then
Error_Msg_Synth
- (Get_Caller_Instance (Subprg_Inst), Expr,
+ (Get_Caller_Instance (Syn_Inst), Expr,
"size must be constant");
return No_Valtyp;
end if;
@@ -2131,7 +1979,7 @@ package body Synth.Vhdl_Oper is
| Iir_Predefined_Ieee_Std_Logic_Arith_Sxt =>
if not Is_Static (R.Val) then
Error_Msg_Synth
- (Get_Caller_Instance (Subprg_Inst), Expr,
+ (Get_Caller_Instance (Syn_Inst), Expr,
"size must be constant");
return No_Valtyp;
end if;
@@ -2222,13 +2070,13 @@ package body Synth.Vhdl_Oper is
Oper := L;
else
Error_Msg_Synth
- (Get_Caller_Instance (Subprg_Inst), Expr,
+ (Get_Caller_Instance (Syn_Inst), Expr,
"one operand of std_match must be constant");
return No_Valtyp;
end if;
if Oper.Typ.W /= Cst.Typ.W then
Error_Msg_Synth
- (Get_Caller_Instance (Subprg_Inst), Expr,
+ (Get_Caller_Instance (Syn_Inst), Expr,
"operands of std_match don't have the same size");
return Create_Value_Discrete (0, Boolean_Type);
end if;
@@ -2243,14 +2091,14 @@ package body Synth.Vhdl_Oper is
when Iir_Predefined_Ieee_Numeric_Std_Find_Leftmost_Sgn
| Iir_Predefined_Ieee_Numeric_Std_Find_Leftmost_Uns =>
- return Synth_Find_Bit (Subprg_Inst, L, R, Res_Typ, True, Expr);
+ return Synth_Find_Bit (Syn_Inst, L, R, Res_Typ, True, Expr);
when Iir_Predefined_Ieee_Numeric_Std_Find_Rightmost_Sgn
| Iir_Predefined_Ieee_Numeric_Std_Find_Rightmost_Uns =>
- return Synth_Find_Bit (Subprg_Inst, L, R, Res_Typ, False, Expr);
+ return Synth_Find_Bit (Syn_Inst, L, R, Res_Typ, False, Expr);
when others =>
Error_Msg_Synth
- (Get_Caller_Instance (Subprg_Inst), Expr,
+ (Get_Caller_Instance (Syn_Inst), Expr,
"unhandled function: " & Iir_Predefined_Functions'Image (Def));
return No_Valtyp;
end case;
@@ -2357,6 +2205,84 @@ package body Synth.Vhdl_Oper is
return Res;
end Synth_Predefined_Function_Call;
+ function Synth_Monadic_Operation (Syn_Inst : Synth_Instance_Acc;
+ Imp : Node;
+ Operand_Expr : Node;
+ Expr : Node) return Valtyp
+ is
+ Inter_Chain : constant Node :=
+ Get_Interface_Declaration_Chain (Imp);
+ Oper_Type : constant Node := Get_Type (Inter_Chain);
+ Oper_Typ : constant Type_Acc := Get_Subtype_Object (Syn_Inst, Oper_Type);
+ Operand : Valtyp;
+ begin
+ Operand := Synth_Expression_With_Type (Syn_Inst, Operand_Expr, Oper_Typ);
+ if Operand = No_Valtyp then
+ return No_Valtyp;
+ end if;
+ Operand := Synth_Subtype_Conversion
+ (Syn_Inst, Operand, Oper_Typ, False, Expr);
+ Strip_Const (Operand);
+
+ if Is_Static_Val (Operand.Val) then
+ return Create_Value_Memtyp
+ (Eval_Static_Predefined_Function_Call
+ (Syn_Inst, Get_Value_Memtyp (Operand), Null_Memtyp,
+ null, Expr));
+ else
+ return Synth_Dynamic_Predefined_Call
+ (Syn_Inst, Imp, Operand, No_Valtyp, Expr);
+ end if;
+ end Synth_Monadic_Operation;
+
+ function Synth_Dyadic_Operation (Syn_Inst : Synth_Instance_Acc;
+ Imp : Node;
+ Left_Expr : Node;
+ Right_Expr : Node;
+ Expr : Node) return Valtyp
+ is
+ Inter_Chain : constant Node :=
+ Get_Interface_Declaration_Chain (Imp);
+ Expr_Type : constant Node := Get_Type (Expr);
+ Left_Type : constant Node := Get_Type (Inter_Chain);
+ Right_Type : constant Node := Get_Type (Get_Chain (Inter_Chain));
+ Left_Typ : constant Type_Acc :=
+ Get_Subtype_Object (Syn_Inst, Left_Type);
+ Right_Typ : constant Type_Acc :=
+ Get_Subtype_Object (Syn_Inst, Right_Type);
+ Expr_Typ : constant Type_Acc := Get_Subtype_Object (Syn_Inst, Expr_Type);
+ Srec : Memtyp;
+ Left : Valtyp;
+ Right : Valtyp;
+ begin
+ Left := Synth_Expression_With_Type (Syn_Inst, Left_Expr, Left_Typ);
+ if Left = No_Valtyp then
+ return No_Valtyp;
+ end if;
+ Left := Synth_Subtype_Conversion (Syn_Inst, Left, Left_Typ, False, Expr);
+ Right := Synth_Expression_With_Type (Syn_Inst, Right_Expr, Right_Typ);
+ if Right = No_Valtyp then
+ return No_Valtyp;
+ end if;
+ Right := Synth_Subtype_Conversion
+ (Syn_Inst, Right, Right_Typ, False, Expr);
+
+ if Is_Static_Val (Left.Val) and Is_Static_Val (Right.Val) then
+ Srec := Eval_Static_Predefined_Function_Call
+ (Syn_Inst, Get_Value_Memtyp (Left), Get_Value_Memtyp (Right),
+ Expr_Typ, Expr);
+ if Srec = Null_Memtyp then
+ return No_Valtyp;
+ end if;
+ return Create_Value_Memtyp (Srec);
+ else
+ Strip_Const (Left);
+ Strip_Const (Right);
+ return Synth_Dynamic_Predefined_Call
+ (Syn_Inst, Imp, Left, Right, Expr);
+ end if;
+ end Synth_Dyadic_Operation;
+
function Synth_Operator_Function_Call
(Syn_Inst : Synth_Instance_Acc; Expr : Node) return Valtyp
is
diff --git a/src/synth/synth-vhdl_oper.ads b/src/synth/synth-vhdl_oper.ads
index f02d4d55c..649849d67 100644
--- a/src/synth/synth-vhdl_oper.ads
+++ b/src/synth/synth-vhdl_oper.ads
@@ -37,7 +37,7 @@ package Synth.Vhdl_Oper is
function Synth_Monadic_Operation (Syn_Inst : Synth_Instance_Acc;
Imp : Node;
Operand_Expr : Node;
- Loc : Node) return Valtyp;
+ Expr : Node) return Valtyp;
function Create_Bounds_From_Length
(Syn_Inst : Synth_Instance_Acc; Atype : Iir; Len : Iir_Index32)