aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/std_names.adb1
-rw-r--r--src/std_names.ads7
-rw-r--r--src/synth/synth-oper.adb14
-rw-r--r--src/vhdl/vhdl-ieee-math_real.adb2
-rw-r--r--src/vhdl/vhdl-nodes.ads1
5 files changed, 22 insertions, 3 deletions
diff --git a/src/std_names.adb b/src/std_names.adb
index 8c97e5f27..d8d71b29b 100644
--- a/src/std_names.adb
+++ b/src/std_names.adb
@@ -650,6 +650,7 @@ package body Std_Names is
Def ("conv_integer", Name_Conv_Integer);
Def ("math_real", Name_Math_Real);
Def ("ceil", Name_Ceil);
+ Def ("round", Name_Round);
Def ("log2", Name_Log2);
Def ("sin", Name_Sin);
Def ("cos", Name_Cos);
diff --git a/src/std_names.ads b/src/std_names.ads
index f9cc961a0..efb0ba919 100644
--- a/src/std_names.ads
+++ b/src/std_names.ads
@@ -731,9 +731,10 @@ package Std_Names is
Name_Conv_Integer : constant Name_Id := Name_First_Ieee + 032;
Name_Math_Real : constant Name_Id := Name_First_Ieee + 033;
Name_Ceil : constant Name_Id := Name_First_Ieee + 034;
- Name_Log2 : constant Name_Id := Name_First_Ieee + 035;
- Name_Sin : constant Name_Id := Name_First_Ieee + 036;
- Name_Cos : constant Name_Id := Name_First_Ieee + 037;
+ Name_Round : constant Name_Id := Name_First_Ieee + 035;
+ Name_Log2 : constant Name_Id := Name_First_Ieee + 036;
+ Name_Sin : constant Name_Id := Name_First_Ieee + 037;
+ Name_Cos : constant Name_Id := Name_First_Ieee + 038;
Name_Last_Ieee : constant Name_Id := Name_Cos;
Name_First_Synthesis : constant Name_Id := Name_Last_Ieee + 1;
diff --git a/src/synth/synth-oper.adb b/src/synth/synth-oper.adb
index fcd11201e..471d82979 100644
--- a/src/synth/synth-oper.adb
+++ b/src/synth/synth-oper.adb
@@ -1186,6 +1186,20 @@ package body Synth.Oper is
return Create_Value_Float
(Ceil (V.Fp), Get_Value_Type (Syn_Inst, Get_Type (Imp)));
end;
+ when Iir_Predefined_Ieee_Math_Real_Round =>
+ declare
+ V : constant Value_Acc := Get_Value (Subprg_Inst, Param1);
+
+ function Round (Arg : Fp64) return Fp64;
+ pragma Import (C, Round);
+ begin
+ if V.Typ.Kind /= Type_Float then
+ Error_Msg_Synth(+Expr, "argument must be a float value");
+ return null;
+ end if;
+ return Create_Value_Float
+ (Round (V.Fp), Get_Value_Type (Syn_Inst, Get_Type (Imp)));
+ end;
when Iir_Predefined_Ieee_Math_Real_Sin =>
declare
V : constant Value_Acc := Get_Value (Subprg_Inst, Param1);
diff --git a/src/vhdl/vhdl-ieee-math_real.adb b/src/vhdl/vhdl-ieee-math_real.adb
index 1ac5a9b10..d4f83e62c 100644
--- a/src/vhdl/vhdl-ieee-math_real.adb
+++ b/src/vhdl/vhdl-ieee-math_real.adb
@@ -42,6 +42,8 @@ package body Vhdl.Ieee.Math_Real is
case Get_Identifier (Decl) is
when Name_Ceil =>
Predef := Iir_Predefined_Ieee_Math_Real_Ceil;
+ when Name_Round =>
+ Predef := Iir_Predefined_Ieee_Math_Real_Round;
when Name_Log2 =>
Predef := Iir_Predefined_Ieee_Math_Real_Log2;
when Name_Sin =>
diff --git a/src/vhdl/vhdl-nodes.ads b/src/vhdl/vhdl-nodes.ads
index 4ed10957d..15e21d738 100644
--- a/src/vhdl/vhdl-nodes.ads
+++ b/src/vhdl/vhdl-nodes.ads
@@ -5593,6 +5593,7 @@ package Vhdl.Nodes is
-- Math_Real
Iir_Predefined_Ieee_Math_Real_Ceil,
+ Iir_Predefined_Ieee_Math_Real_Round,
Iir_Predefined_Ieee_Math_Real_Log2,
Iir_Predefined_Ieee_Math_Real_Sin,
Iir_Predefined_Ieee_Math_Real_Cos,