diff options
author | Tristan Gingold <tgingold@free.fr> | 2020-04-19 12:08:33 +0200 |
---|---|---|
committer | Tristan Gingold <tgingold@free.fr> | 2020-04-19 12:08:33 +0200 |
commit | a131ab5138f7a8bea69b4ff9434f287e77ef6f10 (patch) | |
tree | 6d42a2d52374ccfe946783fa8d31781bc9da558c | |
parent | 8fb42ce39ad5392557b281fa3d607bb7c6d79c5e (diff) | |
download | ghdl-a131ab5138f7a8bea69b4ff9434f287e77ef6f10.tar.gz ghdl-a131ab5138f7a8bea69b4ff9434f287e77ef6f10.tar.bz2 ghdl-a131ab5138f7a8bea69b4ff9434f287e77ef6f10.zip |
synth-oper: handle std_logic_arith_mul_uns_sgn_sgn. For #1239
-rw-r--r-- | src/synth/synth-oper.adb | 34 |
1 files changed, 25 insertions, 9 deletions
diff --git a/src/synth/synth-oper.adb b/src/synth/synth-oper.adb index c87a61235..758ca6b06 100644 --- a/src/synth/synth-oper.adb +++ b/src/synth/synth-oper.adb @@ -995,6 +995,21 @@ package body Synth.Oper is Set_Location (N, Expr); return Create_Value_Net (N, Rtype); end; + when Iir_Predefined_Ieee_Std_Logic_Arith_Mul_Uns_Sgn_Sgn => + -- "*" (unsigned, signed) + declare + W : constant Width := Left.Typ.W + 1 + Right.Typ.W; + Rtype : Type_Acc; + L, R : Net; + N : Net; + begin + L := Synth_Uresize (Left, W, Left_Expr); + R := Synth_Sresize (Right, W, Right_Expr); + Rtype := Create_Vec_Type_By_Length (W, Left.Typ.Vec_El); + N := Build_Dyadic (Build_Context, Id_Smul, L, R); + Set_Location (N, Expr); + return Create_Value_Net (N, Rtype); + end; when Iir_Predefined_Ieee_Numeric_Std_Div_Uns_Uns | Iir_Predefined_Ieee_Numeric_Std_Div_Uns_Nat => @@ -1142,30 +1157,31 @@ package body Synth.Oper is return Synth_Compare_Int_Sgn (Id_Sle, Expr_Typ); when Iir_Predefined_Ieee_Numeric_Std_Gt_Uns_Uns - | Iir_Predefined_Ieee_Std_Logic_Unsigned_Gt_Slv_Slv - | Iir_Predefined_Ieee_Numeric_Std_Match_Gt_Uns_Uns => + | Iir_Predefined_Ieee_Std_Logic_Unsigned_Gt_Slv_Slv + | Iir_Predefined_Ieee_Numeric_Std_Match_Gt_Uns_Uns => -- ">" (Unsigned, Unsigned) [resize] return Synth_Compare_Uns_Uns (Id_Ugt, Expr_Typ); when Iir_Predefined_Ieee_Numeric_Std_Gt_Uns_Nat - | Iir_Predefined_Ieee_Std_Logic_Unsigned_Gt_Slv_Int - | Iir_Predefined_Ieee_Numeric_Std_Match_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); when Iir_Predefined_Ieee_Numeric_Std_Gt_Nat_Uns - | Iir_Predefined_Ieee_Numeric_Std_Match_Gt_Nat_Uns => + | Iir_Predefined_Ieee_Numeric_Std_Match_Gt_Nat_Uns => -- ">" (Natural, Unsigned) [resize] return Synth_Compare_Nat_Uns (Id_Ugt, Expr_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_Numeric_Std_Match_Gt_Sgn_Sgn + | Iir_Predefined_Ieee_Std_Logic_Arith_Gt_Sgn_Sgn => -- ">" (Signed, Signed) [resize] return Synth_Compare_Sgn_Sgn (Id_Sgt, Expr_Typ); when Iir_Predefined_Ieee_Numeric_Std_Gt_Sgn_Int - | Iir_Predefined_Ieee_Numeric_Std_Match_Gt_Sgn_Int => + | Iir_Predefined_Ieee_Numeric_Std_Match_Gt_Sgn_Int + | Iir_Predefined_Ieee_Std_Logic_Arith_Gt_Sgn_Int => -- ">" (Signed, Integer) return Synth_Compare_Sgn_Int (Id_Sgt, Expr_Typ); when Iir_Predefined_Ieee_Numeric_Std_Gt_Int_Sgn - | Iir_Predefined_Ieee_Numeric_Std_Match_Gt_Int_Sgn => + | Iir_Predefined_Ieee_Numeric_Std_Match_Gt_Int_Sgn => -- ">" (Integer, Signed) return Synth_Compare_Int_Sgn (Id_Sgt, Expr_Typ); |