diff options
author | Tristan Gingold <tgingold@free.fr> | 2019-09-22 17:26:38 +0200 |
---|---|---|
committer | Tristan Gingold <tgingold@free.fr> | 2019-09-22 17:26:38 +0200 |
commit | 6f9f27d4a643aaae6e5f04bae104f28473c9b695 (patch) | |
tree | c243106609294590668e370d4005336ce1cb4457 /src/synth/synth-oper.adb | |
parent | 51d105ce7368344753ef90f84c2209dd514715bb (diff) | |
download | ghdl-6f9f27d4a643aaae6e5f04bae104f28473c9b695.tar.gz ghdl-6f9f27d4a643aaae6e5f04bae104f28473c9b695.tar.bz2 ghdl-6f9f27d4a643aaae6e5f04bae104f28473c9b695.zip |
synth: handle rotate.
Diffstat (limited to 'src/synth/synth-oper.adb')
-rw-r--r-- | src/synth/synth-oper.adb | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/src/synth/synth-oper.adb b/src/synth/synth-oper.adb index d50ca1862..8f960a6c2 100644 --- a/src/synth/synth-oper.adb +++ b/src/synth/synth-oper.adb @@ -767,17 +767,17 @@ package body Synth.Oper is end case; end Synth_Monadic_Operation; - function Synth_Shift (Id : Shift_Module_Id; + function Synth_Shift_Rotate (Id : Shift_Rotate_Module_Id; Left, Right : Value_Acc; Expr : Node) return Value_Acc is L : constant Net := Get_Net (Left); N : Net; begin - N := Build_Shift (Build_Context, Id, L, Get_Net (Right)); + N := Build_Shift_Rotate (Build_Context, Id, L, Get_Net (Right)); Set_Location (N, Expr); return Create_Value_Net (N, Create_Res_Bound (Left, L)); - end Synth_Shift; + end Synth_Shift_Rotate; function Synth_Std_Match (Cst : Value_Acc; Oper : Value_Acc; @@ -973,14 +973,28 @@ package body Synth.Oper is L : constant Value_Acc := Get_Value (Subprg_Inst, Param1); R : constant Value_Acc := Get_Value (Subprg_Inst, Param2); begin - return Synth_Shift (Id_Lsl, L, R, Expr); + return Synth_Shift_Rotate (Id_Lsl, L, R, Expr); end; when Iir_Predefined_Ieee_Numeric_Std_Shr_Uns_Nat => declare L : constant Value_Acc := Get_Value (Subprg_Inst, Param1); R : constant Value_Acc := Get_Value (Subprg_Inst, Param2); begin - return Synth_Shift (Id_Lsr, L, R, Expr); + return Synth_Shift_Rotate (Id_Lsr, L, R, Expr); + end; + when Iir_Predefined_Ieee_Numeric_Std_Rol_Uns_Nat => + declare + L : constant Value_Acc := Get_Value (Subprg_Inst, Param1); + R : constant Value_Acc := Get_Value (Subprg_Inst, Param2); + begin + return Synth_Shift_Rotate (Id_Rol, L, R, Expr); + end; + when Iir_Predefined_Ieee_Numeric_Std_Ror_Uns_Nat => + declare + L : constant Value_Acc := Get_Value (Subprg_Inst, Param1); + R : constant Value_Acc := Get_Value (Subprg_Inst, Param2); + begin + return Synth_Shift_Rotate (Id_Ror, L, R, Expr); end; when Iir_Predefined_Ieee_Numeric_Std_Match_Suv => declare |