-- -- File Name: MessagePkg.vhd -- Design Unit Name: MessagePkg -- Revision: STANDARD VERSION, revision 2014.01 -- -- Maintainer: Jim Lewis email: jim@synthworks.com -- Contributor(s): -- Jim Lewis SynthWorks -- -- -- Package Defines -- Data structure for name and message handling. -- -- Developed for: -- SynthWorks Design Inc. -- VHDL Training Classes -- 11898 SW 128th Ave. Tigard, Or 97223 -- http://www.SynthWorks.com -- -- Latest standard version available at: -- http://www.SynthWorks.com/downloads -- -- Revision History: -- Date Version Description -- 06/2010: 0.1 Initial revision -- -- -- Copyright (c) 2010 - 2013 by SynthWorks Design Inc. All rights reserved. -- -- Verbatim copies of this source file may be used and -- distributed without restriction. -- -- This source file is free software; you can redistribute it -- and/or modify it under the terms of the ARTISTIC License -- as published by The Perl Foundation; either version 2.0 of -- the License, or (at your option) any later version. -- -- This source is distributed in the hope that it will be -- useful, but WITHOUT ANY WARRANTY; without even the implied -- warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -- PURPOSE. See the Artistic License for details. -- -- You should have received a copy of the license with this source. -- If not download it from, -- http://www.perlfoundation.org/artistic_license_2_0 -- library ieee ; use ieee.std_logic_1164.all ; use ieee.numeric_std.all ; use ieee.math_real.all ; use std.textio.all ; package MessagePkg is type MessagePType is protected procedure SetName (NameIn : String) ; impure function GetName return string ; impure function IsSetName return boolean ; procedure SetMessage (MessageIn : String) ; impure function GetMessage (ItemNumber : integer) return string ; impure function GetMessageCount return integer ; procedure DeallocateName ; -- clear name procedure DeallocateMessage ; -- clear message procedure Deallocate ; -- clear all end protected MessagePType ; end package MessagePkg ; package body MessagePkg is -- Local Data Structure Types type LineArrayType is array (natural range <>) of line ; type LineArrayPtrType is access LineArrayType ; ------------------------------------------------------------ -- Local. Get first word from a string function GetWord (Message : string) return string is ------------------------------------------------------------ alias aMessage : string( 1 to Message'length) is Message ; begin for i in aMessage'range loop if aMessage(i) = ' ' or aMessage(i) = HT then return aMessage(1 to i-1) ; end if ; end loop ; return aMessage ; end function GetWord ; type MessagePType is protected body variable NamePtr : line := new string'("") ; variable MessageCount : integer := 0 ; constant INITIAL_ITEM_COUNT : integer := 25 ; variable MaxMessageCount : integer := INITIAL_ITEM_COUNT ; variable MessagePtr : LineArrayPtrType := new LineArrayType(1 to INITIAL_ITEM_COUNT) ; ------------------------------------------------------------ procedure SetName (NameIn : String) is ------------------------------------------------------------ begin deallocate(NamePtr) ; NamePtr := new string'(NameIn) ; end procedure SetName ; ------------------------------------------------------------ impure function GetName return string is ------------------------------------------------------------ begin if NamePtr.all /= "" or MessagePtr(1) = NULL then return NamePtr.all ; else return GetWord( MessagePtr(1).all ) ; end if ; end function GetName ; ------------------------------------------------------------ impure function IsSetName return boolean is ------------------------------------------------------------ begin return NamePtr.all /= "" ; end function IsSetName ; ------------------------------------------------------------ procedure SetMessage (MessageIn : String) is ------------------------------------------------------------ variable NamePtr : line ; variable OldMaxMessageCount : integer ; variable OldMessagePtr : LineArrayPtrType ; begin MessageCount := MessageCount + 1 ; if MessageCount > MaxMessageCount then OldMaxMessageCount := MaxMessageCount ; MaxMessageCount := OldMaxMessageCount * 2 ; OldMessagePtr := MessagePtr ; MessagePtr := new LineArrayType(1 to MaxMessageCount) ; for i in 1 to OldMaxMessageCount loop MessagePtr(i) := OldMessagePtr(i) ; end loop ; Deallocate( OldMessagePtr ) ; end if ; MessagePtr(MessageCount) := new string'(MessageIn) ; end procedure SetMessage ; ------------------------------------------------------------ impure function GetMessage (ItemNumber : integer) return string is ------------------------------------------------------------ begin if MessageCount > 0 then if ItemNumber >= 1 and ItemNumber <= MessageCount then return MessagePtr(ItemNumber).all ; else report LF & "%% MessagePkg:MessagePType.GetMessage input value out of range" severity failure ; return "" ; -- error if this happens end if ; else return NamePtr.all ; end if ; end function GetMessage ; ------------------------------------------------------------ impure function GetMessageCount return integer is ------------------------------------------------------------ begin return MessageCount ; end function GetMessageCount ; ------------------------------------------------------------ procedure DeallocateName is -- clear name ------------------------------------------------------------ begin deallocate(NamePtr) ; NamePtr := new string'("") ; end procedure DeallocateName ; ------------------------------------------------------------ procedure DeallocateMessage is -- clear message ------------------------------------------------------------ variable CurPtr : LineArrayPtrType ; begin for i in 1 to MessageCount loop deallocate( MessagePtr(i) ) ; end loop ; MessageCount := 0 ; -- Do NOT Do this: deallocate( MessagePtr ) ; end procedure DeallocateMessage ; ------------------------------------------------------------ procedure Deallocate is -- clear all ------------------------------------------------------------ begin DeallocateName ; DeallocateMessage ; end procedure Deallocate ; end protected body MessagePType ; end package body MessagePkg ;