From 4f08808121e96b68eafc0cc4f163ef439a1457fd Mon Sep 17 00:00:00 2001
From: Daniel van der Schuur <schuur@astron.nl>
Date: Fri, 21 Oct 2016 07:31:22 +0000
Subject: [PATCH] -Added function vector_one_hot.

---
 libraries/base/common/src/vhdl/common_pkg.vhd | 20 +++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/libraries/base/common/src/vhdl/common_pkg.vhd b/libraries/base/common/src/vhdl/common_pkg.vhd
index b01d947170..d4e7bd3248 100644
--- a/libraries/base/common/src/vhdl/common_pkg.vhd
+++ b/libraries/base/common/src/vhdl/common_pkg.vhd
@@ -188,6 +188,7 @@ PACKAGE common_pkg IS
   FUNCTION vector_and(slv : STD_LOGIC_VECTOR) RETURN STD_LOGIC;  -- '1' when all slv bits are '1' else '0'
   FUNCTION vector_or( slv : STD_LOGIC_VECTOR) RETURN STD_LOGIC;  -- '0' when all slv bits are '0' else '1'
   FUNCTION vector_xor(slv : STD_LOGIC_VECTOR) RETURN STD_LOGIC;  -- '1' when the slv has an odd number of '1' bits else '0'
+  FUNCTION vector_one_hot(slv : STD_LOGIC_VECTOR) RETURN STD_LOGIC_VECTOR; -- Returns slv when it contains one hot bit, else returns 0.
   
   FUNCTION andv(slv : STD_LOGIC_VECTOR) RETURN STD_LOGIC;  -- alias of vector_and
   FUNCTION orv( slv : STD_LOGIC_VECTOR) RETURN STD_LOGIC;  -- alias of vector_or
@@ -666,6 +667,25 @@ PACKAGE BODY common_pkg IS
   BEGIN
     RETURN vector_tree(slv, "XOR");
   END;
+
+  FUNCTION vector_one_hot(slv : STD_LOGIC_VECTOR) RETURN STD_LOGIC_VECTOR IS
+    VARIABLE v_one_hot : BOOLEAN := FALSE;
+    VARIABLE v_zeros   : STD_LOGIC_VECTOR(slv'RANGE) := (OTHERS=>'0');
+  BEGIN
+    FOR i IN slv'RANGE LOOP
+      IF slv(i) = '1' THEN
+        IF NOT(v_one_hot) THEN
+          -- No hot bits found so far
+          v_one_hot := TRUE;
+        ELSE
+          -- This is the second hot bit found; return zeros.
+          RETURN v_zeros;
+        END IF;
+      END IF;
+    END LOOP;
+    -- No or a single hot bit found in slv; return slv.
+    RETURN slv;
+  END;
   
   FUNCTION andv(slv : STD_LOGIC_VECTOR) RETURN STD_LOGIC IS
   BEGIN
-- 
GitLab