From 92ac42fcf39d5dac4529d939a49437b2a7afe4c2 Mon Sep 17 00:00:00 2001 From: Tristan Gingold Date: Sun, 20 Dec 2015 13:56:08 +0100 Subject: openieee: complete math_real (and fix uniform). --- libraries/openieee/math_real-body.vhdl | 155 +++++++++++++++++++++++++++++++-- 1 file changed, 146 insertions(+), 9 deletions(-) (limited to 'libraries/openieee/math_real-body.vhdl') diff --git a/libraries/openieee/math_real-body.vhdl b/libraries/openieee/math_real-body.vhdl index 1d7a154af..e825a7801 100644 --- a/libraries/openieee/math_real-body.vhdl +++ b/libraries/openieee/math_real-body.vhdl @@ -46,22 +46,60 @@ package body MATH_REAL is function TRUNC (X : REAL) return REAL is begin assert false severity failure; - end TRUNC; + end; + + function fmod (X, Y : REAL) return REAL; + attribute foreign of fmod : function is "VHPIDIRECT fmod"; + + function fmod (X, Y : REAL) return REAL is + begin + assert false severity failure; + end; + + function "mod" (X, Y : REAL) return REAL + is + variable res : real; + begin + assert y /= 0.0 report "ieee.math_real.""mod"": dividend is 0.0" + severity failure; + res := fmod (x, y); + if res /= 0.0 then + if x > 0.0 xor y > 0.0 then + res := res + y; + end if; + end if; + return res; + end "mod"; + + function REALMAX (X, Y : REAL) return REAL is + begin + assert false severity failure; + end; + + function REALMIN (X, Y : REAL) return REAL is + begin + assert false severity failure; + end; procedure UNIFORM (SEED1, SEED2 : inout POSITIVE; X : out REAL) is variable z, k : Integer; + variable s1, s2 : Integer; begin k := seed1 / 53668; - seed1 := 40014 * (seed1 - k * 53668) - k * 12211; - if seed1 < 0 then - seed1 := seed1 + 2147483563; + s1 := 40014 * (seed1 - k * 53668) - k * 12211; + if s1 < 0 then + seed1 := s1 + 2147483563; + else + seed1 := s1; end if; k := seed2 / 52774; - seed2 := 40692 * (seed2 - k * 52774) - k * 3791; - if seed2 < 0 then - seed2 := seed2 + 2147483399; + s2 := 40692 * (seed2 - k * 52774) - k * 3791; + if s2 < 0 then + seed2 := s2 + 2147483399; + else + seed2 := s2; end if; z := seed1 - seed2; @@ -72,15 +110,114 @@ package body MATH_REAL is x := real (z) * 4.656613e-10; end UNIFORM; + function SQRT (X : REAL) return REAL is + begin + assert false severity failure; + end; + + function CBRT (X : REAL) return REAL is + begin + assert false severity failure; + end; + + function "**" (X : INTEGER; Y : REAL) return REAL is + begin + return real (x) ** y; + end "**"; + + function "**" (X : REAL; Y : REAL) return REAL is + begin + assert false severity failure; + end; + + function EXP (X : REAL) return REAL is + begin + assert false severity failure; + end; + + function LOG (X : REAL) return REAL is + begin + assert false severity failure; + end; + + function LOG2 (X : REAL) return REAL is + begin + assert false severity failure; + end; + + function LOG10 (X : REAL) return REAL is + begin + assert false severity failure; + end; + + function LOG (X : REAL; BASE : REAL) return REAL is + begin + return log (x) / log (base); + end log; + function SIN (X : REAL) return REAL is begin assert false severity failure; - end SIN; + end; function COS (X : REAL) return REAL is begin assert false severity failure; - end COS; + end; + + function TAN (X : REAL) return REAL is + begin + assert false severity failure; + end; + + function ARCSIN (X : REAL) return REAL is + begin + assert false severity failure; + end; + + function ARCCOS (X : REAL) return REAL is + begin + assert false severity failure; + end; + + function ARCTAN (Y : REAL) return REAL is + begin + assert false severity failure; + end; + + function ARCTAN (Y, X : REAL) return REAL is + begin + assert false severity failure; + end; + + function SINH (X : REAL) return REAL is + begin + assert false severity failure; + end; + + function COSH (X : REAL) return REAL is + begin + assert false severity failure; + end; + + function TANH (X : REAL) return REAL is + begin + assert false severity failure; + end; + function ARCSINH (X : REAL) return REAL is + begin + assert false severity failure; + end; + + function ARCCOSH (X : REAL) return REAL is + begin + assert false severity failure; + end; + + function ARCTANH (Y : REAL) return REAL is + begin + assert false severity failure; + end; end MATH_REAL; -- cgit v1.2.3