diff options
Diffstat (limited to 'testsuite/gna/issue2103/pkg_logic_misc.vhdl')
-rw-r--r-- | testsuite/gna/issue2103/pkg_logic_misc.vhdl | 155 |
1 files changed, 155 insertions, 0 deletions
diff --git a/testsuite/gna/issue2103/pkg_logic_misc.vhdl b/testsuite/gna/issue2103/pkg_logic_misc.vhdl new file mode 100644 index 000000000..8a8bdba00 --- /dev/null +++ b/testsuite/gna/issue2103/pkg_logic_misc.vhdl @@ -0,0 +1,155 @@ +
------------------------------------------------------------------------------
-- ____ _____________ __ --
-- / __ \/ ____/ ___/\ \/ / _ _ _ --
-- / / / / __/ \__ \ \ / / \ / \ / \ --
-- / /_/ / /___ ___/ / / / = ( M | S | K )= --
-- /_____/_____//____/ /_/ \_/ \_/ \_/ --
-- --
------------------------------------------------------------------------------
--! @copyright Copyright 2022 DESY
--! SPDX-License-Identifier: CERN-OHL-W-2.0
------------------------------------------------------------------------------
--! @date 2022-06-07
--! @author Andrea Bellandi
--! @email andrea.bellandi@desy.de
------------------------------------------------------------------------------
--! @brief
--! Miscellaneous logic utilities
------------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
--!-------------------------------------------------------
--! Miscellaneous logic functions. All ported functions from
--! IEEE.std_logic_misc belongs here.
package logic_misc is
--!-------------------------------------------------------
--! f_to_std_logic:
--! Converts std_logic to boolean.
function f_to_std_logic (arg: boolean) return std_logic;
--!-------------------------------------------------------
--! f_to_boolean:
--! Converts std_logic to boolean
function f_to_boolean (arg: std_logic) return boolean;
--!-------------------------------------------------------
--! f_all_ones:
--! Checks whether all bits of **arg** are equal to '1'.
--! Equivalent to _and_reduce_.
function f_all_ones (arg: std_logic_vector) return std_logic;
--!-------------------------------------------------------
--! f_all_zeroes:
--! Checks wheter all bits of **arg** are equal to '0'.
--! Equivalent to _nor_reduce_.
function f_all_zeroes (arg: std_logic_vector) return std_logic;
--!-------------------------------------------------------
--! f_odd_ones:
--! Return '1' if an odd number of bits in **arg** are '1'.
--! Equivalent to _xor_reduce_.
function f_odd_ones (arg: std_logic_vector) return std_logic;
--!-------------------------------------------------------
--! f_even_ones:
--! Return '1' if an even number of bits in **arg** are '1'.
--! Return '1' if zero bits in **arg** are '1'.
--! Equivalent to _xnor_reduce_.
function f_even_ones (arg: std_logic_vector) return std_logic;
--!-------------------------------------------------------
--! f_odd_zeroes:
--! Return '1' if an odd number of bits in **arg** are '0'.
--! Equivalent to _xor_reduce_.
function f_odd_zeroes (arg: std_logic_vector) return std_logic;
--!-------------------------------------------------------
--! f_even_zeroes:
--! Return '1' if an even number of bits in **arg** are '0'.
--! Return '1' if zero bits in **arg** are '0'.
--! Equivalent to _xnor_reduce_.
function f_even_zeroes (arg: std_logic_vector) return std_logic;
-- vsg_off function_101
--!-------------------------------------------------------
--! or_reduce:
--! Reduction of bits in **arg** with the **or** logical operator.
--! Port of nonstandard _ieee.std_logic_misc.or_reduce_
function or_reduce (arg: std_logic_vector) return std_logic;
--!-------------------------------------------------------
--! and_reduce:
--! Reduction of bits in **arg** with the **and** logical operator.
--! Port of nonstandard _ieee.std_logic_misc.and_reduce_
function and_reduce (arg: std_logic_vector) return std_logic;
--!-------------------------------------------------------
--! xor_reduce:
--! Reduction of bits in **arg** with the **xor** logical operator.
--! Port of nonstandard _ieee.std_logic_misc.xor_reduce_
function xor_reduce (arg: std_logic_vector) return std_logic;
--!------------------------- + --! nor_reduce: + --! Negated reduction of bits in **arg** with the **or** logical operator. + --! Port of nonstandard _ieee.std_logic_misc.nor_reduce_ + + function nor_reduce (arg: std_logic_vector) return std_logic; + + --!------------------------------------------------------- + --! nand_reduce: + --! Negated reduction of bits in **arg** with the **and** logical operator. + --! Port of nonstandard _ieee.std_logic_misc.nand_reduce_ + + function nand_reduce (arg: std_logic_vector) return std_logic; + + --!------------------------------------------------------- + --! xnor_reduce: + --! Negated reduction of bits in **arg** with the **xor** logical operator. + --! Port of nonstandard _ieee.std_logic_misc.xnor_reduce_ + + function xnor_reduce (arg: std_logic_vector) return std_logic; + +-- vsg_on + +end package logic_misc; + +package body logic_misc is + + function f_to_std_logic (arg: boolean) return std_logic is + begin + + if (arg) then + return '1'; + else + return '0'; + end if; + + end function; + + function f_to_boolean (arg: std_logic) return boolean is + begin + + return arg = '1'; + + end function; + + function f_all_ones (arg: std_logic_vector) return std_logic is + + constant C_ONES : std_logic_vector(arg'length - 1 downto 0) := + ( + others => '1' + ); + + begin + + return f_to_std_logic(arg = C_ONES); + + end function; + + function f_all_zeroes (arg: std_logic_vector) return std_logic is + + constant C_ZEROES : std_logic_vector(arg'length - 1 downto 0) := + ( + others => '0' + ); + + begin + + return f_to_std_logic(arg = C_ZEROES); + + end function; + + function f_odd_ones (arg: std_logic_vector) return std_logic is + + variable var_result : std_logic := '0'; + + begin + + for i in arg'low to arg'high loop + + var_result := var_result xor arg(i); + + end loop; + + return var_result; + + end function; + + function f_even_ones (arg: std_logic_vector) return std_logic is + begin + + return not f_odd_ones(arg); + + end function; + + function f_odd_zeroes (arg: std_logic_vector) return std_logic is + begin + + return f_odd_ones(not arg); + + end function; + + function f_even_zeroes (arg: std_logic_vector) return std_logic is + begin + + return not f_odd_zeroes(arg); + + end function; + + -- vsg_off function_101 + + function or_reduce (arg: std_logic_vector) return std_logic is + begin + + return not f_all_zeroes(arg); + + end function; + + function and_reduce (arg: std_logic_vector) return std_logic is + begin + + return f_all_ones(arg); + + end function; + + function xor_reduce (arg: std_logic_vector) return std_logic is + begin + + return f_odd_ones(arg); + + end function; + + function nor_reduce (arg: std_logic_vector) return std_logic is + begin + + return f_all_zeroes(arg); + + end function; + + function nand_reduce (arg: std_logic_vector) return std_logic is + begin + + return not f_all_ones(arg); + + end function; + + function xnor_reduce (arg: std_logic_vector) return std_logic is + begin + + return f_even_ones(arg); + + end function; + +-- vsg_on + +end package body logic_misc; |