1603 lines
51 KiB
VHDL
1603 lines
51 KiB
VHDL
-- -----------------------------------------------------------------
|
|
--
|
|
-- Copyright 2019 IEEE P1076 WG Authors
|
|
--
|
|
-- See the LICENSE file distributed with this work for copyright and
|
|
-- licensing information and the AUTHORS file.
|
|
--
|
|
-- This file to you under the Apache License, Version 2.0 (the "License").
|
|
-- You may obtain a copy of the License at
|
|
--
|
|
-- http://www.apache.org/licenses/LICENSE-2.0
|
|
--
|
|
-- Unless required by applicable law or agreed to in writing, software
|
|
-- distributed under the License is distributed on an "AS IS" BASIS,
|
|
-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
-- implied. See the License for the specific language governing
|
|
-- permissions and limitations under the License.
|
|
--
|
|
-- Title : Standard VHDL Mathematical Packages
|
|
-- : (MATH_COMPLEX package body)
|
|
-- :
|
|
-- Library : This package shall be compiled into a library
|
|
-- : symbolically named IEEE.
|
|
-- :
|
|
-- Developers: IEEE DASC VHDL Mathematical Packages Working Group
|
|
-- :
|
|
-- Purpose : This package defines a standard for designers to use in
|
|
-- : describing VHDL models that make use of common COMPLEX
|
|
-- : constants and common COMPLEX mathematical functions and
|
|
-- : operators.
|
|
-- :
|
|
-- Limitation: The values generated by the functions in this package
|
|
-- : may vary from platform to platform, and the precision
|
|
-- : of results is only guaranteed to be the minimum required
|
|
-- : by IEEE Std 1076-2008.
|
|
-- :
|
|
-- Note : This package may be modified to include additional data
|
|
-- : required by tools, but it must in no way change the
|
|
-- : external interfaces or simulation behavior of the
|
|
-- : description. It is permissible to add comments and/or
|
|
-- : attributes to the package declarations, but not to change
|
|
-- : or delete any original lines of the package declaration.
|
|
-- : The package body may be changed only in accordance with
|
|
-- : the terms of Clause 16 of this standard.
|
|
-- :
|
|
-- --------------------------------------------------------------------
|
|
-- $Revision: 1220 $
|
|
-- $Date: 2008-04-10 17:16:09 +0930 (Thu, 10 Apr 2008) $
|
|
-- --------------------------------------------------------------------
|
|
|
|
use WORK.MATH_REAL.all;
|
|
|
|
package body MATH_COMPLEX is
|
|
|
|
--
|
|
-- Equality and Inequality Operators for COMPLEX_POLAR
|
|
--
|
|
function "=" ( L: in COMPLEX_POLAR; R: in COMPLEX_POLAR ) return BOOLEAN
|
|
is
|
|
-- Description:
|
|
-- See function declaration in IEEE Std 1076.2-1996
|
|
-- Notes:
|
|
-- a) Returns FALSE on error
|
|
begin
|
|
-- Check validity of input arguments
|
|
if ( L.ARG = -MATH_PI ) then
|
|
assert FALSE
|
|
report "L.ARG = -MATH_PI in =(L,R)"
|
|
severity ERROR;
|
|
return FALSE;
|
|
end if;
|
|
|
|
if ( R.ARG = -MATH_PI ) then
|
|
assert FALSE
|
|
report "R.ARG = -MATH_PI in =(L,R)"
|
|
severity ERROR;
|
|
return FALSE;
|
|
end if;
|
|
|
|
-- Get special values
|
|
if ( L.MAG = 0.0 and R.MAG = 0.0 ) then
|
|
return TRUE;
|
|
end if;
|
|
|
|
-- Get value for general case
|
|
if ( L.MAG = R.MAG and L.ARG = R.ARG ) then
|
|
return TRUE;
|
|
end if;
|
|
|
|
return FALSE;
|
|
end function "=";
|
|
|
|
|
|
function "/=" ( L: in COMPLEX_POLAR; R: in COMPLEX_POLAR ) return BOOLEAN
|
|
is
|
|
-- Description:
|
|
-- See function declaration in IEEE Std 1076.2-1996
|
|
-- Notes:
|
|
-- a) Returns FALSE on error
|
|
begin
|
|
-- Check validity of input arguments
|
|
if ( L.ARG = -MATH_PI ) then
|
|
assert FALSE
|
|
report "L.ARG = -MATH_PI in /=(L,R)"
|
|
severity ERROR;
|
|
return FALSE;
|
|
end if;
|
|
|
|
if ( R.ARG = -MATH_PI ) then
|
|
assert FALSE
|
|
report "R.ARG = -MATH_PI in /=(L,R)"
|
|
severity ERROR;
|
|
return FALSE;
|
|
end if;
|
|
|
|
-- Get special values
|
|
if ( L.MAG = 0.0 and R.MAG = 0.0 ) then
|
|
return FALSE;
|
|
end if;
|
|
|
|
-- Get value for general case
|
|
if ( L.MAG = R.MAG and L.ARG = R.ARG ) then
|
|
return FALSE;
|
|
end if;
|
|
|
|
return TRUE;
|
|
end function "/=";
|
|
|
|
--
|
|
-- Other Functions Start Here
|
|
--
|
|
|
|
function CMPLX(X: in REAL; Y: in REAL := 0.0 ) return COMPLEX is
|
|
-- Description:
|
|
-- See function declaration in IEEE Std 1076.2-1996
|
|
-- Notes:
|
|
-- None
|
|
begin
|
|
return COMPLEX'(X, Y);
|
|
end function CMPLX;
|
|
|
|
|
|
function GET_PRINCIPAL_VALUE(X: in REAL ) return PRINCIPAL_VALUE is
|
|
-- Description:
|
|
-- See function declaration in IEEE Std 1076.2-1996
|
|
-- Notes:
|
|
-- None
|
|
variable TEMP: REAL;
|
|
begin
|
|
-- Check if already a principal value
|
|
if ( X > -MATH_PI and X <= MATH_PI ) then
|
|
return PRINCIPAL_VALUE'(X);
|
|
end if;
|
|
|
|
-- Get principal value
|
|
TEMP := X;
|
|
while ( TEMP <= -MATH_PI ) loop
|
|
TEMP := TEMP + MATH_2_PI;
|
|
end loop;
|
|
while (TEMP > MATH_PI ) loop
|
|
TEMP := TEMP - MATH_2_PI;
|
|
end loop;
|
|
|
|
return PRINCIPAL_VALUE'(TEMP);
|
|
end function GET_PRINCIPAL_VALUE;
|
|
|
|
function COMPLEX_TO_POLAR(Z: in COMPLEX ) return COMPLEX_POLAR is
|
|
-- Description:
|
|
-- See function declaration in IEEE Std 1076.2-1996
|
|
-- Notes:
|
|
-- None
|
|
variable TEMP: REAL;
|
|
begin
|
|
-- Get value for special cases
|
|
if ( Z.RE = 0.0 ) then
|
|
if ( Z.IM = 0.0 ) then
|
|
return COMPLEX_POLAR'(0.0, 0.0);
|
|
elsif ( Z.IM > 0.0 ) then
|
|
return COMPLEX_POLAR'(Z.IM, MATH_PI_OVER_2);
|
|
else
|
|
return COMPLEX_POLAR'(-Z.IM, -MATH_PI_OVER_2);
|
|
end if;
|
|
end if;
|
|
|
|
if ( Z.IM = 0.0 ) then
|
|
if ( Z.RE = 0.0 ) then
|
|
return COMPLEX_POLAR'(0.0, 0.0);
|
|
elsif ( Z.RE > 0.0 ) then
|
|
return COMPLEX_POLAR'(Z.RE, 0.0);
|
|
else
|
|
return COMPLEX_POLAR'(-Z.RE, MATH_PI);
|
|
end if;
|
|
end if;
|
|
|
|
-- Get principal value for general case
|
|
TEMP := ARCTAN(Z.IM, Z.RE);
|
|
|
|
return COMPLEX_POLAR'(SQRT(Z.RE*Z.RE + Z.IM*Z.IM),
|
|
GET_PRINCIPAL_VALUE(TEMP));
|
|
end function COMPLEX_TO_POLAR;
|
|
|
|
function POLAR_TO_COMPLEX(Z: in COMPLEX_POLAR ) return COMPLEX is
|
|
-- Description:
|
|
-- See function declaration in IEEE Std 1076.2-1996
|
|
-- Notes:
|
|
-- a) Returns MATH_CZERO on error
|
|
begin
|
|
-- Check validity of input arguments
|
|
if ( Z.ARG = -MATH_PI ) then
|
|
assert FALSE
|
|
report "Z.ARG = -MATH_PI in POLAR_TO_COMPLEX(Z)"
|
|
severity ERROR;
|
|
return MATH_CZERO;
|
|
end if;
|
|
|
|
-- Get value for general case
|
|
return COMPLEX'( Z.MAG*COS(Z.ARG), Z.MAG*SIN(Z.ARG) );
|
|
end function POLAR_TO_COMPLEX;
|
|
|
|
|
|
function "ABS"(Z: in COMPLEX ) return POSITIVE_REAL is
|
|
-- Description:
|
|
-- See function declaration in IEEE Std 1076.2-1996
|
|
-- Notes:
|
|
-- a) ABS(Z) = SQRT(Z.RE*Z.RE + Z.IM*Z.IM)
|
|
|
|
begin
|
|
-- Get value for general case
|
|
return POSITIVE_REAL'(SQRT(Z.RE*Z.RE + Z.IM*Z.IM));
|
|
end function "ABS";
|
|
|
|
function "ABS"(Z: in COMPLEX_POLAR ) return POSITIVE_REAL is
|
|
-- Description:
|
|
-- See function declaration in IEEE Std 1076.2-1996
|
|
-- Notes:
|
|
-- a) ABS(Z) = Z.MAG
|
|
-- b) Returns 0.0 on error
|
|
|
|
begin
|
|
-- Check validity of input arguments
|
|
if ( Z.ARG = -MATH_PI ) then
|
|
assert FALSE
|
|
report "Z.ARG = -MATH_PI in ABS(Z)"
|
|
severity ERROR;
|
|
return 0.0;
|
|
end if;
|
|
|
|
-- Get value for general case
|
|
return Z.MAG;
|
|
end function "ABS";
|
|
|
|
|
|
function ARG(Z: in COMPLEX ) return PRINCIPAL_VALUE is
|
|
-- Description:
|
|
-- See function declaration in IEEE Std 1076.2-1996
|
|
-- Notes:
|
|
-- a) ARG(Z) = ARCTAN(Z.IM, Z.RE)
|
|
|
|
variable ZTEMP : COMPLEX_POLAR;
|
|
begin
|
|
-- Get value for general case
|
|
ZTEMP := COMPLEX_TO_POLAR(Z);
|
|
return ZTEMP.ARG;
|
|
end function ARG;
|
|
|
|
function ARG(Z: in COMPLEX_POLAR ) return PRINCIPAL_VALUE is
|
|
-- Description:
|
|
-- See function declaration in IEEE Std 1076.2-1996
|
|
-- Notes:
|
|
-- a) ARG(Z) = Z.ARG
|
|
-- b) Returns 0.0 on error
|
|
|
|
begin
|
|
-- Check validity of input arguments
|
|
if ( Z.ARG = -MATH_PI ) then
|
|
assert FALSE
|
|
report "Z.ARG = -MATH_PI in ARG(Z)"
|
|
severity ERROR;
|
|
return 0.0;
|
|
end if;
|
|
|
|
-- Get value for general case
|
|
return Z.ARG;
|
|
end function ARG;
|
|
|
|
function "-" (Z: in COMPLEX ) return COMPLEX is
|
|
-- Description:
|
|
-- See function declaration in IEEE Std 1076.2-1996
|
|
-- Notes:
|
|
-- a) Returns -x -jy for Z = x + jy
|
|
begin
|
|
-- Get value for general case
|
|
return COMPLEX'(-Z.RE, -Z.IM);
|
|
end function "-";
|
|
|
|
function "-" (Z: in COMPLEX_POLAR ) return COMPLEX_POLAR is
|
|
-- Description:
|
|
-- See function declaration in IEEE Std 1076.2-1996
|
|
-- Notes:
|
|
-- a) Returns (Z.MAG, Z.ARG + MATH_PI)
|
|
-- b) Returns Z on error
|
|
variable TEMP: REAL;
|
|
begin
|
|
-- Check validity of input arguments
|
|
if ( Z.ARG = -MATH_PI ) then
|
|
assert FALSE
|
|
report "Z.ARG = -MATH_PI in -(Z)"
|
|
severity ERROR;
|
|
return Z;
|
|
end if;
|
|
|
|
-- Get principal value for general case
|
|
TEMP := REAL'(Z.ARG) + MATH_PI;
|
|
|
|
return COMPLEX_POLAR'(Z.MAG, GET_PRINCIPAL_VALUE(TEMP));
|
|
end function "-";
|
|
|
|
function CONJ (Z: in COMPLEX) return COMPLEX is
|
|
-- Description:
|
|
-- See function declaration in IEEE Std 1076.2-1996
|
|
-- Notes:
|
|
-- a) Returns x - jy for Z = x + jy
|
|
begin
|
|
-- Get value for general case
|
|
return COMPLEX'(Z.RE, -Z.IM);
|
|
end function CONJ;
|
|
|
|
function CONJ (Z: in COMPLEX_POLAR) return COMPLEX_POLAR is
|
|
-- Description:
|
|
-- See function declaration in IEEE Std 1076.2-1996
|
|
-- Notes:
|
|
-- a) Returns COMPLEX conjugate (Z.MAG, -Z.ARG)
|
|
-- b) Returns Z on error
|
|
--
|
|
variable TEMP: PRINCIPAL_VALUE;
|
|
begin
|
|
-- Check validity of input arguments
|
|
if ( Z.ARG = -MATH_PI ) then
|
|
assert FALSE
|
|
report "Z.ARG = -MATH_PI in CONJ(Z)"
|
|
severity ERROR;
|
|
return Z;
|
|
end if;
|
|
|
|
-- Get principal value for general case
|
|
if ( Z.ARG = MATH_PI or Z.ARG = 0.0 ) then
|
|
TEMP := Z.ARG;
|
|
else
|
|
TEMP := -Z.ARG;
|
|
end if;
|
|
|
|
return COMPLEX_POLAR'(Z.MAG, TEMP);
|
|
end function CONJ;
|
|
|
|
function SQRT(Z: in COMPLEX ) return COMPLEX is
|
|
-- Description:
|
|
-- See function declaration in IEEE Std 1076.2-1996
|
|
-- Notes:
|
|
-- None
|
|
variable ZTEMP : COMPLEX_POLAR;
|
|
variable ZOUT : COMPLEX;
|
|
variable TMAG : REAL;
|
|
variable TARG : REAL;
|
|
begin
|
|
-- Get value for special cases
|
|
if ( Z = MATH_CZERO ) then
|
|
return MATH_CZERO;
|
|
end if;
|
|
|
|
-- Get value for general case
|
|
ZTEMP := COMPLEX_TO_POLAR(Z);
|
|
TMAG := SQRT(ZTEMP.MAG);
|
|
TARG := 0.5*ZTEMP.ARG;
|
|
|
|
if ( COS(TARG) > 0.0 ) then
|
|
ZOUT.RE := TMAG*COS(TARG);
|
|
ZOUT.IM := TMAG*SIN(TARG);
|
|
return ZOUT;
|
|
end if;
|
|
|
|
if ( COS(TARG) < 0.0 ) then
|
|
ZOUT.RE := TMAG*COS(TARG + MATH_PI);
|
|
ZOUT.IM := TMAG*SIN(TARG + MATH_PI);
|
|
return ZOUT;
|
|
end if;
|
|
|
|
if ( SIN(TARG) > 0.0 ) then
|
|
ZOUT.RE := 0.0;
|
|
ZOUT.IM := TMAG*SIN(TARG);
|
|
return ZOUT;
|
|
end if;
|
|
|
|
ZOUT.RE := 0.0;
|
|
ZOUT.IM := TMAG*SIN(TARG + MATH_PI);
|
|
return ZOUT;
|
|
end function SQRT;
|
|
|
|
function SQRT(Z: in COMPLEX_POLAR ) return COMPLEX_POLAR is
|
|
-- Description:
|
|
-- See function declaration in IEEE Std 1076.2-1996
|
|
-- Notes:
|
|
-- a) Returns Z on error
|
|
|
|
variable ZOUT : COMPLEX_POLAR;
|
|
variable TMAG : REAL;
|
|
variable TARG : REAL;
|
|
begin
|
|
-- Check validity of input arguments
|
|
if ( Z.ARG = -MATH_PI ) then
|
|
assert FALSE
|
|
report "Z.ARG = -MATH_PI in SQRT(Z)"
|
|
severity ERROR;
|
|
return Z;
|
|
end if;
|
|
|
|
-- Get value for special cases
|
|
if ( Z.MAG = 0.0 and Z.ARG = 0.0 ) then
|
|
return Z;
|
|
end if;
|
|
|
|
-- Get principal value for general case
|
|
TMAG := SQRT(Z.MAG);
|
|
TARG := 0.5*Z.ARG;
|
|
|
|
ZOUT.MAG := POSITIVE_REAL'(TMAG);
|
|
|
|
if ( COS(TARG) < 0.0 ) then
|
|
TARG := TARG + MATH_PI;
|
|
end if;
|
|
|
|
if ( (COS(TARG) = 0.0) and (SIN(TARG) < 0.0) ) then
|
|
TARG := TARG + MATH_PI;
|
|
end if;
|
|
|
|
ZOUT.ARG := GET_PRINCIPAL_VALUE(TARG);
|
|
return ZOUT;
|
|
end function SQRT;
|
|
|
|
function EXP(Z: in COMPLEX ) return COMPLEX is
|
|
-- Description:
|
|
-- See function declaration in IEEE Std 1076.2-1996
|
|
-- Notes:
|
|
-- None
|
|
|
|
variable TEMP: REAL;
|
|
begin
|
|
-- Get value for special cases
|
|
if ( Z = MATH_CZERO ) then
|
|
return MATH_CBASE_1;
|
|
end if;
|
|
|
|
if ( Z.RE = 0.0 ) then
|
|
if ( Z.IM = MATH_PI or Z.IM = -MATH_PI ) then
|
|
return COMPLEX'(-1.0, 0.0);
|
|
end if;
|
|
|
|
if ( Z.IM = MATH_PI_OVER_2 ) then
|
|
return MATH_CBASE_J;
|
|
end if;
|
|
|
|
if ( Z.IM = -MATH_PI_OVER_2 ) then
|
|
return COMPLEX'(0.0, -1.0);
|
|
end if;
|
|
end if;
|
|
|
|
-- Get value for general case
|
|
TEMP := EXP(Z.RE);
|
|
return COMPLEX'(TEMP*COS(Z.IM), TEMP*SIN(Z.IM));
|
|
end function EXP;
|
|
|
|
function EXP(Z: in COMPLEX_POLAR ) return COMPLEX_POLAR is
|
|
-- Description:
|
|
-- See function declaration in IEEE Std 1076.2-1996
|
|
-- Notes:
|
|
-- a) Returns Z on error
|
|
|
|
variable ZTEMP : COMPLEX;
|
|
variable ZOUT : COMPLEX_POLAR;
|
|
begin
|
|
-- Check validity of input arguments
|
|
if ( Z.ARG = -MATH_PI ) then
|
|
assert FALSE
|
|
report "Z.ARG = -MATH_PI in EXP(Z)"
|
|
severity ERROR;
|
|
return Z;
|
|
end if;
|
|
|
|
-- Get value for special cases
|
|
if ( Z.MAG = 0.0 and Z.ARG = 0.0 ) then
|
|
return COMPLEX_POLAR'(1.0, 0.0);
|
|
end if;
|
|
|
|
if ( Z.MAG = MATH_PI and (Z.ARG = MATH_PI_OVER_2 or
|
|
Z.ARG = -MATH_PI_OVER_2 )) then
|
|
return COMPLEX_POLAR'(1.0, MATH_PI);
|
|
end if;
|
|
|
|
if ( Z.MAG = MATH_PI_OVER_2 ) then
|
|
if ( Z.ARG = MATH_PI_OVER_2 ) then
|
|
return COMPLEX_POLAR'(1.0, MATH_PI_OVER_2);
|
|
end if;
|
|
|
|
if ( Z.ARG = -MATH_PI_OVER_2 ) then
|
|
return COMPLEX_POLAR'(1.0, -MATH_PI_OVER_2);
|
|
end if;
|
|
end if;
|
|
|
|
-- Get principal value for general case
|
|
ZTEMP := POLAR_TO_COMPLEX(Z);
|
|
ZOUT.MAG := POSITIVE_REAL'(EXP(ZTEMP.RE));
|
|
ZOUT.ARG := GET_PRINCIPAL_VALUE(ZTEMP.IM);
|
|
|
|
return ZOUT;
|
|
end function EXP;
|
|
|
|
function LOG(Z: in COMPLEX ) return COMPLEX is
|
|
-- Description:
|
|
-- See function declaration in IEEE Std 1076.2-1996
|
|
-- Notes:
|
|
-- a) Returns COMPLEX'(REAL'LOW, 0.0) on error
|
|
|
|
variable ZTEMP : COMPLEX_POLAR;
|
|
variable TEMP : REAL;
|
|
begin
|
|
-- Check validity of input arguments
|
|
if ( Z.RE = 0.0 and Z.IM = 0.0 ) then
|
|
assert FALSE
|
|
report "Z.RE = 0.0 and Z.IM = 0.0 in LOG(Z)"
|
|
severity ERROR;
|
|
return COMPLEX'(REAL'LOW, 0.0);
|
|
end if;
|
|
|
|
-- Get value for special cases
|
|
if ( Z.IM = 0.0 ) then
|
|
if ( Z.RE = -1.0 ) then
|
|
return COMPLEX'(0.0, MATH_PI);
|
|
end if;
|
|
if ( Z.RE = MATH_E ) then
|
|
return MATH_CBASE_1;
|
|
end if;
|
|
if ( Z.RE = 1.0 ) then
|
|
return MATH_CZERO;
|
|
end if;
|
|
end if;
|
|
|
|
if ( Z.RE = 0.0 ) then
|
|
if (Z.IM = 1.0) then
|
|
return COMPLEX'(0.0, MATH_PI_OVER_2);
|
|
end if;
|
|
if (Z.IM = -1.0) then
|
|
return COMPLEX'(0.0, -MATH_PI_OVER_2);
|
|
end if;
|
|
end if;
|
|
|
|
-- Get value for general case
|
|
ZTEMP := COMPLEX_TO_POLAR(Z);
|
|
TEMP := LOG(ZTEMP.MAG);
|
|
return COMPLEX'(TEMP, ZTEMP.ARG);
|
|
end function LOG;
|
|
|
|
function LOG2(Z: in COMPLEX ) return COMPLEX is
|
|
-- Description:
|
|
-- See function declaration in IEEE Std 1076.2-1996
|
|
-- Notes:
|
|
-- a) Returns COMPLEX'(REAL'LOW, 0.0) on error
|
|
|
|
variable ZTEMP : COMPLEX_POLAR;
|
|
variable TEMP : REAL;
|
|
begin
|
|
|
|
-- Check validity of input arguments
|
|
if ( Z.RE = 0.0 and Z.IM = 0.0 ) then
|
|
assert FALSE
|
|
report "Z.RE = 0.0 and Z.IM = 0.0 in LOG2(Z)"
|
|
severity ERROR;
|
|
return COMPLEX'(REAL'LOW, 0.0);
|
|
end if;
|
|
|
|
-- Get value for special cases
|
|
if ( Z.IM = 0.0 ) then
|
|
if ( Z.RE = 2.0 ) then
|
|
return MATH_CBASE_1;
|
|
end if;
|
|
if ( Z.RE = 1.0 ) then
|
|
return MATH_CZERO;
|
|
end if;
|
|
end if;
|
|
|
|
-- Get value for general case
|
|
ZTEMP := COMPLEX_TO_POLAR(Z);
|
|
TEMP := MATH_LOG2_OF_E*LOG(ZTEMP.MAG);
|
|
return COMPLEX'(TEMP, MATH_LOG2_OF_E*ZTEMP.ARG);
|
|
end function LOG2;
|
|
|
|
function LOG10(Z: in COMPLEX ) return COMPLEX is
|
|
-- Description:
|
|
-- See function declaration in IEEE Std 1076.2-1996
|
|
-- Notes:
|
|
-- a) Returns COMPLEX'(REAL'LOW, 0.0) on error
|
|
|
|
variable ZTEMP : COMPLEX_POLAR;
|
|
variable TEMP : REAL;
|
|
begin
|
|
-- Check validity of input arguments
|
|
if ( Z.RE = 0.0 and Z.IM = 0.0 ) then
|
|
assert FALSE
|
|
report "Z.RE = 0.0 and Z.IM = 0.0 in LOG10(Z)"
|
|
severity ERROR;
|
|
return COMPLEX'(REAL'LOW, 0.0);
|
|
end if;
|
|
|
|
-- Get value for special cases
|
|
if ( Z.IM = 0.0 ) then
|
|
if ( Z.RE = 10.0 ) then
|
|
return MATH_CBASE_1;
|
|
end if;
|
|
if ( Z.RE = 1.0 ) then
|
|
return MATH_CZERO;
|
|
end if;
|
|
end if;
|
|
|
|
-- Get value for general case
|
|
ZTEMP := COMPLEX_TO_POLAR(Z);
|
|
TEMP := MATH_LOG10_OF_E*LOG(ZTEMP.MAG);
|
|
return COMPLEX'(TEMP, MATH_LOG10_OF_E*ZTEMP.ARG);
|
|
end function LOG10;
|
|
|
|
|
|
function LOG(Z: in COMPLEX_POLAR ) return COMPLEX_POLAR is
|
|
-- Description:
|
|
-- See function declaration in IEEE Std 1076.2-1996
|
|
-- Notes:
|
|
-- a) Returns COMPLEX_POLAR(REAL'HIGH, MATH_PI) on error
|
|
|
|
variable ZTEMP : COMPLEX;
|
|
variable ZOUT : COMPLEX_POLAR;
|
|
begin
|
|
-- Check validity of input arguments
|
|
if ( Z.MAG <= 0.0 ) then
|
|
assert FALSE
|
|
report "Z.MAG <= 0.0 in LOG(Z)"
|
|
severity ERROR;
|
|
return COMPLEX_POLAR'(REAL'HIGH, MATH_PI);
|
|
end if;
|
|
|
|
if ( Z.ARG = -MATH_PI ) then
|
|
assert FALSE
|
|
report "Z.ARG = -MATH_PI in LOG(Z)"
|
|
severity ERROR;
|
|
return COMPLEX_POLAR'(REAL'HIGH, MATH_PI);
|
|
end if;
|
|
|
|
-- Compute value for special cases
|
|
if (Z.MAG = 1.0 ) then
|
|
if ( Z.ARG = 0.0 ) then
|
|
return COMPLEX_POLAR'(0.0, 0.0);
|
|
end if;
|
|
|
|
if ( Z.ARG = MATH_PI ) then
|
|
return COMPLEX_POLAR'(MATH_PI, MATH_PI_OVER_2);
|
|
end if;
|
|
|
|
if ( Z.ARG = MATH_PI_OVER_2 ) then
|
|
return COMPLEX_POLAR'(MATH_PI_OVER_2, MATH_PI_OVER_2);
|
|
end if;
|
|
|
|
if ( Z.ARG = -MATH_PI_OVER_2 ) then
|
|
return COMPLEX_POLAR'(MATH_PI_OVER_2, -MATH_PI_OVER_2);
|
|
end if;
|
|
end if;
|
|
|
|
if ( Z.MAG = MATH_E and Z.ARG = 0.0 ) then
|
|
return COMPLEX_POLAR'(1.0, 0.0);
|
|
end if;
|
|
|
|
-- Compute value for general case
|
|
ZTEMP.RE := LOG(Z.MAG);
|
|
ZTEMP.IM := Z.ARG;
|
|
ZOUT := COMPLEX_TO_POLAR(ZTEMP);
|
|
return ZOUT;
|
|
end function LOG;
|
|
|
|
|
|
|
|
function LOG2(Z: in COMPLEX_POLAR ) return COMPLEX_POLAR is
|
|
-- Description:
|
|
-- See function declaration in IEEE Std 1076.2-1996
|
|
-- Notes:
|
|
-- a) Returns COMPLEX_POLAR(REAL'HIGH, MATH_PI) on error
|
|
|
|
variable ZTEMP : COMPLEX;
|
|
variable ZOUT : COMPLEX_POLAR;
|
|
begin
|
|
-- Check validity of input arguments
|
|
if ( Z.MAG <= 0.0 ) then
|
|
assert FALSE
|
|
report "Z.MAG <= 0.0 in LOG2(Z)"
|
|
severity ERROR;
|
|
return COMPLEX_POLAR'(REAL'HIGH, MATH_PI);
|
|
end if;
|
|
|
|
if ( Z.ARG = -MATH_PI ) then
|
|
assert FALSE
|
|
report "Z.ARG = -MATH_PI in LOG2(Z)"
|
|
severity ERROR;
|
|
return COMPLEX_POLAR'(REAL'HIGH, MATH_PI);
|
|
end if;
|
|
|
|
-- Compute value for special cases
|
|
if (Z.MAG = 1.0 and Z.ARG = 0.0 ) then
|
|
return COMPLEX_POLAR'(0.0, 0.0);
|
|
end if;
|
|
|
|
if ( Z.MAG = 2.0 and Z.ARG = 0.0 ) then
|
|
return COMPLEX_POLAR'(1.0, 0.0);
|
|
end if;
|
|
|
|
-- Compute value for general case
|
|
ZTEMP.RE := MATH_LOG2_OF_E*LOG(Z.MAG);
|
|
ZTEMP.IM := MATH_LOG2_OF_E*Z.ARG;
|
|
ZOUT := COMPLEX_TO_POLAR(ZTEMP);
|
|
return ZOUT;
|
|
end function LOG2;
|
|
|
|
function LOG10(Z: in COMPLEX_POLAR ) return COMPLEX_POLAR is
|
|
-- Description:
|
|
-- See function declaration in IEEE Std 1076.2-1996
|
|
-- Notes:
|
|
-- a) Returns COMPLEX_POLAR(REAL'HIGH, MATH_PI) on error
|
|
variable ZTEMP : COMPLEX;
|
|
variable ZOUT : COMPLEX_POLAR;
|
|
begin
|
|
-- Check validity of input arguments
|
|
if ( Z.MAG <= 0.0 ) then
|
|
assert FALSE
|
|
report "Z.MAG <= 0.0 in LOG10(Z)"
|
|
severity ERROR;
|
|
return COMPLEX_POLAR'(REAL'HIGH, MATH_PI);
|
|
end if;
|
|
|
|
|
|
if ( Z.ARG = -MATH_PI ) then
|
|
assert FALSE
|
|
report "Z.ARG = -MATH_PI in LOG10(Z)"
|
|
severity ERROR;
|
|
return COMPLEX_POLAR'(REAL'HIGH, MATH_PI);
|
|
end if;
|
|
|
|
-- Compute value for special cases
|
|
if (Z.MAG = 1.0 and Z.ARG = 0.0 ) then
|
|
return COMPLEX_POLAR'(0.0, 0.0);
|
|
end if;
|
|
|
|
if ( Z.MAG = 10.0 and Z.ARG = 0.0 ) then
|
|
return COMPLEX_POLAR'(1.0, 0.0);
|
|
end if;
|
|
|
|
-- Compute value for general case
|
|
ZTEMP.RE := MATH_LOG10_OF_E*LOG(Z.MAG);
|
|
ZTEMP.IM := MATH_LOG10_OF_E*Z.ARG;
|
|
ZOUT := COMPLEX_TO_POLAR(ZTEMP);
|
|
return ZOUT;
|
|
end function LOG10;
|
|
|
|
function LOG(Z: in COMPLEX; BASE: in REAL ) return COMPLEX is
|
|
-- Description:
|
|
-- See function declaration in IEEE Std 1076.2-1996
|
|
-- Notes:
|
|
-- a) Returns COMPLEX'(REAL'LOW, 0.0) on error
|
|
|
|
variable ZTEMP : COMPLEX_POLAR;
|
|
variable TEMPRE : REAL;
|
|
variable TEMPIM : REAL;
|
|
begin
|
|
-- Check validity of input arguments
|
|
if ( Z.RE = 0.0 and Z.IM = 0.0 ) then
|
|
assert FALSE
|
|
report "Z.RE = 0.0 and Z.IM = 0.0 in LOG(Z,BASE)"
|
|
severity ERROR;
|
|
return COMPLEX'(REAL'LOW, 0.0);
|
|
end if;
|
|
|
|
if ( BASE <= 0.0 or BASE = 1.0 ) then
|
|
assert FALSE
|
|
report "BASE <= 0.0 or BASE = 1.0 in LOG(Z,BASE)"
|
|
severity ERROR;
|
|
return COMPLEX'(REAL'LOW, 0.0);
|
|
end if;
|
|
|
|
-- Get value for special cases
|
|
if ( Z.IM = 0.0 ) then
|
|
if ( Z.RE = BASE ) then
|
|
return MATH_CBASE_1;
|
|
end if;
|
|
if ( Z.RE = 1.0 ) then
|
|
return MATH_CZERO;
|
|
end if;
|
|
end if;
|
|
|
|
-- Get value for general case
|
|
ZTEMP := COMPLEX_TO_POLAR(Z);
|
|
TEMPRE := LOG(ZTEMP.MAG, BASE);
|
|
TEMPIM := ZTEMP.ARG/LOG(BASE);
|
|
return COMPLEX'(TEMPRE, TEMPIM);
|
|
end function LOG;
|
|
|
|
function LOG(Z: in COMPLEX_POLAR; BASE: in REAL ) return COMPLEX_POLAR is
|
|
-- Description:
|
|
-- See function declaration in IEEE Std 1076.2-1996
|
|
-- Notes:
|
|
-- a) Returns COMPLEX_POLAR(REAL'HIGH, MATH_PI) on error
|
|
|
|
variable ZTEMP : COMPLEX;
|
|
variable ZOUT : COMPLEX_POLAR;
|
|
begin
|
|
-- Check validity of input arguments
|
|
if ( Z.MAG <= 0.0 ) then
|
|
assert FALSE
|
|
report "Z.MAG <= 0.0 in LOG(Z,BASE)"
|
|
severity ERROR;
|
|
return COMPLEX_POLAR'(REAL'HIGH, MATH_PI);
|
|
end if;
|
|
|
|
if ( BASE <= 0.0 or BASE = 1.0 ) then
|
|
assert FALSE
|
|
report "BASE <= 0.0 or BASE = 1.0 in LOG(Z,BASE)"
|
|
severity ERROR;
|
|
return COMPLEX_POLAR'(REAL'HIGH, MATH_PI);
|
|
end if;
|
|
|
|
if ( Z.ARG = -MATH_PI ) then
|
|
assert FALSE
|
|
report "Z.ARG = -MATH_PI in LOG(Z,BASE)"
|
|
severity ERROR;
|
|
return COMPLEX_POLAR'(REAL'HIGH, MATH_PI);
|
|
end if;
|
|
|
|
-- Compute value for special cases
|
|
if (Z.MAG = 1.0 and Z.ARG = 0.0 ) then
|
|
return COMPLEX_POLAR'(0.0, 0.0);
|
|
end if;
|
|
|
|
if ( Z.MAG = BASE and Z.ARG = 0.0 ) then
|
|
return COMPLEX_POLAR'(1.0, 0.0);
|
|
end if;
|
|
|
|
-- Compute value for general case
|
|
ZTEMP.RE := LOG(Z.MAG, BASE);
|
|
ZTEMP.IM := Z.ARG/LOG(BASE);
|
|
ZOUT := COMPLEX_TO_POLAR(ZTEMP);
|
|
return ZOUT;
|
|
end function LOG;
|
|
|
|
|
|
function SIN(Z: in COMPLEX ) return COMPLEX is
|
|
-- Description:
|
|
-- See function declaration in IEEE Std 1076.2-1996
|
|
-- Notes:
|
|
-- None
|
|
begin
|
|
-- Get value for special cases
|
|
if ( Z.IM = 0.0 ) then
|
|
if ( Z.RE = 0.0 or Z.RE = MATH_PI) then
|
|
return MATH_CZERO;
|
|
end if;
|
|
end if;
|
|
|
|
-- Get value for general case
|
|
return COMPLEX'(SIN(Z.RE)*COSH(Z.IM), COS(Z.RE)*SINH(Z.IM));
|
|
end function SIN;
|
|
|
|
function SIN(Z: in COMPLEX_POLAR ) return COMPLEX_POLAR is
|
|
-- Description:
|
|
-- See function declaration in IEEE Std 1076.2-1996
|
|
-- Notes:
|
|
-- a) Returns COMPLEX_POLAR(0.0, 0.0) on error
|
|
|
|
variable Z1, Z2 : COMPLEX;
|
|
variable ZOUT : COMPLEX_POLAR;
|
|
begin
|
|
-- Check validity of input arguments
|
|
if ( Z.ARG = -MATH_PI ) then
|
|
assert FALSE
|
|
report "Z.ARG = -MATH_PI in SIN(Z)"
|
|
severity ERROR;
|
|
return COMPLEX_POLAR'(0.0, 0.0);
|
|
end if;
|
|
|
|
-- Compute value for special cases
|
|
if ( Z.MAG = 0.0 and Z.ARG = 0.0 ) then
|
|
return COMPLEX_POLAR'(0.0, 0.0);
|
|
end if;
|
|
|
|
if ( Z.MAG = MATH_PI and Z.ARG = 0.0 ) then
|
|
return COMPLEX_POLAR'(0.0, 0.0);
|
|
end if;
|
|
|
|
-- Compute value for general case
|
|
Z1 := POLAR_TO_COMPLEX(Z);
|
|
Z2 := COMPLEX'(SIN(Z1.RE)*COSH(Z1.IM), COS(Z1.RE)*SINH(Z1.IM));
|
|
ZOUT := COMPLEX_TO_POLAR(Z2);
|
|
return ZOUT;
|
|
end function SIN;
|
|
|
|
function COS(Z: in COMPLEX ) return COMPLEX is
|
|
-- Description:
|
|
-- See function declaration in IEEE Std 1076.2-1996
|
|
-- Notes:
|
|
-- None
|
|
begin
|
|
|
|
|
|
-- Get value for special cases
|
|
if ( Z.IM = 0.0 ) then
|
|
if ( Z.RE = MATH_PI_OVER_2 or Z.RE = -MATH_PI_OVER_2) then
|
|
return MATH_CZERO;
|
|
end if;
|
|
end if;
|
|
|
|
-- Get value for general case
|
|
return COMPLEX'(COS(Z.RE)*COSH(Z.IM), -SIN(Z.RE)*SINH(Z.IM));
|
|
end function COS;
|
|
|
|
function COS(Z: in COMPLEX_POLAR ) return COMPLEX_POLAR is
|
|
-- Description:
|
|
-- See function declaration in IEEE Std 1076.2-1996
|
|
-- Notes:
|
|
-- a) Returns COMPLEX_POLAR(0.0, 0.0) on error
|
|
|
|
variable Z1, Z2 : COMPLEX;
|
|
variable ZOUT : COMPLEX_POLAR;
|
|
begin
|
|
-- Check validity of input arguments
|
|
if ( Z.ARG = -MATH_PI ) then
|
|
assert FALSE
|
|
report "Z.ARG = -MATH_PI in COS(Z)"
|
|
severity ERROR;
|
|
return COMPLEX_POLAR'(0.0, 0.0);
|
|
end if;
|
|
|
|
-- Compute value for special cases
|
|
if ( Z.MAG = MATH_PI_OVER_2 and Z.ARG = 0.0 ) then
|
|
return COMPLEX_POLAR'(0.0, 0.0);
|
|
end if;
|
|
|
|
if ( Z.MAG = MATH_PI_OVER_2 and Z.ARG = MATH_PI ) then
|
|
return COMPLEX_POLAR'(0.0, 0.0);
|
|
end if;
|
|
|
|
-- Compute value for general case
|
|
Z1 := POLAR_TO_COMPLEX(Z);
|
|
Z2 := COMPLEX'(COS(Z1.RE)*COSH(Z1.IM), -SIN(Z1.RE)*SINH(Z1.IM));
|
|
ZOUT := COMPLEX_TO_POLAR(Z2);
|
|
return ZOUT;
|
|
end function COS;
|
|
|
|
function SINH(Z: in COMPLEX ) return COMPLEX is
|
|
-- Description:
|
|
-- See function declaration in IEEE Std 1076.2-1996
|
|
-- Notes:
|
|
-- None
|
|
begin
|
|
-- Get value for special cases
|
|
if ( Z.RE = 0.0 ) then
|
|
if ( Z.IM = 0.0 or Z.IM = MATH_PI ) then
|
|
return MATH_CZERO;
|
|
end if;
|
|
|
|
|
|
|
|
if ( Z.IM = MATH_PI_OVER_2 ) then
|
|
return MATH_CBASE_J;
|
|
end if;
|
|
|
|
if ( Z.IM = -MATH_PI_OVER_2 ) then
|
|
return -MATH_CBASE_J;
|
|
end if;
|
|
end if;
|
|
|
|
-- Get value for general case
|
|
return COMPLEX'(SINH(Z.RE)*COS(Z.IM), COSH(Z.RE)*SIN(Z.IM));
|
|
end function SINH;
|
|
|
|
function SINH(Z: in COMPLEX_POLAR ) return COMPLEX_POLAR is
|
|
-- Description:
|
|
-- See function declaration in IEEE Std 1076.2-1996
|
|
-- Notes:
|
|
-- a) Returns COMPLEX_POLAR(0.0, 0.0) on error
|
|
|
|
variable Z1, Z2 : COMPLEX;
|
|
variable ZOUT : COMPLEX_POLAR;
|
|
begin
|
|
-- Check validity of input arguments
|
|
if ( Z.ARG = -MATH_PI ) then
|
|
assert FALSE
|
|
report "Z.ARG = -MATH_PI in SINH(Z)"
|
|
severity ERROR;
|
|
return COMPLEX_POLAR'(0.0, 0.0);
|
|
end if;
|
|
|
|
-- Compute value for special cases
|
|
if ( Z.MAG = 0.0 and Z.ARG = 0.0 ) then
|
|
return COMPLEX_POLAR'(0.0, 0.0);
|
|
end if;
|
|
|
|
if ( Z.MAG = MATH_PI and Z.ARG = MATH_PI_OVER_2 ) then
|
|
return COMPLEX_POLAR'(0.0, 0.0);
|
|
end if;
|
|
|
|
if ( Z.MAG = MATH_PI_OVER_2 and Z.ARG = MATH_PI_OVER_2 ) then
|
|
return COMPLEX_POLAR'(1.0, MATH_PI_OVER_2);
|
|
end if;
|
|
|
|
if ( Z.MAG = MATH_PI_OVER_2 and Z.ARG = -MATH_PI_OVER_2 ) then
|
|
return COMPLEX_POLAR'(1.0, -MATH_PI_OVER_2);
|
|
end if;
|
|
|
|
-- Compute value for general case
|
|
Z1 := POLAR_TO_COMPLEX(Z);
|
|
Z2 := COMPLEX'(SINH(Z1.RE)*COS(Z1.IM), COSH(Z1.RE)*SIN(Z1.IM));
|
|
ZOUT := COMPLEX_TO_POLAR(Z2);
|
|
return ZOUT;
|
|
end function SINH;
|
|
|
|
|
|
function COSH(Z: in COMPLEX ) return COMPLEX is
|
|
-- Description:
|
|
-- See function declaration in IEEE Std 1076.2-1996
|
|
-- Notes:
|
|
-- None
|
|
begin
|
|
-- Get value for special cases
|
|
if ( Z.RE = 0.0 ) then
|
|
if ( Z.IM = 0.0 ) then
|
|
return MATH_CBASE_1;
|
|
end if;
|
|
|
|
if ( Z.IM = MATH_PI ) then
|
|
return -MATH_CBASE_1;
|
|
end if;
|
|
|
|
if ( Z.IM = MATH_PI_OVER_2 or Z.IM = -MATH_PI_OVER_2 ) then
|
|
return MATH_CZERO;
|
|
end if;
|
|
end if;
|
|
|
|
-- Get value for general case
|
|
return COMPLEX'(COSH(Z.RE)*COS(Z.IM), SINH(Z.RE)*SIN(Z.IM));
|
|
end function COSH;
|
|
|
|
function COSH(Z: in COMPLEX_POLAR ) return COMPLEX_POLAR is
|
|
-- Description:
|
|
-- See function declaration in IEEE Std 1076.2-1996
|
|
-- Notes:
|
|
-- a) Returns COMPLEX_POLAR(0.0, 0.0) on error
|
|
|
|
variable Z1, Z2 : COMPLEX;
|
|
variable ZOUT : COMPLEX_POLAR;
|
|
begin
|
|
-- Check validity of input arguments
|
|
if ( Z.ARG = -MATH_PI ) then
|
|
assert FALSE
|
|
report "Z.ARG = -MATH_PI in COSH(Z)"
|
|
severity ERROR;
|
|
return COMPLEX_POLAR'(0.0, 0.0);
|
|
end if;
|
|
|
|
-- Compute value for special cases
|
|
if ( Z.MAG = 0.0 and Z.ARG = 0.0 ) then
|
|
return COMPLEX_POLAR'(1.0, 0.0);
|
|
end if;
|
|
|
|
if ( Z.MAG = MATH_PI and Z.ARG = MATH_PI_OVER_2 ) then
|
|
return COMPLEX_POLAR'(1.0, MATH_PI);
|
|
end if;
|
|
|
|
if ( Z.MAG = MATH_PI_OVER_2 and Z.ARG = MATH_PI_OVER_2 ) then
|
|
return COMPLEX_POLAR'(0.0, 0.0);
|
|
end if;
|
|
|
|
if ( Z.MAG = MATH_PI_OVER_2 and Z.ARG = -MATH_PI_OVER_2 ) then
|
|
return COMPLEX_POLAR'(0.0, 0.0);
|
|
end if;
|
|
|
|
-- Compute value for general case
|
|
Z1 := POLAR_TO_COMPLEX(Z);
|
|
Z2 := COMPLEX'(COSH(Z1.RE)*COS(Z1.IM), SINH(Z1.RE)*SIN(Z1.IM));
|
|
ZOUT := COMPLEX_TO_POLAR(Z2);
|
|
return ZOUT;
|
|
end function COSH;
|
|
|
|
|
|
--
|
|
-- Arithmetic Operators
|
|
--
|
|
function "+" ( L: in COMPLEX; R: in COMPLEX ) return COMPLEX is
|
|
-- Description:
|
|
-- See function declaration in IEEE Std 1076.2-1996
|
|
-- Notes:
|
|
-- None
|
|
begin
|
|
return COMPLEX'(L.RE + R.RE, L.IM + R.IM);
|
|
end function "+";
|
|
|
|
function "+" ( L: in REAL; R: in COMPLEX ) return COMPLEX is
|
|
-- Description:
|
|
-- See function declaration in IEEE Std 1076.2-1996
|
|
-- Notes:
|
|
-- None
|
|
begin
|
|
return COMPLEX'(L + R.RE, R.IM);
|
|
end function "+";
|
|
|
|
function "+" ( L: in COMPLEX; R: in REAL ) return COMPLEX is
|
|
-- Description:
|
|
-- See function declaration in IEEE Std 1076.2-1996
|
|
-- Notes:
|
|
-- None
|
|
begin
|
|
return COMPLEX'(L.RE + R, L.IM);
|
|
end function "+";
|
|
|
|
function "+" (L: in COMPLEX_POLAR; R: in COMPLEX_POLAR)
|
|
return COMPLEX_POLAR is
|
|
-- Description:
|
|
-- See function declaration in IEEE Std 1076.2-1996
|
|
-- Notes:
|
|
-- a) Returns COMPLEX_POLAR'(0.0, 0.0) on error
|
|
--
|
|
variable ZL, ZR : COMPLEX;
|
|
variable ZOUT : COMPLEX_POLAR;
|
|
begin
|
|
-- Check validity of input arguments
|
|
if ( L.ARG = -MATH_PI ) then
|
|
assert FALSE
|
|
report "L.ARG = -MATH_PI in +(L,R)"
|
|
severity ERROR;
|
|
return COMPLEX_POLAR'(0.0, 0.0);
|
|
end if;
|
|
|
|
|
|
if ( R.ARG = -MATH_PI ) then
|
|
assert FALSE
|
|
report "R.ARG = -MATH_PI in +(L,R)"
|
|
severity ERROR;
|
|
return COMPLEX_POLAR'(0.0, 0.0);
|
|
end if;
|
|
|
|
-- Get principal value
|
|
ZL := POLAR_TO_COMPLEX( L );
|
|
ZR := POLAR_TO_COMPLEX( R );
|
|
ZOUT := COMPLEX_TO_POLAR(COMPLEX'(ZL.RE + ZR.RE, ZL.IM +ZR.IM));
|
|
return ZOUT;
|
|
end function "+";
|
|
|
|
function "+" ( L: in REAL; R: in COMPLEX_POLAR) return COMPLEX_POLAR is
|
|
-- Description:
|
|
-- See function declaration in IEEE Std 1076.2-1996
|
|
-- Notes:
|
|
-- a) Returns COMPLEX_POLAR'(0.0, 0.0) on error
|
|
variable ZR : COMPLEX;
|
|
variable ZOUT : COMPLEX_POLAR;
|
|
begin
|
|
-- Check validity of input arguments
|
|
if ( R.ARG = -MATH_PI ) then
|
|
assert FALSE
|
|
report "R.ARG = -MATH_PI in +(L,R)"
|
|
severity ERROR;
|
|
return COMPLEX_POLAR'(0.0, 0.0);
|
|
end if;
|
|
|
|
-- Get principal value
|
|
ZR := POLAR_TO_COMPLEX( R );
|
|
ZOUT := COMPLEX_TO_POLAR(COMPLEX'(L + ZR.RE, ZR.IM));
|
|
return ZOUT;
|
|
end function "+";
|
|
|
|
function "+" ( L: in COMPLEX_POLAR; R: in REAL) return COMPLEX_POLAR is
|
|
-- Description:
|
|
-- See function declaration in IEEE Std 1076.2-1996
|
|
-- Notes:
|
|
-- a) Returns COMPLEX_POLAR'(0.0, 0.0) on error
|
|
--
|
|
variable ZL : COMPLEX;
|
|
variable ZOUT : COMPLEX_POLAR;
|
|
begin
|
|
-- Check validity of input arguments
|
|
if ( L.ARG = -MATH_PI ) then
|
|
assert FALSE
|
|
report "L.ARG = -MATH_PI in +(L,R)"
|
|
severity ERROR;
|
|
return COMPLEX_POLAR'(0.0, 0.0);
|
|
end if;
|
|
|
|
-- Get principal value
|
|
ZL := POLAR_TO_COMPLEX( L );
|
|
ZOUT := COMPLEX_TO_POLAR(COMPLEX'(ZL.RE + R, ZL.IM));
|
|
return ZOUT;
|
|
end function "+";
|
|
|
|
function "-" ( L: in COMPLEX; R: in COMPLEX ) return COMPLEX is
|
|
-- Description:
|
|
-- See function declaration in IEEE Std 1076.2-1996
|
|
-- Notes:
|
|
-- None
|
|
begin
|
|
return COMPLEX'(L.RE - R.RE, L.IM - R.IM);
|
|
end function "-";
|
|
|
|
function "-" ( L: in REAL; R: in COMPLEX ) return COMPLEX is
|
|
-- Description:
|
|
-- See function declaration in IEEE Std 1076.2-1996
|
|
-- Notes:
|
|
-- None
|
|
begin
|
|
return COMPLEX'(L - R.RE, -1.0 * R.IM);
|
|
end function "-";
|
|
|
|
function "-" ( L: in COMPLEX; R: in REAL ) return COMPLEX is
|
|
-- Description:
|
|
-- See function declaration in IEEE Std 1076.2-1996
|
|
-- Notes:
|
|
-- None
|
|
begin
|
|
return COMPLEX'(L.RE - R, L.IM);
|
|
end function "-";
|
|
|
|
function "-" ( L: in COMPLEX_POLAR; R: in COMPLEX_POLAR)
|
|
return COMPLEX_POLAR is
|
|
-- Description:
|
|
-- See function declaration in IEEE Std 1076.2-1996
|
|
-- Notes:
|
|
-- a) Returns COMPLEX_POLAR'(0.0, 0.0) on error
|
|
--
|
|
variable ZL, ZR : COMPLEX;
|
|
variable ZOUT : COMPLEX_POLAR;
|
|
begin
|
|
-- Check validity of input arguments
|
|
if ( L.ARG = -MATH_PI ) then
|
|
assert FALSE
|
|
report "L.ARG = -MATH_PI in -(L,R)"
|
|
severity ERROR;
|
|
return COMPLEX_POLAR'(0.0, 0.0);
|
|
end if;
|
|
|
|
if ( R.ARG = -MATH_PI ) then
|
|
assert FALSE
|
|
report "R.ARG = -MATH_PI in -(L,R)"
|
|
severity ERROR;
|
|
return COMPLEX_POLAR'(0.0, 0.0);
|
|
end if;
|
|
-- Get principal value
|
|
ZL := POLAR_TO_COMPLEX( L );
|
|
ZR := POLAR_TO_COMPLEX( R );
|
|
ZOUT := COMPLEX_TO_POLAR(COMPLEX'(ZL.RE - ZR.RE, ZL.IM -ZR.IM));
|
|
return ZOUT;
|
|
end function "-";
|
|
|
|
function "-" ( L: in REAL; R: in COMPLEX_POLAR) return COMPLEX_POLAR is
|
|
-- Description:
|
|
-- See function declaration in IEEE Std 1076.2-1996
|
|
-- Notes:
|
|
-- a) Returns COMPLEX_POLAR'(0.0, 0.0) on error
|
|
--
|
|
variable ZR : COMPLEX;
|
|
variable ZOUT : COMPLEX_POLAR;
|
|
begin
|
|
-- Check validity of input arguments
|
|
if ( R.ARG = -MATH_PI ) then
|
|
assert FALSE
|
|
report "R.ARG = -MATH_PI in -(L,R)"
|
|
severity ERROR;
|
|
return COMPLEX_POLAR'(0.0, 0.0);
|
|
end if;
|
|
|
|
-- Get principal value
|
|
ZR := POLAR_TO_COMPLEX( R );
|
|
ZOUT := COMPLEX_TO_POLAR(COMPLEX'(L - ZR.RE, -1.0*ZR.IM));
|
|
return ZOUT;
|
|
end function "-";
|
|
|
|
function "-" ( L: in COMPLEX_POLAR; R: in REAL) return COMPLEX_POLAR is
|
|
-- Description:
|
|
-- See function declaration in IEEE Std 1076.2-1996
|
|
-- Notes:
|
|
-- a) Returns COMPLEX_POLAR'(0.0, 0.0) on error
|
|
--
|
|
variable ZL : COMPLEX;
|
|
variable ZOUT : COMPLEX_POLAR;
|
|
begin
|
|
-- Check validity of input arguments
|
|
if ( L.ARG = -MATH_PI ) then
|
|
assert FALSE
|
|
report "L.ARG = -MATH_PI in -(L,R)"
|
|
severity ERROR;
|
|
return COMPLEX_POLAR'(0.0, 0.0);
|
|
end if;
|
|
|
|
-- Get principal value
|
|
ZL := POLAR_TO_COMPLEX( L );
|
|
ZOUT := COMPLEX_TO_POLAR(COMPLEX'(ZL.RE - R, ZL.IM));
|
|
return ZOUT;
|
|
end function "-";
|
|
|
|
|
|
function "*" ( L: in COMPLEX; R: in COMPLEX ) return COMPLEX is
|
|
-- Description:
|
|
-- See function declaration in IEEE Std 1076.2-1996
|
|
-- Notes:
|
|
-- None
|
|
begin
|
|
return COMPLEX'(L.RE * R.RE - L.IM * R.IM, L.RE * R.IM + L.IM * R.RE);
|
|
end function "*";
|
|
|
|
|
|
function "*" ( L: in REAL; R: in COMPLEX ) return COMPLEX is
|
|
-- Description:
|
|
-- See function declaration in IEEE Std 1076.2-1996
|
|
-- Notes:
|
|
-- None
|
|
begin
|
|
return COMPLEX'(L * R.RE, L * R.IM);
|
|
end function "*";
|
|
|
|
function "*" ( L: in COMPLEX; R: in REAL ) return COMPLEX is
|
|
-- Description:
|
|
-- See function declaration in IEEE Std 1076.2-1996
|
|
-- Notes:
|
|
-- None
|
|
begin
|
|
return COMPLEX'(L.RE * R, L.IM * R);
|
|
end function "*";
|
|
|
|
function "*" ( L: in COMPLEX_POLAR; R: in COMPLEX_POLAR)
|
|
return COMPLEX_POLAR is
|
|
-- Description:
|
|
-- See function declaration in IEEE Std 1076.2-1996
|
|
-- Notes:
|
|
-- a) Returns COMPLEX_POLAR'(0.0, 0.0) on error
|
|
--
|
|
variable ZOUT : COMPLEX_POLAR;
|
|
begin
|
|
-- Check validity of input arguments
|
|
if ( L.ARG = -MATH_PI ) then
|
|
assert FALSE
|
|
report "L.ARG = -MATH_PI in *(L,R)"
|
|
severity ERROR;
|
|
return COMPLEX_POLAR'(0.0, 0.0);
|
|
end if;
|
|
|
|
if ( R.ARG = -MATH_PI ) then
|
|
assert FALSE
|
|
report "R.ARG = -MATH_PI in *(L,R)"
|
|
severity ERROR;
|
|
return COMPLEX_POLAR'(0.0, 0.0);
|
|
end if;
|
|
|
|
-- Get principal value
|
|
ZOUT.MAG := L.MAG * R.MAG;
|
|
ZOUT.ARG := GET_PRINCIPAL_VALUE(L.ARG + R.ARG);
|
|
|
|
return ZOUT;
|
|
end function "*";
|
|
|
|
function "*" ( L: in REAL; R: in COMPLEX_POLAR) return COMPLEX_POLAR is
|
|
-- Description:
|
|
-- See function declaration in IEEE Std 1076.2-1996
|
|
-- Notes:
|
|
-- a) Returns COMPLEX_POLAR'(0.0, 0.0) on error
|
|
--
|
|
variable ZL : COMPLEX_POLAR;
|
|
variable ZOUT : COMPLEX_POLAR;
|
|
begin
|
|
-- Check validity of input arguments
|
|
if ( R.ARG = -MATH_PI ) then
|
|
assert FALSE
|
|
report "R.ARG = -MATH_PI in *(L,R)"
|
|
severity ERROR;
|
|
return COMPLEX_POLAR'(0.0, 0.0);
|
|
end if;
|
|
|
|
-- Get principal value
|
|
ZL.MAG := POSITIVE_REAL'(ABS(L));
|
|
if ( L < 0.0 ) then
|
|
ZL.ARG := MATH_PI;
|
|
else
|
|
ZL.ARG := 0.0;
|
|
end if;
|
|
|
|
ZOUT.MAG := ZL.MAG * R.MAG;
|
|
ZOUT.ARG := GET_PRINCIPAL_VALUE(ZL.ARG + R.ARG);
|
|
|
|
return ZOUT;
|
|
end function "*";
|
|
|
|
function "*" ( L: in COMPLEX_POLAR; R: in REAL) return COMPLEX_POLAR is
|
|
-- Description:
|
|
-- See function declaration in IEEE Std 1076.2-1996
|
|
-- Notes:
|
|
-- a) Returns COMPLEX_POLAR'(0.0, 0.0) on error
|
|
--
|
|
variable ZR : COMPLEX_POLAR;
|
|
variable ZOUT : COMPLEX_POLAR;
|
|
begin
|
|
-- Check validity of input arguments
|
|
if ( L.ARG = -MATH_PI ) then
|
|
assert FALSE
|
|
report "L.ARG = -MATH_PI in *(L,R)"
|
|
severity ERROR;
|
|
return COMPLEX_POLAR'(0.0, 0.0);
|
|
end if;
|
|
|
|
-- Get principal value
|
|
ZR.MAG := POSITIVE_REAL'(ABS(R));
|
|
if ( R < 0.0 ) then
|
|
ZR.ARG := MATH_PI;
|
|
else
|
|
ZR.ARG := 0.0;
|
|
end if;
|
|
|
|
ZOUT.MAG := L.MAG * ZR.MAG;
|
|
ZOUT.ARG := GET_PRINCIPAL_VALUE(L.ARG + ZR.ARG);
|
|
|
|
return ZOUT;
|
|
end function "*";
|
|
|
|
function "/" ( L: in COMPLEX; R: in COMPLEX ) return COMPLEX is
|
|
-- Description:
|
|
-- See function declaration in IEEE Std 1076.2-1996
|
|
-- Notes:
|
|
-- a) Returns COMPLEX'(REAL'HIGH, 0.0) on error
|
|
--
|
|
constant TEMP : REAL := R.RE*R.RE + R.IM*R.IM;
|
|
begin
|
|
-- Check validity of input arguments
|
|
if (TEMP = 0.0) then
|
|
assert FALSE
|
|
report "Attempt to divide COMPLEX by (0.0, 0.0)"
|
|
severity ERROR;
|
|
return COMPLEX'(REAL'HIGH, 0.0);
|
|
end if;
|
|
|
|
-- Get value
|
|
return COMPLEX'( (L.RE * R.RE + L.IM * R.IM) / TEMP,
|
|
(L.IM * R.RE - L.RE * R.IM) / TEMP);
|
|
end function "/";
|
|
|
|
function "/" ( L: in REAL; R: in COMPLEX ) return COMPLEX is
|
|
-- Description:
|
|
-- See function declaration in IEEE Std 1076.2-1996
|
|
-- Notes:
|
|
-- a) Returns COMPLEX'(REAL'HIGH, 0.0) on error
|
|
--
|
|
variable TEMP : REAL := R.RE*R.RE + R.IM*R.IM;
|
|
begin
|
|
-- Check validity of input arguments
|
|
if (TEMP = 0.0) then
|
|
assert FALSE
|
|
report "Attempt to divide COMPLEX by (0.0, 0.0)"
|
|
severity ERROR;
|
|
return COMPLEX'(REAL'HIGH, 0.0);
|
|
end if;
|
|
|
|
-- Get value
|
|
TEMP := L / TEMP;
|
|
return COMPLEX'( TEMP * R.RE, -TEMP * R.IM );
|
|
end function "/";
|
|
|
|
function "/" ( L: in COMPLEX; R: in REAL ) return COMPLEX is
|
|
-- Description:
|
|
-- See function declaration in IEEE Std 1076.2-1996
|
|
-- Notes:
|
|
-- a) Returns COMPLEX'(REAL'HIGH, 0.0) on error
|
|
begin
|
|
-- Check validity of input arguments
|
|
if (R = 0.0) then
|
|
assert FALSE
|
|
report "Attempt to divide COMPLEX by 0.0"
|
|
severity ERROR;
|
|
return COMPLEX'(REAL'HIGH, 0.0);
|
|
end if;
|
|
|
|
-- Get value
|
|
return COMPLEX'(L.RE / R, L.IM / R);
|
|
end function "/";
|
|
|
|
|
|
function "/" ( L: in COMPLEX_POLAR; R: in COMPLEX_POLAR)
|
|
return COMPLEX_POLAR is
|
|
-- Description:
|
|
-- See function declaration in IEEE Std 1076.2-1996
|
|
-- Notes:
|
|
-- a) Returns COMPLEX_POLAR'(REAL'HIGH, 0.0) on error
|
|
--
|
|
variable ZOUT : COMPLEX_POLAR;
|
|
begin
|
|
-- Check validity of input arguments
|
|
if (R.MAG = 0.0) then
|
|
assert FALSE
|
|
report "Attempt to divide COMPLEX_POLAR by (0.0, 0.0)"
|
|
severity ERROR;
|
|
return COMPLEX_POLAR'(REAL'HIGH, 0.0);
|
|
end if;
|
|
|
|
if ( L.ARG = -MATH_PI ) then
|
|
assert FALSE
|
|
report "L.ARG = -MATH_PI in /(L,R)"
|
|
severity ERROR;
|
|
return COMPLEX_POLAR'(REAL'HIGH, 0.0);
|
|
end if;
|
|
|
|
if ( R.ARG = -MATH_PI ) then
|
|
assert FALSE
|
|
report "R.ARG = -MATH_PI in /(L,R)"
|
|
severity ERROR;
|
|
return COMPLEX_POLAR'(0.0, 0.0);
|
|
end if;
|
|
|
|
-- Get principal value
|
|
ZOUT.MAG := L.MAG/R.MAG;
|
|
ZOUT.ARG := GET_PRINCIPAL_VALUE(L.ARG - R.ARG);
|
|
|
|
return ZOUT;
|
|
end function "/";
|
|
|
|
function "/" ( L: in COMPLEX_POLAR; R: in REAL) return COMPLEX_POLAR is
|
|
-- Description:
|
|
-- See function declaration in IEEE Std 1076.2-1996
|
|
-- Notes:
|
|
-- a) Returns COMPLEX_POLAR'(REAL'HIGH, 0.0) on error
|
|
--
|
|
variable ZR : COMPLEX_POLAR;
|
|
variable ZOUT : COMPLEX_POLAR;
|
|
begin
|
|
-- Check validity of input arguments
|
|
if (R = 0.0) then
|
|
assert FALSE
|
|
report "Attempt to divide COMPLEX_POLAR by 0.0"
|
|
severity ERROR;
|
|
return COMPLEX_POLAR'(REAL'HIGH, 0.0);
|
|
end if;
|
|
|
|
if ( L.ARG = -MATH_PI ) then
|
|
assert FALSE
|
|
report "L.ARG = -MATH_PI in /(L,R)"
|
|
severity ERROR;
|
|
return COMPLEX_POLAR'(REAL'HIGH, 0.0);
|
|
end if;
|
|
|
|
-- Get principal value
|
|
ZR.MAG := POSITIVE_REAL'(ABS(R));
|
|
if R < 0.0 then
|
|
ZR.ARG := MATH_PI;
|
|
else
|
|
ZR.ARG := 0.0;
|
|
end if;
|
|
|
|
ZOUT.MAG := L.MAG/ZR.MAG;
|
|
ZOUT.ARG := GET_PRINCIPAL_VALUE(L.ARG - ZR.ARG);
|
|
|
|
return ZOUT;
|
|
end function "/";
|
|
|
|
function "/" ( L: in REAL; R: in COMPLEX_POLAR) return COMPLEX_POLAR is
|
|
-- Description:
|
|
-- See function declaration in IEEE Std 1076.2-1996
|
|
-- Notes:
|
|
-- a) Returns COMPLEX_POLAR'(REAL'HIGH, 0.0) on error
|
|
--
|
|
variable ZL : COMPLEX_POLAR;
|
|
variable ZOUT : COMPLEX_POLAR;
|
|
begin
|
|
-- Check validity of input arguments
|
|
if (R.MAG = 0.0) then
|
|
assert FALSE
|
|
report "Attempt to divide COMPLEX_POLAR by (0.0, 0.0)"
|
|
severity ERROR;
|
|
return COMPLEX_POLAR'(REAL'HIGH, 0.0);
|
|
end if;
|
|
|
|
if ( R.ARG = -MATH_PI ) then
|
|
assert FALSE
|
|
report "R.ARG = -MATH_P in /(L,R)"
|
|
severity ERROR;
|
|
return COMPLEX_POLAR'(0.0, 0.0);
|
|
end if;
|
|
|
|
-- Get principal value
|
|
ZL.MAG := POSITIVE_REAL'(ABS(L));
|
|
if L < 0.0 then
|
|
ZL.ARG := MATH_PI;
|
|
else
|
|
ZL.ARG := 0.0;
|
|
end if;
|
|
|
|
ZOUT.MAG := ZL.MAG/R.MAG;
|
|
ZOUT.ARG := GET_PRINCIPAL_VALUE(ZL.ARG - R.ARG);
|
|
|
|
return ZOUT;
|
|
end function "/";
|
|
|
|
end package body MATH_COMPLEX;
|