| @ -0,0 +1,204 @@ | |||
| -- | |||
| -- 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 ; | |||