From 75d51c0b92015b48b176374f9a387b2d25fa8198 Mon Sep 17 00:00:00 2001
From: Dimitris Lampridis <dimitris.lampridis@cern.ch>
Date: Fri, 13 Dec 2019 10:16:09 +0100
Subject: [PATCH] [common] add VHDL functions to upper/lower case characters
 and strings

---
 CHANGELOG.md                    |  2 ++
 modules/common/gencores_pkg.vhd | 48 +++++++++++++++++++++++++++++++++
 2 files changed, 50 insertions(+)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index dafb1c35..f96fdc8a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
 and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
 
 ## [Unreleased]
+### Added
+- VHDL functions to convert characters and strings to upper/lower case.
 
 ## [1.0.0] - 2019-10-21
 ### Added
diff --git a/modules/common/gencores_pkg.vhd b/modules/common/gencores_pkg.vhd
index 4b0f986d..454c8e64 100644
--- a/modules/common/gencores_pkg.vhd
+++ b/modules/common/gencores_pkg.vhd
@@ -726,6 +726,12 @@ package gencores_pkg is
   function f_pick (cond : std_logic; if_1 : std_logic_vector; if_0 : std_logic_vector)
     return std_logic_vector;
 
+  -- Functions to convert characters and strings to upper/lower case
+  function to_upper(c : character) return character;
+  function to_lower(c : character) return character;
+  function to_upper(s : string) return string;
+  function to_lower(s : string) return string;
+
 end package;
 
 package body gencores_pkg is
@@ -954,4 +960,46 @@ package body gencores_pkg is
     return f_pick (f_to_std_logic(cond), if_1, if_0);
   end function f_pick;
 
+  ------------------------------------------------------------------------------
+  -- Functions to convert characters and strings to upper/lower case
+  ------------------------------------------------------------------------------
+
+  function to_upper(c : character) return character is
+    variable i : integer;
+  begin
+    i := character'pos(c);
+    if (i > 96 and i < 123) then
+      i := i - 32;
+    end if;
+    return character'val(i);
+  end function to_upper;
+
+  function to_lower(c : character) return character is
+    variable i : integer;
+  begin
+    i := character'pos(c);
+    if (i > 64 and i < 91) then
+      i := i + 32;
+    end if;
+    return character'val(i);
+  end function to_lower;
+
+  function to_upper(s : string) return string is
+    variable uppercase : string (s'range);
+  begin
+    for i in s'range loop
+      uppercase(i) := to_upper(s(i));
+    end loop;
+    return uppercase;
+  end to_upper;
+
+  function to_lower(s : string) return string is
+    variable lowercase : string (s'range);
+  begin
+    for i in s'range loop
+      lowercase(i) := to_lower(s(i));
+    end loop;
+    return lowercase;
+  end to_lower;
+
 end gencores_pkg;
-- 
GitLab