The Math Package Study Subgroup From: Jose Torres To: Interested Parties Date: November 25, 1993 Subject: Minutes on 10/15/93 meeting SUMMARY This meeting took place at Mentor (DASC meetings following VIUF) from 9:00 a.m. until 11:00 am, with the following participants: Jose Torres, Synopsys, jose@synopsys.com Chuck Swart, Mentor, chuck_swart@mentorg.com Alex Zamfirescu, Vantage, a.zamfirescu@ieee.org Jerry A. Myers, Wright Patterson AFB, myersja@wl.wpafb.af.mil Richard Fryer, NAWC, richard.fryer@chinalake.navy.mil Attendance was sporadic, with people coming into and out of the meeting. There were never more than three people in the meeting at any one time. An overview of the package and the status of activities was presented, as well as feedback received since the last meeting. No issues were raised this time other than the need to speed up the process to ballot the package. Next general meeting will take place at Tempe, Arizona in conjunction with the IEEE SHDL Conference. The meeting will take place on January 27 from 8am to 12 noon SUMMARY 1. Par Number John Hines ratified the approval of the par number (1076.2) 2. Coordination with analog working group. Jean-Michel Berge has the action item to submit analog requirements to the math working group; no requirements have been received so far. Jean-Michel requested the current version of the package for its distribution in a European meeting before the end of the year. There is still the issue about the need for double precision functions and the possibility that a new real type called FLOAT may be part of the AHDL effort. This type will require greater accuracy than the current REAL type. The current proposed solution for this requirement is to develop 2 math packages: one for each real type. One consequence of such a decision is that we could ballot the REAL based math package almost immediately and could ballot the FLOAT package at the same time that analog is balloted. 4. Examining Needs for Additional Functionality. Some feedback has been received about the current version of the package. The feedback includes both comments for additional functions (more distributions and statistical functions, functions for matrix operations, and functions for type conversions), which we are considering and checking if they are within the scope of this effort, as well as comments on fixes/enhancements for the currently proposed functions. 5. Developing a test bench. John Hines obtained the NBS FORTRAN tests of math functions (thanks John), so that we do not have to re-invent the wheel for this effort.. Chuck Swart is checking with Mento Graphics if the tests for their math package can be used as a basis for the test bench. Alex Zamfirescu got permission from Vantage to provide their test bench template to be considered as a basis for the test bench. Jose Torres got some funding from Synopsys to develop a prototype of the test bench for the math package. We expect that a prototype for the test bench will be available by mid-January. We will need volunteers to help on extending the test bench for completeness. If you are interested please let Jose (jose@synopsys.com) know. 6. Balloting John Hines was asked to get the process ballot constituency process rolling. The idea is to start with the list used for VHDL-1992. Jose Torres was assigned the action item to create a deflector for the group and to open an account to post the latest version of the package. This action has been started and the account and deflector will be ready by the 2nd week of December 1993. 7. FOREIGN attributes The issue about the use of FOREIGN attributes is still open. The current suggestion is to use the FOREIGN attribute to describe the particular function and that complying vendors would then have to recognize particular strings to be compliant. For example, the SRAND function might have FOREIGN attribute "MATH_SRAND". 8. Miscellaneous Some of the functions in the package do not have checks for the input values. In general, it was recognized that some cleaning is needed on the current proposal, and should be done as part of the process of creating the test bench. Several subprograms have variables declared which should really be constants, since their values are not changed within the subprogram. One example of this is in the CEILING function "variable large: real := 1073741824.0;" should more accurately be "constant large: ..." 9. Current Version of The Package. Package declaration follows. For electronic version of package body, please send request to jose@synopsys.com ------------------------------------------------------------------------ -- -- This source file may be used and distributed without restriction. -- No declarations or definitions shall be included in this package. -- This package cannot be sold or distributed for profit. -- -- **************************************************************** -- * * -- * W A R N I N G * -- * * -- * This DRAFT version IS NOT endorsed or approved by IEEE * -- * * -- **************************************************************** -- -- Title: PACKAGE MATH_REAL -- -- Library: This package shall be compiled into a library -- symbolically named IEEE. -- -- Purpose: VHDL declarations for mathematical package MATH_REAL -- which contains common real constants, common real -- functions, and real trascendental functions. -- -- Author: IEEE VHDL Math Package Study Group -- -- Notes: -- The package body shall be considered the formal definition of -- the semantics of this package. Tool developers may choose to implement -- the package body in the most efficient manner available to them. -- -- History: -- Version 0.1 (Strawman) Jose A. Torres 6/22/92 -- Version 0.2 Jose A. Torres 1/15/93 -- Version 0.3 Jose A. Torres 4/13/93 -- Version 0.4 Jose A. Torres 4/19/93 -- Version 0.5 Jose A. Torres 4/20/93 Added RANDOM() -- Version 0.6 Jose A. Torres 4/23/93 Renamed RANDOM as -- UNIFORM. Modified -- rights banner. -- Version 0.7 Jose A. Torres 5/28/93 Rev up for compatibility -- with package body. ------------------------------------------------------------- Library IEEE; Package MATH_REAL is -- -- commonly used constants -- constant MATH_E : real := 2.71828_18284_59045_23536; -- value of e constant MATH_1_E: real := 0.36787_94411_71442_32160; -- value of 1/e constant MATH_PI : real := 3.14159_26535_89793_23846; -- value of pi constant MATH_1_PI : real := 0.31830_98861_83790_67154; -- value of 1/pi constant MATH_LOG_OF_2: real := 0.69314_71805_59945_30942; -- natural log of 2 constant MATH_LOG_OF_10: real := 2.30258_50929_94045_68402; -- natural log of10 constant MATH_LOG2_OF_E: real := 1.44269_50408_88963_4074; -- log base 2 of e constant MATH_LOG10_OF_E: real := 0.43429_44819_03251_82765; -- log base 10 of e constant MATH_SQRT2: real := 1.41421_35623_73095_04880; -- sqrt of 2 constant MATH_SQRT1_2: real := 0.70710_67811_86547_52440; -- sqrt of 1/2 constant MATH_SQRT_PI: real := 1.77245_38509_05516_02730; -- sqrt of pi constant MATH_DEG_TO_RAD: real := 0.01745_32925_19943_29577; -- conversion factor from degree to radian constant MATH_RAD_TO_DEG: real := 57.29577_95130_82320_87685; -- conversion factor from radian to degree -- -- attribute for functions whose implementation is foreign (C native) -- attribute FOREIGN : string; -- predefined attribute in VHDL-1992 -- -- function declarations -- function SIGN (X: real ) return real; -- returns 1.0 if X > 0.0; 0.0 if X == 0.0; -1.0 if X < 0.0 function CEIL (X : real ) return real; -- returns smallest integer value (as real) not less than X function FLOOR (X : real ) return real; -- returns largest integer value (as real) not greater than X function ROUND (X : real ) return real; -- returns integer FLOOR(X + 0.5) if X > 0; -- return integer CEIL(X - 0.5) if X < 0 function FMAX (X, Y : real ) return real; -- returns the algebraically larger of X and Y function FMIN (X, Y : real ) return real; -- returns the algebraically smaller of X and Y procedure UNIFORM (variable Seed1,Seed2:inout integer; variable X:out real); -- returns a pseudo-random number with uniform distribution in the -- interval (0.0, 1.0). -- Before the first call to UNIFORM, the seed values (Seed1, Seed2) must -- be initialized to values in the range [1, 2147483562] and -- [1, 2147483398] respectively. The seed values are modified after -- each call to UNIFORM. -- This random number generator is portable for 32-bit computers, and -- it has period ~2.30584*(10**18) for each set of seed values. -- -- For VHDL-1992, the seeds will be global variables, functions to -- initialize their values (INIT_SEED) will be provided, and the UNIFORM -- procedure call will be modified accordingly. function SRAND (seed: in integer ) return integer; -- -- sets value of seed for sequence of -- pseudo-random numbers. -- It uses the foreign native C function srand(). attribute FOREIGN of SRAND : function is "C_NATIVE"; function RAND return integer; -- -- returns an integer pseudo-random number with uniform distribution. -- It uses the foreign native C function rand(). -- Seed for the sequence is initialized with the -- SRAND() function and value of the seed is changed every -- time SRAND() is called, but it is not visible. -- The range of generated values is platform dependent. attribute FOREIGN of RAND : function is "C_NATIVE"; function GET_RAND_MAX return integer; -- -- returns the upper bound of the range of the -- pseudo-random numbers generated by RAND(). -- The support for this function is platform dependent, and -- it uses foreign native C functions or constants. -- It may not be available in some platforms. -- Note: the value of (RAND() / GET_RAND_MAX()) is a -- pseudo-random number distributed between 0 & 1. attribute FOREIGN of GET_RAND_MAX : function is "C_NATIVE"; function SQRT (X : real ) return real; -- returns square root of X; X >= 0 function CBRT (X : real ) return real; -- returns cube root of X function "**" (X : integer; Y : real) return real; -- returns Y power of X ==> X**Y; -- error if X = 0 and Y <= 0.0 -- error if X < 0 and Y does not have an integer value function "**" (X : real; Y : real) return real; -- returns Y power of X ==> X**Y; -- error if X = 0.0 and Y <= 0.0 -- error if X < 0.0 and Y does not have an integer value function EXP (X : real ) return real; -- returns e**X; where e = MATH_E function LOG (X : real ) return real; -- returns natural logarithm of X; X > 0 function LOG (BASE: positive; X : real) return real; -- returns logarithm base BASE of X; X > 0 function SIN (X : real ) return real; -- returns sin X; X in radians function COS ( X : real ) return real; -- returns cos X; X in radians function TAN (X : real ) return real; -- returns tan X; X in radians -- X /= ((2k+1) * PI/2), where k is an integer function ASIN (X : real ) return real; -- returns -PI/2 < asin X < PI/2; | X | <= 1 function ACOS (X : real ) return real; -- returns 0 < acos X < PI; | X | <= 1 function ATAN (X : real) return real; -- returns -PI/2 < atan X < PI/2 function ATAN2 (X : real; Y : real) return real; -- returns atan (X/Y); -PI < atan2(X,Y) < PI; Y /= 0.0 function SINH (X : real) return real; -- hyperbolic sine; returns (e**X - e**(-X))/2 function COSH (X : real) return real; -- hyperbolic cosine; returns (e**X + e**(-X))/2 function TANH (X : real) return real; -- hyperbolic tangent; -- returns (e**X - e**(-X))/(e**X + e**(-X)) function ASINH (X : real) return real; -- returns ln( X + sqrt( X**2 + 1)) function ACOSH (X : real) return real; -- returns ln( X + sqrt( X**2 - 1)); X >= 1 function ATANH (X : real) return real; -- returns (ln( (1 + X)/(1 - X)))/2 ; | X | < 1 end MATH_REAL;