diff --git a/AlertLogPkg.vhd b/AlertLogPkg.vhd index c631291..4f941bb 100644 --- a/AlertLogPkg.vhd +++ b/AlertLogPkg.vhd @@ -1,3312 +1,3317 @@ --- --- File Name: AlertLogPkg.vhd --- Design Unit Name: AlertLogPkg --- Revision: STANDARD VERSION --- --- Maintainer: Jim Lewis email: jim@synthworks.com --- Contributor(s): --- Jim Lewis jim@synthworks.com --- --- --- Description: --- Alert handling and log filtering (verbosity control) --- Alert handling provides a method to count failures, errors, and warnings --- To accumlate counts, a data structure is created in a shared variable --- It is of type AlertLogStructPType which is defined in AlertLogBasePkg --- Log filtering provides verbosity control for logs (display or do not display) --- AlertLogPkg provides a simplified interface to the shared variable --- --- --- Developed for: --- SynthWorks Design Inc. --- VHDL Training Classes --- 11898 SW 128th Ave. Tigard, Or 97223 --- http://www.SynthWorks.com --- --- Revision History: --- Date Version Description --- 01/2015: 2015.01 Initial revision --- 03/2015 2015.03 Added: AlertIfEqual, AlertIfNotEqual, AlertIfDiff, PathTail, --- ReportNonZeroAlerts, ReadLogEnables --- 05/2015 2015.06 Added IncAlertCount, AffirmIf --- 07/2015 2016.01 Fixed AlertLogID issue with > 32 IDs --- 02/2016 2016.02 Fixed IsLogEnableType (for PASSED), AffirmIf (to pass AlertLevel) --- Created LocalInitialize --- 05/2017 2017.05 AffirmIfEqual, AffirmIfDiff, --- GetAffirmCount (deprecates GetAffirmCheckCount), IncAffirmCount (deprecates IncAffirmCheckCount), --- IsAlertEnabled (alias), IsLogEnabled (alias) --- --- --- Copyright (c) 2015 - 2017 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 --- - - -use std.textio.all ; -use work.OsvvmGlobalPkg.all ; -use work.TranscriptPkg.all ; -use work.TextUtilPkg.all ; - -library IEEE ; -use ieee.std_logic_1164.all ; -use ieee.numeric_std.all ; - -package AlertLogPkg is - - type AlertLogIDType is range integer'low to integer'high ; - type AlertLogIDVectorType is array (integer range <>) of AlertLogIDType ; - type AlertType is (FAILURE, ERROR, WARNING) ; -- NEVER - subtype AlertIndexType is AlertType range FAILURE to WARNING ; - type AlertCountType is array (AlertIndexType) of integer ; - type AlertEnableType is array(AlertIndexType) of boolean ; - type LogType is (ALWAYS, DEBUG, FINAL, INFO, PASSED) ; -- NEVER -- See function IsLogEnableType - subtype LogIndexType is LogType range DEBUG to PASSED ; - type LogEnableType is array (LogIndexType) of boolean ; - - constant ALERTLOG_BASE_ID : AlertLogIDType := 0 ; -- Careful as some code may assume this is 0. - constant ALERTLOG_DEFAULT_ID : AlertLogIDType := 1 ; - constant ALERT_DEFAULT_ID : AlertLogIDType := ALERTLOG_DEFAULT_ID ; - constant LOG_DEFAULT_ID : AlertLogIDType := ALERTLOG_DEFAULT_ID ; - constant OSVVM_ALERTLOG_ID : AlertLogIDType := 2 ; - constant OSVVM_SCOREBOARD_ALERTLOG_ID : AlertLogIDType := OSVVM_ALERTLOG_ID ; - -- NUM_PREDEFINED_AL_IDS intended to be local, but depends on others - -- constant NUM_PREDEFINED_AL_IDS : AlertLogIDType := OSVVM_SCOREBOARD_ALERTLOG_ID - ALERTLOG_BASE_ID ; -- Not including base - constant ALERTLOG_ID_NOT_FOUND : AlertLogIDType := -1 ; -- alternately integer'right - constant ALERTLOG_ID_NOT_ASSIGNED : AlertLogIDType := -1 ; - constant MIN_NUM_AL_IDS : AlertLogIDType := 32 ; -- Number IDs initially allocated - - alias AlertLogOptionsType is work.OsvvmGlobalPkg.OsvvmOptionsType ; - - ------------------------------------------------------------ - -- Alert always goes to the transcript file - procedure Alert( - AlertLogID : AlertLogIDType ; - Message : string ; - Level : AlertType := ERROR - ) ; - procedure Alert( Message : string ; Level : AlertType := ERROR ) ; - - ------------------------------------------------------------ - procedure IncAlertCount( -- A silent form of alert - AlertLogID : AlertLogIDType ; - Level : AlertType := ERROR - ) ; - procedure IncAlertCount( Level : AlertType := ERROR ) ; - - ------------------------------------------------------------ - -- Similar to assert, except condition is positive - procedure AlertIf( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIf( condition : boolean ; Message : string ; Level : AlertType := ERROR ) ; - impure function AlertIf( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; Level : AlertType := ERROR ) return boolean ; - impure function AlertIf( condition : boolean ; Message : string ; Level : AlertType := ERROR ) return boolean ; - - ------------------------------------------------------------ - -- Direct replacement for assert - procedure AlertIfNot( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfNot( condition : boolean ; Message : string ; Level : AlertType := ERROR ) ; - impure function AlertIfNot( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; Level : AlertType := ERROR ) return boolean ; - impure function AlertIfNot( condition : boolean ; Message : string ; Level : AlertType := ERROR ) return boolean ; - - ------------------------------------------------------------ - -- overloading for common functionality - procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : std_logic ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : std_logic_vector ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : unsigned ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : signed ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : integer ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : real ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : character ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : string ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : time ; Message : string ; Level : AlertType := ERROR ) ; - - procedure AlertIfEqual( L, R : std_logic ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfEqual( L, R : std_logic_vector ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfEqual( L, R : unsigned ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfEqual( L, R : signed ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfEqual( L, R : integer ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfEqual( L, R : real ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfEqual( L, R : character ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfEqual( L, R : string ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfEqual( L, R : time ; Message : string ; Level : AlertType := ERROR ) ; - - procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : std_logic ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : std_logic_vector ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : unsigned ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : signed ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : integer ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : real ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : character ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : string ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : time ; Message : string ; Level : AlertType := ERROR ) ; - - procedure AlertIfNotEqual( L, R : std_logic ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfNotEqual( L, R : std_logic_vector ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfNotEqual( L, R : unsigned ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfNotEqual( L, R : signed ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfNotEqual( L, R : integer ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfNotEqual( L, R : real ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfNotEqual( L, R : character ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfNotEqual( L, R : string ; Message : string ; Level : AlertType := ERROR ) ; - procedure AlertIfNotEqual( L, R : time ; Message : string ; Level : AlertType := ERROR ) ; - - ------------------------------------------------------------ - -- Simple Diff for file comparisons - procedure AlertIfDiff (AlertLogID : AlertLogIDType ; Name1, Name2 : string; Message : string := "" ; Level : AlertType := ERROR ) ; - procedure AlertIfDiff (Name1, Name2 : string; Message : string := "" ; Level : AlertType := ERROR ) ; - procedure AlertIfDiff (AlertLogID : AlertLogIDType ; file File1, File2 : text; Message : string := "" ; Level : AlertType := ERROR ) ; - procedure AlertIfDiff (file File1, File2 : text; Message : string := "" ; Level : AlertType := ERROR ) ; - - ------------------------------------------------------------ - ------------------------------------------------------------ - ------------------------------------------------------------ - procedure AffirmIf( - ------------------------------------------------------------ - AlertLogID : AlertLogIDType ; - condition : boolean ; - ReceivedMessage : string ; - ExpectedMessage : string ; - Enable : boolean := FALSE -- override internal enable - ) ; - - procedure AffirmIf( condition : boolean ; ReceivedMessage, ExpectedMessage : string ; Enable : boolean := FALSE ) ; - impure function AffirmIf( AlertLogID : AlertLogIDType ; condition : boolean ; ReceivedMessage, ExpectedMessage : string ; Enable : boolean := FALSE ) return boolean ; - impure function AffirmIf( condition : boolean ; ReceivedMessage, ExpectedMessage : string ; Enable : boolean := FALSE ) return boolean ; - - procedure AffirmIf( - AlertLogID : AlertLogIDType ; - condition : boolean ; - Message : string ; - Enable : boolean := FALSE -- override internal enable - ) ; - - procedure AffirmIf(condition : boolean ; Message : string ; Enable : boolean := FALSE ) ; - impure function AffirmIf( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; Enable : boolean := FALSE ) return boolean ; - impure function AffirmIf( condition : boolean ; Message : string ; Enable : boolean := FALSE ) return boolean ; - - ------------------------------------------------------------ - procedure AffirmIfNot( AlertLogID : AlertLogIDType ; condition : boolean ; ReceivedMessage, ExpectedMessage : string ; Enable : boolean := FALSE ) ; - procedure AffirmIfNot( condition : boolean ; ReceivedMessage, ExpectedMessage : string ; Enable : boolean := FALSE ) ; - impure function AffirmIfNot( AlertLogID : AlertLogIDType ; condition : boolean ; ReceivedMessage, ExpectedMessage : string ; Enable : boolean := FALSE ) return boolean ; - impure function AffirmIfNot( condition : boolean ; ReceivedMessage, ExpectedMessage : string ; Enable : boolean := FALSE ) return boolean ; - - ------------------------------------------------------------ - procedure AffirmIfNot( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; Enable : boolean := FALSE ) ; - procedure AffirmIfNot( condition : boolean ; Message : string ; Enable : boolean := FALSE ) ; - impure function AffirmIfNot( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; Enable : boolean := FALSE ) return boolean ; - impure function AffirmIfNot( condition : boolean ; Message : string ; Enable : boolean := FALSE ) return boolean ; - - ------------------------------------------------------------ - procedure AffirmPassed( AlertLogID : AlertLogIDType ; Message : string ; Enable : boolean := FALSE ) ; - procedure AffirmPassed( Message : string ; Enable : boolean := FALSE ) ; - procedure AffirmError( AlertLogID : AlertLogIDType ; Message : string ) ; - procedure AffirmError( Message : string ) ; - - ------------------------------------------------------------ - procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : std_logic ; Message : string := "" ; Enable : boolean := FALSE ) ; - procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : std_logic_vector ; Message : string := "" ; Enable : boolean := FALSE ) ; - procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : unsigned ; Message : string := "" ; Enable : boolean := FALSE ) ; - procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : signed ; Message : string := "" ; Enable : boolean := FALSE ); - procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : integer ; Message : string := "" ; Enable : boolean := FALSE ) ; - procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : real ; Message : string := "" ; Enable : boolean := FALSE ) ; - procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : character ; Message : string := "" ; Enable : boolean := FALSE ) ; - procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : string ; Message : string := "" ; Enable : boolean := FALSE ) ; - procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : time ; Message : string := "" ; Enable : boolean := FALSE ) ; - - -- Without AlertLogID - ------------------------------------------------------------ - procedure AffirmIfEqual( Received, Expected : std_logic ; Message : string := "" ; Enable : boolean := FALSE ) ; - procedure AffirmIfEqual( Received, Expected : std_logic_vector ; Message : string := "" ; Enable : boolean := FALSE ) ; - procedure AffirmIfEqual( Received, Expected : unsigned ; Message : string := "" ; Enable : boolean := FALSE ) ; - procedure AffirmIfEqual( Received, Expected : signed ; Message : string := "" ; Enable : boolean := FALSE ) ; - procedure AffirmIfEqual( Received, Expected : integer ; Message : string := "" ; Enable : boolean := FALSE ) ; - procedure AffirmIfEqual( Received, Expected : real ; Message : string := "" ; Enable : boolean := FALSE ) ; - procedure AffirmIfEqual( Received, Expected : character ; Message : string := "" ; Enable : boolean := FALSE ) ; - procedure AffirmIfEqual( Received, Expected : string ; Message : string := "" ; Enable : boolean := FALSE ) ; - procedure AffirmIfEqual( Received, Expected : time ; Message : string := "" ; Enable : boolean := FALSE ) ; - - ------------------------------------------------------------ - procedure AffirmIfDiff (AlertLogID : AlertLogIDType ; Name1, Name2 : string; Message : string := "" ; Enable : boolean := FALSE ) ; - procedure AffirmIfDiff (Name1, Name2 : string; Message : string := "" ; Enable : boolean := FALSE ) ; - procedure AffirmIfDiff (AlertLogID : AlertLogIDType ; file File1, File2 : text; Message : string := "" ; Enable : boolean := FALSE ) ; - procedure AffirmIfDiff (file File1, File2 : text; Message : string := "" ; Enable : boolean := FALSE ) ; - - ------------------------------------------------------------ - procedure SetAlertLogJustify ; - procedure ReportAlerts ( Name : String ; AlertCount : AlertCountType ) ; - procedure ReportAlerts ( Name : string := OSVVM_STRING_INIT_PARM_DETECT ; AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID ; ExternalErrors : AlertCountType := (others => 0) ) ; - procedure ReportNonZeroAlerts ( Name : string := OSVVM_STRING_INIT_PARM_DETECT ; AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID ; ExternalErrors : AlertCountType := (others => 0) ) ; - procedure ClearAlerts ; - function "ABS" (L : AlertCountType) return AlertCountType ; - function "+" (L, R : AlertCountType) return AlertCountType ; - function "-" (L, R : AlertCountType) return AlertCountType ; - function "-" (R : AlertCountType) return AlertCountType ; - impure function SumAlertCount(AlertCount: AlertCountType) return integer ; - impure function GetAlertCount(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return AlertCountType ; - impure function GetAlertCount(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return integer ; - impure function GetEnabledAlertCount(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return AlertCountType ; - impure function GetEnabledAlertCount(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return integer ; - impure function GetDisabledAlertCount return AlertCountType ; - impure function GetDisabledAlertCount return integer ; - impure function GetDisabledAlertCount(AlertLogID: AlertLogIDType) return AlertCountType ; - impure function GetDisabledAlertCount(AlertLogID: AlertLogIDType) return integer ; - - ------------------------------------------------------------ - -- log filtering for verbosity control, optionally has a separate file parameter - procedure Log( - AlertLogID : AlertLogIDType ; - Message : string ; - Level : LogType := ALWAYS ; - Enable : boolean := FALSE -- override internal enable - ) ; - procedure Log( Message : string ; Level : LogType := ALWAYS ; Enable : boolean := FALSE) ; - - ------------------------------------------------------------ - -- Accessor Methods - procedure SetAlertLogName(Name : string ) ; - impure function GetAlertLogName(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return string ; - procedure DeallocateAlertLogStruct ; - procedure InitializeAlertLogStruct ; - impure function FindAlertLogID(Name : string ) return AlertLogIDType ; - impure function FindAlertLogID(Name : string ; ParentID : AlertLogIDType) return AlertLogIDType ; - impure function GetAlertLogID(Name : string ; ParentID : AlertLogIDType := ALERTLOG_BASE_ID ; CreateHierarchy : Boolean := TRUE) return AlertLogIDType ; - impure function GetAlertLogParentID(AlertLogID : AlertLogIDType) return AlertLogIDType ; - - ------------------------------------------------------------ - -- Accessor Methods - procedure SetGlobalAlertEnable (A : boolean := TRUE) ; - impure function SetGlobalAlertEnable (A : boolean := TRUE) return boolean ; - impure function GetGlobalAlertEnable return boolean ; - procedure IncAffirmCount ; - impure function GetAffirmCount return natural ; ---?? procedure IncAffirmPassCount ; ---?? impure function GetAffirmPassCount return natural ; - - procedure SetAlertStopCount(AlertLogID : AlertLogIDType ; Level : AlertType ; Count : integer) ; - procedure SetAlertStopCount(Level : AlertType ; Count : integer) ; - impure function GetAlertStopCount(AlertLogID : AlertLogIDType ; Level : AlertType) return integer ; - impure function GetAlertStopCount(Level : AlertType) return integer ; - - procedure SetAlertEnable(Level : AlertType ; Enable : boolean) ; - procedure SetAlertEnable(AlertLogID : AlertLogIDType ; Level : AlertType ; Enable : boolean ; DescendHierarchy : boolean := TRUE) ; - impure function GetAlertEnable(AlertLogID : AlertLogIDType ; Level : AlertType) return boolean ; - impure function GetAlertEnable(Level : AlertType) return boolean ; - alias IsAlertEnabled is GetAlertEnable[AlertLogIDType, AlertType return boolean] ; - alias IsAlertEnabled is GetAlertEnable[AlertType return boolean] ; - - procedure SetLogEnable(Level : LogType ; Enable : boolean) ; - procedure SetLogEnable(AlertLogID : AlertLogIDType ; Level : LogType ; Enable : boolean ; DescendHierarchy : boolean := TRUE) ; - impure function GetLogEnable(AlertLogID : AlertLogIDType ; Level : LogType) return boolean ; - impure function GetLogEnable(Level : LogType) return boolean ; - alias IsLogEnabled is GetLogEnable [AlertLogIDType, LogType return boolean] ; -- same as GetLogEnable - alias IsLogEnabled is GetLogEnable [LogType return boolean] ; -- same as GetLogEnable - - procedure ReportLogEnables ; - - ------------------------------------------------------------ - procedure SetAlertLogOptions ( - FailOnWarning : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - FailOnDisabledErrors : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - ReportHierarchy : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - WriteAlertLevel : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - WriteAlertName : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - WriteAlertTime : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - WriteLogLevel : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - WriteLogName : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - WriteLogTime : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - AlertPrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; - LogPrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; - ReportPrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; - DoneName : string := OSVVM_STRING_INIT_PARM_DETECT ; - PassName : string := OSVVM_STRING_INIT_PARM_DETECT ; - FailName : string := OSVVM_STRING_INIT_PARM_DETECT - ) ; - - procedure ReportAlertLogOptions ; - - impure function GetAlertLogFailOnWarning return AlertLogOptionsType ; - impure function GetAlertLogFailOnDisabledErrors return AlertLogOptionsType ; - impure function GetAlertLogReportHierarchy return AlertLogOptionsType ; - impure function GetAlertLogFoundReportHier return boolean ; - impure function GetAlertLogFoundAlertHier return boolean ; - impure function GetAlertLogWriteAlertLevel return AlertLogOptionsType ; - impure function GetAlertLogWriteAlertName return AlertLogOptionsType ; - impure function GetAlertLogWriteAlertTime return AlertLogOptionsType ; - impure function GetAlertLogWriteLogLevel return AlertLogOptionsType ; - impure function GetAlertLogWriteLogName return AlertLogOptionsType ; - impure function GetAlertLogWriteLogTime return AlertLogOptionsType ; - - impure function GetAlertLogAlertPrefix return string ; - impure function GetAlertLogLogPrefix return string ; - - impure function GetAlertLogReportPrefix return string ; - impure function GetAlertLogDoneName return string ; - impure function GetAlertLogPassName return string ; - impure function GetAlertLogFailName return string ; - - - -- File Reading Utilities - function IsLogEnableType (Name : String) return boolean ; - procedure ReadLogEnables (file AlertLogInitFile : text) ; - procedure ReadLogEnables (FileName : string) ; - - -- String Helper Functions -- This should be in a more general string package - function PathTail (A : string) return string ; - - - -- ------------------------------------------------------------ - -- Deprecated - -- - - -- deprecated - procedure AlertIf( condition : boolean ; AlertLogID : AlertLogIDType ; Message : string ; Level : AlertType := ERROR ) ; - impure function AlertIf( condition : boolean ; AlertLogID : AlertLogIDType ; Message : string ; Level : AlertType := ERROR ) return boolean ; - - -- deprecated - procedure AlertIfNot( condition : boolean ; AlertLogID : AlertLogIDType ; Message : string ; Level : AlertType := ERROR ) ; - impure function AlertIfNot( condition : boolean ; AlertLogID : AlertLogIDType ; Message : string ; Level : AlertType := ERROR ) return boolean ; - - -- deprecated - procedure AffirmIf( - AlertLogID : AlertLogIDType ; - condition : boolean ; - Message : string ; - LogLevel : LogType ; -- := PASSED - AlertLevel : AlertType := ERROR - ) ; - procedure AffirmIf( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; AlertLevel : AlertType ) ; - procedure AffirmIf(condition : boolean ; Message : string ; LogLevel : LogType ; AlertLevel : AlertType := ERROR) ; - procedure AffirmIf(condition : boolean ; Message : string ; AlertLevel : AlertType ) ; - - alias IncAffirmCheckCount is IncAffirmCount [] ; - alias GetAffirmCheckCount is GetAffirmCount [return natural] ; - alias IsLoggingEnabled is GetLogEnable [AlertLogIDType, LogType return boolean] ; -- same as IsLogEnabled - alias IsLoggingEnabled is GetLogEnable [LogType return boolean] ; -- same as IsLogEnabled - - -end AlertLogPkg ; - ---- /////////////////////////////////////////////////////////////////////////// ---- /////////////////////////////////////////////////////////////////////////// ---- /////////////////////////////////////////////////////////////////////////// - -use work.NamePkg.all ; - -package body AlertLogPkg is - - -- instead of justify(to_upper(to_string())), just look up the upper case, left justified values - type AlertNameType is array(AlertType) of string(1 to 7) ; - constant ALERT_NAME : AlertNameType := (WARNING => "WARNING", ERROR => "ERROR ", FAILURE => "FAILURE") ; -- , NEVER => "NEVER " - type LogNameType is array(LogType) of string(1 to 7) ; - constant LOG_NAME : LogNameType := (DEBUG => "DEBUG ", FINAL => "FINAL ", INFO => "INFO ", ALWAYS => "ALWAYS ", PASSED => "PASSED ") ; -- , NEVER => "NEVER " - - - type AlertLogStructPType is protected - - ------------------------------------------------------------ - procedure alert ( - ------------------------------------------------------------ - AlertLogID : AlertLogIDType ; - message : string ; - level : AlertType := ERROR - ) ; - - ------------------------------------------------------------ - procedure IncAlertCount ( AlertLogID : AlertLogIDType ; level : AlertType := ERROR ) ; - procedure SetJustify ; - procedure ReportAlerts ( Name : string ; AlertCount : AlertCountType ) ; - procedure ReportAlerts ( Name : string := OSVVM_STRING_INIT_PARM_DETECT ; AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID ; ExternalErrors : AlertCountType := (0,0,0) ; ReportAll : boolean := TRUE ) ; - procedure ClearAlerts ; - impure function GetAlertCount(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return AlertCountType ; - impure function GetEnabledAlertCount(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return AlertCountType ; - impure function GetDisabledAlertCount return AlertCountType ; - impure function GetDisabledAlertCount(AlertLogID: AlertLogIDType) return AlertCountType ; - - ------------------------------------------------------------ - procedure log ( - ------------------------------------------------------------ - AlertLogID : AlertLogIDType ; - Message : string ; - Level : LogType := ALWAYS ; - Enable : boolean := FALSE -- override internal enable - ) ; - - ------------------------------------------------------------ - -- FILE IO Controls --- procedure SetTranscriptEnable (A : boolean := TRUE) ; --- impure function IsTranscriptEnabled return boolean ; --- procedure MirrorTranscript (A : boolean := TRUE) ; --- impure function IsTranscriptMirrored return boolean ; - - ------------------------------------------------------------ - ------------------------------------------------------------ - -- AlertLog Structure Creation and Interaction Methods - - ------------------------------------------------------------ - procedure SetAlertLogName(Name : string ) ; - procedure SetNumAlertLogIDs (NewNumAlertLogIDs : AlertLogIDType) ; - impure function FindAlertLogID(Name : string ) return AlertLogIDType ; - impure function FindAlertLogID(Name : string ; ParentID : AlertLogIDType) return AlertLogIDType ; - impure function GetAlertLogID(Name : string ; ParentID : AlertLogIDType ; CreateHierarchy : Boolean) return AlertLogIDType ; - impure function GetAlertLogParentID(AlertLogID : AlertLogIDType) return AlertLogIDType ; - procedure Initialize(NewNumAlertLogIDs : AlertLogIDType := MIN_NUM_AL_IDS) ; - procedure Deallocate ; - - ------------------------------------------------------------ - ------------------------------------------------------------ - -- Accessor Methods - ------------------------------------------------------------ - procedure SetGlobalAlertEnable (A : boolean := TRUE) ; - impure function GetAlertLogName(AlertLogID : AlertLogIDType) return string ; - impure function GetGlobalAlertEnable return boolean ; - procedure IncAffirmCount ; - impure function GetAffirmCount return natural ; ---?? procedure IncAffirmPassCount ; ---?? impure function GetAffirmPassCount return natural ; - - procedure SetAlertStopCount(AlertLogID : AlertLogIDType ; Level : AlertType ; Count : integer) ; - impure function GetAlertStopCount(AlertLogID : AlertLogIDType ; Level : AlertType) return integer ; - - procedure SetAlertEnable(Level : AlertType ; Enable : boolean) ; - procedure SetAlertEnable(AlertLogID : AlertLogIDType ; Level : AlertType ; Enable : boolean ; DescendHierarchy : boolean := TRUE) ; - impure function GetAlertEnable(AlertLogID : AlertLogIDType ; Level : AlertType) return boolean ; - - procedure SetLogEnable(Level : LogType ; Enable : boolean) ; - procedure SetLogEnable(AlertLogID : AlertLogIDType ; Level : LogType ; Enable : boolean ; DescendHierarchy : boolean := TRUE) ; - impure function GetLogEnable(AlertLogID : AlertLogIDType ; Level : LogType) return boolean ; - - procedure ReportLogEnables ; - - ------------------------------------------------------------ - -- Reporting Accessor - procedure SetAlertLogOptions ( - FailOnWarning : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - FailOnDisabledErrors : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - ReportHierarchy : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - WriteAlertLevel : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - WriteAlertName : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - WriteAlertTime : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - WriteLogLevel : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - WriteLogName : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - WriteLogTime : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - AlertPrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; - LogPrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; - ReportPrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; - DoneName : string := OSVVM_STRING_INIT_PARM_DETECT ; - PassName : string := OSVVM_STRING_INIT_PARM_DETECT ; - FailName : string := OSVVM_STRING_INIT_PARM_DETECT - ) ; - procedure ReportAlertLogOptions ; - - impure function GetAlertLogFailOnWarning return AlertLogOptionsType ; - impure function GetAlertLogFailOnDisabledErrors return AlertLogOptionsType ; - impure function GetAlertLogReportHierarchy return AlertLogOptionsType ; - impure function GetAlertLogFoundReportHier return boolean ; - impure function GetAlertLogFoundAlertHier return boolean ; - impure function GetAlertLogWriteAlertLevel return AlertLogOptionsType ; - impure function GetAlertLogWriteAlertName return AlertLogOptionsType ; - impure function GetAlertLogWriteAlertTime return AlertLogOptionsType ; - impure function GetAlertLogWriteLogLevel return AlertLogOptionsType ; - impure function GetAlertLogWriteLogName return AlertLogOptionsType ; - impure function GetAlertLogWriteLogTime return AlertLogOptionsType ; - - impure function GetAlertLogAlertPrefix return string ; - impure function GetAlertLogLogPrefix return string ; - - impure function GetAlertLogReportPrefix return string ; - impure function GetAlertLogDoneName return string ; - impure function GetAlertLogPassName return string ; - impure function GetAlertLogFailName return string ; - - end protected AlertLogStructPType ; - - --- /////////////////////////////////////////////////////////////////////////// - - type AlertLogStructPType is protected body - - variable GlobalAlertEnabledVar : boolean := TRUE ; -- Allows turn off and on - - variable AffirmCheckCountVar : natural := 0 ; ---?? variable AffirmPassedCountVar : natural := 0 ; - - ------------------------------------------------------------ - type AlertLogRecType is record - ------------------------------------------------------------ - Name : Line ; - ParentID : AlertLogIDType ; - AlertCount : AlertCountType ; - AlertStopCount : AlertCountType ; - AlertEnabled : AlertEnableType ; - LogEnabled : LogEnableType ; - end record AlertLogRecType ; - - ------------------------------------------------------------ - -- Basis for AlertLog Data Structure - variable NumAlertLogIDsVar : AlertLogIDType := 0 ; -- defined by initialize - variable NumAllocatedAlertLogIDsVar : AlertLogIDType := 0 ; ---xx variable NumPredefinedAlIDsVar : AlertLogIDType := 0 ; -- defined by initialize - - type AlertLogRecPtrType is access AlertLogRecType ; - type AlertLogArrayType is array (AlertLogIDType range <>) of AlertLogRecPtrType ; - type AlertLogArrayPtrType is access AlertLogArrayType ; - variable AlertLogPtr : AlertLogArrayPtrType ; - - ------------------------------------------------------------ - -- Report formatting settings, with defaults - variable FailOnWarningVar : boolean := TRUE ; - variable FailOnDisabledErrorsVar : boolean := TRUE ; - variable ReportHierarchyVar : boolean := TRUE ; - variable FoundReportHierVar : boolean := FALSE ; - variable FoundAlertHierVar : boolean := FALSE ; - - variable WriteAlertLevelVar : boolean := TRUE ; - variable WriteAlertNameVar : boolean := TRUE ; - variable WriteAlertTimeVar : boolean := TRUE ; - variable WriteLogLevelVar : boolean := TRUE ; - variable WriteLogNameVar : boolean := TRUE ; - variable WriteLogTimeVar : boolean := TRUE ; - - variable AlertPrefixVar : NamePType ; - variable LogPrefixVar : NamePType ; - variable ReportPrefixVar : NamePType ; - variable DoneNameVar : NamePType ; - variable PassNameVar : NamePType ; - variable FailNameVar : NamePType ; - - variable AlertLogJustifyAmountVar : integer := 0 ; - variable ReportJustifyAmountVar : integer := 0 ; - - ------------------------------------------------------------ - -- PT Local - impure function LeftJustify(A : String; Amount : integer) return string is - ------------------------------------------------------------ - constant Spaces : string(1 to maximum(1, Amount)) := (others => ' ') ; - begin - if A'length >= Amount then - return A ; - else - return A & Spaces(1 to Amount - A'length) ; - end if ; - end function LeftJustify ; - - - ------------------------------------------------------------ - -- PT Local - procedure IncrementAlertCount( - ------------------------------------------------------------ - constant AlertLogID : in AlertLogIDType ; - constant Level : in AlertType ; - variable StopDueToCount : inout boolean - ) is - begin - -- Always Count at this level - AlertLogPtr(AlertLogID).AlertCount(Level) := AlertLogPtr(AlertLogID).AlertCount(Level) + 1 ; - -- Only do remaining actions if enabled - if AlertLogPtr(AlertLogID).AlertEnabled(Level) then - -- Exceeded Stop Count at this level? - if AlertLogPtr(AlertLogID).AlertCount(Level) >= AlertLogPtr(AlertLogID).AlertStopCount(Level) then - StopDueToCount := TRUE ; - end if ; - -- Propagate counts to parent(s) -- Ascend Hierarchy - if AlertLogID /= ALERTLOG_BASE_ID then - IncrementAlertCount(AlertLogPtr(AlertLogID).ParentID, Level, StopDueToCount) ; - end if ; - end if ; - end procedure IncrementAlertCount ; - - ------------------------------------------------------------ - procedure alert ( - ------------------------------------------------------------ - AlertLogID : AlertLogIDType ; - message : string ; - level : AlertType := ERROR - ) is - variable buf : Line ; - constant AlertPrefix : string := AlertPrefixVar.Get(OSVVM_DEFAULT_ALERT_PREFIX) ; - variable StopDueToCount : boolean := FALSE ; - begin - if GlobalAlertEnabledVar then - -- Do not write or count when GlobalAlertEnabledVar is disabled - if AlertLogPtr(AlertLogID).AlertEnabled(Level) then - -- do not write when disabled - write(buf, AlertPrefix) ; - if WriteAlertLevelVar then - -- write(buf, " " & to_string(Level) ) ; - write(buf, " " & ALERT_NAME(Level)) ; -- uses constant lookup - end if ; ---xx if (NumAlertLogIDsVar > NumPredefinedAlIDsVar) and WriteAlertNameVar then -- print hierarchy names even when silent - if FoundAlertHierVar and WriteAlertNameVar then --- write(buf, " in " & justify(AlertLogPtr(AlertLogID).Name.all & ",", LEFT, AlertLogJustifyAmountVar) ) ; - write(buf, " in " & LeftJustify(AlertLogPtr(AlertLogID).Name.all & ",", AlertLogJustifyAmountVar) ) ; - end if ; - write(buf, " " & Message) ; - if WriteAlertTimeVar then - write(buf, " at " & to_string(NOW, 1 ns)) ; - end if ; - writeline(buf) ; - end if ; - -- Always Count - IncrementAlertCount(AlertLogID, Level, StopDueToCount) ; - if StopDueToCount then - write(buf, LF & AlertPrefix & " Stop Count on " & ALERT_NAME(Level) & " reached") ; ---xx if NumAlertLogIDsVar > NumPredefinedAlIDsVar then -- print hierarchy names even when silent - if FoundAlertHierVar then - write(buf, " in " & AlertLogPtr(AlertLogID).Name.all) ; - end if ; - write(buf, " at " & to_string(NOW, 1 ns) & " ") ; - writeline(buf) ; - ReportAlerts(ReportAll => TRUE) ; - std.env.stop(1) ; - end if ; - end if ; - end procedure alert ; - - ------------------------------------------------------------ - procedure IncAlertCount ( - ------------------------------------------------------------ - AlertLogID : AlertLogIDType ; - level : AlertType := ERROR - ) is - variable buf : Line ; - constant AlertPrefix : string := AlertPrefixVar.Get(OSVVM_DEFAULT_ALERT_PREFIX) ; - variable StopDueToCount : boolean := FALSE ; - begin - if GlobalAlertEnabledVar then - IncrementAlertCount(AlertLogID, Level, StopDueToCount) ; - if StopDueToCount then - write(buf, LF & AlertPrefix & " Stop Count on " & ALERT_NAME(Level) & " reached") ; ---xx if NumAlertLogIDsVar > NumPredefinedAlIDsVar then -- print hierarchy names even when silent - if FoundAlertHierVar then - write(buf, " in " & AlertLogPtr(AlertLogID).Name.all) ; - end if ; - write(buf, " at " & to_string(NOW, 1 ns) & " ") ; - writeline(buf) ; - ReportAlerts(ReportAll => TRUE) ; - std.env.stop ; - end if ; - end if ; - end procedure IncAlertCount ; - - ------------------------------------------------------------ - -- PT Local - impure function CalcJustify (AlertLogID : AlertLogIDType ; CurrentLength : integer ; IndentAmount : integer) return integer_vector is - ------------------------------------------------------------ - variable ResultValues, LowerLevelValues : integer_vector(1 to 2) ; -- 1 = Max, 2 = Indented - begin - ResultValues(1) := CurrentLength + 1 ; -- AlertLogJustifyAmountVar - ResultValues(2) := CurrentLength + IndentAmount ; -- ReportJustifyAmountVar - for i in AlertLogID+1 to NumAlertLogIDsVar loop - if AlertLogID = AlertLogPtr(i).ParentID then - LowerLevelValues := CalcJustify(i, AlertLogPtr(i).Name'length, IndentAmount + 2) ; - ResultValues(1) := maximum(ResultValues(1), LowerLevelValues(1)) ; - ResultValues(2) := maximum(ResultValues(2), LowerLevelValues(2)) ; - end if ; - end loop ; - return ResultValues ; - end function CalcJustify ; - - ------------------------------------------------------------ - procedure SetJustify is - ------------------------------------------------------------ - variable ResultValues : integer_vector(1 to 2) ; -- 1 = Max, 2 = Indented - begin - ResultValues := CalcJustify(ALERTLOG_BASE_ID, 0, 0) ; - AlertLogJustifyAmountVar := ResultValues(1) ; - ReportJustifyAmountVar := ResultValues(2) ; - end procedure SetJustify ; - - ------------------------------------------------------------ - -- PT Local - impure function GetEnabledAlertCount(AlertCount: AlertCountType; AlertEnabled : AlertEnableType) return AlertCountType is - ------------------------------------------------------------ - variable Count : AlertCountType := (others => 0) ; - begin - if AlertEnabled(FAILURE) then - Count(FAILURE) := AlertCount(FAILURE) ; - end if ; - if AlertEnabled(ERROR) then - Count(ERROR) := AlertCount(ERROR) ; - end if ; - if FailOnWarningVar and AlertEnabled(WARNING) then - Count(WARNING) := AlertCount(WARNING) ; - end if ; - return Count ; - end function GetEnabledAlertCount ; - - ------------------------------------------------------------ - impure function GetAlertCount(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return AlertCountType is - ------------------------------------------------------------ - variable AlertCount : AlertCountType ; - begin - return AlertLogPtr(AlertLogID).AlertCount ; - end function GetAlertCount ; - - ------------------------------------------------------------ - impure function GetEnabledAlertCount(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return AlertCountType is - ------------------------------------------------------------ - variable AlertCount : AlertCountType ; - begin - return GetEnabledAlertCount(AlertLogPtr(AlertLogID).AlertCount, AlertLogPtr(AlertLogID).AlertEnabled) ; - end function GetEnabledAlertCount ; - - ------------------------------------------------------------ - -- PT Local - impure function GetDisabledAlertCount(AlertCount: AlertCountType; AlertEnabled : AlertEnableType) return AlertCountType is - ------------------------------------------------------------ - variable Count : AlertCountType := (others => 0) ; - begin - if not AlertEnabled(FAILURE) then - Count(FAILURE) := AlertCount(FAILURE) ; - end if ; - if not AlertEnabled(ERROR) then - Count(ERROR) := AlertCount(ERROR) ; - end if ; - if FailOnWarningVar and not AlertEnabled(WARNING) then - Count(WARNING) := AlertCount(WARNING) ; - end if ; - return Count ; - end function GetDisabledAlertCount ; - - ------------------------------------------------------------ - impure function GetDisabledAlertCount return AlertCountType is - ------------------------------------------------------------ - variable Count : AlertCountType := (others => 0) ; - begin - for i in ALERTLOG_BASE_ID to NumAlertLogIDsVar loop - Count := Count + GetDisabledAlertCount(AlertLogPtr(i).AlertCount, AlertLogPtr(i).AlertEnabled) ; - end loop ; - return Count ; - end function GetDisabledAlertCount ; - - ------------------------------------------------------------ - impure function GetDisabledAlertCount(AlertLogID: AlertLogIDType) return AlertCountType is - ------------------------------------------------------------ - variable Count : AlertCountType := (others => 0) ; - begin - Count := GetDisabledAlertCount(AlertLogPtr(AlertLogID).AlertCount, AlertLogPtr(AlertLogID).AlertEnabled) ; - for i in AlertLogID+1 to NumAlertLogIDsVar loop - if AlertLogID = AlertLogPtr(i).ParentID then - Count := Count + GetDisabledAlertCount(i) ; - end if ; - end loop ; - return Count ; - end function GetDisabledAlertCount ; - - ------------------------------------------------------------ - -- PT Local - procedure PrintTopAlerts ( - ------------------------------------------------------------ - NumErrors : integer ; - AlertCount : AlertCountType ; - Name : string ; - NumDisabledErrors : integer - ) is - constant ReportPrefix : string := ResolveOsvvmWritePrefix(ReportPrefixVar.GetOpt ) ; - constant DoneName : string := ResolveOsvvmDoneName(DoneNameVar.GetOpt ) ; - constant PassName : string := ResolveOsvvmPassName(PassNameVar.GetOpt ) ; - constant FailName : string := ResolveOsvvmFailName(FailNameVar.GetOpt ) ; - variable buf : line ; - begin - if NumErrors = 0 then - if NumDisabledErrors = 0 then - -- Passed - write(buf, ReportPrefix & DoneName & " " & PassName & " " & Name) ; - if AffirmCheckCountVar > 0 then - write(buf, " Affirmations Checked: " & to_string(AffirmCheckCountVar)) ; - end if ; - write(buf, " at " & to_string(NOW, 1 ns)) ; - WriteLine(buf) ; - else - -- Failed Due to Disabled Errors - write(buf, ReportPrefix & DoneName & " " & FailName & " " & Name) ; - write(buf, " Failed Due to Disabled Error(s) = " & to_string(NumDisabledErrors)) ; - if AffirmCheckCountVar > 0 then - write(buf, " Affirmations Checked: " & to_string(AffirmCheckCountVar)) ; - end if ; - write(buf, " at " & to_string(NOW, 1 ns)) ; - WriteLine(buf) ; - end if ; - else - -- Failed - write(buf, ReportPrefix & DoneName & " " & FailName & " "& Name) ; - write(buf, " Total Error(s) = " & to_string(NumErrors) ) ; - write(buf, " Failures: " & to_string(AlertCount(FAILURE)) ) ; - write(buf, " Errors: " & to_string(AlertCount(ERROR) ) ) ; - write(buf, " Warnings: " & to_string(AlertCount(WARNING) ) ) ; - if AffirmCheckCountVar > 0 then ---?? write(buf, " Affirmations Passed: " & to_string(AffirmPassedCountVar)) ; ---?? write(buf, " Checked: " & to_string(AffirmCheckCountVar)) ; - write(buf, " Affirmations Checked: " & to_string(AffirmCheckCountVar)) ; - end if ; - Write(buf, " at " & to_string(NOW, 1 ns)) ; - WriteLine(buf) ; - end if ; - end procedure PrintTopAlerts ; - - ------------------------------------------------------------ - -- PT Local - procedure PrintChild( - ------------------------------------------------------------ - AlertLogID : AlertLogIDType ; - Prefix : string ; - IndentAmount : integer ; - ReportAll : boolean - ) is - variable buf : line ; - begin - for i in AlertLogID+1 to NumAlertLogIDsVar loop - if AlertLogID = AlertLogPtr(i).ParentID then - if ReportAll or SumAlertCount(AlertLogPtr(i).AlertCount) > 0 then - Write(buf, Prefix & " " & LeftJustify(AlertLogPtr(i).Name.all, ReportJustifyAmountVar - IndentAmount)) ; - write(buf, " Failures: " & to_string(AlertLogPtr(i).AlertCount(FAILURE) ) ) ; - write(buf, " Errors: " & to_string(AlertLogPtr(i).AlertCount(ERROR) ) ) ; - write(buf, " Warnings: " & to_string(AlertLogPtr(i).AlertCount(WARNING) ) ) ; - WriteLine(buf) ; - end if ; - PrintChild( - AlertLogID => i, - Prefix => Prefix & " ", - IndentAmount => IndentAmount + 2, - ReportAll => ReportAll - ) ; - end if ; - end loop ; - end procedure PrintChild ; - - ------------------------------------------------------------ - procedure ReportAlerts ( Name : string := OSVVM_STRING_INIT_PARM_DETECT ; AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID ; ExternalErrors : AlertCountType := (0,0,0) ; ReportAll : boolean := TRUE) is - ------------------------------------------------------------ - variable NumErrors : integer ; - variable NumDisabledErrors : integer ; - constant ReportPrefix : string := ResolveOsvvmWritePrefix(ReportPrefixVar.GetOpt) ; - begin - if ReportJustifyAmountVar <= 0 then - SetJustify ; - end if ; - NumErrors := SumAlertCount( ExternalErrors + GetEnabledAlertCount(AlertLogPtr(AlertLogID).AlertCount, AlertLogPtr(AlertLogID).AlertEnabled) ) ; - if FailOnDisabledErrorsVar then - NumDisabledErrors := SumAlertCount( GetDisabledAlertCount(AlertLogID) ) ; - else - NumDisabledErrors := 0 ; - end if ; - if IsOsvvmStringSet(Name) then - PrintTopAlerts ( - NumErrors => NumErrors, - AlertCount => AlertLogPtr(AlertLogID).AlertCount + ExternalErrors, - Name => Name, - NumDisabledErrors => NumDisabledErrors - ) ; - else - PrintTopAlerts ( - NumErrors => NumErrors, - AlertCount => AlertLogPtr(AlertLogID).AlertCount + ExternalErrors, - Name => AlertLogPtr(AlertLogID).Name.all, - NumDisabledErrors => NumDisabledErrors - ) ; - end if ; - --Print Hierarchy when enabled and error or disabled error - if (FoundReportHierVar and ReportHierarchyVar) and (NumErrors /= 0 or NumDisabledErrors /=0) then - PrintChild( - AlertLogID => AlertLogID, - Prefix => ReportPrefix & " ", - IndentAmount => 2, - ReportAll => ReportAll - ) ; - end if ; - end procedure ReportAlerts ; - - ------------------------------------------------------------ - procedure ReportAlerts ( Name : string ; AlertCount : AlertCountType ) is - ------------------------------------------------------------ - begin - PrintTopAlerts ( - NumErrors => SumAlertCount(AlertCount), - AlertCount => AlertCount, - Name => Name, - NumDisabledErrors => 0 - ) ; - end procedure ReportAlerts ; - - ------------------------------------------------------------ - procedure ClearAlerts is - ------------------------------------------------------------ - begin - AffirmCheckCountVar := 0 ; ---?? AffirmPassedCountVar := 0 ; - - AlertLogPtr(ALERTLOG_BASE_ID).AlertCount := (0, 0, 0) ; - AlertLogPtr(ALERTLOG_BASE_ID).AlertStopCount := (FAILURE => 0, ERROR => integer'right, WARNING => integer'right) ; - - for i in ALERTLOG_BASE_ID + 1 to NumAlertLogIDsVar loop - AlertLogPtr(i).AlertCount := (0, 0, 0) ; - AlertLogPtr(i).AlertStopCount := (FAILURE => integer'right, ERROR => integer'right, WARNING => integer'right) ; - end loop ; - end procedure ClearAlerts ; - - ------------------------------------------------------------ - -- PT Local - procedure LocalLog ( - ------------------------------------------------------------ - AlertLogID : AlertLogIDType ; - Message : string ; - Level : LogType - ) is - variable buf : line ; - constant LogPrefix : string := LogPrefixVar.Get(OSVVM_DEFAULT_LOG_PREFIX) ; - begin - write(buf, LogPrefix) ; - if WriteLogLevelVar then - write(buf, " " & LOG_NAME(Level) ) ; - end if ; ---xx if (NumAlertLogIDsVar > NumPredefinedAlIDsVar) and WriteLogNameVar then -- print hierarchy names even when silent - if FoundAlertHierVar and WriteLogNameVar then --- write(buf, " in " & justify(AlertLogPtr(AlertLogID).Name.all & ",", LEFT, AlertLogJustifyAmountVar) ) ; - write(buf, " in " & LeftJustify(AlertLogPtr(AlertLogID).Name.all & ",", AlertLogJustifyAmountVar) ) ; - end if ; - write(buf, " " & Message) ; - if WriteLogTimeVar then - write(buf, " at " & to_string(NOW, 1 ns)) ; - end if ; - writeline(buf) ; - end procedure LocalLog ; - - ------------------------------------------------------------ - procedure log ( - ------------------------------------------------------------ - AlertLogID : AlertLogIDType ; - Message : string ; - Level : LogType := ALWAYS ; - Enable : boolean := FALSE -- override internal enable - ) is - begin - if Level = ALWAYS or Enable then - LocalLog(AlertLogID, Message, Level) ; - elsif AlertLogPtr(AlertLogID).LogEnabled(Level) then - LocalLog(AlertLogID, Message, Level) ; - end if ; - end procedure log ; - - ------------------------------------------------------------ - ------------------------------------------------------------ - -- AlertLog Structure Creation and Interaction Methods - - ------------------------------------------------------------ - procedure SetAlertLogName(Name : string ) is - ------------------------------------------------------------ - begin - Deallocate(AlertLogPtr(ALERTLOG_BASE_ID).Name) ; - AlertLogPtr(ALERTLOG_BASE_ID).Name := new string'(Name) ; - end procedure SetAlertLogName ; - - ------------------------------------------------------------ - impure function GetAlertLogName(AlertLogID : AlertLogIDType) return string is - ------------------------------------------------------------ - begin - return AlertLogPtr(AlertLogID).Name.all ; - end function GetAlertLogName ; - - ------------------------------------------------------------ - -- PT Local - procedure NewAlertLogRec(AlertLogID : AlertLogIDType ; Name : string ; ParentID : AlertLogIDType) is - ------------------------------------------------------------ - variable AlertEnabled : AlertEnableType ; - variable AlertStopCount : AlertCountType ; - variable LogEnabled : LogEnableType ; - begin - if AlertLogID = ALERTLOG_BASE_ID then - AlertEnabled := (TRUE, TRUE, TRUE) ; - LogEnabled := (others => FALSE) ; - AlertStopCount := (FAILURE => 0, ERROR => integer'right, WARNING => integer'right) ; - else - if ParentID < ALERTLOG_BASE_ID then - AlertEnabled := AlertLogPtr(ALERTLOG_BASE_ID).AlertEnabled ; - LogEnabled := AlertLogPtr(ALERTLOG_BASE_ID).LogEnabled ; - else - AlertEnabled := AlertLogPtr(ParentID).AlertEnabled ; - LogEnabled := AlertLogPtr(ParentID).LogEnabled ; - end if ; - AlertStopCount := (FAILURE => integer'right, ERROR => integer'right, WARNING => integer'right) ; - end if ; - AlertLogPtr(AlertLogID) := new AlertLogRecType ; - AlertLogPtr(AlertLogID).Name := new string'(NAME) ; - AlertLogPtr(AlertLogID).ParentID := ParentID ; - AlertLogPtr(AlertLogID).AlertCount := (0, 0, 0) ; - AlertLogPtr(AlertLogID).AlertEnabled := AlertEnabled ; - AlertLogPtr(AlertLogID).AlertStopCount := AlertStopCount ; - AlertLogPtr(AlertLogID).LogEnabled := LogEnabled ; --- AlertLogPtr(AlertLogID) := new AlertLogRecType'( --- Name => new string'(NAME), --- ParentID => ParentID, --- AlertCount => (0, 0, 0), --- AlertEnabled => AlertEnabled, --- AlertStopCount => AlertStopCount, --- LogEnabled => LogEnabled --- ) ; - end procedure NewAlertLogRec ; - - ------------------------------------------------------------ - -- PT Local - -- Construct initial data structure - procedure LocalInitialize(NewNumAlertLogIDs : AlertLogIDType := MIN_NUM_AL_IDS) is - ------------------------------------------------------------ - begin - if NumAllocatedAlertLogIDsVar /= 0 then - Alert(ALERT_DEFAULT_ID, "AlertLogPkg: Initialize, data structure already initialized", FAILURE) ; - return ; - end if ; - -- Initialize Pointer - AlertLogPtr := new AlertLogArrayType(ALERTLOG_BASE_ID to ALERTLOG_BASE_ID + NewNumAlertLogIDs) ; - NumAllocatedAlertLogIDsVar := NewNumAlertLogIDs ; - -- Create BASE AlertLogID (if it differs from DEFAULT - if ALERTLOG_BASE_ID /= ALERT_DEFAULT_ID then - NewAlertLogRec(ALERTLOG_BASE_ID, "AlertLogTop", ALERTLOG_BASE_ID) ; - end if ; - -- Create DEFAULT AlertLogID - NewAlertLogRec(ALERT_DEFAULT_ID, "Default", ALERTLOG_BASE_ID) ; - NumAlertLogIDsVar := ALERT_DEFAULT_ID ; - -- Create OSVVM AlertLogID (if it differs from DEFAULT - if OSVVM_ALERTLOG_ID /= ALERT_DEFAULT_ID then - NewAlertLogRec(OSVVM_ALERTLOG_ID, "OSVVM", ALERTLOG_BASE_ID) ; - NumAlertLogIDsVar := NumAlertLogIDsVar + 1 ; - end if ; - if OSVVM_SCOREBOARD_ALERTLOG_ID /= OSVVM_ALERTLOG_ID then - NewAlertLogRec(OSVVM_SCOREBOARD_ALERTLOG_ID, "OSVVM Scoreboard", ALERTLOG_BASE_ID) ; - NumAlertLogIDsVar := NumAlertLogIDsVar + 1 ; - end if ; - end procedure LocalInitialize ; - - ------------------------------------------------------------ - -- Construct initial data structure - procedure Initialize(NewNumAlertLogIDs : AlertLogIDType := MIN_NUM_AL_IDS) is - ------------------------------------------------------------ - begin - LocalInitialize(NewNumAlertLogIDs) ; - end procedure Initialize ; - - ------------------------------------------------------------ - -- PT Local - -- Constructs initial data structure using constant below - impure function LocalInitialize return boolean is - ------------------------------------------------------------ - begin - LocalInitialize(MIN_NUM_AL_IDS) ; - return TRUE ; - end function LocalInitialize ; - - constant CONSTRUCT_ALERT_DATA_STRUCTURE : boolean := LocalInitialize ; - - ------------------------------------------------------------ - procedure Deallocate is - ------------------------------------------------------------ - begin - for i in ALERTLOG_BASE_ID to NumAlertLogIDsVar loop - Deallocate(AlertLogPtr(i).Name) ; - Deallocate(AlertLogPtr(i)) ; - end loop ; - deallocate(AlertLogPtr) ; - -- Free up space used by protected types within AlertLogPkg - AlertPrefixVar.Deallocate ; - LogPrefixVar.Deallocate ; - ReportPrefixVar.Deallocate ; - DoneNameVar.Deallocate ; - PassNameVar.Deallocate ; - FailNameVar.Deallocate ; - -- Restore variables to their initial state - NumAlertLogIDsVar := 0 ; - NumAllocatedAlertLogIDsVar := 0 ; - GlobalAlertEnabledVar := TRUE ; -- Allows turn off and on - AffirmCheckCountVar := 0 ; ---?? AffirmPassedCountVar := 0 ; - FailOnWarningVar := TRUE ; - FailOnDisabledErrorsVar := TRUE ; - ReportHierarchyVar := TRUE ; - FoundReportHierVar := FALSE ; - FoundAlertHierVar := FALSE ; - WriteAlertLevelVar := TRUE ; - WriteAlertNameVar := TRUE ; - WriteAlertTimeVar := TRUE ; - WriteLogLevelVar := TRUE ; - WriteLogNameVar := TRUE ; - WriteLogTimeVar := TRUE ; - end procedure Deallocate ; - - ------------------------------------------------------------ - -- PT Local. - procedure GrowAlertStructure (NewNumAlertLogIDs : AlertLogIDType) is - ------------------------------------------------------------ - variable oldAlertLogPtr : AlertLogArrayPtrType ; - begin - if NumAllocatedAlertLogIDsVar = 0 then - Initialize (NewNumAlertLogIDs) ; -- Construct initial structure - else - oldAlertLogPtr := AlertLogPtr ; - AlertLogPtr := new AlertLogArrayType(ALERTLOG_BASE_ID to NewNumAlertLogIDs) ; - AlertLogPtr(ALERTLOG_BASE_ID to NumAlertLogIDsVar) := oldAlertLogPtr(ALERTLOG_BASE_ID to NumAlertLogIDsVar) ; - deallocate(oldAlertLogPtr) ; - end if ; - NumAllocatedAlertLogIDsVar := NewNumAlertLogIDs ; - end procedure GrowAlertStructure ; - - ------------------------------------------------------------ - -- Sets a AlertLogPtr to a particular size - -- Use for small bins to save space or large bins to - -- suppress the resize and copy as a CovBin autosizes. - procedure SetNumAlertLogIDs (NewNumAlertLogIDs : AlertLogIDType) is - ------------------------------------------------------------ - variable oldAlertLogPtr : AlertLogArrayPtrType ; - begin - if NewNumAlertLogIDs > NumAllocatedAlertLogIDsVar then - GrowAlertStructure(NewNumAlertLogIDs) ; - end if; - end procedure SetNumAlertLogIDs ; - - ------------------------------------------------------------ - -- PT Local - impure function GetNextAlertLogID return AlertLogIDType is - ------------------------------------------------------------ - variable NewNumAlertLogIDs : AlertLogIDType ; - begin - NewNumAlertLogIDs := NumAlertLogIDsVar + 1 ; - if NewNumAlertLogIDs > NumAllocatedAlertLogIDsVar then - GrowAlertStructure(NumAllocatedAlertLogIDsVar + MIN_NUM_AL_IDS) ; - end if ; - NumAlertLogIDsVar := NewNumAlertLogIDs ; - return NumAlertLogIDsVar ; - end function GetNextAlertLogID ; - - ------------------------------------------------------------ - impure function FindAlertLogID(Name : string ) return AlertLogIDType is - ------------------------------------------------------------ - begin - for i in ALERTLOG_BASE_ID to NumAlertLogIDsVar loop - if Name = AlertLogPtr(i).Name.all then - return i ; - end if ; - end loop ; - return ALERTLOG_ID_NOT_FOUND ; -- not found - end function FindAlertLogID ; - - ------------------------------------------------------------ - impure function FindAlertLogID(Name : string ; ParentID : AlertLogIDType) return AlertLogIDType is - ------------------------------------------------------------ - variable CurParentID : AlertLogIDType ; - begin - for i in ALERTLOG_BASE_ID to NumAlertLogIDsVar loop - CurParentID := AlertLogPtr(i).ParentID ; - if Name = AlertLogPtr(i).Name.all and - (CurParentID = ParentID or CurParentID = ALERTLOG_ID_NOT_ASSIGNED or ParentID = ALERTLOG_ID_NOT_ASSIGNED) - then - return i ; - end if ; - end loop ; - return ALERTLOG_ID_NOT_FOUND ; -- not found - end function FindAlertLogID ; - - ------------------------------------------------------------ - impure function GetAlertLogID(Name : string ; ParentID : AlertLogIDType ; CreateHierarchy : Boolean) return AlertLogIDType is - ------------------------------------------------------------ - variable ResultID : AlertLogIDType ; - begin - ResultID := FindAlertLogID(Name, ParentID) ; - if ResultID /= ALERTLOG_ID_NOT_FOUND then - -- found it, set ParentID - if AlertLogPtr(ResultID).ParentID = ALERTLOG_ID_NOT_ASSIGNED then - AlertLogPtr(ResultID).ParentID := ParentID ; - -- else -- do not update as ParentIDs are either same or input ParentID = ALERTLOG_ID_NOT_ASSIGNED - end if ; - else - ResultID := GetNextAlertLogID ; - NewAlertLogRec(ResultID, Name, ParentID) ; - FoundAlertHierVar := TRUE ; - if CreateHierarchy then - FoundReportHierVar := TRUE ; - end if ; - end if ; - return ResultID ; - end function GetAlertLogID ; - - ------------------------------------------------------------ - impure function GetAlertLogParentID(AlertLogID : AlertLogIDType) return AlertLogIDType is - ------------------------------------------------------------ - begin - return AlertLogPtr(AlertLogID).ParentID ; - end function GetAlertLogParentID ; - - ------------------------------------------------------------ - ------------------------------------------------------------ - -- Accessor Methods - ------------------------------------------------------------ - - ------------------------------------------------------------ - procedure SetGlobalAlertEnable (A : boolean := TRUE) is - ------------------------------------------------------------ - begin - GlobalAlertEnabledVar := A ; - end procedure SetGlobalAlertEnable ; - - ------------------------------------------------------------ - impure function GetGlobalAlertEnable return boolean is - ------------------------------------------------------------ - begin - return GlobalAlertEnabledVar ; - end function GetGlobalAlertEnable ; - - ------------------------------------------------------------ - procedure IncAffirmCount is - ------------------------------------------------------------ - begin - if GlobalAlertEnabledVar then - AffirmCheckCountVar := AffirmCheckCountVar + 1 ; - end if ; - end procedure IncAffirmCount ; - - ------------------------------------------------------------ - impure function GetAffirmCount return natural is - ------------------------------------------------------------ - begin - return AffirmCheckCountVar ; - end function GetAffirmCount ; - ---?? ------------------------------------------------------------ ---?? procedure IncAffirmPassCount is ---?? ------------------------------------------------------------ ---?? begin ---?? if GlobalAlertEnabledVar then ---?? AffirmCheckCountVar := AffirmCheckCountVar + 1 ; ---?? AffirmPassedCountVar := AffirmPassedCountVar + 1 ; ---?? end if ; ---?? end procedure IncAffirmPassCount ; ---?? ---?? ------------------------------------------------------------ ---?? impure function GetAffirmPassCount return natural is ---?? ------------------------------------------------------------ ---?? begin ---?? return AffirmPassedCountVar ; ---?? end function GetAffirmPassCount ; - - ------------------------------------------------------------ - -- PT LOCAL - procedure SetOneStopCount( - ------------------------------------------------------------ - AlertLogID : AlertLogIDType ; - Level : AlertType ; - Count : integer - ) is - begin - if AlertLogPtr(AlertLogID).AlertStopCount(Level) = integer'right then - AlertLogPtr(AlertLogID).AlertStopCount(Level) := Count ; - else - AlertLogPtr(AlertLogID).AlertStopCount(Level) := - AlertLogPtr(AlertLogID).AlertStopCount(Level) + Count ; - end if ; - end procedure SetOneStopCount ; - - ------------------------------------------------------------ - procedure SetAlertStopCount(AlertLogID : AlertLogIDType ; Level : AlertType ; Count : integer) is - ------------------------------------------------------------ - begin - SetOneStopCount(AlertLogID, Level, Count) ; - if AlertLogID /= ALERTLOG_BASE_ID then - SetAlertStopCount(AlertLogPtr(AlertLogID).ParentID, Level, Count) ; - end if ; - end procedure SetAlertStopCount ; - - ------------------------------------------------------------ - impure function GetAlertStopCount(AlertLogID : AlertLogIDType ; Level : AlertType) return integer is - ------------------------------------------------------------ - begin - return AlertLogPtr(AlertLogID).AlertStopCount(Level) ; - end function GetAlertStopCount ; - - ------------------------------------------------------------ - procedure SetAlertEnable(Level : AlertType ; Enable : boolean) is - ------------------------------------------------------------ - begin - for i in ALERTLOG_BASE_ID to NumAlertLogIDsVar loop - AlertLogPtr(i).AlertEnabled(Level) := Enable ; - end loop ; - end procedure SetAlertEnable ; - - ------------------------------------------------------------ - procedure SetAlertEnable(AlertLogID : AlertLogIDType ; Level : AlertType ; Enable : boolean ; DescendHierarchy : boolean := TRUE) is - ------------------------------------------------------------ - begin - AlertLogPtr(AlertLogID).AlertEnabled(Level) := Enable ; - if DescendHierarchy then - for i in AlertLogID+1 to NumAlertLogIDsVar loop - if AlertLogID = AlertLogPtr(i).ParentID then - SetAlertEnable(i, Level, Enable, DescendHierarchy) ; - end if ; - end loop ; - end if ; - end procedure SetAlertEnable ; - - ------------------------------------------------------------ - impure function GetAlertEnable(AlertLogID : AlertLogIDType ; Level : AlertType) return boolean is - ------------------------------------------------------------ - begin - return AlertLogPtr(AlertLogID).AlertEnabled(Level) ; - end function GetAlertEnable ; - - ------------------------------------------------------------ - procedure SetLogEnable(Level : LogType ; Enable : boolean) is - ------------------------------------------------------------ - begin - for i in ALERTLOG_BASE_ID to NumAlertLogIDsVar loop - AlertLogPtr(i).LogEnabled(Level) := Enable ; - end loop ; - end procedure SetLogEnable ; - - ------------------------------------------------------------ - procedure SetLogEnable(AlertLogID : AlertLogIDType ; Level : LogType ; Enable : boolean ; DescendHierarchy : boolean := TRUE) is - ------------------------------------------------------------ - begin - AlertLogPtr(AlertLogID).LogEnabled(Level) := Enable ; - if DescendHierarchy then - for i in AlertLogID+1 to NumAlertLogIDsVar loop - if AlertLogID = AlertLogPtr(i).ParentID then - SetLogEnable(i, Level, Enable, DescendHierarchy) ; - end if ; - end loop ; - end if ; - end procedure SetLogEnable ; - - ------------------------------------------------------------ - impure function GetLogEnable(AlertLogID : AlertLogIDType ; Level : LogType) return boolean is - ------------------------------------------------------------ - begin - if Level = ALWAYS then - return TRUE ; - else - return AlertLogPtr(AlertLogID).LogEnabled(Level) ; - end if ; - end function GetLogEnable ; - - ------------------------------------------------------------ - -- PT Local - procedure PrintLogLevels( - ------------------------------------------------------------ - AlertLogID : AlertLogIDType ; - Prefix : string ; - IndentAmount : integer - ) is - variable buf : line ; - begin - write(buf, Prefix & " " & LeftJustify(AlertLogPtr(AlertLogID).Name.all, ReportJustifyAmountVar - IndentAmount)) ; - for i in LogIndexType loop - if AlertLogPtr(AlertLogID).LogEnabled(i) then --- write(buf, " " & to_string(AlertLogPtr(AlertLogID).LogEnabled(i)) ) ; - write(buf, " " & to_string(i)) ; - end if ; - end loop ; - WriteLine(buf) ; - for i in AlertLogID+1 to NumAlertLogIDsVar loop - if AlertLogID = AlertLogPtr(i).ParentID then - PrintLogLevels( - AlertLogID => i, - Prefix => Prefix & " ", - IndentAmount => IndentAmount + 2 - ) ; - end if ; - end loop ; - end procedure PrintLogLevels ; - - ------------------------------------------------------------ - procedure ReportLogEnables is - ------------------------------------------------------------ - begin - if ReportJustifyAmountVar <= 0 then - SetJustify ; - end if ; - PrintLogLevels(ALERTLOG_BASE_ID, "", 0) ; - end procedure ReportLogEnables ; - - ------------------------------------------------------------ - procedure SetAlertLogOptions ( - ------------------------------------------------------------ - FailOnWarning : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - FailOnDisabledErrors : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - ReportHierarchy : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - WriteAlertLevel : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - WriteAlertName : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - WriteAlertTime : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - WriteLogLevel : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - WriteLogName : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - WriteLogTime : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - AlertPrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; - LogPrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; - ReportPrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; - DoneName : string := OSVVM_STRING_INIT_PARM_DETECT ; - PassName : string := OSVVM_STRING_INIT_PARM_DETECT ; - FailName : string := OSVVM_STRING_INIT_PARM_DETECT - ) is - begin - if FailOnWarning /= OPT_INIT_PARM_DETECT then - FailOnWarningVar := IsEnabled(FailOnWarning) ; - end if ; - if FailOnDisabledErrors /= OPT_INIT_PARM_DETECT then - FailOnDisabledErrorsVar := IsEnabled(FailOnDisabledErrors) ; - end if ; - if ReportHierarchy /= OPT_INIT_PARM_DETECT then - ReportHierarchyVar := IsEnabled(ReportHierarchy) ; - end if ; - if WriteAlertLevel /= OPT_INIT_PARM_DETECT then - WriteAlertLevelVar := IsEnabled(WriteAlertLevel) ; - end if ; - if WriteAlertName /= OPT_INIT_PARM_DETECT then - WriteAlertNameVar := IsEnabled(WriteAlertName) ; - end if ; - if WriteAlertTime /= OPT_INIT_PARM_DETECT then - WriteAlertTimeVar := IsEnabled(WriteAlertTime) ; - end if ; - if WriteLogLevel /= OPT_INIT_PARM_DETECT then - WriteLogLevelVar := IsEnabled(WriteLogLevel) ; - end if ; - if WriteLogName /= OPT_INIT_PARM_DETECT then - WriteLogNameVar := IsEnabled(WriteLogName) ; - end if ; - if WriteLogTime /= OPT_INIT_PARM_DETECT then - WriteLogTimeVar := IsEnabled(WriteLogTime) ; - end if ; - if AlertPrefix /= OSVVM_STRING_INIT_PARM_DETECT then - AlertPrefixVar.Set(AlertPrefix) ; - end if ; - if LogPrefix /= OSVVM_STRING_INIT_PARM_DETECT then - LogPrefixVar.Set(LogPrefix) ; - end if ; - if ReportPrefix /= OSVVM_STRING_INIT_PARM_DETECT then - ReportPrefixVar.Set(ReportPrefix) ; - end if ; - if DoneName /= OSVVM_STRING_INIT_PARM_DETECT then - DoneNameVar.Set(DoneName) ; - end if ; - if PassName /= OSVVM_STRING_INIT_PARM_DETECT then - PassNameVar.Set(PassName) ; - end if ; - if FailName /= OSVVM_STRING_INIT_PARM_DETECT then - FailNameVar.Set(FailName) ; - end if ; - end procedure SetAlertLogOptions ; - - ------------------------------------------------------------ - procedure ReportAlertLogOptions is - ------------------------------------------------------------ - variable buf : line ; - begin - -- Boolean Values - swrite(buf, "ReportAlertLogOptions" & LF ) ; - swrite(buf, "---------------------" & LF ) ; - swrite(buf, "FailOnWarningVar: " & to_string(FailOnWarningVar ) & LF ) ; - swrite(buf, "FailOnDisabledErrorsVar: " & to_string(FailOnDisabledErrorsVar ) & LF ) ; - swrite(buf, "ReportHierarchyVar: " & to_string(ReportHierarchyVar ) & LF ) ; - swrite(buf, "FoundReportHierVar: " & to_string(FoundReportHierVar ) & LF ) ; -- Not set by user - swrite(buf, "FoundAlertHierVar: " & to_string(FoundAlertHierVar ) & LF ) ; -- Not set by user - swrite(buf, "WriteAlertLevelVar: " & to_string(WriteAlertLevelVar ) & LF ) ; - swrite(buf, "WriteAlertNameVar: " & to_string(WriteAlertNameVar ) & LF ) ; - swrite(buf, "WriteAlertTimeVar: " & to_string(WriteAlertTimeVar ) & LF ) ; - swrite(buf, "WriteLogLevelVar: " & to_string(WriteLogLevelVar ) & LF ) ; - swrite(buf, "WriteLogNameVar: " & to_string(WriteLogNameVar ) & LF ) ; - swrite(buf, "WriteLogTimeVar: " & to_string(WriteLogTimeVar ) & LF ) ; - - -- String - swrite(buf, "AlertPrefixVar: " & string'(AlertPrefixVar.Get(OSVVM_DEFAULT_ALERT_PREFIX)) & LF ) ; - swrite(buf, "LogPrefixVar: " & string'(LogPrefixVar.Get(OSVVM_DEFAULT_LOG_PREFIX)) & LF ) ; - swrite(buf, "ReportPrefixVar: " & ResolveOsvvmWritePrefix(ReportPrefixVar.GetOpt) & LF ) ; - swrite(buf, "DoneNameVar: " & ResolveOsvvmDoneName(DoneNameVar.GetOpt) & LF ) ; - swrite(buf, "PassNameVar: " & ResolveOsvvmPassName(PassNameVar.GetOpt) & LF ) ; - swrite(buf, "FailNameVar: " & ResolveOsvvmFailName(FailNameVar.GetOpt) & LF ) ; - writeline(buf) ; - end procedure ReportAlertLogOptions ; - - ------------------------------------------------------------ - impure function GetAlertLogFailOnWarning return AlertLogOptionsType is - ------------------------------------------------------------ - begin - return to_OsvvmOptionsType(FailOnWarningVar) ; - end function GetAlertLogFailOnWarning ; - - ------------------------------------------------------------ - impure function GetAlertLogFailOnDisabledErrors return AlertLogOptionsType is - ------------------------------------------------------------ - begin - return to_OsvvmOptionsType(FailOnDisabledErrorsVar) ; - end function GetAlertLogFailOnDisabledErrors ; - - ------------------------------------------------------------ - impure function GetAlertLogReportHierarchy return AlertLogOptionsType is - ------------------------------------------------------------ - begin - return to_OsvvmOptionsType(ReportHierarchyVar) ; - end function GetAlertLogReportHierarchy ; - - ------------------------------------------------------------ - impure function GetAlertLogFoundReportHier return boolean is - ------------------------------------------------------------ - begin - return FoundReportHierVar ; - end function GetAlertLogFoundReportHier ; - - ------------------------------------------------------------ - impure function GetAlertLogFoundAlertHier return boolean is - ------------------------------------------------------------ - begin - return FoundAlertHierVar ; - end function GetAlertLogFoundAlertHier ; - - ------------------------------------------------------------ - impure function GetAlertLogWriteAlertLevel return AlertLogOptionsType is - ------------------------------------------------------------ - begin - return to_OsvvmOptionsType(WriteAlertLevelVar) ; - end function GetAlertLogWriteAlertLevel ; - - ------------------------------------------------------------ - impure function GetAlertLogWriteAlertName return AlertLogOptionsType is - ------------------------------------------------------------ - begin - return to_OsvvmOptionsType(WriteAlertNameVar) ; - end function GetAlertLogWriteAlertName ; - - ------------------------------------------------------------ - impure function GetAlertLogWriteAlertTime return AlertLogOptionsType is - ------------------------------------------------------------ - begin - return to_OsvvmOptionsType(WriteAlertTimeVar) ; - end function GetAlertLogWriteAlertTime ; - - ------------------------------------------------------------ - impure function GetAlertLogWriteLogLevel return AlertLogOptionsType is - ------------------------------------------------------------ - begin - return to_OsvvmOptionsType(WriteLogLevelVar) ; - end function GetAlertLogWriteLogLevel ; - - ------------------------------------------------------------ - impure function GetAlertLogWriteLogName return AlertLogOptionsType is - ------------------------------------------------------------ - begin - return to_OsvvmOptionsType(WriteLogNameVar) ; - end function GetAlertLogWriteLogName ; - - ------------------------------------------------------------ - impure function GetAlertLogWriteLogTime return AlertLogOptionsType is - ------------------------------------------------------------ - begin - return to_OsvvmOptionsType(WriteLogTimeVar) ; - end function GetAlertLogWriteLogTime ; - - ------------------------------------------------------------ - impure function GetAlertLogAlertPrefix return string is - ------------------------------------------------------------ - begin - return AlertPrefixVar.Get(OSVVM_DEFAULT_ALERT_PREFIX) ; - end function GetAlertLogAlertPrefix ; - - ------------------------------------------------------------ - impure function GetAlertLogLogPrefix return string is - ------------------------------------------------------------ - begin - return LogPrefixVar.Get(OSVVM_DEFAULT_LOG_PREFIX) ; - end function GetAlertLogLogPrefix ; - - ------------------------------------------------------------ - impure function GetAlertLogReportPrefix return string is - ------------------------------------------------------------ - begin - return ResolveOsvvmWritePrefix(ReportPrefixVar.GetOpt) ; - end function GetAlertLogReportPrefix ; - - ------------------------------------------------------------ - impure function GetAlertLogDoneName return string is - ------------------------------------------------------------ - begin - return ResolveOsvvmDoneName(DoneNameVar.GetOpt) ; - end function GetAlertLogDoneName ; - - ------------------------------------------------------------ - impure function GetAlertLogPassName return string is - ------------------------------------------------------------ - begin - return ResolveOsvvmPassName(PassNameVar.GetOpt) ; - end function GetAlertLogPassName ; - - ------------------------------------------------------------ - impure function GetAlertLogFailName return string is - ------------------------------------------------------------ - begin - return ResolveOsvvmFailName(FailNameVar.GetOpt) ; - end function GetAlertLogFailName ; - - end protected body AlertLogStructPType ; - - - - shared variable AlertLogStruct : AlertLogStructPType ; - ---- /////////////////////////////////////////////////////////////////////////// ---- /////////////////////////////////////////////////////////////////////////// ---- /////////////////////////////////////////////////////////////////////////// - - ------------------------------------------------------------ - procedure Alert( - ------------------------------------------------------------ - AlertLogID : AlertLogIDType ; - Message : string ; - Level : AlertType := ERROR - ) is - begin - AlertLogStruct.Alert(AlertLogID, Message, Level) ; - end procedure alert ; - - ------------------------------------------------------------ - procedure Alert( Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message, Level) ; - end procedure alert ; - - ------------------------------------------------------------ - procedure IncAlertCount( - ------------------------------------------------------------ - AlertLogID : AlertLogIDType ; - Level : AlertType := ERROR - ) is - begin - AlertLogStruct.IncAlertCount(AlertLogID, Level) ; - end procedure IncAlertCount ; - - ------------------------------------------------------------ - procedure IncAlertCount( Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - AlertLogStruct.IncAlertCount(ALERT_DEFAULT_ID, Level) ; - end procedure IncAlertCount ; - - - ------------------------------------------------------------ - procedure AlertIf( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if condition then - AlertLogStruct.Alert(AlertLogID , Message, Level) ; - end if ; - end procedure AlertIf ; - - ------------------------------------------------------------ - procedure AlertIf( condition : boolean ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if condition then - AlertLogStruct.Alert(ALERT_DEFAULT_ID , Message, Level) ; - end if ; - end procedure AlertIf ; - - ------------------------------------------------------------ - -- useful in a loop: exit when AlertIf( not ReadValid, failure, "Read Failed") ; - impure function AlertIf( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; Level : AlertType := ERROR ) return boolean is - ------------------------------------------------------------ - begin - if condition then - AlertLogStruct.Alert(AlertLogID , Message, Level) ; - end if ; - return condition ; - end function AlertIf ; - - ------------------------------------------------------------ - impure function AlertIf( condition : boolean ; Message : string ; Level : AlertType := ERROR ) return boolean is - ------------------------------------------------------------ - begin - if condition then - AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message, Level) ; - end if ; - return condition ; - end function AlertIf ; - - ------------------------------------------------------------ - procedure AlertIfNot( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if not condition then - AlertLogStruct.Alert(AlertLogID, Message, Level) ; - end if ; - end procedure AlertIfNot ; - - ------------------------------------------------------------ - procedure AlertIfNot( condition : boolean ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if not condition then - AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message, Level) ; - end if ; - end procedure AlertIfNot ; - - ------------------------------------------------------------ - -- useful in a loop: exit when AlertIfNot( not ReadValid, failure, "Read Failed") ; - impure function AlertIfNot( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; Level : AlertType := ERROR ) return boolean is - ------------------------------------------------------------ - begin - if not condition then - AlertLogStruct.Alert(AlertLogID, Message, Level) ; - end if ; - return not condition ; - end function AlertIfNot ; - - ------------------------------------------------------------ - impure function AlertIfNot( condition : boolean ; Message : string ; Level : AlertType := ERROR ) return boolean is - ------------------------------------------------------------ - begin - if not condition then - AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message, Level) ; - end if ; - return not condition ; - end function AlertIfNot ; - - - ------------------------------------------------------------ - -- AlertIfEqual with AlertLogID - ------------------------------------------------------------ - procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : std_logic ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L ?= R then - AlertLogStruct.Alert(AlertLogID, Message & " L = R, L = " & to_string(L) & " R = " & to_string(R), Level) ; - end if ; - end procedure AlertIfEqual ; - - ------------------------------------------------------------ - procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : std_logic_vector ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L ?= R then - AlertLogStruct.Alert(AlertLogID, Message & " L = R, L = " & to_string(L) & " R = " & to_string(R), Level) ; - end if ; - end procedure AlertIfEqual ; - - ------------------------------------------------------------ - procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : unsigned ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L ?= R then - AlertLogStruct.Alert(AlertLogID, Message & " L = R, L = " & to_string(L) & " R = " & to_string(R), Level) ; - end if ; - end procedure AlertIfEqual ; - - ------------------------------------------------------------ - procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : signed ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L ?= R then - AlertLogStruct.Alert(AlertLogID, Message & " L = R, L = " & to_string(L) & " R = " & to_string(R), Level) ; - end if ; - end procedure AlertIfEqual ; - - ------------------------------------------------------------ - procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : integer ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L = R then - AlertLogStruct.Alert(AlertLogID, Message & " L = R, L = " & to_string(L) & " R = " & to_string(R), Level) ; - end if ; - end procedure AlertIfEqual ; - - ------------------------------------------------------------ - procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : real ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L = R then - AlertLogStruct.Alert(AlertLogID, Message & " L = R, L = " & to_string(L, 4) & " R = " & to_string(R, 4), Level) ; - end if ; - end procedure AlertIfEqual ; - - ------------------------------------------------------------ - procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : character ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L = R then - AlertLogStruct.Alert(AlertLogID, Message & " L = R, L = " & L & " R = " & R, Level) ; - end if ; - end procedure AlertIfEqual ; - - ------------------------------------------------------------ - procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : string ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L = R then - AlertLogStruct.Alert(AlertLogID, Message & " L = R, L = " & L & " R = " & R, Level) ; - end if ; - end procedure AlertIfEqual ; - - ------------------------------------------------------------ - procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : time ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L = R then - AlertLogStruct.Alert(AlertLogID, Message & " L = R, L = " & to_string(L) & " R = " & to_string(R), Level) ; - end if ; - end procedure AlertIfEqual ; - - - ------------------------------------------------------------ - -- AlertIfEqual without AlertLogID - ------------------------------------------------------------ - procedure AlertIfEqual( L, R : std_logic ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L ?= R then - AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L = R, L = " & to_string(L) & " R = " & to_string(R), Level) ; - end if ; - end procedure AlertIfEqual ; - - ------------------------------------------------------------ - procedure AlertIfEqual( L, R : std_logic_vector ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L ?= R then - AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L = R, L = " & to_string(L) & " R = " & to_string(R), Level) ; - end if ; - end procedure AlertIfEqual ; - - ------------------------------------------------------------ - procedure AlertIfEqual( L, R : unsigned ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L ?= R then - AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L = R, L = " & to_string(L) & " R = " & to_string(R), Level) ; - end if ; - end procedure AlertIfEqual ; - - ------------------------------------------------------------ - procedure AlertIfEqual( L, R : signed ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L ?= R then - AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L = R, L = " & to_string(L) & " R = " & to_string(R), Level) ; - end if ; - end procedure AlertIfEqual ; - - ------------------------------------------------------------ - procedure AlertIfEqual( L, R : integer ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L = R then - AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L = R, L = " & to_string(L) & " R = " & to_string(R), Level) ; - end if ; - end procedure AlertIfEqual ; - - ------------------------------------------------------------ - procedure AlertIfEqual( L, R : real ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L = R then - AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L = R, L = " & to_string(L, 4) & " R = " & to_string(R, 4), Level) ; - end if ; - end procedure AlertIfEqual ; - - ------------------------------------------------------------ - procedure AlertIfEqual( L, R : character ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L = R then - AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L = R, L = " & L & " R = " & R, Level) ; - end if ; - end procedure AlertIfEqual ; - - ------------------------------------------------------------ - procedure AlertIfEqual( L, R : string ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L = R then - AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L = R, L = " & L & " R = " & R, Level) ; - end if ; - end procedure AlertIfEqual ; - - ------------------------------------------------------------ - procedure AlertIfEqual( L, R : time ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L = R then - AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L = R, L = " & to_string(L) & " R = " & to_string(R), Level) ; - end if ; - end procedure AlertIfEqual ; - - - ------------------------------------------------------------ - -- AlertIfNotEqual with AlertLogID - ------------------------------------------------------------ - procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : std_logic ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L ?/= R then - AlertLogStruct.Alert(AlertLogID, Message & " L /= R, L = " & to_string(L) & " R = " & to_string(R), Level) ; - end if ; - end procedure AlertIfNotEqual ; - - ------------------------------------------------------------ - procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : std_logic_vector ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L ?/= R then - AlertLogStruct.Alert(AlertLogID, Message & " L /= R, L = " & to_string(L) & " R = " & to_string(R), Level) ; - end if ; - end procedure AlertIfNotEqual ; - - ------------------------------------------------------------ - procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : unsigned ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L ?/= R then - AlertLogStruct.Alert(AlertLogID, Message & " L /= R, L = " & to_string(L) & " R = " & to_string(R), Level) ; - end if ; - end procedure AlertIfNotEqual ; - - ------------------------------------------------------------ - procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : signed ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L ?/= R then - AlertLogStruct.Alert(AlertLogID, Message & " L /= R, L = " & to_string(L) & " R = " & to_string(R), Level) ; - end if ; - end procedure AlertIfNotEqual ; - - ------------------------------------------------------------ - procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : integer ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L /= R then - AlertLogStruct.Alert(AlertLogID, Message & " L /= R, L = " & to_string(L) & " R = " & to_string(R), Level) ; - end if ; - end procedure AlertIfNotEqual ; - - ------------------------------------------------------------ - procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : real ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L /= R then - AlertLogStruct.Alert(AlertLogID, Message & " L /= R, L = " & to_string(L, 4) & " R = " & to_string(R, 4), Level) ; - end if ; - end procedure AlertIfNotEqual ; - - ------------------------------------------------------------ - procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : character ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L /= R then - AlertLogStruct.Alert(AlertLogID, Message & " L /= R, L = " & L & " R = " & R, Level) ; - end if ; - end procedure AlertIfNotEqual ; - - ------------------------------------------------------------ - procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : string ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L /= R then - AlertLogStruct.Alert(AlertLogID, Message & " L /= R, L = " & L & " R = " & R, Level) ; - end if ; - end procedure AlertIfNotEqual ; - - ------------------------------------------------------------ - procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : time ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L /= R then - AlertLogStruct.Alert(AlertLogID, Message & " L /= R, L = " & to_string(L) & " R = " & to_string(R), Level) ; - end if ; - end procedure AlertIfNotEqual ; - - - ------------------------------------------------------------ - -- AlertIfNotEqual without AlertLogID - ------------------------------------------------------------ - procedure AlertIfNotEqual( L, R : std_logic ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L ?/= R then - AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L /= R, L = " & to_string(L) & " R = " & to_string(R), Level) ; - end if ; - end procedure AlertIfNotEqual ; - - ------------------------------------------------------------ - procedure AlertIfNotEqual( L, R : std_logic_vector ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L ?/= R then - AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L /= R, L = " & to_string(L) & " R = " & to_string(R), Level) ; - end if ; - end procedure AlertIfNotEqual ; - - ------------------------------------------------------------ - procedure AlertIfNotEqual( L, R : unsigned ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L ?/= R then - AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L /= R, L = " & to_string(L) & " R = " & to_string(R), Level) ; - end if ; - end procedure AlertIfNotEqual ; - - ------------------------------------------------------------ - procedure AlertIfNotEqual( L, R : signed ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L ?/= R then - AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L /= R, L = " & to_string(L) & " R = " & to_string(R), Level) ; - end if ; - end procedure AlertIfNotEqual ; - - ------------------------------------------------------------ - procedure AlertIfNotEqual( L, R : integer ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L /= R then - AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L /= R, L = " & to_string(L) & " R = " & to_string(R), Level) ; - end if ; - end procedure AlertIfNotEqual ; - - ------------------------------------------------------------ - procedure AlertIfNotEqual( L, R : real ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L /= R then - AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L /= R, L = " & to_string(L, 4) & " R = " & to_string(R, 4), Level) ; - end if ; - end procedure AlertIfNotEqual ; - - ------------------------------------------------------------ - procedure AlertIfNotEqual( L, R : character ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L /= R then - AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L /= R, L = " & L & " R = " & R, Level) ; - end if ; - end procedure AlertIfNotEqual ; - - ------------------------------------------------------------ - procedure AlertIfNotEqual( L, R : string ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L /= R then - AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L /= R, L = " & L & " R = " & R, Level) ; - end if ; - end procedure AlertIfNotEqual ; - - ------------------------------------------------------------ - procedure AlertIfNotEqual( L, R : time ; Message : string ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - begin - if L /= R then - AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L /= R, L = " & to_string(L) & " R = " & to_string(R), Level) ; - end if ; - end procedure AlertIfNotEqual ; - - - ------------------------------------------------------------ - -- Local - procedure LocalAlertIfDiff (AlertLogID : AlertLogIDType ; file File1, File2 : text; Message : string ; Level : AlertType ; Valid : out boolean ) is - -- Simple diff. - ------------------------------------------------------------ - variable Buf1, Buf2 : line ; - variable File1Done, File2Done : boolean ; - variable LineCount : integer := 0 ; - begin - ReadLoop : loop - File1Done := EndFile(File1) ; - File2Done := EndFile(File2) ; - exit ReadLoop when File1Done or File2Done ; - - ReadLine(File1, Buf1) ; - ReadLine(File2, Buf2) ; - LineCount := LineCount + 1 ; - - if Buf1.all /= Buf2.all then - AlertLogStruct.Alert(AlertLogID , Message & " File miscompare on line " & to_string(LineCount), Level) ; - exit ReadLoop ; - end if ; - end loop ReadLoop ; - if File1Done /= File2Done then - if not File1Done then - AlertLogStruct.Alert(AlertLogID , Message & " File1 longer than File2 " & to_string(LineCount), Level) ; - end if ; - if not File2Done then - AlertLogStruct.Alert(AlertLogID , Message & " File2 longer than File1 " & to_string(LineCount), Level) ; - end if ; - end if; - if File1Done and File2Done then - Valid := TRUE ; - else - Valid := FALSE ; - end if ; - end procedure LocalAlertIfDiff ; - - ------------------------------------------------------------ - -- Local - procedure LocalAlertIfDiff (AlertLogID : AlertLogIDType ; Name1, Name2 : string; Message : string ; Level : AlertType ; Valid : out boolean ) is - -- Open files and call AlertIfDiff[text, ...] - ------------------------------------------------------------ - file FileID1, FileID2 : text ; - variable status1, status2 : file_open_status ; - begin - Valid := FALSE ; - file_open(status1, FileID1, Name1, READ_MODE) ; - file_open(status2, FileID2, Name2, READ_MODE) ; - if status1 = OPEN_OK and status2 = OPEN_OK then - LocalAlertIfDiff (AlertLogID, FileID1, FileID2, Message & " " & Name1 & " /= " & Name2 & ", ", Level, Valid) ; - else - if status1 /= OPEN_OK then - AlertLogStruct.Alert(AlertLogID , Message & " File, " & Name1 & ", did not open", Level) ; - end if ; - if status2 /= OPEN_OK then - AlertLogStruct.Alert(AlertLogID , Message & " File, " & Name2 & ", did not open", Level) ; - end if ; - end if; - end procedure LocalAlertIfDiff ; - - ------------------------------------------------------------ - procedure AlertIfDiff (AlertLogID : AlertLogIDType ; Name1, Name2 : string; Message : string := "" ; Level : AlertType := ERROR ) is - -- Open files and call AlertIfDiff[text, ...] - ------------------------------------------------------------ - variable Valid : boolean ; - begin - LocalAlertIfDiff (AlertLogID, Name1, Name2, Message, Level, Valid) ; - end procedure AlertIfDiff ; - - ------------------------------------------------------------ - procedure AlertIfDiff (Name1, Name2 : string; Message : string := "" ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - variable Valid : boolean ; - begin - LocalAlertIfDiff (ALERT_DEFAULT_ID, Name1, Name2, Message, Level, Valid) ; - end procedure AlertIfDiff ; - - ------------------------------------------------------------ - procedure AlertIfDiff (AlertLogID : AlertLogIDType ; file File1, File2 : text; Message : string := "" ; Level : AlertType := ERROR ) is - -- Simple diff. - ------------------------------------------------------------ - variable Valid : boolean ; - begin - LocalAlertIfDiff (AlertLogID, File1, File2, Message, Level, Valid ) ; - end procedure AlertIfDiff ; - - ------------------------------------------------------------ - procedure AlertIfDiff (file File1, File2 : text; Message : string := "" ; Level : AlertType := ERROR ) is - ------------------------------------------------------------ - variable Valid : boolean ; - begin - LocalAlertIfDiff (ALERT_DEFAULT_ID, File1, File2, Message, Level, Valid ) ; - end procedure AlertIfDiff ; - - ------------------------------------------------------------ - procedure AffirmIf( - ------------------------------------------------------------ - AlertLogID : AlertLogIDType ; - condition : boolean ; - ReceivedMessage : string ; - ExpectedMessage : string ; - Enable : boolean := FALSE -- override internal enable - ) is - begin - AlertLogStruct.IncAffirmCount ; -- increment check count - if condition then - -- passed - AlertLogStruct.Log(AlertLogID, ReceivedMessage, PASSED, Enable) ; --- AlertLogStruct.IncAffirmPassCount ; -- increment pass & check count - else - AlertLogStruct.Alert(AlertLogID, ReceivedMessage & ExpectedMessage, ERROR) ; - end if ; - end procedure AffirmIf ; - - ------------------------------------------------------------ - procedure AffirmIf( condition : boolean ; ReceivedMessage, ExpectedMessage : string ; Enable : boolean := FALSE ) is - ------------------------------------------------------------ - begin - AffirmIf(ALERT_DEFAULT_ID, condition, ReceivedMessage, ExpectedMessage, Enable) ; - end procedure AffirmIf ; - - ------------------------------------------------------------ - impure function AffirmIf( AlertLogID : AlertLogIDType ; condition : boolean ; ReceivedMessage, ExpectedMessage : string ; Enable : boolean := FALSE ) return boolean is - ------------------------------------------------------------ - begin - AffirmIf(AlertLogID, condition, ReceivedMessage, ExpectedMessage, Enable) ; - return condition ; - end function AffirmIf ; - - ------------------------------------------------------------ - impure function AffirmIf( condition : boolean ; ReceivedMessage, ExpectedMessage : string ; Enable : boolean := FALSE ) return boolean is - ------------------------------------------------------------ - begin - AffirmIf(ALERT_DEFAULT_ID, condition, ReceivedMessage, ExpectedMessage, Enable) ; - return condition ; - end function AffirmIf ; - - - ------------------------------------------------------------ - procedure AffirmIf( - ------------------------------------------------------------ - AlertLogID : AlertLogIDType ; - condition : boolean ; - Message : string ; - Enable : boolean := FALSE -- override internal enable - ) is - begin - AlertLogStruct.IncAffirmCount ; -- increment check count - if condition then - -- passed - AlertLogStruct.Log(AlertLogID, Message, PASSED, Enable) ; --- AlertLogStruct.IncAffirmPassCount ; -- increment pass & check count - else - AlertLogStruct.Alert(AlertLogID, Message, ERROR) ; - end if ; - end procedure AffirmIf ; - - ------------------------------------------------------------ - procedure AffirmIf(condition : boolean ; Message : string ; Enable : boolean := FALSE) is - ------------------------------------------------------------ - begin - AffirmIf(ALERT_DEFAULT_ID, condition, Message, Enable) ; - end procedure AffirmIf; - - ------------------------------------------------------------ - -- useful in a loop: exit when AffirmIf( ID, not ReadValid, "Read Failed") ; - impure function AffirmIf( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; Enable : boolean := FALSE ) return boolean is - ------------------------------------------------------------ - begin - AffirmIf(AlertLogID, condition, Message, Enable) ; - return condition ; - end function AffirmIf ; - - ------------------------------------------------------------ - impure function AffirmIf( condition : boolean ; Message : string ; Enable : boolean := FALSE ) return boolean is - ------------------------------------------------------------ - begin - AffirmIf(ALERT_DEFAULT_ID, condition, Message, Enable) ; - return condition ; - end function AffirmIf ; - - ------------------------------------------------------------ - ------------------------------------------------------------ - procedure AffirmIfNot( AlertLogID : AlertLogIDType ; condition : boolean ; ReceivedMessage, ExpectedMessage : string ; Enable : boolean := FALSE ) is - ------------------------------------------------------------ - begin - AffirmIf(AlertLogID, not condition, ReceivedMessage, ExpectedMessage, Enable) ; - end procedure AffirmIfNot ; - - ------------------------------------------------------------ - procedure AffirmIfNot( condition : boolean ; ReceivedMessage, ExpectedMessage : string ; Enable : boolean := FALSE ) is - ------------------------------------------------------------ - begin - AffirmIf(ALERT_DEFAULT_ID, not condition, ReceivedMessage, ExpectedMessage, Enable) ; - end procedure AffirmIfNot ; - - ------------------------------------------------------------ - -- useful in a loop: exit when AffirmIfNot( not ReadValid, failure, "Read Failed") ; - impure function AffirmIfNot( AlertLogID : AlertLogIDType ; condition : boolean ; ReceivedMessage, ExpectedMessage : string ; Enable : boolean := FALSE ) return boolean is - ------------------------------------------------------------ - begin - AffirmIf(AlertLogID, not condition, ReceivedMessage, ExpectedMessage, Enable) ; - return not condition ; - end function AffirmIfNot ; - - ------------------------------------------------------------ - impure function AffirmIfNot( condition : boolean ; ReceivedMessage, ExpectedMessage : string ; Enable : boolean := FALSE ) return boolean is - ------------------------------------------------------------ - begin - AffirmIf(ALERT_DEFAULT_ID, not condition, ReceivedMessage, ExpectedMessage, Enable) ; - return not condition ; - end function AffirmIfNot ; - - ------------------------------------------------------------ - procedure AffirmIfNot( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; Enable : boolean := FALSE ) is - ------------------------------------------------------------ - begin - AffirmIf(AlertLogID, not condition, Message, Enable) ; - end procedure AffirmIfNot ; - - ------------------------------------------------------------ - procedure AffirmIfNot( condition : boolean ; Message : string ; Enable : boolean := FALSE ) is - ------------------------------------------------------------ - begin - AffirmIf(ALERT_DEFAULT_ID, not condition, Message, Enable) ; - end procedure AffirmIfNot ; - - ------------------------------------------------------------ - -- useful in a loop: exit when AffirmIfNot( not ReadValid, failure, "Read Failed") ; - impure function AffirmIfNot( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; Enable : boolean := FALSE ) return boolean is - ------------------------------------------------------------ - begin - AffirmIf(AlertLogID, not condition, Message, Enable) ; - return not condition ; - end function AffirmIfNot ; - - ------------------------------------------------------------ - impure function AffirmIfNot( condition : boolean ; Message : string ; Enable : boolean := FALSE ) return boolean is - ------------------------------------------------------------ - begin - AffirmIf(ALERT_DEFAULT_ID, not condition, Message, Enable) ; - return not condition ; - end function AffirmIfNot ; - - - ------------------------------------------------------------ - ------------------------------------------------------------ - procedure AffirmPassed( AlertLogID : AlertLogIDType ; Message : string ; Enable : boolean := FALSE ) is - ------------------------------------------------------------ - begin - AffirmIf(AlertLogID, TRUE, Message, Enable) ; - end procedure AffirmPassed ; - - ------------------------------------------------------------ - procedure AffirmPassed( Message : string ; Enable : boolean := FALSE ) is - ------------------------------------------------------------ - begin - AffirmIf(ALERT_DEFAULT_ID, TRUE, Message, Enable) ; - end procedure AffirmPassed ; - - ------------------------------------------------------------ - procedure AffirmError( AlertLogID : AlertLogIDType ; Message : string ) is - ------------------------------------------------------------ - begin - AffirmIf(AlertLogID, FALSE, Message, FALSE) ; - end procedure AffirmError ; - - ------------------------------------------------------------ - procedure AffirmError( Message : string ) is - ------------------------------------------------------------ - begin - AffirmIf(ALERT_DEFAULT_ID, FALSE, Message, FALSE) ; - end procedure AffirmError ; - - -- With AlertLogID - ------------------------------------------------------------ - procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : std_logic ; Message : string := "" ; Enable : boolean := FALSE ) is - ------------------------------------------------------------ - begin - AffirmIf(AlertLogID, ??(Received ?= Expected), - Message & " Received : " & to_string(Received), - " ?= Expected : " & to_string(Expected), - Enable) ; - end procedure AffirmIfEqual ; - - ------------------------------------------------------------ - procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : std_logic_vector ; Message : string := "" ; Enable : boolean := FALSE ) is - ------------------------------------------------------------ - begin - AffirmIf(AlertLogID, ??(Received ?= Expected), - Message & " Received : " & to_hstring(Received), - " ?= Expected : " & to_hstring(Expected), - Enable) ; - end procedure AffirmIfEqual ; - - ------------------------------------------------------------ - procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : unsigned ; Message : string := "" ; Enable : boolean := FALSE ) is - ------------------------------------------------------------ - begin - AffirmIf(AlertLogID, ??(Received ?= Expected), - Message & " Received : " & to_hstring(Received), - " ?= Expected : " & to_hstring(Expected), - Enable) ; - end procedure AffirmIfEqual ; - - ------------------------------------------------------------ - procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : signed ; Message : string := "" ; Enable : boolean := FALSE ) is - ------------------------------------------------------------ - begin - AffirmIf(AlertLogID, ??(Received ?= Expected), - Message & " Received : " & to_hstring(Received), - " ?= Expected : " & to_hstring(Expected), - Enable) ; - end procedure AffirmIfEqual ; - - ------------------------------------------------------------ - procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : integer ; Message : string := "" ; Enable : boolean := FALSE ) is - ------------------------------------------------------------ - begin - AffirmIf(AlertLogID, Received = Expected, - Message & " Received : " & to_string(Received), - " = Expected : " & to_string(Expected), - Enable) ; - end procedure AffirmIfEqual ; - - ------------------------------------------------------------ - procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : real ; Message : string := "" ; Enable : boolean := FALSE ) is - ------------------------------------------------------------ - begin - AffirmIf(AlertLogID, Received = Expected, - Message & " Received : " & to_string(Received, 4), - " = Expected : " & to_string(Expected, 4), - Enable) ; - end procedure AffirmIfEqual ; - - ------------------------------------------------------------ - procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : character ; Message : string := "" ; Enable : boolean := FALSE ) is - ------------------------------------------------------------ - begin - AffirmIf(AlertLogID, Received = Expected, - Message & " Received : " & to_string(Received), - " = Expected : " & to_string(Expected), - Enable) ; - end procedure AffirmIfEqual ; - - ------------------------------------------------------------ - procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : string ; Message : string := "" ; Enable : boolean := FALSE ) is - ------------------------------------------------------------ - begin - AffirmIf(AlertLogID, Received = Expected, - Message & " Received : " & Received, - " = Expected : " & Expected, - Enable) ; - end procedure AffirmIfEqual ; - - ------------------------------------------------------------ - procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : time ; Message : string := "" ; Enable : boolean := FALSE ) is - ------------------------------------------------------------ - begin - AffirmIf(AlertLogID, Received = Expected, - Message & " Received : " & to_string(Received), - " = Expected : " & to_string(Expected), - Enable) ; - end procedure AffirmIfEqual ; - - -- Without AlertLogID - ------------------------------------------------------------ - procedure AffirmIfEqual( Received, Expected : std_logic ; Message : string := "" ; Enable : boolean := FALSE ) is - ------------------------------------------------------------ - begin - AffirmIf(ALERT_DEFAULT_ID, ??(Received ?= Expected), - Message & " Received : " & to_string(Received), - " ?= Expected : " & to_string(Expected), - Enable) ; - end procedure AffirmIfEqual ; - - ------------------------------------------------------------ - procedure AffirmIfEqual( Received, Expected : std_logic_vector ; Message : string := "" ; Enable : boolean := FALSE ) is - ------------------------------------------------------------ - begin - AffirmIf(ALERT_DEFAULT_ID, ??(Received ?= Expected), - Message & " Received : " & to_string(Received), - " ?= Expected : " & to_string(Expected), - Enable) ; - end procedure AffirmIfEqual ; - - ------------------------------------------------------------ - procedure AffirmIfEqual( Received, Expected : unsigned ; Message : string := "" ; Enable : boolean := FALSE ) is - ------------------------------------------------------------ - begin - AffirmIf(ALERT_DEFAULT_ID, ??(Received ?= Expected), - Message & " Received : " & to_string(Received), - " ?= Expected : " & to_string(Expected), - Enable) ; - end procedure AffirmIfEqual ; - - ------------------------------------------------------------ - procedure AffirmIfEqual( Received, Expected : signed ; Message : string := "" ; Enable : boolean := FALSE ) is - ------------------------------------------------------------ - begin - AffirmIf(ALERT_DEFAULT_ID, ??(Received ?= Expected), - Message & " Received : " & to_string(Received), - " ?= Expected : " & to_string(Expected), - Enable) ; - end procedure AffirmIfEqual ; - - ------------------------------------------------------------ - procedure AffirmIfEqual( Received, Expected : integer ; Message : string := "" ; Enable : boolean := FALSE ) is - ------------------------------------------------------------ - begin - AffirmIf(ALERT_DEFAULT_ID, Received = Expected, - Message & " Received : " & to_string(Received), - " = Expected : " & to_string(Expected), - Enable) ; - end procedure AffirmIfEqual ; - - ------------------------------------------------------------ - procedure AffirmIfEqual( Received, Expected : real ; Message : string := "" ; Enable : boolean := FALSE ) is - ------------------------------------------------------------ - begin - AffirmIf(ALERT_DEFAULT_ID, Received = Expected, - Message & " Received : " & to_string(Received, 4), - " = Expected : " & to_string(Expected, 4), - Enable) ; - end procedure AffirmIfEqual ; - - ------------------------------------------------------------ - procedure AffirmIfEqual( Received, Expected : character ; Message : string := "" ; Enable : boolean := FALSE ) is - ------------------------------------------------------------ - begin - AffirmIf(ALERT_DEFAULT_ID, Received = Expected, - Message & " Received : " & to_string(Received), - " = Expected : " & to_string(Expected), - Enable) ; - end procedure AffirmIfEqual ; - - ------------------------------------------------------------ - procedure AffirmIfEqual( Received, Expected : string ; Message : string := "" ; Enable : boolean := FALSE ) is - ------------------------------------------------------------ - begin - AffirmIf(ALERT_DEFAULT_ID, Received = Expected, - Message & " Received : " & Received, - " = Expected : " & Expected, - Enable) ; - end procedure AffirmIfEqual ; - - ------------------------------------------------------------ - procedure AffirmIfEqual( Received, Expected : time ; Message : string := "" ; Enable : boolean := FALSE ) is - ------------------------------------------------------------ - begin - AffirmIf(ALERT_DEFAULT_ID, Received = Expected, - Message & " Received : " & to_string(Received), - " = Expected : " & to_string(Expected), - Enable) ; - end procedure AffirmIfEqual ; - - ------------------------------------------------------------ - procedure AffirmIfDiff (AlertLogID : AlertLogIDType ; Name1, Name2 : string; Message : string := "" ; Enable : boolean := FALSE ) is - -- Open files and call AffirmIfDiff[text, ...] - ------------------------------------------------------------ - variable Valid : boolean ; - begin - LocalAlertIfDiff (AlertLogID, Name1, Name2, Message, ERROR, Valid) ; - if Valid then - AlertLogStruct.Log(AlertLogID, Message & " " & Name1 & " = " & Name2, PASSED, Enable) ; - end if ; - end procedure AffirmIfDiff ; - - ------------------------------------------------------------ - procedure AffirmIfDiff (Name1, Name2 : string; Message : string := "" ; Enable : boolean := FALSE ) is - ------------------------------------------------------------ - variable Valid : boolean ; - begin - LocalAlertIfDiff (ALERT_DEFAULT_ID, Name1, Name2, Message, ERROR, Valid) ; - if Valid then - AlertLogStruct.Log(ALERT_DEFAULT_ID, Message & " " & Name1 & " = " & Name2, PASSED, Enable) ; - end if ; - end procedure AffirmIfDiff ; - - ------------------------------------------------------------ - procedure AffirmIfDiff (AlertLogID : AlertLogIDType ; file File1, File2 : text; Message : string := "" ; Enable : boolean := FALSE ) is - -- Simple diff. - ------------------------------------------------------------ - variable Valid : boolean ; - begin - LocalAlertIfDiff (AlertLogID, File1, File2, Message, ERROR, Valid ) ; - if Valid then - AlertLogStruct.Log(AlertLogID, Message, PASSED, Enable) ; - end if ; - end procedure AffirmIfDiff ; - - ------------------------------------------------------------ - procedure AffirmIfDiff (file File1, File2 : text; Message : string := "" ; Enable : boolean := FALSE ) is - ------------------------------------------------------------ - variable Valid : boolean ; - begin - LocalAlertIfDiff (ALERT_DEFAULT_ID, File1, File2, Message, ERROR, Valid ) ; - if Valid then - AlertLogStruct.Log(ALERT_DEFAULT_ID, Message, PASSED, Enable) ; - end if ; - end procedure AffirmIfDiff ; - - ------------------------------------------------------------ - procedure SetAlertLogJustify is - ------------------------------------------------------------ - begin - AlertLogStruct.SetJustify ; - end procedure SetAlertLogJustify ; - - ------------------------------------------------------------ - procedure ReportAlerts ( Name : String ; AlertCount : AlertCountType ) is - ------------------------------------------------------------ - begin - AlertLogStruct.ReportAlerts(Name, AlertCount) ; - end procedure ReportAlerts ; - - ------------------------------------------------------------ - procedure ReportAlerts ( Name : string := OSVVM_STRING_INIT_PARM_DETECT ; AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID ; ExternalErrors : AlertCountType := (others => 0) ) is - ------------------------------------------------------------ - begin - AlertLogStruct.ReportAlerts(Name, AlertLogID, ExternalErrors, TRUE) ; - end procedure ReportAlerts ; - - ------------------------------------------------------------ - procedure ReportNonZeroAlerts ( Name : string := OSVVM_STRING_INIT_PARM_DETECT ; AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID ; ExternalErrors : AlertCountType := (others => 0) ) is - ------------------------------------------------------------ - begin - AlertLogStruct.ReportAlerts(Name, AlertLogID, ExternalErrors, FALSE) ; - end procedure ReportNonZeroAlerts ; - - ------------------------------------------------------------ - procedure ClearAlerts is - ------------------------------------------------------------ - begin - AlertLogStruct.ClearAlerts ; - end procedure ClearAlerts ; - - ------------------------------------------------------------ - function "ABS" (L : AlertCountType) return AlertCountType is - ------------------------------------------------------------ - variable Result : AlertCountType ; - begin - Result(FAILURE) := ABS( L(FAILURE) ) ; - Result(ERROR) := ABS( L(ERROR) ) ; - Result(WARNING) := ABS( L(WARNING) ); - return Result ; - end function "ABS" ; - - ------------------------------------------------------------ - function "+" (L, R : AlertCountType) return AlertCountType is - ------------------------------------------------------------ - variable Result : AlertCountType ; - begin - Result(FAILURE) := L(FAILURE) + R(FAILURE) ; - Result(ERROR) := L(ERROR) + R(ERROR) ; - Result(WARNING) := L(WARNING) + R(WARNING) ; - return Result ; - end function "+" ; - - ------------------------------------------------------------ - function "-" (L, R : AlertCountType) return AlertCountType is - ------------------------------------------------------------ - variable Result : AlertCountType ; - begin - Result(FAILURE) := L(FAILURE) - R(FAILURE) ; - Result(ERROR) := L(ERROR) - R(ERROR) ; - Result(WARNING) := L(WARNING) - R(WARNING) ; - return Result ; - end function "-" ; - - ------------------------------------------------------------ - function "-" (R : AlertCountType) return AlertCountType is - ------------------------------------------------------------ - variable Result : AlertCountType ; - begin - Result(FAILURE) := - R(FAILURE) ; - Result(ERROR) := - R(ERROR) ; - Result(WARNING) := - R(WARNING) ; - return Result ; - end function "-" ; - - ------------------------------------------------------------ - impure function SumAlertCount(AlertCount: AlertCountType) return integer is - ------------------------------------------------------------ - begin - -- Using ABS ensures correct expected error handling. - return abs(AlertCount(FAILURE)) + abs(AlertCount(ERROR)) + abs(AlertCount(WARNING)) ; - end function SumAlertCount ; - - ------------------------------------------------------------ - impure function GetAlertCount(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return AlertCountType is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetAlertCount(AlertLogID) ; - end function GetAlertCount ; - - ------------------------------------------------------------ - impure function GetAlertCount(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return integer is - ------------------------------------------------------------ - begin - return SumAlertCount(AlertLogStruct.GetAlertCount(AlertLogID)) ; - end function GetAlertCount ; - - ------------------------------------------------------------ - impure function GetEnabledAlertCount(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return AlertCountType is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetEnabledAlertCount(AlertLogID) ; - end function GetEnabledAlertCount ; - - ------------------------------------------------------------ - impure function GetEnabledAlertCount(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return integer is - ------------------------------------------------------------ - begin - return SumAlertCount(AlertLogStruct.GetEnabledAlertCount(AlertLogID)) ; - end function GetEnabledAlertCount ; - - ------------------------------------------------------------ - impure function GetDisabledAlertCount return AlertCountType is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetDisabledAlertCount ; - end function GetDisabledAlertCount ; - - ------------------------------------------------------------ - impure function GetDisabledAlertCount return integer is - ------------------------------------------------------------ - begin - return SumAlertCount(AlertLogStruct.GetDisabledAlertCount) ; - end function GetDisabledAlertCount ; - - ------------------------------------------------------------ - impure function GetDisabledAlertCount(AlertLogID: AlertLogIDType) return AlertCountType is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetDisabledAlertCount(AlertLogID) ; - end function GetDisabledAlertCount ; - - ------------------------------------------------------------ - impure function GetDisabledAlertCount(AlertLogID: AlertLogIDType) return integer is - ------------------------------------------------------------ - begin - return SumAlertCount(AlertLogStruct.GetDisabledAlertCount(AlertLogID)) ; - end function GetDisabledAlertCount ; - - ------------------------------------------------------------ - procedure Log( - AlertLogID : AlertLogIDType ; - Message : string ; - Level : LogType := ALWAYS ; - Enable : boolean := FALSE -- override internal enable - ) is - begin - AlertLogStruct.Log(AlertLogID, Message, Level, Enable) ; - end procedure log ; - - ------------------------------------------------------------ - procedure Log( Message : string ; Level : LogType := ALWAYS ; Enable : boolean := FALSE) is - ------------------------------------------------------------ - begin - AlertLogStruct.Log(LOG_DEFAULT_ID, Message, Level, Enable) ; - end procedure log ; - - ------------------------------------------------------------ - procedure SetAlertLogName(Name : string ) is - ------------------------------------------------------------ - begin - AlertLogStruct.SetAlertLogName(Name) ; - end procedure SetAlertLogName ; - - ------------------------------------------------------------ - impure function GetAlertLogName(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return string is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetAlertLogName(AlertLogID) ; - end GetAlertLogName ; - - ------------------------------------------------------------ - procedure DeallocateAlertLogStruct is - ------------------------------------------------------------ - begin - AlertLogStruct.Deallocate ; - end procedure DeallocateAlertLogStruct ; - - ------------------------------------------------------------ - procedure InitializeAlertLogStruct is - ------------------------------------------------------------ - begin - AlertLogStruct.Initialize ; - end procedure InitializeAlertLogStruct ; - - ------------------------------------------------------------ - impure function FindAlertLogID(Name : string ) return AlertLogIDType is - ------------------------------------------------------------ - begin - return AlertLogStruct.FindAlertLogID(Name) ; - end function FindAlertLogID ; - - ------------------------------------------------------------ - impure function FindAlertLogID(Name : string ; ParentID : AlertLogIDType) return AlertLogIDType is - ------------------------------------------------------------ - begin - return AlertLogStruct.FindAlertLogID(Name, ParentID) ; - end function FindAlertLogID ; - - ------------------------------------------------------------ - impure function GetAlertLogID(Name : string ; ParentID : AlertLogIDType := ALERTLOG_BASE_ID ; CreateHierarchy : Boolean := TRUE) return AlertLogIDType is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetAlertLogID(Name, ParentID, CreateHierarchy ) ; - end function GetAlertLogID ; - - ------------------------------------------------------------ - impure function GetAlertLogParentID(AlertLogID : AlertLogIDType) return AlertLogIDType is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetAlertLogParentID(AlertLogID) ; - end function GetAlertLogParentID ; - - ------------------------------------------------------------ - procedure SetGlobalAlertEnable (A : boolean := TRUE) is - ------------------------------------------------------------ - begin - AlertLogStruct.SetGlobalAlertEnable(A) ; - end procedure SetGlobalAlertEnable ; - - ------------------------------------------------------------ - -- Set using constant. Set before code runs. - impure function SetGlobalAlertEnable (A : boolean := TRUE) return boolean is - ------------------------------------------------------------ - begin - AlertLogStruct.SetGlobalAlertEnable(A) ; - return A ; - end function SetGlobalAlertEnable ; - - ------------------------------------------------------------ - impure function GetGlobalAlertEnable return boolean is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetGlobalAlertEnable ; - end function GetGlobalAlertEnable ; - - ------------------------------------------------------------ - procedure IncAffirmCount is - ------------------------------------------------------------ - begin - AlertLogStruct.IncAffirmCount ; - end procedure IncAffirmCount ; - - ------------------------------------------------------------ - impure function GetAffirmCount return natural is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetAffirmCount ; - end function GetAffirmCount ; - ---?? ------------------------------------------------------------ ---?? procedure IncAffirmPassCount is ---?? ------------------------------------------------------------ ---?? begin ---?? AlertLogStruct.IncAffirmPassCount ; ---?? end procedure IncAffirmPassCount ; ---?? ---?? ------------------------------------------------------------ ---?? impure function GetAffirmPassCount return natural is ---?? ------------------------------------------------------------ ---?? begin ---?? return AlertLogStruct.GetAffirmPassCount ; ---?? end function GetAffirmPassCount ; - - ------------------------------------------------------------ - procedure SetAlertStopCount(AlertLogID : AlertLogIDType ; Level : AlertType ; Count : integer) is - ------------------------------------------------------------ - begin - AlertLogStruct.SetAlertStopCount(AlertLogID, Level, Count) ; - end procedure SetAlertStopCount ; - - ------------------------------------------------------------ - procedure SetAlertStopCount(Level : AlertType ; Count : integer) is - ------------------------------------------------------------ - begin - AlertLogStruct.SetAlertStopCount(ALERTLOG_BASE_ID, Level, Count) ; - end procedure SetAlertStopCount ; - - ------------------------------------------------------------ - impure function GetAlertStopCount(AlertLogID : AlertLogIDType ; Level : AlertType) return integer is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetAlertStopCount(AlertLogID, Level) ; - end function GetAlertStopCount ; - - ------------------------------------------------------------ - impure function GetAlertStopCount(Level : AlertType) return integer is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetAlertStopCount(ALERTLOG_BASE_ID, Level) ; - end function GetAlertStopCount ; - - ------------------------------------------------------------ - procedure SetAlertEnable(Level : AlertType ; Enable : boolean) is - ------------------------------------------------------------ - begin - AlertLogStruct.SetAlertEnable(Level, Enable) ; - end procedure SetAlertEnable ; - - ------------------------------------------------------------ - procedure SetAlertEnable(AlertLogID : AlertLogIDType ; Level : AlertType ; Enable : boolean ; DescendHierarchy : boolean := TRUE) is - ------------------------------------------------------------ - begin - AlertLogStruct.SetAlertEnable(AlertLogID, Level, Enable, DescendHierarchy) ; - end procedure SetAlertEnable ; - - ------------------------------------------------------------ - impure function GetAlertEnable(AlertLogID : AlertLogIDType ; Level : AlertType) return boolean is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetAlertEnable(AlertLogID, Level) ; - end function GetAlertEnable ; - - ------------------------------------------------------------ - impure function GetAlertEnable(Level : AlertType) return boolean is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetAlertEnable(ALERT_DEFAULT_ID, Level) ; - end function GetAlertEnable ; - - ------------------------------------------------------------ - procedure SetLogEnable(Level : LogType ; Enable : boolean) is - ------------------------------------------------------------ - begin - AlertLogStruct.SetLogEnable(Level, Enable) ; - end procedure SetLogEnable ; - - ------------------------------------------------------------ - procedure SetLogEnable(AlertLogID : AlertLogIDType ; Level : LogType ; Enable : boolean ; DescendHierarchy : boolean := TRUE) is - ------------------------------------------------------------ - begin - AlertLogStruct.SetLogEnable(AlertLogID, Level, Enable, DescendHierarchy) ; - end procedure SetLogEnable ; - - ------------------------------------------------------------ - impure function GetLogEnable(AlertLogID : AlertLogIDType ; Level : LogType) return boolean is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetLogEnable(AlertLogID, Level) ; - end function GetLogEnable ; - - ------------------------------------------------------------ - impure function GetLogEnable(Level : LogType) return boolean is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetLogEnable(LOG_DEFAULT_ID, Level) ; - end function GetLogEnable ; - - ------------------------------------------------------------ - procedure ReportLogEnables is - ------------------------------------------------------------ - begin - AlertLogStruct.ReportLogEnables ; - end ReportLogEnables ; - - ------------------------------------------------------------ - procedure SetAlertLogOptions ( - ------------------------------------------------------------ - FailOnWarning : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - FailOnDisabledErrors : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - ReportHierarchy : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - WriteAlertLevel : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - WriteAlertName : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - WriteAlertTime : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - WriteLogLevel : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - WriteLogName : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - WriteLogTime : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; - AlertPrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; - LogPrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; - ReportPrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; - DoneName : string := OSVVM_STRING_INIT_PARM_DETECT ; - PassName : string := OSVVM_STRING_INIT_PARM_DETECT ; - FailName : string := OSVVM_STRING_INIT_PARM_DETECT - ) is - begin - AlertLogStruct.SetAlertLogOptions ( - FailOnWarning => FailOnWarning , - FailOnDisabledErrors => FailOnDisabledErrors, - ReportHierarchy => ReportHierarchy , - WriteAlertLevel => WriteAlertLevel , - WriteAlertName => WriteAlertName , - WriteAlertTime => WriteAlertTime , - WriteLogLevel => WriteLogLevel , - WriteLogName => WriteLogName , - WriteLogTime => WriteLogTime , - AlertPrefix => AlertPrefix , - LogPrefix => LogPrefix , - ReportPrefix => ReportPrefix , - DoneName => DoneName , - PassName => PassName , - FailName => FailName - ); - end procedure SetAlertLogOptions ; - - ------------------------------------------------------------ - procedure ReportAlertLogOptions is - ------------------------------------------------------------ - begin - AlertLogStruct.ReportAlertLogOptions ; - end procedure ReportAlertLogOptions ; - - ------------------------------------------------------------ - impure function GetAlertLogFailOnWarning return AlertLogOptionsType is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetAlertLogFailOnWarning ; - end function GetAlertLogFailOnWarning ; - - ------------------------------------------------------------ - impure function GetAlertLogFailOnDisabledErrors return AlertLogOptionsType is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetAlertLogFailOnDisabledErrors ; - end function GetAlertLogFailOnDisabledErrors ; - - ------------------------------------------------------------ - impure function GetAlertLogReportHierarchy return AlertLogOptionsType is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetAlertLogReportHierarchy ; - end function GetAlertLogReportHierarchy ; - - ------------------------------------------------------------ - impure function GetAlertLogFoundReportHier return boolean is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetAlertLogFoundReportHier ; - end function GetAlertLogFoundReportHier ; - - ------------------------------------------------------------ - impure function GetAlertLogFoundAlertHier return boolean is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetAlertLogFoundAlertHier ; - end function GetAlertLogFoundAlertHier ; - - ------------------------------------------------------------ - impure function GetAlertLogWriteAlertLevel return AlertLogOptionsType is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetAlertLogWriteAlertLevel ; - end function GetAlertLogWriteAlertLevel ; - - ------------------------------------------------------------ - impure function GetAlertLogWriteAlertName return AlertLogOptionsType is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetAlertLogWriteAlertName ; - end function GetAlertLogWriteAlertName ; - - ------------------------------------------------------------ - impure function GetAlertLogWriteAlertTime return AlertLogOptionsType is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetAlertLogWriteAlertTime ; - end function GetAlertLogWriteAlertTime ; - - ------------------------------------------------------------ - impure function GetAlertLogWriteLogLevel return AlertLogOptionsType is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetAlertLogWriteLogLevel ; - end function GetAlertLogWriteLogLevel ; - - ------------------------------------------------------------ - impure function GetAlertLogWriteLogName return AlertLogOptionsType is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetAlertLogWriteLogName ; - end function GetAlertLogWriteLogName ; - - ------------------------------------------------------------ - impure function GetAlertLogWriteLogTime return AlertLogOptionsType is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetAlertLogWriteLogTime ; - end function GetAlertLogWriteLogTime ; - - ------------------------------------------------------------ - impure function GetAlertLogAlertPrefix return string is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetAlertLogAlertPrefix ; - end function GetAlertLogAlertPrefix ; - - ------------------------------------------------------------ - impure function GetAlertLogLogPrefix return string is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetAlertLogLogPrefix ; - end function GetAlertLogLogPrefix ; - - ------------------------------------------------------------ - impure function GetAlertLogReportPrefix return string is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetAlertLogReportPrefix ; - end function GetAlertLogReportPrefix ; - - ------------------------------------------------------------ - impure function GetAlertLogDoneName return string is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetAlertLogDoneName ; - end function GetAlertLogDoneName ; - - ------------------------------------------------------------ - impure function GetAlertLogPassName return string is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetAlertLogPassName ; - end function GetAlertLogPassName ; - - ------------------------------------------------------------ - impure function GetAlertLogFailName return string is - ------------------------------------------------------------ - begin - return AlertLogStruct.GetAlertLogFailName ; - end function GetAlertLogFailName ; - - ------------------------------------------------------------ - function IsLogEnableType (Name : String) return boolean is - ------------------------------------------------------------ - -- type LogType is (ALWAYS, DEBUG, FINAL, INFO, PASSED) ; -- NEVER - begin - if Name = "PASSED" then return TRUE ; - elsif Name = "DEBUG" then return TRUE ; - elsif Name = "FINAL" then return TRUE ; - elsif Name = "INFO" then return TRUE ; - end if ; - return FALSE ; - end function IsLogEnableType ; - - ------------------------------------------------------------ - procedure ReadLogEnables (file AlertLogInitFile : text) is - -- Preferred Read format - -- Line 1: instance1_name log_enable log_enable log_enable - -- Line 2: instance2_name log_enable log_enable log_enable - -- when reading multiple log_enables on a line, they must be separated by a space - -- - --- Also supports alternate format from Lyle/.... - -- Line 1: instance1_name - -- Line 2: log enable - -- Line 3: instance2_name - -- Line 4: log enable - -- - ------------------------------------------------------------ - type ReadStateType is (GET_ID, GET_ENABLE) ; - variable ReadState : ReadStateType := GET_ID ; - variable buf : line ; - variable Empty : boolean ; - variable MultiLineComment : boolean := FALSE ; - variable Name : string(1 to 80) ; - variable NameLen : integer ; - variable AlertLogID : AlertLogIDType ; - variable ReadAnEnable : boolean ; - variable LogLevel : LogType ; - begin - ReadState := GET_ID ; - ReadLineLoop : while not EndFile(AlertLogInitFile) loop - ReadLine(AlertLogInitFile, buf) ; - if ReadAnEnable then - -- Read one or more enable values, next line read AlertLog name - -- Note that any newline with ReadAnEnable TRUE will result in - -- searching for another AlertLogID name - this includes multi-line comments. - ReadState := GET_ID ; - end if ; - - ReadNameLoop : loop - EmptyOrCommentLine(buf, Empty, MultiLineComment) ; - next ReadLineLoop when Empty ; - - case ReadState is - when GET_ID => - sread(buf, Name, NameLen) ; - exit ReadNameLoop when NameLen = 0 ; - AlertLogID := GetAlertLogID(Name(1 to NameLen), ALERTLOG_ID_NOT_ASSIGNED) ; - ReadState := GET_ENABLE ; - ReadAnEnable := FALSE ; - - when GET_ENABLE => - sread(buf, Name, NameLen) ; - exit ReadNameLoop when NameLen = 0 ; - ReadAnEnable := TRUE ; - if not IsLogEnableType(Name(1 to NameLen)) then - Alert(OSVVM_ALERTLOG_ID, "AlertLogPkg.ReadLogEnables: Found Invalid LogEnable: " & Name(1 to NameLen)) ; - exit ReadNameLoop ; - end if ; - LogLevel := LogType'value(Name(1 to NameLen)) ; - SetLogEnable(AlertLogID, LogLevel, TRUE) ; - end case ; - end loop ReadNameLoop ; - end loop ReadLineLoop ; - end procedure ReadLogEnables ; - - ------------------------------------------------------------ - procedure ReadLogEnables (FileName : string) is - ------------------------------------------------------------ - file AlertLogInitFile : text open READ_MODE is FileName ; - begin - ReadLogEnables(AlertLogInitFile) ; - end procedure ReadLogEnables ; - - ------------------------------------------------------------ - function PathTail (A : string) return string is - ------------------------------------------------------------ - alias aA : string(1 to A'length) is A ; - begin - for i in aA'length - 1 downto 1 loop - if aA(i) = ':' then - return aA(i+1 to aA'length-1) ; - end if ; - end loop ; - return aA ; - end function PathTail ; - - -- ------------------------------------------------------------ - -- Deprecated - -- - - ------------------------------------------------------------ - -- deprecated - procedure AlertIf( condition : boolean ; AlertLogID : AlertLogIDType ; Message : string ; Level : AlertType := ERROR ) is - begin - AlertIf( AlertLogID, condition, Message, Level) ; - end procedure AlertIf ; - - ------------------------------------------------------------ - -- deprecated - impure function AlertIf( condition : boolean ; AlertLogID : AlertLogIDType ; Message : string ; Level : AlertType := ERROR ) return boolean is - begin - return AlertIf( AlertLogID, condition, Message, Level) ; - end function AlertIf ; - - ------------------------------------------------------------ - -- deprecated - procedure AlertIfNot( condition : boolean ; AlertLogID : AlertLogIDType ; Message : string ; Level : AlertType := ERROR ) is - begin - AlertIfNot( AlertLogID, condition, Message, Level) ; - end procedure AlertIfNot ; - - ------------------------------------------------------------ - -- deprecated - impure function AlertIfNot( condition : boolean ; AlertLogID : AlertLogIDType ; Message : string ; Level : AlertType := ERROR ) return boolean is - begin - return AlertIfNot( AlertLogID, condition, Message, Level) ; - end function AlertIfNot ; - - ------------------------------------------------------------ - -- deprecated - procedure AffirmIf( - AlertLogID : AlertLogIDType ; - condition : boolean ; - Message : string ; - LogLevel : LogType ; -- := PASSED - AlertLevel : AlertType := ERROR - ) is - begin - AlertLogStruct.IncAffirmCount ; -- increment check count - if condition then - -- passed - AlertLogStruct.Log(AlertLogID, Message, LogLevel) ; -- call log --- AlertLogStruct.IncAffirmPassCount ; -- increment pass & check count - else - AlertLogStruct.Alert(AlertLogID, Message, AlertLevel) ; -- signal failure - end if ; - end procedure AffirmIf ; - - ------------------------------------------------------------ - -- deprecated - procedure AffirmIf( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; AlertLevel : AlertType ) is - begin - AffirmIf(AlertLogID, condition, Message, PASSED, AlertLevel) ; - end procedure AffirmIf ; - - ------------------------------------------------------------ - -- deprecated - procedure AffirmIf(condition : boolean ; Message : string ; LogLevel : LogType ; AlertLevel : AlertType := ERROR) is - begin - AffirmIf(ALERT_DEFAULT_ID, condition, Message, LogLevel, AlertLevel) ; - end procedure AffirmIf; - - ------------------------------------------------------------ - -- deprecated - procedure AffirmIf(condition : boolean ; Message : string ; AlertLevel : AlertType ) is - begin - AffirmIf(ALERT_DEFAULT_ID, condition, Message, PASSED, AlertLevel) ; - end procedure AffirmIf; - +-- +-- File Name: AlertLogPkg.vhd +-- Design Unit Name: AlertLogPkg +-- Revision: STANDARD VERSION +-- +-- Maintainer: Jim Lewis email: jim@synthworks.com +-- Contributor(s): +-- Jim Lewis jim@synthworks.com +-- +-- +-- Description: +-- Alert handling and log filtering (verbosity control) +-- Alert handling provides a method to count failures, errors, and warnings +-- To accumlate counts, a data structure is created in a shared variable +-- It is of type AlertLogStructPType which is defined in AlertLogBasePkg +-- Log filtering provides verbosity control for logs (display or do not display) +-- AlertLogPkg provides a simplified interface to the shared variable +-- +-- +-- Developed for: +-- SynthWorks Design Inc. +-- VHDL Training Classes +-- 11898 SW 128th Ave. Tigard, Or 97223 +-- http://www.SynthWorks.com +-- +-- Revision History: +-- Date Version Description +-- 01/2015: 2015.01 Initial revision +-- 03/2015 2015.03 Added: AlertIfEqual, AlertIfNotEqual, AlertIfDiff, PathTail, +-- ReportNonZeroAlerts, ReadLogEnables +-- 05/2015 2015.06 Added IncAlertCount, AffirmIf +-- 07/2015 2016.01 Fixed AlertLogID issue with > 32 IDs +-- 02/2016 2016.02 Fixed IsLogEnableType (for PASSED), AffirmIf (to pass AlertLevel) +-- Created LocalInitialize +-- 05/2017 2017.05 AffirmIfEqual, AffirmIfDiff, +-- GetAffirmCount (deprecates GetAffirmCheckCount), IncAffirmCount (deprecates IncAffirmCheckCount), +-- IsAlertEnabled (alias), IsLogEnabled (alias) +-- +-- +-- Copyright (c) 2015 - 2017 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 +-- + + +use std.textio.all ; +use work.OsvvmGlobalPkg.all ; +use work.TranscriptPkg.all ; +use work.TextUtilPkg.all ; + +library IEEE ; +use ieee.std_logic_1164.all ; +use ieee.numeric_std.all ; + +package AlertLogPkg is + +-- type AlertLogIDType is range integer'low to integer'high ; -- next revsion + subtype AlertLogIDType is integer ; + type AlertLogIDVectorType is array (integer range <>) of AlertLogIDType ; + type AlertType is (FAILURE, ERROR, WARNING) ; -- NEVER + subtype AlertIndexType is AlertType range FAILURE to WARNING ; + type AlertCountType is array (AlertIndexType) of integer ; + type AlertEnableType is array(AlertIndexType) of boolean ; + type LogType is (ALWAYS, DEBUG, FINAL, INFO, PASSED) ; -- NEVER -- See function IsLogEnableType + subtype LogIndexType is LogType range DEBUG to PASSED ; + type LogEnableType is array (LogIndexType) of boolean ; + + constant ALERTLOG_BASE_ID : AlertLogIDType := 0 ; -- Careful as some code may assume this is 0. + constant ALERTLOG_DEFAULT_ID : AlertLogIDType := 1 ; + constant ALERT_DEFAULT_ID : AlertLogIDType := ALERTLOG_DEFAULT_ID ; + constant LOG_DEFAULT_ID : AlertLogIDType := ALERTLOG_DEFAULT_ID ; + constant OSVVM_ALERTLOG_ID : AlertLogIDType := 2 ; + constant OSVVM_SCOREBOARD_ALERTLOG_ID : AlertLogIDType := OSVVM_ALERTLOG_ID ; + -- NUM_PREDEFINED_AL_IDS intended to be local, but depends on others + -- constant NUM_PREDEFINED_AL_IDS : AlertLogIDType := OSVVM_SCOREBOARD_ALERTLOG_ID - ALERTLOG_BASE_ID ; -- Not including base + constant ALERTLOG_ID_NOT_FOUND : AlertLogIDType := -1 ; -- alternately integer'right + constant ALERTLOG_ID_NOT_ASSIGNED : AlertLogIDType := -1 ; + constant MIN_NUM_AL_IDS : AlertLogIDType := 32 ; -- Number IDs initially allocated + + alias AlertLogOptionsType is work.OsvvmGlobalPkg.OsvvmOptionsType ; + + ------------------------------------------------------------ + -- Alert always goes to the transcript file + procedure Alert( + AlertLogID : AlertLogIDType ; + Message : string ; + Level : AlertType := ERROR + ) ; + procedure Alert( Message : string ; Level : AlertType := ERROR ) ; + + ------------------------------------------------------------ + procedure IncAlertCount( -- A silent form of alert + AlertLogID : AlertLogIDType ; + Level : AlertType := ERROR + ) ; + procedure IncAlertCount( Level : AlertType := ERROR ) ; + + ------------------------------------------------------------ + -- Similar to assert, except condition is positive + procedure AlertIf( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIf( condition : boolean ; Message : string ; Level : AlertType := ERROR ) ; + impure function AlertIf( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; Level : AlertType := ERROR ) return boolean ; + impure function AlertIf( condition : boolean ; Message : string ; Level : AlertType := ERROR ) return boolean ; + + ------------------------------------------------------------ + -- Direct replacement for assert + procedure AlertIfNot( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfNot( condition : boolean ; Message : string ; Level : AlertType := ERROR ) ; + impure function AlertIfNot( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; Level : AlertType := ERROR ) return boolean ; + impure function AlertIfNot( condition : boolean ; Message : string ; Level : AlertType := ERROR ) return boolean ; + + ------------------------------------------------------------ + -- overloading for common functionality + procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : std_logic ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : std_logic_vector ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : unsigned ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : signed ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : integer ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : real ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : character ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : string ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : time ; Message : string ; Level : AlertType := ERROR ) ; + + procedure AlertIfEqual( L, R : std_logic ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfEqual( L, R : std_logic_vector ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfEqual( L, R : unsigned ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfEqual( L, R : signed ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfEqual( L, R : integer ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfEqual( L, R : real ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfEqual( L, R : character ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfEqual( L, R : string ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfEqual( L, R : time ; Message : string ; Level : AlertType := ERROR ) ; + + procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : std_logic ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : std_logic_vector ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : unsigned ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : signed ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : integer ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : real ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : character ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : string ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : time ; Message : string ; Level : AlertType := ERROR ) ; + + procedure AlertIfNotEqual( L, R : std_logic ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfNotEqual( L, R : std_logic_vector ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfNotEqual( L, R : unsigned ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfNotEqual( L, R : signed ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfNotEqual( L, R : integer ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfNotEqual( L, R : real ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfNotEqual( L, R : character ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfNotEqual( L, R : string ; Message : string ; Level : AlertType := ERROR ) ; + procedure AlertIfNotEqual( L, R : time ; Message : string ; Level : AlertType := ERROR ) ; + + ------------------------------------------------------------ + -- Simple Diff for file comparisons + procedure AlertIfDiff (AlertLogID : AlertLogIDType ; Name1, Name2 : string; Message : string := "" ; Level : AlertType := ERROR ) ; + procedure AlertIfDiff (Name1, Name2 : string; Message : string := "" ; Level : AlertType := ERROR ) ; + procedure AlertIfDiff (AlertLogID : AlertLogIDType ; file File1, File2 : text; Message : string := "" ; Level : AlertType := ERROR ) ; + procedure AlertIfDiff (file File1, File2 : text; Message : string := "" ; Level : AlertType := ERROR ) ; + + ------------------------------------------------------------ + ------------------------------------------------------------ + ------------------------------------------------------------ + procedure AffirmIf( + ------------------------------------------------------------ + AlertLogID : AlertLogIDType ; + condition : boolean ; + ReceivedMessage : string ; + ExpectedMessage : string ; + Enable : boolean := FALSE -- override internal enable + ) ; + + procedure AffirmIf( condition : boolean ; ReceivedMessage, ExpectedMessage : string ; Enable : boolean := FALSE ) ; + impure function AffirmIf( AlertLogID : AlertLogIDType ; condition : boolean ; ReceivedMessage, ExpectedMessage : string ; Enable : boolean := FALSE ) return boolean ; + impure function AffirmIf( condition : boolean ; ReceivedMessage, ExpectedMessage : string ; Enable : boolean := FALSE ) return boolean ; + + procedure AffirmIf( + AlertLogID : AlertLogIDType ; + condition : boolean ; + Message : string ; + Enable : boolean := FALSE -- override internal enable + ) ; + + procedure AffirmIf(condition : boolean ; Message : string ; Enable : boolean := FALSE ) ; + impure function AffirmIf( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; Enable : boolean := FALSE ) return boolean ; + impure function AffirmIf( condition : boolean ; Message : string ; Enable : boolean := FALSE ) return boolean ; + + ------------------------------------------------------------ + procedure AffirmIfNot( AlertLogID : AlertLogIDType ; condition : boolean ; ReceivedMessage, ExpectedMessage : string ; Enable : boolean := FALSE ) ; + procedure AffirmIfNot( condition : boolean ; ReceivedMessage, ExpectedMessage : string ; Enable : boolean := FALSE ) ; + impure function AffirmIfNot( AlertLogID : AlertLogIDType ; condition : boolean ; ReceivedMessage, ExpectedMessage : string ; Enable : boolean := FALSE ) return boolean ; + impure function AffirmIfNot( condition : boolean ; ReceivedMessage, ExpectedMessage : string ; Enable : boolean := FALSE ) return boolean ; + + ------------------------------------------------------------ + procedure AffirmIfNot( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; Enable : boolean := FALSE ) ; + procedure AffirmIfNot( condition : boolean ; Message : string ; Enable : boolean := FALSE ) ; + impure function AffirmIfNot( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; Enable : boolean := FALSE ) return boolean ; + impure function AffirmIfNot( condition : boolean ; Message : string ; Enable : boolean := FALSE ) return boolean ; + + ------------------------------------------------------------ + procedure AffirmPassed( AlertLogID : AlertLogIDType ; Message : string ; Enable : boolean := FALSE ) ; + procedure AffirmPassed( Message : string ; Enable : boolean := FALSE ) ; + procedure AffirmError( AlertLogID : AlertLogIDType ; Message : string ) ; + procedure AffirmError( Message : string ) ; + + ------------------------------------------------------------ + procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : std_logic ; Message : string := "" ; Enable : boolean := FALSE ) ; + procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : std_logic_vector ; Message : string := "" ; Enable : boolean := FALSE ) ; + procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : unsigned ; Message : string := "" ; Enable : boolean := FALSE ) ; + procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : signed ; Message : string := "" ; Enable : boolean := FALSE ); + procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : integer ; Message : string := "" ; Enable : boolean := FALSE ) ; + procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : real ; Message : string := "" ; Enable : boolean := FALSE ) ; + procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : character ; Message : string := "" ; Enable : boolean := FALSE ) ; + procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : string ; Message : string := "" ; Enable : boolean := FALSE ) ; + procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : time ; Message : string := "" ; Enable : boolean := FALSE ) ; + + -- Without AlertLogID + ------------------------------------------------------------ + procedure AffirmIfEqual( Received, Expected : std_logic ; Message : string := "" ; Enable : boolean := FALSE ) ; + procedure AffirmIfEqual( Received, Expected : std_logic_vector ; Message : string := "" ; Enable : boolean := FALSE ) ; + procedure AffirmIfEqual( Received, Expected : unsigned ; Message : string := "" ; Enable : boolean := FALSE ) ; + procedure AffirmIfEqual( Received, Expected : signed ; Message : string := "" ; Enable : boolean := FALSE ) ; + procedure AffirmIfEqual( Received, Expected : integer ; Message : string := "" ; Enable : boolean := FALSE ) ; + procedure AffirmIfEqual( Received, Expected : real ; Message : string := "" ; Enable : boolean := FALSE ) ; + procedure AffirmIfEqual( Received, Expected : character ; Message : string := "" ; Enable : boolean := FALSE ) ; + procedure AffirmIfEqual( Received, Expected : string ; Message : string := "" ; Enable : boolean := FALSE ) ; + procedure AffirmIfEqual( Received, Expected : time ; Message : string := "" ; Enable : boolean := FALSE ) ; + + ------------------------------------------------------------ + procedure AffirmIfDiff (AlertLogID : AlertLogIDType ; Name1, Name2 : string; Message : string := "" ; Enable : boolean := FALSE ) ; + procedure AffirmIfDiff (Name1, Name2 : string; Message : string := "" ; Enable : boolean := FALSE ) ; + procedure AffirmIfDiff (AlertLogID : AlertLogIDType ; file File1, File2 : text; Message : string := "" ; Enable : boolean := FALSE ) ; + procedure AffirmIfDiff (file File1, File2 : text; Message : string := "" ; Enable : boolean := FALSE ) ; + + ------------------------------------------------------------ + procedure SetAlertLogJustify ; + procedure ReportAlerts ( Name : String ; AlertCount : AlertCountType ) ; + procedure ReportAlerts ( Name : string := OSVVM_STRING_INIT_PARM_DETECT ; AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID ; ExternalErrors : AlertCountType := (others => 0) ) ; + procedure ReportNonZeroAlerts ( Name : string := OSVVM_STRING_INIT_PARM_DETECT ; AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID ; ExternalErrors : AlertCountType := (others => 0) ) ; + procedure ClearAlerts ; + function "ABS" (L : AlertCountType) return AlertCountType ; + function "+" (L, R : AlertCountType) return AlertCountType ; + function "-" (L, R : AlertCountType) return AlertCountType ; + function "-" (R : AlertCountType) return AlertCountType ; + impure function SumAlertCount(AlertCount: AlertCountType) return integer ; + impure function GetAlertCount(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return AlertCountType ; + impure function GetAlertCount(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return integer ; + impure function GetEnabledAlertCount(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return AlertCountType ; + impure function GetEnabledAlertCount(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return integer ; + impure function GetDisabledAlertCount return AlertCountType ; + impure function GetDisabledAlertCount return integer ; + impure function GetDisabledAlertCount(AlertLogID: AlertLogIDType) return AlertCountType ; + impure function GetDisabledAlertCount(AlertLogID: AlertLogIDType) return integer ; + + ------------------------------------------------------------ + -- log filtering for verbosity control, optionally has a separate file parameter + procedure Log( + AlertLogID : AlertLogIDType ; + Message : string ; + Level : LogType := ALWAYS ; + Enable : boolean := FALSE -- override internal enable + ) ; + procedure Log( Message : string ; Level : LogType := ALWAYS ; Enable : boolean := FALSE) ; + + ------------------------------------------------------------ + -- Accessor Methods + procedure SetAlertLogName(Name : string ) ; + impure function GetAlertLogName(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return string ; + procedure DeallocateAlertLogStruct ; + procedure InitializeAlertLogStruct ; + impure function FindAlertLogID(Name : string ) return AlertLogIDType ; + impure function FindAlertLogID(Name : string ; ParentID : AlertLogIDType) return AlertLogIDType ; + impure function GetAlertLogID(Name : string ; ParentID : AlertLogIDType := ALERTLOG_BASE_ID ; CreateHierarchy : Boolean := TRUE) return AlertLogIDType ; + impure function GetAlertLogParentID(AlertLogID : AlertLogIDType) return AlertLogIDType ; + + ------------------------------------------------------------ + -- Accessor Methods + procedure SetGlobalAlertEnable (A : boolean := TRUE) ; + impure function SetGlobalAlertEnable (A : boolean := TRUE) return boolean ; + impure function GetGlobalAlertEnable return boolean ; + procedure IncAffirmCount ; + impure function GetAffirmCount return natural ; +--?? procedure IncAffirmPassCount ; +--?? impure function GetAffirmPassCount return natural ; + + procedure SetAlertStopCount(AlertLogID : AlertLogIDType ; Level : AlertType ; Count : integer) ; + procedure SetAlertStopCount(Level : AlertType ; Count : integer) ; + impure function GetAlertStopCount(AlertLogID : AlertLogIDType ; Level : AlertType) return integer ; + impure function GetAlertStopCount(Level : AlertType) return integer ; + + procedure SetAlertEnable(Level : AlertType ; Enable : boolean) ; + procedure SetAlertEnable(AlertLogID : AlertLogIDType ; Level : AlertType ; Enable : boolean ; DescendHierarchy : boolean := TRUE) ; + impure function GetAlertEnable(AlertLogID : AlertLogIDType ; Level : AlertType) return boolean ; + impure function GetAlertEnable(Level : AlertType) return boolean ; + alias IsAlertEnabled is GetAlertEnable[AlertLogIDType, AlertType return boolean] ; + alias IsAlertEnabled is GetAlertEnable[AlertType return boolean] ; + + procedure SetLogEnable(Level : LogType ; Enable : boolean) ; + procedure SetLogEnable(AlertLogID : AlertLogIDType ; Level : LogType ; Enable : boolean ; DescendHierarchy : boolean := TRUE) ; + impure function GetLogEnable(AlertLogID : AlertLogIDType ; Level : LogType) return boolean ; + impure function GetLogEnable(Level : LogType) return boolean ; + alias IsLogEnabled is GetLogEnable [AlertLogIDType, LogType return boolean] ; -- same as GetLogEnable + alias IsLogEnabled is GetLogEnable [LogType return boolean] ; -- same as GetLogEnable + + procedure ReportLogEnables ; + + ------------------------------------------------------------ + procedure SetAlertLogOptions ( + FailOnWarning : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + FailOnDisabledErrors : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + ReportHierarchy : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + WriteAlertLevel : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + WriteAlertName : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + WriteAlertTime : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + WriteLogLevel : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + WriteLogName : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + WriteLogTime : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + AlertPrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; + LogPrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; + ReportPrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; + DoneName : string := OSVVM_STRING_INIT_PARM_DETECT ; + PassName : string := OSVVM_STRING_INIT_PARM_DETECT ; + FailName : string := OSVVM_STRING_INIT_PARM_DETECT + ) ; + + procedure ReportAlertLogOptions ; + + impure function GetAlertLogFailOnWarning return AlertLogOptionsType ; + impure function GetAlertLogFailOnDisabledErrors return AlertLogOptionsType ; + impure function GetAlertLogReportHierarchy return AlertLogOptionsType ; + impure function GetAlertLogFoundReportHier return boolean ; + impure function GetAlertLogFoundAlertHier return boolean ; + impure function GetAlertLogWriteAlertLevel return AlertLogOptionsType ; + impure function GetAlertLogWriteAlertName return AlertLogOptionsType ; + impure function GetAlertLogWriteAlertTime return AlertLogOptionsType ; + impure function GetAlertLogWriteLogLevel return AlertLogOptionsType ; + impure function GetAlertLogWriteLogName return AlertLogOptionsType ; + impure function GetAlertLogWriteLogTime return AlertLogOptionsType ; + + impure function GetAlertLogAlertPrefix return string ; + impure function GetAlertLogLogPrefix return string ; + + impure function GetAlertLogReportPrefix return string ; + impure function GetAlertLogDoneName return string ; + impure function GetAlertLogPassName return string ; + impure function GetAlertLogFailName return string ; + + + -- File Reading Utilities + function IsLogEnableType (Name : String) return boolean ; + procedure ReadLogEnables (file AlertLogInitFile : text) ; + procedure ReadLogEnables (FileName : string) ; + + -- String Helper Functions -- This should be in a more general string package + function PathTail (A : string) return string ; + + + -- ------------------------------------------------------------ + -- Deprecated + -- + + -- deprecated + procedure AlertIf( condition : boolean ; AlertLogID : AlertLogIDType ; Message : string ; Level : AlertType := ERROR ) ; + impure function AlertIf( condition : boolean ; AlertLogID : AlertLogIDType ; Message : string ; Level : AlertType := ERROR ) return boolean ; + + -- deprecated + procedure AlertIfNot( condition : boolean ; AlertLogID : AlertLogIDType ; Message : string ; Level : AlertType := ERROR ) ; + impure function AlertIfNot( condition : boolean ; AlertLogID : AlertLogIDType ; Message : string ; Level : AlertType := ERROR ) return boolean ; + + -- deprecated + procedure AffirmIf( + AlertLogID : AlertLogIDType ; + condition : boolean ; + Message : string ; + LogLevel : LogType ; -- := PASSED + AlertLevel : AlertType := ERROR + ) ; + procedure AffirmIf( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; AlertLevel : AlertType ) ; + procedure AffirmIf(condition : boolean ; Message : string ; LogLevel : LogType ; AlertLevel : AlertType := ERROR) ; + procedure AffirmIf(condition : boolean ; Message : string ; AlertLevel : AlertType ) ; + + alias IncAffirmCheckCount is IncAffirmCount [] ; + alias GetAffirmCheckCount is GetAffirmCount [return natural] ; + alias IsLoggingEnabled is GetLogEnable [AlertLogIDType, LogType return boolean] ; -- same as IsLogEnabled + alias IsLoggingEnabled is GetLogEnable [LogType return boolean] ; -- same as IsLogEnabled + + +end AlertLogPkg ; + +--- /////////////////////////////////////////////////////////////////////////// +--- /////////////////////////////////////////////////////////////////////////// +--- /////////////////////////////////////////////////////////////////////////// + +use work.NamePkg.all ; + +package body AlertLogPkg is + + -- instead of justify(to_upper(to_string())), just look up the upper case, left justified values + type AlertNameType is array(AlertType) of string(1 to 7) ; + constant ALERT_NAME : AlertNameType := (WARNING => "WARNING", ERROR => "ERROR ", FAILURE => "FAILURE") ; -- , NEVER => "NEVER " + type LogNameType is array(LogType) of string(1 to 7) ; + constant LOG_NAME : LogNameType := (DEBUG => "DEBUG ", FINAL => "FINAL ", INFO => "INFO ", ALWAYS => "ALWAYS ", PASSED => "PASSED ") ; -- , NEVER => "NEVER " + + + type AlertLogStructPType is protected + + ------------------------------------------------------------ + procedure alert ( + ------------------------------------------------------------ + AlertLogID : AlertLogIDType ; + message : string ; + level : AlertType := ERROR + ) ; + + ------------------------------------------------------------ + procedure IncAlertCount ( AlertLogID : AlertLogIDType ; level : AlertType := ERROR ) ; + procedure SetJustify ; + procedure ReportAlerts ( Name : string ; AlertCount : AlertCountType ) ; + procedure ReportAlerts ( Name : string := OSVVM_STRING_INIT_PARM_DETECT ; AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID ; ExternalErrors : AlertCountType := (0,0,0) ; ReportAll : boolean := TRUE ) ; + procedure ClearAlerts ; + impure function GetAlertCount(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return AlertCountType ; + impure function GetEnabledAlertCount(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return AlertCountType ; + impure function GetDisabledAlertCount return AlertCountType ; + impure function GetDisabledAlertCount(AlertLogID: AlertLogIDType) return AlertCountType ; + + ------------------------------------------------------------ + procedure log ( + ------------------------------------------------------------ + AlertLogID : AlertLogIDType ; + Message : string ; + Level : LogType := ALWAYS ; + Enable : boolean := FALSE -- override internal enable + ) ; + + ------------------------------------------------------------ + -- FILE IO Controls +-- procedure SetTranscriptEnable (A : boolean := TRUE) ; +-- impure function IsTranscriptEnabled return boolean ; +-- procedure MirrorTranscript (A : boolean := TRUE) ; +-- impure function IsTranscriptMirrored return boolean ; + + ------------------------------------------------------------ + ------------------------------------------------------------ + -- AlertLog Structure Creation and Interaction Methods + + ------------------------------------------------------------ + procedure SetAlertLogName(Name : string ) ; + procedure SetNumAlertLogIDs (NewNumAlertLogIDs : AlertLogIDType) ; + impure function FindAlertLogID(Name : string ) return AlertLogIDType ; + impure function FindAlertLogID(Name : string ; ParentID : AlertLogIDType) return AlertLogIDType ; + impure function GetAlertLogID(Name : string ; ParentID : AlertLogIDType ; CreateHierarchy : Boolean) return AlertLogIDType ; + impure function GetAlertLogParentID(AlertLogID : AlertLogIDType) return AlertLogIDType ; + procedure Initialize(NewNumAlertLogIDs : AlertLogIDType := MIN_NUM_AL_IDS) ; + procedure Deallocate ; + + ------------------------------------------------------------ + ------------------------------------------------------------ + -- Accessor Methods + ------------------------------------------------------------ + procedure SetGlobalAlertEnable (A : boolean := TRUE) ; + impure function GetAlertLogName(AlertLogID : AlertLogIDType) return string ; + impure function GetGlobalAlertEnable return boolean ; + procedure IncAffirmCount ; + impure function GetAffirmCount return natural ; +--?? procedure IncAffirmPassCount ; +--?? impure function GetAffirmPassCount return natural ; + + procedure SetAlertStopCount(AlertLogID : AlertLogIDType ; Level : AlertType ; Count : integer) ; + impure function GetAlertStopCount(AlertLogID : AlertLogIDType ; Level : AlertType) return integer ; + + procedure SetAlertEnable(Level : AlertType ; Enable : boolean) ; + procedure SetAlertEnable(AlertLogID : AlertLogIDType ; Level : AlertType ; Enable : boolean ; DescendHierarchy : boolean := TRUE) ; + impure function GetAlertEnable(AlertLogID : AlertLogIDType ; Level : AlertType) return boolean ; + + procedure SetLogEnable(Level : LogType ; Enable : boolean) ; + procedure SetLogEnable(AlertLogID : AlertLogIDType ; Level : LogType ; Enable : boolean ; DescendHierarchy : boolean := TRUE) ; + impure function GetLogEnable(AlertLogID : AlertLogIDType ; Level : LogType) return boolean ; + + procedure ReportLogEnables ; + + ------------------------------------------------------------ + -- Reporting Accessor + procedure SetAlertLogOptions ( + FailOnWarning : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + FailOnDisabledErrors : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + ReportHierarchy : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + WriteAlertLevel : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + WriteAlertName : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + WriteAlertTime : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + WriteLogLevel : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + WriteLogName : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + WriteLogTime : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + AlertPrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; + LogPrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; + ReportPrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; + DoneName : string := OSVVM_STRING_INIT_PARM_DETECT ; + PassName : string := OSVVM_STRING_INIT_PARM_DETECT ; + FailName : string := OSVVM_STRING_INIT_PARM_DETECT + ) ; + procedure ReportAlertLogOptions ; + + impure function GetAlertLogFailOnWarning return AlertLogOptionsType ; + impure function GetAlertLogFailOnDisabledErrors return AlertLogOptionsType ; + impure function GetAlertLogReportHierarchy return AlertLogOptionsType ; + impure function GetAlertLogFoundReportHier return boolean ; + impure function GetAlertLogFoundAlertHier return boolean ; + impure function GetAlertLogWriteAlertLevel return AlertLogOptionsType ; + impure function GetAlertLogWriteAlertName return AlertLogOptionsType ; + impure function GetAlertLogWriteAlertTime return AlertLogOptionsType ; + impure function GetAlertLogWriteLogLevel return AlertLogOptionsType ; + impure function GetAlertLogWriteLogName return AlertLogOptionsType ; + impure function GetAlertLogWriteLogTime return AlertLogOptionsType ; + + impure function GetAlertLogAlertPrefix return string ; + impure function GetAlertLogLogPrefix return string ; + + impure function GetAlertLogReportPrefix return string ; + impure function GetAlertLogDoneName return string ; + impure function GetAlertLogPassName return string ; + impure function GetAlertLogFailName return string ; + + end protected AlertLogStructPType ; + + --- /////////////////////////////////////////////////////////////////////////// + + type AlertLogStructPType is protected body + + variable GlobalAlertEnabledVar : boolean := TRUE ; -- Allows turn off and on + + variable AffirmCheckCountVar : natural := 0 ; +--?? variable AffirmPassedCountVar : natural := 0 ; + + ------------------------------------------------------------ + type AlertLogRecType is record + ------------------------------------------------------------ + Name : Line ; + ParentID : AlertLogIDType ; + AlertCount : AlertCountType ; + AlertStopCount : AlertCountType ; + AlertEnabled : AlertEnableType ; + LogEnabled : LogEnableType ; + end record AlertLogRecType ; + + ------------------------------------------------------------ + -- Basis for AlertLog Data Structure + variable NumAlertLogIDsVar : AlertLogIDType := 0 ; -- defined by initialize + variable NumAllocatedAlertLogIDsVar : AlertLogIDType := 0 ; +--xx variable NumPredefinedAlIDsVar : AlertLogIDType := 0 ; -- defined by initialize + + type AlertLogRecPtrType is access AlertLogRecType ; + type AlertLogArrayType is array (AlertLogIDType range <>) of AlertLogRecPtrType ; + type AlertLogArrayPtrType is access AlertLogArrayType ; + variable AlertLogPtr : AlertLogArrayPtrType ; + + ------------------------------------------------------------ + -- Report formatting settings, with defaults + variable FailOnWarningVar : boolean := TRUE ; + variable FailOnDisabledErrorsVar : boolean := TRUE ; + variable ReportHierarchyVar : boolean := TRUE ; + variable FoundReportHierVar : boolean := FALSE ; + variable FoundAlertHierVar : boolean := FALSE ; + + variable WriteAlertLevelVar : boolean := TRUE ; + variable WriteAlertNameVar : boolean := TRUE ; + variable WriteAlertTimeVar : boolean := TRUE ; + variable WriteLogLevelVar : boolean := TRUE ; + variable WriteLogNameVar : boolean := TRUE ; + variable WriteLogTimeVar : boolean := TRUE ; + + variable AlertPrefixVar : NamePType ; + variable LogPrefixVar : NamePType ; + variable ReportPrefixVar : NamePType ; + variable DoneNameVar : NamePType ; + variable PassNameVar : NamePType ; + variable FailNameVar : NamePType ; + + variable AlertLogJustifyAmountVar : integer := 0 ; + variable ReportJustifyAmountVar : integer := 0 ; + + ------------------------------------------------------------ + -- PT Local + impure function LeftJustify(A : String; Amount : integer) return string is + ------------------------------------------------------------ + constant Spaces : string(1 to maximum(1, Amount)) := (others => ' ') ; + begin + if A'length >= Amount then + return A ; + else + return A & Spaces(1 to Amount - A'length) ; + end if ; + end function LeftJustify ; + + + ------------------------------------------------------------ + -- PT Local + procedure IncrementAlertCount( + ------------------------------------------------------------ + constant AlertLogID : in AlertLogIDType ; + constant Level : in AlertType ; + variable StopDueToCount : inout boolean + ) is + begin + -- Always Count at this level + AlertLogPtr(AlertLogID).AlertCount(Level) := AlertLogPtr(AlertLogID).AlertCount(Level) + 1 ; + -- Only do remaining actions if enabled + if AlertLogPtr(AlertLogID).AlertEnabled(Level) then + -- Exceeded Stop Count at this level? + if AlertLogPtr(AlertLogID).AlertCount(Level) >= AlertLogPtr(AlertLogID).AlertStopCount(Level) then + StopDueToCount := TRUE ; + end if ; + -- Propagate counts to parent(s) -- Ascend Hierarchy + if AlertLogID /= ALERTLOG_BASE_ID then + IncrementAlertCount(AlertLogPtr(AlertLogID).ParentID, Level, StopDueToCount) ; + end if ; + end if ; + end procedure IncrementAlertCount ; + + ------------------------------------------------------------ + procedure alert ( + ------------------------------------------------------------ + AlertLogID : AlertLogIDType ; + message : string ; + level : AlertType := ERROR + ) is + variable buf : Line ; + constant AlertPrefix : string := AlertPrefixVar.Get(OSVVM_DEFAULT_ALERT_PREFIX) ; + variable StopDueToCount : boolean := FALSE ; + begin + if GlobalAlertEnabledVar then + -- Do not write or count when GlobalAlertEnabledVar is disabled + if AlertLogPtr(AlertLogID).AlertEnabled(Level) then + -- do not write when disabled + write(buf, AlertPrefix) ; + if WriteAlertLevelVar then + -- write(buf, " " & to_string(Level) ) ; + write(buf, " " & ALERT_NAME(Level)) ; -- uses constant lookup + end if ; +--xx if (NumAlertLogIDsVar > NumPredefinedAlIDsVar) and WriteAlertNameVar then -- print hierarchy names even when silent + if FoundAlertHierVar and WriteAlertNameVar then +-- write(buf, " in " & justify(AlertLogPtr(AlertLogID).Name.all & ",", LEFT, AlertLogJustifyAmountVar) ) ; + write(buf, " in " & LeftJustify(AlertLogPtr(AlertLogID).Name.all & ",", AlertLogJustifyAmountVar) ) ; + end if ; + write(buf, " " & Message) ; + if WriteAlertTimeVar then + write(buf, " at " & to_string(NOW, 1 ns)) ; + end if ; + writeline(buf) ; + end if ; + -- Always Count + IncrementAlertCount(AlertLogID, Level, StopDueToCount) ; + if StopDueToCount then + write(buf, LF & AlertPrefix & " Stop Count on " & ALERT_NAME(Level) & " reached") ; +--xx if NumAlertLogIDsVar > NumPredefinedAlIDsVar then -- print hierarchy names even when silent + if FoundAlertHierVar then + write(buf, " in " & AlertLogPtr(AlertLogID).Name.all) ; + end if ; + write(buf, " at " & to_string(NOW, 1 ns) & " ") ; + writeline(buf) ; + ReportAlerts(ReportAll => TRUE) ; + std.env.stop(1) ; + end if ; + end if ; + end procedure alert ; + + ------------------------------------------------------------ + procedure IncAlertCount ( + ------------------------------------------------------------ + AlertLogID : AlertLogIDType ; + level : AlertType := ERROR + ) is + variable buf : Line ; + constant AlertPrefix : string := AlertPrefixVar.Get(OSVVM_DEFAULT_ALERT_PREFIX) ; + variable StopDueToCount : boolean := FALSE ; + begin + if GlobalAlertEnabledVar then + IncrementAlertCount(AlertLogID, Level, StopDueToCount) ; + if StopDueToCount then + write(buf, LF & AlertPrefix & " Stop Count on " & ALERT_NAME(Level) & " reached") ; +--xx if NumAlertLogIDsVar > NumPredefinedAlIDsVar then -- print hierarchy names even when silent + if FoundAlertHierVar then + write(buf, " in " & AlertLogPtr(AlertLogID).Name.all) ; + end if ; + write(buf, " at " & to_string(NOW, 1 ns) & " ") ; + writeline(buf) ; + ReportAlerts(ReportAll => TRUE) ; + std.env.stop ; + end if ; + end if ; + end procedure IncAlertCount ; + + ------------------------------------------------------------ + -- PT Local + impure function CalcJustify (AlertLogID : AlertLogIDType ; CurrentLength : integer ; IndentAmount : integer) return integer_vector is + ------------------------------------------------------------ + variable ResultValues, LowerLevelValues : integer_vector(1 to 2) ; -- 1 = Max, 2 = Indented + begin + ResultValues(1) := CurrentLength + 1 ; -- AlertLogJustifyAmountVar + ResultValues(2) := CurrentLength + IndentAmount ; -- ReportJustifyAmountVar + for i in AlertLogID+1 to NumAlertLogIDsVar loop + if AlertLogID = AlertLogPtr(i).ParentID then + LowerLevelValues := CalcJustify(i, AlertLogPtr(i).Name'length, IndentAmount + 2) ; + ResultValues(1) := maximum(ResultValues(1), LowerLevelValues(1)) ; + ResultValues(2) := maximum(ResultValues(2), LowerLevelValues(2)) ; + end if ; + end loop ; + return ResultValues ; + end function CalcJustify ; + + ------------------------------------------------------------ + procedure SetJustify is + ------------------------------------------------------------ + variable ResultValues : integer_vector(1 to 2) ; -- 1 = Max, 2 = Indented + begin + ResultValues := CalcJustify(ALERTLOG_BASE_ID, 0, 0) ; + AlertLogJustifyAmountVar := ResultValues(1) ; + ReportJustifyAmountVar := ResultValues(2) ; + end procedure SetJustify ; + + ------------------------------------------------------------ + -- PT Local + impure function GetEnabledAlertCount(AlertCount: AlertCountType; AlertEnabled : AlertEnableType) return AlertCountType is + ------------------------------------------------------------ + variable Count : AlertCountType := (others => 0) ; + begin + if AlertEnabled(FAILURE) then + Count(FAILURE) := AlertCount(FAILURE) ; + end if ; + if AlertEnabled(ERROR) then + Count(ERROR) := AlertCount(ERROR) ; + end if ; + if FailOnWarningVar and AlertEnabled(WARNING) then + Count(WARNING) := AlertCount(WARNING) ; + end if ; + return Count ; + end function GetEnabledAlertCount ; + + ------------------------------------------------------------ + impure function GetAlertCount(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return AlertCountType is + ------------------------------------------------------------ + variable AlertCount : AlertCountType ; + begin + return AlertLogPtr(AlertLogID).AlertCount ; + end function GetAlertCount ; + + ------------------------------------------------------------ + impure function GetEnabledAlertCount(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return AlertCountType is + ------------------------------------------------------------ + variable AlertCount : AlertCountType ; + begin + return GetEnabledAlertCount(AlertLogPtr(AlertLogID).AlertCount, AlertLogPtr(AlertLogID).AlertEnabled) ; + end function GetEnabledAlertCount ; + + ------------------------------------------------------------ + -- PT Local + impure function GetDisabledAlertCount(AlertCount: AlertCountType; AlertEnabled : AlertEnableType) return AlertCountType is + ------------------------------------------------------------ + variable Count : AlertCountType := (others => 0) ; + begin + if not AlertEnabled(FAILURE) then + Count(FAILURE) := AlertCount(FAILURE) ; + end if ; + if not AlertEnabled(ERROR) then + Count(ERROR) := AlertCount(ERROR) ; + end if ; + if FailOnWarningVar and not AlertEnabled(WARNING) then + Count(WARNING) := AlertCount(WARNING) ; + end if ; + return Count ; + end function GetDisabledAlertCount ; + + ------------------------------------------------------------ + impure function GetDisabledAlertCount return AlertCountType is + ------------------------------------------------------------ + variable Count : AlertCountType := (others => 0) ; + begin + for i in ALERTLOG_BASE_ID to NumAlertLogIDsVar loop + Count := Count + GetDisabledAlertCount(AlertLogPtr(i).AlertCount, AlertLogPtr(i).AlertEnabled) ; + end loop ; + return Count ; + end function GetDisabledAlertCount ; + + ------------------------------------------------------------ + impure function GetDisabledAlertCount(AlertLogID: AlertLogIDType) return AlertCountType is + ------------------------------------------------------------ + variable Count : AlertCountType := (others => 0) ; + begin + Count := GetDisabledAlertCount(AlertLogPtr(AlertLogID).AlertCount, AlertLogPtr(AlertLogID).AlertEnabled) ; + for i in AlertLogID+1 to NumAlertLogIDsVar loop + if AlertLogID = AlertLogPtr(i).ParentID then + Count := Count + GetDisabledAlertCount(i) ; + end if ; + end loop ; + return Count ; + end function GetDisabledAlertCount ; + + ------------------------------------------------------------ + -- PT Local + procedure PrintTopAlerts ( + ------------------------------------------------------------ + NumErrors : integer ; + AlertCount : AlertCountType ; + Name : string ; + NumDisabledErrors : integer + ) is + constant ReportPrefix : string := ResolveOsvvmWritePrefix(ReportPrefixVar.GetOpt ) ; + constant DoneName : string := ResolveOsvvmDoneName(DoneNameVar.GetOpt ) ; + constant PassName : string := ResolveOsvvmPassName(PassNameVar.GetOpt ) ; + constant FailName : string := ResolveOsvvmFailName(FailNameVar.GetOpt ) ; + variable buf : line ; + begin + if NumErrors = 0 then + if NumDisabledErrors = 0 then + -- Passed + write(buf, ReportPrefix & DoneName & " " & PassName & " " & Name) ; + if AffirmCheckCountVar > 0 then + write(buf, " Affirmations Checked: " & to_string(AffirmCheckCountVar)) ; + end if ; + write(buf, " at " & to_string(NOW, 1 ns)) ; + WriteLine(buf) ; + else + -- Failed Due to Disabled Errors + write(buf, ReportPrefix & DoneName & " " & FailName & " " & Name) ; + write(buf, " Failed Due to Disabled Error(s) = " & to_string(NumDisabledErrors)) ; + if AffirmCheckCountVar > 0 then + write(buf, " Affirmations Checked: " & to_string(AffirmCheckCountVar)) ; + end if ; + write(buf, " at " & to_string(NOW, 1 ns)) ; + WriteLine(buf) ; + end if ; + else + -- Failed + write(buf, ReportPrefix & DoneName & " " & FailName & " "& Name) ; + write(buf, " Total Error(s) = " & to_string(NumErrors) ) ; + write(buf, " Failures: " & to_string(AlertCount(FAILURE)) ) ; + write(buf, " Errors: " & to_string(AlertCount(ERROR) ) ) ; + write(buf, " Warnings: " & to_string(AlertCount(WARNING) ) ) ; + if AffirmCheckCountVar > 0 then +--?? write(buf, " Affirmations Passed: " & to_string(AffirmPassedCountVar)) ; +--?? write(buf, " Checked: " & to_string(AffirmCheckCountVar)) ; + write(buf, " Affirmations Checked: " & to_string(AffirmCheckCountVar)) ; + end if ; + Write(buf, " at " & to_string(NOW, 1 ns)) ; + WriteLine(buf) ; + end if ; + end procedure PrintTopAlerts ; + + ------------------------------------------------------------ + -- PT Local + procedure PrintChild( + ------------------------------------------------------------ + AlertLogID : AlertLogIDType ; + Prefix : string ; + IndentAmount : integer ; + ReportAll : boolean + ) is + variable buf : line ; + begin + for i in AlertLogID+1 to NumAlertLogIDsVar loop + if AlertLogID = AlertLogPtr(i).ParentID then + if ReportAll or SumAlertCount(AlertLogPtr(i).AlertCount) > 0 then + Write(buf, Prefix & " " & LeftJustify(AlertLogPtr(i).Name.all, ReportJustifyAmountVar - IndentAmount)) ; + write(buf, " Failures: " & to_string(AlertLogPtr(i).AlertCount(FAILURE) ) ) ; + write(buf, " Errors: " & to_string(AlertLogPtr(i).AlertCount(ERROR) ) ) ; + write(buf, " Warnings: " & to_string(AlertLogPtr(i).AlertCount(WARNING) ) ) ; + WriteLine(buf) ; + end if ; + PrintChild( + AlertLogID => i, + Prefix => Prefix & " ", + IndentAmount => IndentAmount + 2, + ReportAll => ReportAll + ) ; + end if ; + end loop ; + end procedure PrintChild ; + + ------------------------------------------------------------ + procedure ReportAlerts ( Name : string := OSVVM_STRING_INIT_PARM_DETECT ; AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID ; ExternalErrors : AlertCountType := (0,0,0) ; ReportAll : boolean := TRUE) is + ------------------------------------------------------------ + variable NumErrors : integer ; + variable NumDisabledErrors : integer ; + constant ReportPrefix : string := ResolveOsvvmWritePrefix(ReportPrefixVar.GetOpt) ; + begin + if ReportJustifyAmountVar <= 0 then + SetJustify ; + end if ; + NumErrors := SumAlertCount( ExternalErrors + GetEnabledAlertCount(AlertLogPtr(AlertLogID).AlertCount, AlertLogPtr(AlertLogID).AlertEnabled) ) ; + if FailOnDisabledErrorsVar then + NumDisabledErrors := SumAlertCount( GetDisabledAlertCount(AlertLogID) ) ; + else + NumDisabledErrors := 0 ; + end if ; + if IsOsvvmStringSet(Name) then + PrintTopAlerts ( + NumErrors => NumErrors, + AlertCount => AlertLogPtr(AlertLogID).AlertCount + ExternalErrors, + Name => Name, + NumDisabledErrors => NumDisabledErrors + ) ; + else + PrintTopAlerts ( + NumErrors => NumErrors, + AlertCount => AlertLogPtr(AlertLogID).AlertCount + ExternalErrors, + Name => AlertLogPtr(AlertLogID).Name.all, + NumDisabledErrors => NumDisabledErrors + ) ; + end if ; + --Print Hierarchy when enabled and error or disabled error + if (FoundReportHierVar and ReportHierarchyVar) and (NumErrors /= 0 or NumDisabledErrors /=0) then + PrintChild( + AlertLogID => AlertLogID, + Prefix => ReportPrefix & " ", + IndentAmount => 2, + ReportAll => ReportAll + ) ; + end if ; + end procedure ReportAlerts ; + + ------------------------------------------------------------ + procedure ReportAlerts ( Name : string ; AlertCount : AlertCountType ) is + ------------------------------------------------------------ + begin + PrintTopAlerts ( + NumErrors => SumAlertCount(AlertCount), + AlertCount => AlertCount, + Name => Name, + NumDisabledErrors => 0 + ) ; + end procedure ReportAlerts ; + + ------------------------------------------------------------ + procedure ClearAlerts is + ------------------------------------------------------------ + begin + AffirmCheckCountVar := 0 ; +--?? AffirmPassedCountVar := 0 ; + + AlertLogPtr(ALERTLOG_BASE_ID).AlertCount := (0, 0, 0) ; + AlertLogPtr(ALERTLOG_BASE_ID).AlertStopCount := (FAILURE => 0, ERROR => integer'right, WARNING => integer'right) ; + + for i in ALERTLOG_BASE_ID + 1 to NumAlertLogIDsVar loop + AlertLogPtr(i).AlertCount := (0, 0, 0) ; + AlertLogPtr(i).AlertStopCount := (FAILURE => integer'right, ERROR => integer'right, WARNING => integer'right) ; + end loop ; + end procedure ClearAlerts ; + + ------------------------------------------------------------ + -- PT Local + procedure LocalLog ( + ------------------------------------------------------------ + AlertLogID : AlertLogIDType ; + Message : string ; + Level : LogType + ) is + variable buf : line ; + constant LogPrefix : string := LogPrefixVar.Get(OSVVM_DEFAULT_LOG_PREFIX) ; + begin + write(buf, LogPrefix) ; + if WriteLogLevelVar then + write(buf, " " & LOG_NAME(Level) ) ; + end if ; +--xx if (NumAlertLogIDsVar > NumPredefinedAlIDsVar) and WriteLogNameVar then -- print hierarchy names even when silent + if FoundAlertHierVar and WriteLogNameVar then +-- write(buf, " in " & justify(AlertLogPtr(AlertLogID).Name.all & ",", LEFT, AlertLogJustifyAmountVar) ) ; + write(buf, " in " & LeftJustify(AlertLogPtr(AlertLogID).Name.all & ",", AlertLogJustifyAmountVar) ) ; + end if ; + write(buf, " " & Message) ; + if WriteLogTimeVar then + write(buf, " at " & to_string(NOW, 1 ns)) ; + end if ; + writeline(buf) ; + end procedure LocalLog ; + + ------------------------------------------------------------ + procedure log ( + ------------------------------------------------------------ + AlertLogID : AlertLogIDType ; + Message : string ; + Level : LogType := ALWAYS ; + Enable : boolean := FALSE -- override internal enable + ) is + begin + if Level = ALWAYS or Enable then + LocalLog(AlertLogID, Message, Level) ; + elsif AlertLogPtr(AlertLogID).LogEnabled(Level) then + LocalLog(AlertLogID, Message, Level) ; + end if ; + end procedure log ; + + ------------------------------------------------------------ + ------------------------------------------------------------ + -- AlertLog Structure Creation and Interaction Methods + + ------------------------------------------------------------ + procedure SetAlertLogName(Name : string ) is + ------------------------------------------------------------ + begin + Deallocate(AlertLogPtr(ALERTLOG_BASE_ID).Name) ; + AlertLogPtr(ALERTLOG_BASE_ID).Name := new string'(Name) ; + end procedure SetAlertLogName ; + + ------------------------------------------------------------ + impure function GetAlertLogName(AlertLogID : AlertLogIDType) return string is + ------------------------------------------------------------ + begin + return AlertLogPtr(AlertLogID).Name.all ; + end function GetAlertLogName ; + + ------------------------------------------------------------ + -- PT Local + procedure NewAlertLogRec(AlertLogID : AlertLogIDType ; Name : string ; ParentID : AlertLogIDType) is + ------------------------------------------------------------ + variable AlertEnabled : AlertEnableType ; + variable AlertStopCount : AlertCountType ; + variable LogEnabled : LogEnableType ; + begin + if AlertLogID = ALERTLOG_BASE_ID then + AlertEnabled := (TRUE, TRUE, TRUE) ; + LogEnabled := (others => FALSE) ; + AlertStopCount := (FAILURE => 0, ERROR => integer'right, WARNING => integer'right) ; + else + if ParentID < ALERTLOG_BASE_ID then + AlertEnabled := AlertLogPtr(ALERTLOG_BASE_ID).AlertEnabled ; + LogEnabled := AlertLogPtr(ALERTLOG_BASE_ID).LogEnabled ; + else + AlertEnabled := AlertLogPtr(ParentID).AlertEnabled ; + LogEnabled := AlertLogPtr(ParentID).LogEnabled ; + end if ; + AlertStopCount := (FAILURE => integer'right, ERROR => integer'right, WARNING => integer'right) ; + end if ; + AlertLogPtr(AlertLogID) := new AlertLogRecType ; + AlertLogPtr(AlertLogID).Name := new string'(NAME) ; + AlertLogPtr(AlertLogID).ParentID := ParentID ; + AlertLogPtr(AlertLogID).AlertCount := (0, 0, 0) ; + AlertLogPtr(AlertLogID).AlertEnabled := AlertEnabled ; + AlertLogPtr(AlertLogID).AlertStopCount := AlertStopCount ; + AlertLogPtr(AlertLogID).LogEnabled := LogEnabled ; +-- AlertLogPtr(AlertLogID) := new AlertLogRecType'( +-- Name => new string'(NAME), +-- ParentID => ParentID, +-- AlertCount => (0, 0, 0), +-- AlertEnabled => AlertEnabled, +-- AlertStopCount => AlertStopCount, +-- LogEnabled => LogEnabled +-- ) ; + end procedure NewAlertLogRec ; + + ------------------------------------------------------------ + -- PT Local + -- Construct initial data structure + procedure LocalInitialize(NewNumAlertLogIDs : AlertLogIDType := MIN_NUM_AL_IDS) is + ------------------------------------------------------------ + begin + if NumAllocatedAlertLogIDsVar /= 0 then + Alert(ALERT_DEFAULT_ID, "AlertLogPkg: Initialize, data structure already initialized", FAILURE) ; + return ; + end if ; + -- Initialize Pointer + AlertLogPtr := new AlertLogArrayType(ALERTLOG_BASE_ID to ALERTLOG_BASE_ID + NewNumAlertLogIDs) ; + NumAllocatedAlertLogIDsVar := NewNumAlertLogIDs ; + -- Create BASE AlertLogID (if it differs from DEFAULT + if ALERTLOG_BASE_ID /= ALERT_DEFAULT_ID then + NewAlertLogRec(ALERTLOG_BASE_ID, "AlertLogTop", ALERTLOG_BASE_ID) ; + end if ; + -- Create DEFAULT AlertLogID + NewAlertLogRec(ALERT_DEFAULT_ID, "Default", ALERTLOG_BASE_ID) ; + NumAlertLogIDsVar := ALERT_DEFAULT_ID ; + -- Create OSVVM AlertLogID (if it differs from DEFAULT + if OSVVM_ALERTLOG_ID /= ALERT_DEFAULT_ID then + NewAlertLogRec(OSVVM_ALERTLOG_ID, "OSVVM", ALERTLOG_BASE_ID) ; + NumAlertLogIDsVar := NumAlertLogIDsVar + 1 ; + end if ; + if OSVVM_SCOREBOARD_ALERTLOG_ID /= OSVVM_ALERTLOG_ID then + NewAlertLogRec(OSVVM_SCOREBOARD_ALERTLOG_ID, "OSVVM Scoreboard", ALERTLOG_BASE_ID) ; + NumAlertLogIDsVar := NumAlertLogIDsVar + 1 ; + end if ; + end procedure LocalInitialize ; + + ------------------------------------------------------------ + -- Construct initial data structure + procedure Initialize(NewNumAlertLogIDs : AlertLogIDType := MIN_NUM_AL_IDS) is + ------------------------------------------------------------ + begin + LocalInitialize(NewNumAlertLogIDs) ; + end procedure Initialize ; + + ------------------------------------------------------------ + -- PT Local + -- Constructs initial data structure using constant below + impure function LocalInitialize return boolean is + ------------------------------------------------------------ + begin + LocalInitialize(MIN_NUM_AL_IDS) ; + return TRUE ; + end function LocalInitialize ; + + constant CONSTRUCT_ALERT_DATA_STRUCTURE : boolean := LocalInitialize ; + + ------------------------------------------------------------ + procedure Deallocate is + ------------------------------------------------------------ + begin + for i in ALERTLOG_BASE_ID to NumAlertLogIDsVar loop + Deallocate(AlertLogPtr(i).Name) ; + Deallocate(AlertLogPtr(i)) ; + end loop ; + deallocate(AlertLogPtr) ; + -- Free up space used by protected types within AlertLogPkg + AlertPrefixVar.Deallocate ; + LogPrefixVar.Deallocate ; + ReportPrefixVar.Deallocate ; + DoneNameVar.Deallocate ; + PassNameVar.Deallocate ; + FailNameVar.Deallocate ; + -- Restore variables to their initial state + NumAlertLogIDsVar := 0 ; + NumAllocatedAlertLogIDsVar := 0 ; + GlobalAlertEnabledVar := TRUE ; -- Allows turn off and on + AffirmCheckCountVar := 0 ; +--?? AffirmPassedCountVar := 0 ; + FailOnWarningVar := TRUE ; + FailOnDisabledErrorsVar := TRUE ; + ReportHierarchyVar := TRUE ; + FoundReportHierVar := FALSE ; + FoundAlertHierVar := FALSE ; + WriteAlertLevelVar := TRUE ; + WriteAlertNameVar := TRUE ; + WriteAlertTimeVar := TRUE ; + WriteLogLevelVar := TRUE ; + WriteLogNameVar := TRUE ; + WriteLogTimeVar := TRUE ; + end procedure Deallocate ; + + ------------------------------------------------------------ + -- PT Local. + procedure GrowAlertStructure (NewNumAlertLogIDs : AlertLogIDType) is + ------------------------------------------------------------ + variable oldAlertLogPtr : AlertLogArrayPtrType ; + begin + if NumAllocatedAlertLogIDsVar = 0 then + Initialize (NewNumAlertLogIDs) ; -- Construct initial structure + else + oldAlertLogPtr := AlertLogPtr ; + AlertLogPtr := new AlertLogArrayType(ALERTLOG_BASE_ID to NewNumAlertLogIDs) ; + AlertLogPtr(ALERTLOG_BASE_ID to NumAlertLogIDsVar) := oldAlertLogPtr(ALERTLOG_BASE_ID to NumAlertLogIDsVar) ; + deallocate(oldAlertLogPtr) ; + end if ; + NumAllocatedAlertLogIDsVar := NewNumAlertLogIDs ; + end procedure GrowAlertStructure ; + + ------------------------------------------------------------ + -- Sets a AlertLogPtr to a particular size + -- Use for small bins to save space or large bins to + -- suppress the resize and copy as a CovBin autosizes. + procedure SetNumAlertLogIDs (NewNumAlertLogIDs : AlertLogIDType) is + ------------------------------------------------------------ + variable oldAlertLogPtr : AlertLogArrayPtrType ; + begin + if NewNumAlertLogIDs > NumAllocatedAlertLogIDsVar then + GrowAlertStructure(NewNumAlertLogIDs) ; + end if; + end procedure SetNumAlertLogIDs ; + + ------------------------------------------------------------ + -- PT Local + impure function GetNextAlertLogID return AlertLogIDType is + ------------------------------------------------------------ + variable NewNumAlertLogIDs : AlertLogIDType ; + begin + NewNumAlertLogIDs := NumAlertLogIDsVar + 1 ; + if NewNumAlertLogIDs > NumAllocatedAlertLogIDsVar then + GrowAlertStructure(NumAllocatedAlertLogIDsVar + MIN_NUM_AL_IDS) ; + end if ; + NumAlertLogIDsVar := NewNumAlertLogIDs ; + return NumAlertLogIDsVar ; + end function GetNextAlertLogID ; + + ------------------------------------------------------------ + impure function FindAlertLogID(Name : string ) return AlertLogIDType is + ------------------------------------------------------------ + begin + for i in ALERTLOG_BASE_ID to NumAlertLogIDsVar loop + if Name = AlertLogPtr(i).Name.all then + return i ; + end if ; + end loop ; + return ALERTLOG_ID_NOT_FOUND ; -- not found + end function FindAlertLogID ; + + ------------------------------------------------------------ + impure function FindAlertLogID(Name : string ; ParentID : AlertLogIDType) return AlertLogIDType is + ------------------------------------------------------------ + variable CurParentID : AlertLogIDType ; + begin + for i in ALERTLOG_BASE_ID to NumAlertLogIDsVar loop + CurParentID := AlertLogPtr(i).ParentID ; + if Name = AlertLogPtr(i).Name.all and + (CurParentID = ParentID or CurParentID = ALERTLOG_ID_NOT_ASSIGNED or ParentID = ALERTLOG_ID_NOT_ASSIGNED) + then + return i ; + end if ; + end loop ; + return ALERTLOG_ID_NOT_FOUND ; -- not found + end function FindAlertLogID ; + + ------------------------------------------------------------ + impure function GetAlertLogID(Name : string ; ParentID : AlertLogIDType ; CreateHierarchy : Boolean) return AlertLogIDType is + ------------------------------------------------------------ + variable ResultID : AlertLogIDType ; + begin + ResultID := FindAlertLogID(Name, ParentID) ; + if ResultID /= ALERTLOG_ID_NOT_FOUND then + -- found it, set ParentID + if AlertLogPtr(ResultID).ParentID = ALERTLOG_ID_NOT_ASSIGNED then + AlertLogPtr(ResultID).ParentID := ParentID ; + -- else -- do not update as ParentIDs are either same or input ParentID = ALERTLOG_ID_NOT_ASSIGNED + end if ; + else + ResultID := GetNextAlertLogID ; + NewAlertLogRec(ResultID, Name, ParentID) ; + FoundAlertHierVar := TRUE ; + if CreateHierarchy then + FoundReportHierVar := TRUE ; + end if ; + end if ; + return ResultID ; + end function GetAlertLogID ; + + ------------------------------------------------------------ + impure function GetAlertLogParentID(AlertLogID : AlertLogIDType) return AlertLogIDType is + ------------------------------------------------------------ + begin + return AlertLogPtr(AlertLogID).ParentID ; + end function GetAlertLogParentID ; + + ------------------------------------------------------------ + ------------------------------------------------------------ + -- Accessor Methods + ------------------------------------------------------------ + + ------------------------------------------------------------ + procedure SetGlobalAlertEnable (A : boolean := TRUE) is + ------------------------------------------------------------ + begin + GlobalAlertEnabledVar := A ; + end procedure SetGlobalAlertEnable ; + + ------------------------------------------------------------ + impure function GetGlobalAlertEnable return boolean is + ------------------------------------------------------------ + begin + return GlobalAlertEnabledVar ; + end function GetGlobalAlertEnable ; + + ------------------------------------------------------------ + procedure IncAffirmCount is + ------------------------------------------------------------ + begin + if GlobalAlertEnabledVar then + AffirmCheckCountVar := AffirmCheckCountVar + 1 ; + end if ; + end procedure IncAffirmCount ; + + ------------------------------------------------------------ + impure function GetAffirmCount return natural is + ------------------------------------------------------------ + begin + return AffirmCheckCountVar ; + end function GetAffirmCount ; + +--?? ------------------------------------------------------------ +--?? procedure IncAffirmPassCount is +--?? ------------------------------------------------------------ +--?? begin +--?? if GlobalAlertEnabledVar then +--?? AffirmCheckCountVar := AffirmCheckCountVar + 1 ; +--?? AffirmPassedCountVar := AffirmPassedCountVar + 1 ; +--?? end if ; +--?? end procedure IncAffirmPassCount ; +--?? +--?? ------------------------------------------------------------ +--?? impure function GetAffirmPassCount return natural is +--?? ------------------------------------------------------------ +--?? begin +--?? return AffirmPassedCountVar ; +--?? end function GetAffirmPassCount ; + + ------------------------------------------------------------ + -- PT LOCAL + procedure SetOneStopCount( + ------------------------------------------------------------ + AlertLogID : AlertLogIDType ; + Level : AlertType ; + Count : integer + ) is + begin + if AlertLogPtr(AlertLogID).AlertStopCount(Level) = integer'right then + AlertLogPtr(AlertLogID).AlertStopCount(Level) := Count ; + else + AlertLogPtr(AlertLogID).AlertStopCount(Level) := + AlertLogPtr(AlertLogID).AlertStopCount(Level) + Count ; + end if ; + end procedure SetOneStopCount ; + + ------------------------------------------------------------ + procedure SetAlertStopCount(AlertLogID : AlertLogIDType ; Level : AlertType ; Count : integer) is + ------------------------------------------------------------ + begin + SetOneStopCount(AlertLogID, Level, Count) ; + if AlertLogID /= ALERTLOG_BASE_ID then + SetAlertStopCount(AlertLogPtr(AlertLogID).ParentID, Level, Count) ; + end if ; + end procedure SetAlertStopCount ; + + ------------------------------------------------------------ + impure function GetAlertStopCount(AlertLogID : AlertLogIDType ; Level : AlertType) return integer is + ------------------------------------------------------------ + begin + return AlertLogPtr(AlertLogID).AlertStopCount(Level) ; + end function GetAlertStopCount ; + + ------------------------------------------------------------ + procedure SetAlertEnable(Level : AlertType ; Enable : boolean) is + ------------------------------------------------------------ + begin + for i in ALERTLOG_BASE_ID to NumAlertLogIDsVar loop + AlertLogPtr(i).AlertEnabled(Level) := Enable ; + end loop ; + end procedure SetAlertEnable ; + + ------------------------------------------------------------ + procedure SetAlertEnable(AlertLogID : AlertLogIDType ; Level : AlertType ; Enable : boolean ; DescendHierarchy : boolean := TRUE) is + ------------------------------------------------------------ + begin + AlertLogPtr(AlertLogID).AlertEnabled(Level) := Enable ; + if DescendHierarchy then + for i in AlertLogID+1 to NumAlertLogIDsVar loop + if AlertLogID = AlertLogPtr(i).ParentID then + SetAlertEnable(i, Level, Enable, DescendHierarchy) ; + end if ; + end loop ; + end if ; + end procedure SetAlertEnable ; + + ------------------------------------------------------------ + impure function GetAlertEnable(AlertLogID : AlertLogIDType ; Level : AlertType) return boolean is + ------------------------------------------------------------ + begin + return AlertLogPtr(AlertLogID).AlertEnabled(Level) ; + end function GetAlertEnable ; + + ------------------------------------------------------------ + procedure SetLogEnable(Level : LogType ; Enable : boolean) is + ------------------------------------------------------------ + begin + for i in ALERTLOG_BASE_ID to NumAlertLogIDsVar loop + AlertLogPtr(i).LogEnabled(Level) := Enable ; + end loop ; + end procedure SetLogEnable ; + + ------------------------------------------------------------ + procedure SetLogEnable(AlertLogID : AlertLogIDType ; Level : LogType ; Enable : boolean ; DescendHierarchy : boolean := TRUE) is + ------------------------------------------------------------ + begin + AlertLogPtr(AlertLogID).LogEnabled(Level) := Enable ; + if DescendHierarchy then + for i in AlertLogID+1 to NumAlertLogIDsVar loop + if AlertLogID = AlertLogPtr(i).ParentID then + SetLogEnable(i, Level, Enable, DescendHierarchy) ; + end if ; + end loop ; + end if ; + end procedure SetLogEnable ; + + ------------------------------------------------------------ + impure function GetLogEnable(AlertLogID : AlertLogIDType ; Level : LogType) return boolean is + ------------------------------------------------------------ + begin + if Level = ALWAYS then + return TRUE ; + else + return AlertLogPtr(AlertLogID).LogEnabled(Level) ; + end if ; + end function GetLogEnable ; + + ------------------------------------------------------------ + -- PT Local + procedure PrintLogLevels( + ------------------------------------------------------------ + AlertLogID : AlertLogIDType ; + Prefix : string ; + IndentAmount : integer + ) is + variable buf : line ; + begin + write(buf, Prefix & " " & LeftJustify(AlertLogPtr(AlertLogID).Name.all, ReportJustifyAmountVar - IndentAmount)) ; + for i in LogIndexType loop + if AlertLogPtr(AlertLogID).LogEnabled(i) then +-- write(buf, " " & to_string(AlertLogPtr(AlertLogID).LogEnabled(i)) ) ; + write(buf, " " & to_string(i)) ; + end if ; + end loop ; + WriteLine(buf) ; + for i in AlertLogID+1 to NumAlertLogIDsVar loop + if AlertLogID = AlertLogPtr(i).ParentID then + PrintLogLevels( + AlertLogID => i, + Prefix => Prefix & " ", + IndentAmount => IndentAmount + 2 + ) ; + end if ; + end loop ; + end procedure PrintLogLevels ; + + ------------------------------------------------------------ + procedure ReportLogEnables is + ------------------------------------------------------------ + begin + if ReportJustifyAmountVar <= 0 then + SetJustify ; + end if ; + PrintLogLevels(ALERTLOG_BASE_ID, "", 0) ; + end procedure ReportLogEnables ; + + ------------------------------------------------------------ + procedure SetAlertLogOptions ( + ------------------------------------------------------------ + FailOnWarning : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + FailOnDisabledErrors : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + ReportHierarchy : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + WriteAlertLevel : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + WriteAlertName : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + WriteAlertTime : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + WriteLogLevel : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + WriteLogName : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + WriteLogTime : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + AlertPrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; + LogPrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; + ReportPrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; + DoneName : string := OSVVM_STRING_INIT_PARM_DETECT ; + PassName : string := OSVVM_STRING_INIT_PARM_DETECT ; + FailName : string := OSVVM_STRING_INIT_PARM_DETECT + ) is + begin + if FailOnWarning /= OPT_INIT_PARM_DETECT then + FailOnWarningVar := IsEnabled(FailOnWarning) ; + end if ; + if FailOnDisabledErrors /= OPT_INIT_PARM_DETECT then + FailOnDisabledErrorsVar := IsEnabled(FailOnDisabledErrors) ; + end if ; + if ReportHierarchy /= OPT_INIT_PARM_DETECT then + ReportHierarchyVar := IsEnabled(ReportHierarchy) ; + end if ; + if WriteAlertLevel /= OPT_INIT_PARM_DETECT then + WriteAlertLevelVar := IsEnabled(WriteAlertLevel) ; + end if ; + if WriteAlertName /= OPT_INIT_PARM_DETECT then + WriteAlertNameVar := IsEnabled(WriteAlertName) ; + end if ; + if WriteAlertTime /= OPT_INIT_PARM_DETECT then + WriteAlertTimeVar := IsEnabled(WriteAlertTime) ; + end if ; + if WriteLogLevel /= OPT_INIT_PARM_DETECT then + WriteLogLevelVar := IsEnabled(WriteLogLevel) ; + end if ; + if WriteLogName /= OPT_INIT_PARM_DETECT then + WriteLogNameVar := IsEnabled(WriteLogName) ; + end if ; + if WriteLogTime /= OPT_INIT_PARM_DETECT then + WriteLogTimeVar := IsEnabled(WriteLogTime) ; + end if ; + if AlertPrefix /= OSVVM_STRING_INIT_PARM_DETECT then + AlertPrefixVar.Set(AlertPrefix) ; + end if ; + if LogPrefix /= OSVVM_STRING_INIT_PARM_DETECT then + LogPrefixVar.Set(LogPrefix) ; + end if ; + if ReportPrefix /= OSVVM_STRING_INIT_PARM_DETECT then + ReportPrefixVar.Set(ReportPrefix) ; + end if ; + if DoneName /= OSVVM_STRING_INIT_PARM_DETECT then + DoneNameVar.Set(DoneName) ; + end if ; + if PassName /= OSVVM_STRING_INIT_PARM_DETECT then + PassNameVar.Set(PassName) ; + end if ; + if FailName /= OSVVM_STRING_INIT_PARM_DETECT then + FailNameVar.Set(FailName) ; + end if ; + end procedure SetAlertLogOptions ; + + ------------------------------------------------------------ + procedure ReportAlertLogOptions is + ------------------------------------------------------------ + variable buf : line ; + begin + -- Boolean Values + swrite(buf, "ReportAlertLogOptions" & LF ) ; + swrite(buf, "---------------------" & LF ) ; + swrite(buf, "FailOnWarningVar: " & to_string(FailOnWarningVar ) & LF ) ; + swrite(buf, "FailOnDisabledErrorsVar: " & to_string(FailOnDisabledErrorsVar ) & LF ) ; + swrite(buf, "ReportHierarchyVar: " & to_string(ReportHierarchyVar ) & LF ) ; + swrite(buf, "FoundReportHierVar: " & to_string(FoundReportHierVar ) & LF ) ; -- Not set by user + swrite(buf, "FoundAlertHierVar: " & to_string(FoundAlertHierVar ) & LF ) ; -- Not set by user + swrite(buf, "WriteAlertLevelVar: " & to_string(WriteAlertLevelVar ) & LF ) ; + swrite(buf, "WriteAlertNameVar: " & to_string(WriteAlertNameVar ) & LF ) ; + swrite(buf, "WriteAlertTimeVar: " & to_string(WriteAlertTimeVar ) & LF ) ; + swrite(buf, "WriteLogLevelVar: " & to_string(WriteLogLevelVar ) & LF ) ; + swrite(buf, "WriteLogNameVar: " & to_string(WriteLogNameVar ) & LF ) ; + swrite(buf, "WriteLogTimeVar: " & to_string(WriteLogTimeVar ) & LF ) ; + + -- String + swrite(buf, "AlertPrefixVar: " & string'(AlertPrefixVar.Get(OSVVM_DEFAULT_ALERT_PREFIX)) & LF ) ; + swrite(buf, "LogPrefixVar: " & string'(LogPrefixVar.Get(OSVVM_DEFAULT_LOG_PREFIX)) & LF ) ; + swrite(buf, "ReportPrefixVar: " & ResolveOsvvmWritePrefix(ReportPrefixVar.GetOpt) & LF ) ; + swrite(buf, "DoneNameVar: " & ResolveOsvvmDoneName(DoneNameVar.GetOpt) & LF ) ; + swrite(buf, "PassNameVar: " & ResolveOsvvmPassName(PassNameVar.GetOpt) & LF ) ; + swrite(buf, "FailNameVar: " & ResolveOsvvmFailName(FailNameVar.GetOpt) & LF ) ; + writeline(buf) ; + end procedure ReportAlertLogOptions ; + + ------------------------------------------------------------ + impure function GetAlertLogFailOnWarning return AlertLogOptionsType is + ------------------------------------------------------------ + begin + return to_OsvvmOptionsType(FailOnWarningVar) ; + end function GetAlertLogFailOnWarning ; + + ------------------------------------------------------------ + impure function GetAlertLogFailOnDisabledErrors return AlertLogOptionsType is + ------------------------------------------------------------ + begin + return to_OsvvmOptionsType(FailOnDisabledErrorsVar) ; + end function GetAlertLogFailOnDisabledErrors ; + + ------------------------------------------------------------ + impure function GetAlertLogReportHierarchy return AlertLogOptionsType is + ------------------------------------------------------------ + begin + return to_OsvvmOptionsType(ReportHierarchyVar) ; + end function GetAlertLogReportHierarchy ; + + ------------------------------------------------------------ + impure function GetAlertLogFoundReportHier return boolean is + ------------------------------------------------------------ + begin + return FoundReportHierVar ; + end function GetAlertLogFoundReportHier ; + + ------------------------------------------------------------ + impure function GetAlertLogFoundAlertHier return boolean is + ------------------------------------------------------------ + begin + return FoundAlertHierVar ; + end function GetAlertLogFoundAlertHier ; + + ------------------------------------------------------------ + impure function GetAlertLogWriteAlertLevel return AlertLogOptionsType is + ------------------------------------------------------------ + begin + return to_OsvvmOptionsType(WriteAlertLevelVar) ; + end function GetAlertLogWriteAlertLevel ; + + ------------------------------------------------------------ + impure function GetAlertLogWriteAlertName return AlertLogOptionsType is + ------------------------------------------------------------ + begin + return to_OsvvmOptionsType(WriteAlertNameVar) ; + end function GetAlertLogWriteAlertName ; + + ------------------------------------------------------------ + impure function GetAlertLogWriteAlertTime return AlertLogOptionsType is + ------------------------------------------------------------ + begin + return to_OsvvmOptionsType(WriteAlertTimeVar) ; + end function GetAlertLogWriteAlertTime ; + + ------------------------------------------------------------ + impure function GetAlertLogWriteLogLevel return AlertLogOptionsType is + ------------------------------------------------------------ + begin + return to_OsvvmOptionsType(WriteLogLevelVar) ; + end function GetAlertLogWriteLogLevel ; + + ------------------------------------------------------------ + impure function GetAlertLogWriteLogName return AlertLogOptionsType is + ------------------------------------------------------------ + begin + return to_OsvvmOptionsType(WriteLogNameVar) ; + end function GetAlertLogWriteLogName ; + + ------------------------------------------------------------ + impure function GetAlertLogWriteLogTime return AlertLogOptionsType is + ------------------------------------------------------------ + begin + return to_OsvvmOptionsType(WriteLogTimeVar) ; + end function GetAlertLogWriteLogTime ; + + ------------------------------------------------------------ + impure function GetAlertLogAlertPrefix return string is + ------------------------------------------------------------ + begin + return AlertPrefixVar.Get(OSVVM_DEFAULT_ALERT_PREFIX) ; + end function GetAlertLogAlertPrefix ; + + ------------------------------------------------------------ + impure function GetAlertLogLogPrefix return string is + ------------------------------------------------------------ + begin + return LogPrefixVar.Get(OSVVM_DEFAULT_LOG_PREFIX) ; + end function GetAlertLogLogPrefix ; + + ------------------------------------------------------------ + impure function GetAlertLogReportPrefix return string is + ------------------------------------------------------------ + begin + return ResolveOsvvmWritePrefix(ReportPrefixVar.GetOpt) ; + end function GetAlertLogReportPrefix ; + + ------------------------------------------------------------ + impure function GetAlertLogDoneName return string is + ------------------------------------------------------------ + begin + return ResolveOsvvmDoneName(DoneNameVar.GetOpt) ; + end function GetAlertLogDoneName ; + + ------------------------------------------------------------ + impure function GetAlertLogPassName return string is + ------------------------------------------------------------ + begin + return ResolveOsvvmPassName(PassNameVar.GetOpt) ; + end function GetAlertLogPassName ; + + ------------------------------------------------------------ + impure function GetAlertLogFailName return string is + ------------------------------------------------------------ + begin + return ResolveOsvvmFailName(FailNameVar.GetOpt) ; + end function GetAlertLogFailName ; + + end protected body AlertLogStructPType ; + + + + shared variable AlertLogStruct : AlertLogStructPType ; + +--- /////////////////////////////////////////////////////////////////////////// +--- /////////////////////////////////////////////////////////////////////////// +--- /////////////////////////////////////////////////////////////////////////// + + ------------------------------------------------------------ + procedure Alert( + ------------------------------------------------------------ + AlertLogID : AlertLogIDType ; + Message : string ; + Level : AlertType := ERROR + ) is + begin + AlertLogStruct.Alert(AlertLogID, Message, Level) ; + end procedure alert ; + + ------------------------------------------------------------ + procedure Alert( Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message, Level) ; + end procedure alert ; + + ------------------------------------------------------------ + procedure IncAlertCount( + ------------------------------------------------------------ + AlertLogID : AlertLogIDType ; + Level : AlertType := ERROR + ) is + begin + AlertLogStruct.IncAlertCount(AlertLogID, Level) ; + end procedure IncAlertCount ; + + ------------------------------------------------------------ + procedure IncAlertCount( Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + AlertLogStruct.IncAlertCount(ALERT_DEFAULT_ID, Level) ; + end procedure IncAlertCount ; + + + ------------------------------------------------------------ + procedure AlertIf( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if condition then + AlertLogStruct.Alert(AlertLogID , Message, Level) ; + end if ; + end procedure AlertIf ; + + ------------------------------------------------------------ + procedure AlertIf( condition : boolean ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if condition then + AlertLogStruct.Alert(ALERT_DEFAULT_ID , Message, Level) ; + end if ; + end procedure AlertIf ; + + ------------------------------------------------------------ + -- useful in a loop: exit when AlertIf( not ReadValid, failure, "Read Failed") ; + impure function AlertIf( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; Level : AlertType := ERROR ) return boolean is + ------------------------------------------------------------ + begin + if condition then + AlertLogStruct.Alert(AlertLogID , Message, Level) ; + end if ; + return condition ; + end function AlertIf ; + + ------------------------------------------------------------ + impure function AlertIf( condition : boolean ; Message : string ; Level : AlertType := ERROR ) return boolean is + ------------------------------------------------------------ + begin + if condition then + AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message, Level) ; + end if ; + return condition ; + end function AlertIf ; + + ------------------------------------------------------------ + procedure AlertIfNot( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if not condition then + AlertLogStruct.Alert(AlertLogID, Message, Level) ; + end if ; + end procedure AlertIfNot ; + + ------------------------------------------------------------ + procedure AlertIfNot( condition : boolean ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if not condition then + AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message, Level) ; + end if ; + end procedure AlertIfNot ; + + ------------------------------------------------------------ + -- useful in a loop: exit when AlertIfNot( not ReadValid, failure, "Read Failed") ; + impure function AlertIfNot( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; Level : AlertType := ERROR ) return boolean is + ------------------------------------------------------------ + begin + if not condition then + AlertLogStruct.Alert(AlertLogID, Message, Level) ; + end if ; + return not condition ; + end function AlertIfNot ; + + ------------------------------------------------------------ + impure function AlertIfNot( condition : boolean ; Message : string ; Level : AlertType := ERROR ) return boolean is + ------------------------------------------------------------ + begin + if not condition then + AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message, Level) ; + end if ; + return not condition ; + end function AlertIfNot ; + + + ------------------------------------------------------------ + -- AlertIfEqual with AlertLogID + ------------------------------------------------------------ + procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : std_logic ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L ?= R then + AlertLogStruct.Alert(AlertLogID, Message & " L = R, L = " & to_string(L) & " R = " & to_string(R), Level) ; + end if ; + end procedure AlertIfEqual ; + + ------------------------------------------------------------ + procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : std_logic_vector ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L ?= R then + AlertLogStruct.Alert(AlertLogID, Message & " L = R, L = " & to_string(L) & " R = " & to_string(R), Level) ; + end if ; + end procedure AlertIfEqual ; + + ------------------------------------------------------------ + procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : unsigned ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L ?= R then + AlertLogStruct.Alert(AlertLogID, Message & " L = R, L = " & to_string(L) & " R = " & to_string(R), Level) ; + end if ; + end procedure AlertIfEqual ; + + ------------------------------------------------------------ + procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : signed ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L ?= R then + AlertLogStruct.Alert(AlertLogID, Message & " L = R, L = " & to_string(L) & " R = " & to_string(R), Level) ; + end if ; + end procedure AlertIfEqual ; + + ------------------------------------------------------------ + procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : integer ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L = R then + AlertLogStruct.Alert(AlertLogID, Message & " L = R, L = " & to_string(L) & " R = " & to_string(R), Level) ; + end if ; + end procedure AlertIfEqual ; + + ------------------------------------------------------------ + procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : real ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L = R then + AlertLogStruct.Alert(AlertLogID, Message & " L = R, L = " & to_string(L, 4) & " R = " & to_string(R, 4), Level) ; + end if ; + end procedure AlertIfEqual ; + + ------------------------------------------------------------ + procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : character ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L = R then + AlertLogStruct.Alert(AlertLogID, Message & " L = R, L = " & L & " R = " & R, Level) ; + end if ; + end procedure AlertIfEqual ; + + ------------------------------------------------------------ + procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : string ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L = R then + AlertLogStruct.Alert(AlertLogID, Message & " L = R, L = " & L & " R = " & R, Level) ; + end if ; + end procedure AlertIfEqual ; + + ------------------------------------------------------------ + procedure AlertIfEqual( AlertLogID : AlertLogIDType ; L, R : time ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L = R then + AlertLogStruct.Alert(AlertLogID, Message & " L = R, L = " & to_string(L) & " R = " & to_string(R), Level) ; + end if ; + end procedure AlertIfEqual ; + + + ------------------------------------------------------------ + -- AlertIfEqual without AlertLogID + ------------------------------------------------------------ + procedure AlertIfEqual( L, R : std_logic ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L ?= R then + AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L = R, L = " & to_string(L) & " R = " & to_string(R), Level) ; + end if ; + end procedure AlertIfEqual ; + + ------------------------------------------------------------ + procedure AlertIfEqual( L, R : std_logic_vector ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L ?= R then + AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L = R, L = " & to_string(L) & " R = " & to_string(R), Level) ; + end if ; + end procedure AlertIfEqual ; + + ------------------------------------------------------------ + procedure AlertIfEqual( L, R : unsigned ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L ?= R then + AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L = R, L = " & to_string(L) & " R = " & to_string(R), Level) ; + end if ; + end procedure AlertIfEqual ; + + ------------------------------------------------------------ + procedure AlertIfEqual( L, R : signed ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L ?= R then + AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L = R, L = " & to_string(L) & " R = " & to_string(R), Level) ; + end if ; + end procedure AlertIfEqual ; + + ------------------------------------------------------------ + procedure AlertIfEqual( L, R : integer ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L = R then + AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L = R, L = " & to_string(L) & " R = " & to_string(R), Level) ; + end if ; + end procedure AlertIfEqual ; + + ------------------------------------------------------------ + procedure AlertIfEqual( L, R : real ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L = R then + AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L = R, L = " & to_string(L, 4) & " R = " & to_string(R, 4), Level) ; + end if ; + end procedure AlertIfEqual ; + + ------------------------------------------------------------ + procedure AlertIfEqual( L, R : character ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L = R then + AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L = R, L = " & L & " R = " & R, Level) ; + end if ; + end procedure AlertIfEqual ; + + ------------------------------------------------------------ + procedure AlertIfEqual( L, R : string ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L = R then + AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L = R, L = " & L & " R = " & R, Level) ; + end if ; + end procedure AlertIfEqual ; + + ------------------------------------------------------------ + procedure AlertIfEqual( L, R : time ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L = R then + AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L = R, L = " & to_string(L) & " R = " & to_string(R), Level) ; + end if ; + end procedure AlertIfEqual ; + + + ------------------------------------------------------------ + -- AlertIfNotEqual with AlertLogID + ------------------------------------------------------------ + procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : std_logic ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L ?/= R then + AlertLogStruct.Alert(AlertLogID, Message & " L /= R, L = " & to_string(L) & " R = " & to_string(R), Level) ; + end if ; + end procedure AlertIfNotEqual ; + + ------------------------------------------------------------ + procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : std_logic_vector ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L ?/= R then + AlertLogStruct.Alert(AlertLogID, Message & " L /= R, L = " & to_string(L) & " R = " & to_string(R), Level) ; + end if ; + end procedure AlertIfNotEqual ; + + ------------------------------------------------------------ + procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : unsigned ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L ?/= R then + AlertLogStruct.Alert(AlertLogID, Message & " L /= R, L = " & to_string(L) & " R = " & to_string(R), Level) ; + end if ; + end procedure AlertIfNotEqual ; + + ------------------------------------------------------------ + procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : signed ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L ?/= R then + AlertLogStruct.Alert(AlertLogID, Message & " L /= R, L = " & to_string(L) & " R = " & to_string(R), Level) ; + end if ; + end procedure AlertIfNotEqual ; + + ------------------------------------------------------------ + procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : integer ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L /= R then + AlertLogStruct.Alert(AlertLogID, Message & " L /= R, L = " & to_string(L) & " R = " & to_string(R), Level) ; + end if ; + end procedure AlertIfNotEqual ; + + ------------------------------------------------------------ + procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : real ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L /= R then + AlertLogStruct.Alert(AlertLogID, Message & " L /= R, L = " & to_string(L, 4) & " R = " & to_string(R, 4), Level) ; + end if ; + end procedure AlertIfNotEqual ; + + ------------------------------------------------------------ + procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : character ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L /= R then + AlertLogStruct.Alert(AlertLogID, Message & " L /= R, L = " & L & " R = " & R, Level) ; + end if ; + end procedure AlertIfNotEqual ; + + ------------------------------------------------------------ + procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : string ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L /= R then + AlertLogStruct.Alert(AlertLogID, Message & " L /= R, L = " & L & " R = " & R, Level) ; + end if ; + end procedure AlertIfNotEqual ; + + ------------------------------------------------------------ + procedure AlertIfNotEqual( AlertLogID : AlertLogIDType ; L, R : time ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L /= R then + AlertLogStruct.Alert(AlertLogID, Message & " L /= R, L = " & to_string(L) & " R = " & to_string(R), Level) ; + end if ; + end procedure AlertIfNotEqual ; + + + ------------------------------------------------------------ + -- AlertIfNotEqual without AlertLogID + ------------------------------------------------------------ + procedure AlertIfNotEqual( L, R : std_logic ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L ?/= R then + AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L /= R, L = " & to_string(L) & " R = " & to_string(R), Level) ; + end if ; + end procedure AlertIfNotEqual ; + + ------------------------------------------------------------ + procedure AlertIfNotEqual( L, R : std_logic_vector ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L ?/= R then + AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L /= R, L = " & to_string(L) & " R = " & to_string(R), Level) ; + end if ; + end procedure AlertIfNotEqual ; + + ------------------------------------------------------------ + procedure AlertIfNotEqual( L, R : unsigned ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L ?/= R then + AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L /= R, L = " & to_string(L) & " R = " & to_string(R), Level) ; + end if ; + end procedure AlertIfNotEqual ; + + ------------------------------------------------------------ + procedure AlertIfNotEqual( L, R : signed ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L ?/= R then + AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L /= R, L = " & to_string(L) & " R = " & to_string(R), Level) ; + end if ; + end procedure AlertIfNotEqual ; + + ------------------------------------------------------------ + procedure AlertIfNotEqual( L, R : integer ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L /= R then + AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L /= R, L = " & to_string(L) & " R = " & to_string(R), Level) ; + end if ; + end procedure AlertIfNotEqual ; + + ------------------------------------------------------------ + procedure AlertIfNotEqual( L, R : real ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L /= R then + AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L /= R, L = " & to_string(L, 4) & " R = " & to_string(R, 4), Level) ; + end if ; + end procedure AlertIfNotEqual ; + + ------------------------------------------------------------ + procedure AlertIfNotEqual( L, R : character ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L /= R then + AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L /= R, L = " & L & " R = " & R, Level) ; + end if ; + end procedure AlertIfNotEqual ; + + ------------------------------------------------------------ + procedure AlertIfNotEqual( L, R : string ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L /= R then + AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L /= R, L = " & L & " R = " & R, Level) ; + end if ; + end procedure AlertIfNotEqual ; + + ------------------------------------------------------------ + procedure AlertIfNotEqual( L, R : time ; Message : string ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + begin + if L /= R then + AlertLogStruct.Alert(ALERT_DEFAULT_ID, Message & " L /= R, L = " & to_string(L) & " R = " & to_string(R), Level) ; + end if ; + end procedure AlertIfNotEqual ; + + + ------------------------------------------------------------ + -- Local + procedure LocalAlertIfDiff (AlertLogID : AlertLogIDType ; file File1, File2 : text; Message : string ; Level : AlertType ; Valid : out boolean ) is + -- Simple diff. + ------------------------------------------------------------ + variable Buf1, Buf2 : line ; + variable File1Done, File2Done : boolean ; + variable LineCount : integer := 0 ; + begin + ReadLoop : loop + File1Done := EndFile(File1) ; + File2Done := EndFile(File2) ; + exit ReadLoop when File1Done or File2Done ; + + ReadLine(File1, Buf1) ; + ReadLine(File2, Buf2) ; + LineCount := LineCount + 1 ; + + if Buf1.all /= Buf2.all then + AlertLogStruct.Alert(AlertLogID , Message & " File miscompare on line " & to_string(LineCount), Level) ; + exit ReadLoop ; + end if ; + end loop ReadLoop ; + if File1Done /= File2Done then + if not File1Done then + AlertLogStruct.Alert(AlertLogID , Message & " File1 longer than File2 " & to_string(LineCount), Level) ; + end if ; + if not File2Done then + AlertLogStruct.Alert(AlertLogID , Message & " File2 longer than File1 " & to_string(LineCount), Level) ; + end if ; + end if; + if File1Done and File2Done then + Valid := TRUE ; + else + Valid := FALSE ; + end if ; + end procedure LocalAlertIfDiff ; + + ------------------------------------------------------------ + -- Local + procedure LocalAlertIfDiff (AlertLogID : AlertLogIDType ; Name1, Name2 : string; Message : string ; Level : AlertType ; Valid : out boolean ) is + -- Open files and call AlertIfDiff[text, ...] + ------------------------------------------------------------ + file FileID1, FileID2 : text ; + variable status1, status2 : file_open_status ; + begin + Valid := FALSE ; + file_open(status1, FileID1, Name1, READ_MODE) ; + file_open(status2, FileID2, Name2, READ_MODE) ; + if status1 = OPEN_OK and status2 = OPEN_OK then + LocalAlertIfDiff (AlertLogID, FileID1, FileID2, Message & " " & Name1 & " /= " & Name2 & ", ", Level, Valid) ; + else + if status1 /= OPEN_OK then + AlertLogStruct.Alert(AlertLogID , Message & " File, " & Name1 & ", did not open", Level) ; + end if ; + if status2 /= OPEN_OK then + AlertLogStruct.Alert(AlertLogID , Message & " File, " & Name2 & ", did not open", Level) ; + end if ; + end if; + end procedure LocalAlertIfDiff ; + + ------------------------------------------------------------ + procedure AlertIfDiff (AlertLogID : AlertLogIDType ; Name1, Name2 : string; Message : string := "" ; Level : AlertType := ERROR ) is + -- Open files and call AlertIfDiff[text, ...] + ------------------------------------------------------------ + variable Valid : boolean ; + begin + LocalAlertIfDiff (AlertLogID, Name1, Name2, Message, Level, Valid) ; + end procedure AlertIfDiff ; + + ------------------------------------------------------------ + procedure AlertIfDiff (Name1, Name2 : string; Message : string := "" ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + variable Valid : boolean ; + begin + LocalAlertIfDiff (ALERT_DEFAULT_ID, Name1, Name2, Message, Level, Valid) ; + end procedure AlertIfDiff ; + + ------------------------------------------------------------ + procedure AlertIfDiff (AlertLogID : AlertLogIDType ; file File1, File2 : text; Message : string := "" ; Level : AlertType := ERROR ) is + -- Simple diff. + ------------------------------------------------------------ + variable Valid : boolean ; + begin + LocalAlertIfDiff (AlertLogID, File1, File2, Message, Level, Valid ) ; + end procedure AlertIfDiff ; + + ------------------------------------------------------------ + procedure AlertIfDiff (file File1, File2 : text; Message : string := "" ; Level : AlertType := ERROR ) is + ------------------------------------------------------------ + variable Valid : boolean ; + begin + LocalAlertIfDiff (ALERT_DEFAULT_ID, File1, File2, Message, Level, Valid ) ; + end procedure AlertIfDiff ; + + ------------------------------------------------------------ + procedure AffirmIf( + ------------------------------------------------------------ + AlertLogID : AlertLogIDType ; + condition : boolean ; + ReceivedMessage : string ; + ExpectedMessage : string ; + Enable : boolean := FALSE -- override internal enable + ) is + begin + AlertLogStruct.IncAffirmCount ; -- increment check count + if condition then + -- passed + AlertLogStruct.Log(AlertLogID, ReceivedMessage, PASSED, Enable) ; +-- AlertLogStruct.IncAffirmPassCount ; -- increment pass & check count + else + AlertLogStruct.Alert(AlertLogID, ReceivedMessage & ExpectedMessage, ERROR) ; + end if ; + end procedure AffirmIf ; + + ------------------------------------------------------------ + procedure AffirmIf( condition : boolean ; ReceivedMessage, ExpectedMessage : string ; Enable : boolean := FALSE ) is + ------------------------------------------------------------ + begin + AffirmIf(ALERT_DEFAULT_ID, condition, ReceivedMessage, ExpectedMessage, Enable) ; + end procedure AffirmIf ; + + ------------------------------------------------------------ + impure function AffirmIf( AlertLogID : AlertLogIDType ; condition : boolean ; ReceivedMessage, ExpectedMessage : string ; Enable : boolean := FALSE ) return boolean is + ------------------------------------------------------------ + begin + AffirmIf(AlertLogID, condition, ReceivedMessage, ExpectedMessage, Enable) ; + return condition ; + end function AffirmIf ; + + ------------------------------------------------------------ + impure function AffirmIf( condition : boolean ; ReceivedMessage, ExpectedMessage : string ; Enable : boolean := FALSE ) return boolean is + ------------------------------------------------------------ + begin + AffirmIf(ALERT_DEFAULT_ID, condition, ReceivedMessage, ExpectedMessage, Enable) ; + return condition ; + end function AffirmIf ; + + + ------------------------------------------------------------ + procedure AffirmIf( + ------------------------------------------------------------ + AlertLogID : AlertLogIDType ; + condition : boolean ; + Message : string ; + Enable : boolean := FALSE -- override internal enable + ) is + begin + AlertLogStruct.IncAffirmCount ; -- increment check count + if condition then + -- passed + AlertLogStruct.Log(AlertLogID, Message, PASSED, Enable) ; +-- AlertLogStruct.IncAffirmPassCount ; -- increment pass & check count + else + AlertLogStruct.Alert(AlertLogID, Message, ERROR) ; + end if ; + end procedure AffirmIf ; + + ------------------------------------------------------------ + procedure AffirmIf(condition : boolean ; Message : string ; Enable : boolean := FALSE) is + ------------------------------------------------------------ + begin + AffirmIf(ALERT_DEFAULT_ID, condition, Message, Enable) ; + end procedure AffirmIf; + + ------------------------------------------------------------ + -- useful in a loop: exit when AffirmIf( ID, not ReadValid, "Read Failed") ; + impure function AffirmIf( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; Enable : boolean := FALSE ) return boolean is + ------------------------------------------------------------ + begin + AffirmIf(AlertLogID, condition, Message, Enable) ; + return condition ; + end function AffirmIf ; + + ------------------------------------------------------------ + impure function AffirmIf( condition : boolean ; Message : string ; Enable : boolean := FALSE ) return boolean is + ------------------------------------------------------------ + begin + AffirmIf(ALERT_DEFAULT_ID, condition, Message, Enable) ; + return condition ; + end function AffirmIf ; + + ------------------------------------------------------------ + ------------------------------------------------------------ + procedure AffirmIfNot( AlertLogID : AlertLogIDType ; condition : boolean ; ReceivedMessage, ExpectedMessage : string ; Enable : boolean := FALSE ) is + ------------------------------------------------------------ + begin + AffirmIf(AlertLogID, not condition, ReceivedMessage, ExpectedMessage, Enable) ; + end procedure AffirmIfNot ; + + ------------------------------------------------------------ + procedure AffirmIfNot( condition : boolean ; ReceivedMessage, ExpectedMessage : string ; Enable : boolean := FALSE ) is + ------------------------------------------------------------ + begin + AffirmIf(ALERT_DEFAULT_ID, not condition, ReceivedMessage, ExpectedMessage, Enable) ; + end procedure AffirmIfNot ; + + ------------------------------------------------------------ + -- useful in a loop: exit when AffirmIfNot( not ReadValid, failure, "Read Failed") ; + impure function AffirmIfNot( AlertLogID : AlertLogIDType ; condition : boolean ; ReceivedMessage, ExpectedMessage : string ; Enable : boolean := FALSE ) return boolean is + ------------------------------------------------------------ + begin + AffirmIf(AlertLogID, not condition, ReceivedMessage, ExpectedMessage, Enable) ; + return not condition ; + end function AffirmIfNot ; + + ------------------------------------------------------------ + impure function AffirmIfNot( condition : boolean ; ReceivedMessage, ExpectedMessage : string ; Enable : boolean := FALSE ) return boolean is + ------------------------------------------------------------ + begin + AffirmIf(ALERT_DEFAULT_ID, not condition, ReceivedMessage, ExpectedMessage, Enable) ; + return not condition ; + end function AffirmIfNot ; + + ------------------------------------------------------------ + procedure AffirmIfNot( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; Enable : boolean := FALSE ) is + ------------------------------------------------------------ + begin + AffirmIf(AlertLogID, not condition, Message, Enable) ; + end procedure AffirmIfNot ; + + ------------------------------------------------------------ + procedure AffirmIfNot( condition : boolean ; Message : string ; Enable : boolean := FALSE ) is + ------------------------------------------------------------ + begin + AffirmIf(ALERT_DEFAULT_ID, not condition, Message, Enable) ; + end procedure AffirmIfNot ; + + ------------------------------------------------------------ + -- useful in a loop: exit when AffirmIfNot( not ReadValid, failure, "Read Failed") ; + impure function AffirmIfNot( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; Enable : boolean := FALSE ) return boolean is + ------------------------------------------------------------ + begin + AffirmIf(AlertLogID, not condition, Message, Enable) ; + return not condition ; + end function AffirmIfNot ; + + ------------------------------------------------------------ + impure function AffirmIfNot( condition : boolean ; Message : string ; Enable : boolean := FALSE ) return boolean is + ------------------------------------------------------------ + begin + AffirmIf(ALERT_DEFAULT_ID, not condition, Message, Enable) ; + return not condition ; + end function AffirmIfNot ; + + + ------------------------------------------------------------ + ------------------------------------------------------------ + procedure AffirmPassed( AlertLogID : AlertLogIDType ; Message : string ; Enable : boolean := FALSE ) is + ------------------------------------------------------------ + begin + AffirmIf(AlertLogID, TRUE, Message, Enable) ; + end procedure AffirmPassed ; + + ------------------------------------------------------------ + procedure AffirmPassed( Message : string ; Enable : boolean := FALSE ) is + ------------------------------------------------------------ + begin + AffirmIf(ALERT_DEFAULT_ID, TRUE, Message, Enable) ; + end procedure AffirmPassed ; + + ------------------------------------------------------------ + procedure AffirmError( AlertLogID : AlertLogIDType ; Message : string ) is + ------------------------------------------------------------ + begin + AffirmIf(AlertLogID, FALSE, Message, FALSE) ; + end procedure AffirmError ; + + ------------------------------------------------------------ + procedure AffirmError( Message : string ) is + ------------------------------------------------------------ + begin + AffirmIf(ALERT_DEFAULT_ID, FALSE, Message, FALSE) ; + end procedure AffirmError ; + + -- With AlertLogID + ------------------------------------------------------------ + procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : std_logic ; Message : string := "" ; Enable : boolean := FALSE ) is + ------------------------------------------------------------ + begin + AffirmIf(AlertLogID, ??(Received ?= Expected), + Message & " Received : " & to_string(Received), + " ?= Expected : " & to_string(Expected), + Enable) ; + end procedure AffirmIfEqual ; + + ------------------------------------------------------------ + procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : std_logic_vector ; Message : string := "" ; Enable : boolean := FALSE ) is + ------------------------------------------------------------ + begin + AffirmIf(AlertLogID, ??(Received ?= Expected), + Message & " Received : " & to_hstring(Received), + " ?= Expected : " & to_hstring(Expected), + Enable) ; + end procedure AffirmIfEqual ; + + ------------------------------------------------------------ + procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : unsigned ; Message : string := "" ; Enable : boolean := FALSE ) is + ------------------------------------------------------------ + begin + AffirmIf(AlertLogID, ??(Received ?= Expected), + Message & " Received : " & to_hstring(Received), + " ?= Expected : " & to_hstring(Expected), + Enable) ; + end procedure AffirmIfEqual ; + + ------------------------------------------------------------ + procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : signed ; Message : string := "" ; Enable : boolean := FALSE ) is + ------------------------------------------------------------ + begin + AffirmIf(AlertLogID, ??(Received ?= Expected), + Message & " Received : " & to_hstring(Received), + " ?= Expected : " & to_hstring(Expected), + Enable) ; + end procedure AffirmIfEqual ; + + ------------------------------------------------------------ + procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : integer ; Message : string := "" ; Enable : boolean := FALSE ) is + ------------------------------------------------------------ + begin + AffirmIf(AlertLogID, Received = Expected, + Message & " Received : " & to_string(Received), + " = Expected : " & to_string(Expected), + Enable) ; + end procedure AffirmIfEqual ; + + ------------------------------------------------------------ + procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : real ; Message : string := "" ; Enable : boolean := FALSE ) is + ------------------------------------------------------------ + begin + AffirmIf(AlertLogID, Received = Expected, + Message & " Received : " & to_string(Received, 4), + " = Expected : " & to_string(Expected, 4), + Enable) ; + end procedure AffirmIfEqual ; + + ------------------------------------------------------------ + procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : character ; Message : string := "" ; Enable : boolean := FALSE ) is + ------------------------------------------------------------ + begin + AffirmIf(AlertLogID, Received = Expected, + Message & " Received : " & to_string(Received), + " = Expected : " & to_string(Expected), + Enable) ; + end procedure AffirmIfEqual ; + + ------------------------------------------------------------ + procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : string ; Message : string := "" ; Enable : boolean := FALSE ) is + ------------------------------------------------------------ + begin + AffirmIf(AlertLogID, Received = Expected, + Message & " Received : " & Received, + " = Expected : " & Expected, + Enable) ; + end procedure AffirmIfEqual ; + + ------------------------------------------------------------ + procedure AffirmIfEqual( AlertLogID : AlertLogIDType ; Received, Expected : time ; Message : string := "" ; Enable : boolean := FALSE ) is + ------------------------------------------------------------ + begin + AffirmIf(AlertLogID, Received = Expected, + Message & " Received : " & to_string(Received), + " = Expected : " & to_string(Expected), + Enable) ; + end procedure AffirmIfEqual ; + + -- Without AlertLogID + ------------------------------------------------------------ + procedure AffirmIfEqual( Received, Expected : std_logic ; Message : string := "" ; Enable : boolean := FALSE ) is + ------------------------------------------------------------ + begin + AffirmIf(ALERT_DEFAULT_ID, ??(Received ?= Expected), + Message & " Received : " & to_string(Received), + " ?= Expected : " & to_string(Expected), + Enable) ; + end procedure AffirmIfEqual ; + + ------------------------------------------------------------ + procedure AffirmIfEqual( Received, Expected : std_logic_vector ; Message : string := "" ; Enable : boolean := FALSE ) is + ------------------------------------------------------------ + begin + AffirmIf(ALERT_DEFAULT_ID, ??(Received ?= Expected), + Message & " Received : " & to_string(Received), + " ?= Expected : " & to_string(Expected), + Enable) ; + end procedure AffirmIfEqual ; + + ------------------------------------------------------------ + procedure AffirmIfEqual( Received, Expected : unsigned ; Message : string := "" ; Enable : boolean := FALSE ) is + ------------------------------------------------------------ + begin + AffirmIf(ALERT_DEFAULT_ID, ??(Received ?= Expected), + Message & " Received : " & to_string(Received), + " ?= Expected : " & to_string(Expected), + Enable) ; + end procedure AffirmIfEqual ; + + ------------------------------------------------------------ + procedure AffirmIfEqual( Received, Expected : signed ; Message : string := "" ; Enable : boolean := FALSE ) is + ------------------------------------------------------------ + begin + AffirmIf(ALERT_DEFAULT_ID, ??(Received ?= Expected), + Message & " Received : " & to_string(Received), + " ?= Expected : " & to_string(Expected), + Enable) ; + end procedure AffirmIfEqual ; + + ------------------------------------------------------------ + procedure AffirmIfEqual( Received, Expected : integer ; Message : string := "" ; Enable : boolean := FALSE ) is + ------------------------------------------------------------ + begin + AffirmIf(ALERT_DEFAULT_ID, Received = Expected, + Message & " Received : " & to_string(Received), + " = Expected : " & to_string(Expected), + Enable) ; + end procedure AffirmIfEqual ; + + ------------------------------------------------------------ + procedure AffirmIfEqual( Received, Expected : real ; Message : string := "" ; Enable : boolean := FALSE ) is + ------------------------------------------------------------ + begin + AffirmIf(ALERT_DEFAULT_ID, Received = Expected, + Message & " Received : " & to_string(Received, 4), + " = Expected : " & to_string(Expected, 4), + Enable) ; + end procedure AffirmIfEqual ; + + ------------------------------------------------------------ + procedure AffirmIfEqual( Received, Expected : character ; Message : string := "" ; Enable : boolean := FALSE ) is + ------------------------------------------------------------ + begin + AffirmIf(ALERT_DEFAULT_ID, Received = Expected, + Message & " Received : " & to_string(Received), + " = Expected : " & to_string(Expected), + Enable) ; + end procedure AffirmIfEqual ; + + ------------------------------------------------------------ + procedure AffirmIfEqual( Received, Expected : string ; Message : string := "" ; Enable : boolean := FALSE ) is + ------------------------------------------------------------ + begin + AffirmIf(ALERT_DEFAULT_ID, Received = Expected, + Message & " Received : " & Received, + " = Expected : " & Expected, + Enable) ; + end procedure AffirmIfEqual ; + + ------------------------------------------------------------ + procedure AffirmIfEqual( Received, Expected : time ; Message : string := "" ; Enable : boolean := FALSE ) is + ------------------------------------------------------------ + begin + AffirmIf(ALERT_DEFAULT_ID, Received = Expected, + Message & " Received : " & to_string(Received), + " = Expected : " & to_string(Expected), + Enable) ; + end procedure AffirmIfEqual ; + + ------------------------------------------------------------ + procedure AffirmIfDiff (AlertLogID : AlertLogIDType ; Name1, Name2 : string; Message : string := "" ; Enable : boolean := FALSE ) is + -- Open files and call AffirmIfDiff[text, ...] + ------------------------------------------------------------ + variable Valid : boolean ; + begin + LocalAlertIfDiff (AlertLogID, Name1, Name2, Message, ERROR, Valid) ; + if Valid then + AlertLogStruct.Log(AlertLogID, Message & " " & Name1 & " = " & Name2, PASSED, Enable) ; + end if ; + end procedure AffirmIfDiff ; + + ------------------------------------------------------------ + procedure AffirmIfDiff (Name1, Name2 : string; Message : string := "" ; Enable : boolean := FALSE ) is + ------------------------------------------------------------ + variable Valid : boolean ; + begin + LocalAlertIfDiff (ALERT_DEFAULT_ID, Name1, Name2, Message, ERROR, Valid) ; + if Valid then + AlertLogStruct.Log(ALERT_DEFAULT_ID, Message & " " & Name1 & " = " & Name2, PASSED, Enable) ; + end if ; + end procedure AffirmIfDiff ; + + ------------------------------------------------------------ + procedure AffirmIfDiff (AlertLogID : AlertLogIDType ; file File1, File2 : text; Message : string := "" ; Enable : boolean := FALSE ) is + -- Simple diff. + ------------------------------------------------------------ + variable Valid : boolean ; + begin + LocalAlertIfDiff (AlertLogID, File1, File2, Message, ERROR, Valid ) ; + if Valid then + AlertLogStruct.Log(AlertLogID, Message, PASSED, Enable) ; + end if ; + end procedure AffirmIfDiff ; + + ------------------------------------------------------------ + procedure AffirmIfDiff (file File1, File2 : text; Message : string := "" ; Enable : boolean := FALSE ) is + ------------------------------------------------------------ + variable Valid : boolean ; + begin + LocalAlertIfDiff (ALERT_DEFAULT_ID, File1, File2, Message, ERROR, Valid ) ; + if Valid then + AlertLogStruct.Log(ALERT_DEFAULT_ID, Message, PASSED, Enable) ; + end if ; + end procedure AffirmIfDiff ; + + ------------------------------------------------------------ + procedure SetAlertLogJustify is + ------------------------------------------------------------ + begin + AlertLogStruct.SetJustify ; + end procedure SetAlertLogJustify ; + + ------------------------------------------------------------ + procedure ReportAlerts ( Name : String ; AlertCount : AlertCountType ) is + ------------------------------------------------------------ + begin + AlertLogStruct.ReportAlerts(Name, AlertCount) ; + end procedure ReportAlerts ; + + ------------------------------------------------------------ + procedure ReportAlerts ( Name : string := OSVVM_STRING_INIT_PARM_DETECT ; AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID ; ExternalErrors : AlertCountType := (others => 0) ) is + ------------------------------------------------------------ + begin + AlertLogStruct.ReportAlerts(Name, AlertLogID, ExternalErrors, TRUE) ; + end procedure ReportAlerts ; + + ------------------------------------------------------------ + procedure ReportNonZeroAlerts ( Name : string := OSVVM_STRING_INIT_PARM_DETECT ; AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID ; ExternalErrors : AlertCountType := (others => 0) ) is + ------------------------------------------------------------ + begin + AlertLogStruct.ReportAlerts(Name, AlertLogID, ExternalErrors, FALSE) ; + end procedure ReportNonZeroAlerts ; + + ------------------------------------------------------------ + procedure ClearAlerts is + ------------------------------------------------------------ + begin + AlertLogStruct.ClearAlerts ; + end procedure ClearAlerts ; + + ------------------------------------------------------------ + function "ABS" (L : AlertCountType) return AlertCountType is + ------------------------------------------------------------ + variable Result : AlertCountType ; + begin + Result(FAILURE) := ABS( L(FAILURE) ) ; + Result(ERROR) := ABS( L(ERROR) ) ; + Result(WARNING) := ABS( L(WARNING) ); + return Result ; + end function "ABS" ; + + ------------------------------------------------------------ + function "+" (L, R : AlertCountType) return AlertCountType is + ------------------------------------------------------------ + variable Result : AlertCountType ; + begin + Result(FAILURE) := L(FAILURE) + R(FAILURE) ; + Result(ERROR) := L(ERROR) + R(ERROR) ; + Result(WARNING) := L(WARNING) + R(WARNING) ; + return Result ; + end function "+" ; + + ------------------------------------------------------------ + function "-" (L, R : AlertCountType) return AlertCountType is + ------------------------------------------------------------ + variable Result : AlertCountType ; + begin + Result(FAILURE) := L(FAILURE) - R(FAILURE) ; + Result(ERROR) := L(ERROR) - R(ERROR) ; + Result(WARNING) := L(WARNING) - R(WARNING) ; + return Result ; + end function "-" ; + + ------------------------------------------------------------ + function "-" (R : AlertCountType) return AlertCountType is + ------------------------------------------------------------ + variable Result : AlertCountType ; + begin + Result(FAILURE) := - R(FAILURE) ; + Result(ERROR) := - R(ERROR) ; + Result(WARNING) := - R(WARNING) ; + return Result ; + end function "-" ; + + ------------------------------------------------------------ + impure function SumAlertCount(AlertCount: AlertCountType) return integer is + ------------------------------------------------------------ + begin + -- Using ABS ensures correct expected error handling. + return abs(AlertCount(FAILURE)) + abs(AlertCount(ERROR)) + abs(AlertCount(WARNING)) ; + end function SumAlertCount ; + + ------------------------------------------------------------ + impure function GetAlertCount(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return AlertCountType is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetAlertCount(AlertLogID) ; + end function GetAlertCount ; + + ------------------------------------------------------------ + impure function GetAlertCount(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return integer is + ------------------------------------------------------------ + begin + return SumAlertCount(AlertLogStruct.GetAlertCount(AlertLogID)) ; + end function GetAlertCount ; + + ------------------------------------------------------------ + impure function GetEnabledAlertCount(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return AlertCountType is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetEnabledAlertCount(AlertLogID) ; + end function GetEnabledAlertCount ; + + ------------------------------------------------------------ + impure function GetEnabledAlertCount(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return integer is + ------------------------------------------------------------ + begin + return SumAlertCount(AlertLogStruct.GetEnabledAlertCount(AlertLogID)) ; + end function GetEnabledAlertCount ; + + ------------------------------------------------------------ + impure function GetDisabledAlertCount return AlertCountType is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetDisabledAlertCount ; + end function GetDisabledAlertCount ; + + ------------------------------------------------------------ + impure function GetDisabledAlertCount return integer is + ------------------------------------------------------------ + begin + return SumAlertCount(AlertLogStruct.GetDisabledAlertCount) ; + end function GetDisabledAlertCount ; + + ------------------------------------------------------------ + impure function GetDisabledAlertCount(AlertLogID: AlertLogIDType) return AlertCountType is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetDisabledAlertCount(AlertLogID) ; + end function GetDisabledAlertCount ; + + ------------------------------------------------------------ + impure function GetDisabledAlertCount(AlertLogID: AlertLogIDType) return integer is + ------------------------------------------------------------ + begin + return SumAlertCount(AlertLogStruct.GetDisabledAlertCount(AlertLogID)) ; + end function GetDisabledAlertCount ; + + ------------------------------------------------------------ + procedure Log( + AlertLogID : AlertLogIDType ; + Message : string ; + Level : LogType := ALWAYS ; + Enable : boolean := FALSE -- override internal enable + ) is + begin + AlertLogStruct.Log(AlertLogID, Message, Level, Enable) ; + end procedure log ; + + ------------------------------------------------------------ + procedure Log( Message : string ; Level : LogType := ALWAYS ; Enable : boolean := FALSE) is + ------------------------------------------------------------ + begin + AlertLogStruct.Log(LOG_DEFAULT_ID, Message, Level, Enable) ; + end procedure log ; + + ------------------------------------------------------------ + procedure SetAlertLogName(Name : string ) is + ------------------------------------------------------------ + begin + AlertLogStruct.SetAlertLogName(Name) ; + end procedure SetAlertLogName ; + + ------------------------------------------------------------ + impure function GetAlertLogName(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return string is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetAlertLogName(AlertLogID) ; + end GetAlertLogName ; + + ------------------------------------------------------------ + procedure DeallocateAlertLogStruct is + ------------------------------------------------------------ + begin + AlertLogStruct.Deallocate ; + end procedure DeallocateAlertLogStruct ; + + ------------------------------------------------------------ + procedure InitializeAlertLogStruct is + ------------------------------------------------------------ + begin + AlertLogStruct.Initialize ; + end procedure InitializeAlertLogStruct ; + + ------------------------------------------------------------ + impure function FindAlertLogID(Name : string ) return AlertLogIDType is + ------------------------------------------------------------ + begin + return AlertLogStruct.FindAlertLogID(Name) ; + end function FindAlertLogID ; + + ------------------------------------------------------------ + impure function FindAlertLogID(Name : string ; ParentID : AlertLogIDType) return AlertLogIDType is + ------------------------------------------------------------ + begin + return AlertLogStruct.FindAlertLogID(Name, ParentID) ; + end function FindAlertLogID ; + + ------------------------------------------------------------ + impure function GetAlertLogID(Name : string ; ParentID : AlertLogIDType := ALERTLOG_BASE_ID ; CreateHierarchy : Boolean := TRUE) return AlertLogIDType is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetAlertLogID(Name, ParentID, CreateHierarchy ) ; + end function GetAlertLogID ; + + ------------------------------------------------------------ + impure function GetAlertLogParentID(AlertLogID : AlertLogIDType) return AlertLogIDType is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetAlertLogParentID(AlertLogID) ; + end function GetAlertLogParentID ; + + ------------------------------------------------------------ + procedure SetGlobalAlertEnable (A : boolean := TRUE) is + ------------------------------------------------------------ + begin + AlertLogStruct.SetGlobalAlertEnable(A) ; + end procedure SetGlobalAlertEnable ; + + ------------------------------------------------------------ + -- Set using constant. Set before code runs. + impure function SetGlobalAlertEnable (A : boolean := TRUE) return boolean is + ------------------------------------------------------------ + begin + AlertLogStruct.SetGlobalAlertEnable(A) ; + return A ; + end function SetGlobalAlertEnable ; + + ------------------------------------------------------------ + impure function GetGlobalAlertEnable return boolean is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetGlobalAlertEnable ; + end function GetGlobalAlertEnable ; + + ------------------------------------------------------------ + procedure IncAffirmCount is + ------------------------------------------------------------ + begin + AlertLogStruct.IncAffirmCount ; + end procedure IncAffirmCount ; + + ------------------------------------------------------------ + impure function GetAffirmCount return natural is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetAffirmCount ; + end function GetAffirmCount ; + +--?? ------------------------------------------------------------ +--?? procedure IncAffirmPassCount is +--?? ------------------------------------------------------------ +--?? begin +--?? AlertLogStruct.IncAffirmPassCount ; +--?? end procedure IncAffirmPassCount ; +--?? +--?? ------------------------------------------------------------ +--?? impure function GetAffirmPassCount return natural is +--?? ------------------------------------------------------------ +--?? begin +--?? return AlertLogStruct.GetAffirmPassCount ; +--?? end function GetAffirmPassCount ; + + ------------------------------------------------------------ + procedure SetAlertStopCount(AlertLogID : AlertLogIDType ; Level : AlertType ; Count : integer) is + ------------------------------------------------------------ + begin + AlertLogStruct.SetAlertStopCount(AlertLogID, Level, Count) ; + end procedure SetAlertStopCount ; + + ------------------------------------------------------------ + procedure SetAlertStopCount(Level : AlertType ; Count : integer) is + ------------------------------------------------------------ + begin + AlertLogStruct.SetAlertStopCount(ALERTLOG_BASE_ID, Level, Count) ; + end procedure SetAlertStopCount ; + + ------------------------------------------------------------ + impure function GetAlertStopCount(AlertLogID : AlertLogIDType ; Level : AlertType) return integer is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetAlertStopCount(AlertLogID, Level) ; + end function GetAlertStopCount ; + + ------------------------------------------------------------ + impure function GetAlertStopCount(Level : AlertType) return integer is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetAlertStopCount(ALERTLOG_BASE_ID, Level) ; + end function GetAlertStopCount ; + + ------------------------------------------------------------ + procedure SetAlertEnable(Level : AlertType ; Enable : boolean) is + ------------------------------------------------------------ + begin + AlertLogStruct.SetAlertEnable(Level, Enable) ; + end procedure SetAlertEnable ; + + ------------------------------------------------------------ + procedure SetAlertEnable(AlertLogID : AlertLogIDType ; Level : AlertType ; Enable : boolean ; DescendHierarchy : boolean := TRUE) is + ------------------------------------------------------------ + begin + AlertLogStruct.SetAlertEnable(AlertLogID, Level, Enable, DescendHierarchy) ; + end procedure SetAlertEnable ; + + ------------------------------------------------------------ + impure function GetAlertEnable(AlertLogID : AlertLogIDType ; Level : AlertType) return boolean is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetAlertEnable(AlertLogID, Level) ; + end function GetAlertEnable ; + + ------------------------------------------------------------ + impure function GetAlertEnable(Level : AlertType) return boolean is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetAlertEnable(ALERT_DEFAULT_ID, Level) ; + end function GetAlertEnable ; + + ------------------------------------------------------------ + procedure SetLogEnable(Level : LogType ; Enable : boolean) is + ------------------------------------------------------------ + begin + AlertLogStruct.SetLogEnable(Level, Enable) ; + end procedure SetLogEnable ; + + ------------------------------------------------------------ + procedure SetLogEnable(AlertLogID : AlertLogIDType ; Level : LogType ; Enable : boolean ; DescendHierarchy : boolean := TRUE) is + ------------------------------------------------------------ + begin + AlertLogStruct.SetLogEnable(AlertLogID, Level, Enable, DescendHierarchy) ; + end procedure SetLogEnable ; + + ------------------------------------------------------------ + impure function GetLogEnable(AlertLogID : AlertLogIDType ; Level : LogType) return boolean is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetLogEnable(AlertLogID, Level) ; + end function GetLogEnable ; + + ------------------------------------------------------------ + impure function GetLogEnable(Level : LogType) return boolean is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetLogEnable(LOG_DEFAULT_ID, Level) ; + end function GetLogEnable ; + + ------------------------------------------------------------ + procedure ReportLogEnables is + ------------------------------------------------------------ + begin + AlertLogStruct.ReportLogEnables ; + end ReportLogEnables ; + + ------------------------------------------------------------ + procedure SetAlertLogOptions ( + ------------------------------------------------------------ + FailOnWarning : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + FailOnDisabledErrors : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + ReportHierarchy : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + WriteAlertLevel : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + WriteAlertName : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + WriteAlertTime : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + WriteLogLevel : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + WriteLogName : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + WriteLogTime : AlertLogOptionsType := OPT_INIT_PARM_DETECT ; + AlertPrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; + LogPrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; + ReportPrefix : string := OSVVM_STRING_INIT_PARM_DETECT ; + DoneName : string := OSVVM_STRING_INIT_PARM_DETECT ; + PassName : string := OSVVM_STRING_INIT_PARM_DETECT ; + FailName : string := OSVVM_STRING_INIT_PARM_DETECT + ) is + begin + AlertLogStruct.SetAlertLogOptions ( + FailOnWarning => FailOnWarning , + FailOnDisabledErrors => FailOnDisabledErrors, + ReportHierarchy => ReportHierarchy , + WriteAlertLevel => WriteAlertLevel , + WriteAlertName => WriteAlertName , + WriteAlertTime => WriteAlertTime , + WriteLogLevel => WriteLogLevel , + WriteLogName => WriteLogName , + WriteLogTime => WriteLogTime , + AlertPrefix => AlertPrefix , + LogPrefix => LogPrefix , + ReportPrefix => ReportPrefix , + DoneName => DoneName , + PassName => PassName , + FailName => FailName + ); + end procedure SetAlertLogOptions ; + + ------------------------------------------------------------ + procedure ReportAlertLogOptions is + ------------------------------------------------------------ + begin + AlertLogStruct.ReportAlertLogOptions ; + end procedure ReportAlertLogOptions ; + + ------------------------------------------------------------ + impure function GetAlertLogFailOnWarning return AlertLogOptionsType is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetAlertLogFailOnWarning ; + end function GetAlertLogFailOnWarning ; + + ------------------------------------------------------------ + impure function GetAlertLogFailOnDisabledErrors return AlertLogOptionsType is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetAlertLogFailOnDisabledErrors ; + end function GetAlertLogFailOnDisabledErrors ; + + ------------------------------------------------------------ + impure function GetAlertLogReportHierarchy return AlertLogOptionsType is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetAlertLogReportHierarchy ; + end function GetAlertLogReportHierarchy ; + + ------------------------------------------------------------ + impure function GetAlertLogFoundReportHier return boolean is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetAlertLogFoundReportHier ; + end function GetAlertLogFoundReportHier ; + + ------------------------------------------------------------ + impure function GetAlertLogFoundAlertHier return boolean is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetAlertLogFoundAlertHier ; + end function GetAlertLogFoundAlertHier ; + + ------------------------------------------------------------ + impure function GetAlertLogWriteAlertLevel return AlertLogOptionsType is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetAlertLogWriteAlertLevel ; + end function GetAlertLogWriteAlertLevel ; + + ------------------------------------------------------------ + impure function GetAlertLogWriteAlertName return AlertLogOptionsType is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetAlertLogWriteAlertName ; + end function GetAlertLogWriteAlertName ; + + ------------------------------------------------------------ + impure function GetAlertLogWriteAlertTime return AlertLogOptionsType is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetAlertLogWriteAlertTime ; + end function GetAlertLogWriteAlertTime ; + + ------------------------------------------------------------ + impure function GetAlertLogWriteLogLevel return AlertLogOptionsType is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetAlertLogWriteLogLevel ; + end function GetAlertLogWriteLogLevel ; + + ------------------------------------------------------------ + impure function GetAlertLogWriteLogName return AlertLogOptionsType is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetAlertLogWriteLogName ; + end function GetAlertLogWriteLogName ; + + ------------------------------------------------------------ + impure function GetAlertLogWriteLogTime return AlertLogOptionsType is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetAlertLogWriteLogTime ; + end function GetAlertLogWriteLogTime ; + + ------------------------------------------------------------ + impure function GetAlertLogAlertPrefix return string is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetAlertLogAlertPrefix ; + end function GetAlertLogAlertPrefix ; + + ------------------------------------------------------------ + impure function GetAlertLogLogPrefix return string is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetAlertLogLogPrefix ; + end function GetAlertLogLogPrefix ; + + ------------------------------------------------------------ + impure function GetAlertLogReportPrefix return string is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetAlertLogReportPrefix ; + end function GetAlertLogReportPrefix ; + + ------------------------------------------------------------ + impure function GetAlertLogDoneName return string is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetAlertLogDoneName ; + end function GetAlertLogDoneName ; + + ------------------------------------------------------------ + impure function GetAlertLogPassName return string is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetAlertLogPassName ; + end function GetAlertLogPassName ; + + ------------------------------------------------------------ + impure function GetAlertLogFailName return string is + ------------------------------------------------------------ + begin + return AlertLogStruct.GetAlertLogFailName ; + end function GetAlertLogFailName ; + + ------------------------------------------------------------ + function IsLogEnableType (Name : String) return boolean is + ------------------------------------------------------------ + -- type LogType is (ALWAYS, DEBUG, FINAL, INFO, PASSED) ; -- NEVER + begin + if Name = "PASSED" then return TRUE ; + elsif Name = "DEBUG" then return TRUE ; + elsif Name = "FINAL" then return TRUE ; + elsif Name = "INFO" then return TRUE ; + end if ; + return FALSE ; + end function IsLogEnableType ; + + ------------------------------------------------------------ + procedure ReadLogEnables (file AlertLogInitFile : text) is + -- Preferred Read format + -- Line 1: instance1_name log_enable log_enable log_enable + -- Line 2: instance2_name log_enable log_enable log_enable + -- when reading multiple log_enables on a line, they must be separated by a space + -- + --- Also supports alternate format from Lyle/.... + -- Line 1: instance1_name + -- Line 2: log enable + -- Line 3: instance2_name + -- Line 4: log enable + -- + ------------------------------------------------------------ + type ReadStateType is (GET_ID, GET_ENABLE) ; + variable ReadState : ReadStateType := GET_ID ; + variable buf : line ; + variable Empty : boolean ; + variable MultiLineComment : boolean := FALSE ; + variable Name : string(1 to 80) ; + variable NameLen : integer ; + variable AlertLogID : AlertLogIDType ; + variable ReadAnEnable : boolean ; + variable LogLevel : LogType ; + begin + ReadState := GET_ID ; + ReadLineLoop : while not EndFile(AlertLogInitFile) loop + ReadLine(AlertLogInitFile, buf) ; + if ReadAnEnable then + -- Read one or more enable values, next line read AlertLog name + -- Note that any newline with ReadAnEnable TRUE will result in + -- searching for another AlertLogID name - this includes multi-line comments. + ReadState := GET_ID ; + end if ; + + ReadNameLoop : loop + EmptyOrCommentLine(buf, Empty, MultiLineComment) ; + next ReadLineLoop when Empty ; + + case ReadState is + when GET_ID => + sread(buf, Name, NameLen) ; + exit ReadNameLoop when NameLen = 0 ; + AlertLogID := GetAlertLogID(Name(1 to NameLen), ALERTLOG_ID_NOT_ASSIGNED) ; + ReadState := GET_ENABLE ; + ReadAnEnable := FALSE ; + + when GET_ENABLE => + sread(buf, Name, NameLen) ; + exit ReadNameLoop when NameLen = 0 ; + ReadAnEnable := TRUE ; + if not IsLogEnableType(Name(1 to NameLen)) then + Alert(OSVVM_ALERTLOG_ID, "AlertLogPkg.ReadLogEnables: Found Invalid LogEnable: " & Name(1 to NameLen)) ; + exit ReadNameLoop ; + end if ; + LogLevel := LogType'value(Name(1 to NameLen)) ; + SetLogEnable(AlertLogID, LogLevel, TRUE) ; + end case ; + end loop ReadNameLoop ; + end loop ReadLineLoop ; + end procedure ReadLogEnables ; + + ------------------------------------------------------------ + procedure ReadLogEnables (FileName : string) is + ------------------------------------------------------------ + file AlertLogInitFile : text open READ_MODE is FileName ; + begin + ReadLogEnables(AlertLogInitFile) ; + end procedure ReadLogEnables ; + + ------------------------------------------------------------ + function PathTail (A : string) return string is + ------------------------------------------------------------ + alias aA : string(1 to A'length) is A ; + variable LenA : integer := A'length ; + begin + if aA(LenA) = ':' then + LenA := LenA - 1 ; + end if ; + for i in LenA downto 1 loop + if aA(i) = ':' then + return aA(i+1 to LenA) ; + end if ; + end loop ; + return aA(1 to LenA) ; + end function PathTail ; + + -- ------------------------------------------------------------ + -- Deprecated + -- + + ------------------------------------------------------------ + -- deprecated + procedure AlertIf( condition : boolean ; AlertLogID : AlertLogIDType ; Message : string ; Level : AlertType := ERROR ) is + begin + AlertIf( AlertLogID, condition, Message, Level) ; + end procedure AlertIf ; + + ------------------------------------------------------------ + -- deprecated + impure function AlertIf( condition : boolean ; AlertLogID : AlertLogIDType ; Message : string ; Level : AlertType := ERROR ) return boolean is + begin + return AlertIf( AlertLogID, condition, Message, Level) ; + end function AlertIf ; + + ------------------------------------------------------------ + -- deprecated + procedure AlertIfNot( condition : boolean ; AlertLogID : AlertLogIDType ; Message : string ; Level : AlertType := ERROR ) is + begin + AlertIfNot( AlertLogID, condition, Message, Level) ; + end procedure AlertIfNot ; + + ------------------------------------------------------------ + -- deprecated + impure function AlertIfNot( condition : boolean ; AlertLogID : AlertLogIDType ; Message : string ; Level : AlertType := ERROR ) return boolean is + begin + return AlertIfNot( AlertLogID, condition, Message, Level) ; + end function AlertIfNot ; + + ------------------------------------------------------------ + -- deprecated + procedure AffirmIf( + AlertLogID : AlertLogIDType ; + condition : boolean ; + Message : string ; + LogLevel : LogType ; -- := PASSED + AlertLevel : AlertType := ERROR + ) is + begin + AlertLogStruct.IncAffirmCount ; -- increment check count + if condition then + -- passed + AlertLogStruct.Log(AlertLogID, Message, LogLevel) ; -- call log +-- AlertLogStruct.IncAffirmPassCount ; -- increment pass & check count + else + AlertLogStruct.Alert(AlertLogID, Message, AlertLevel) ; -- signal failure + end if ; + end procedure AffirmIf ; + + ------------------------------------------------------------ + -- deprecated + procedure AffirmIf( AlertLogID : AlertLogIDType ; condition : boolean ; Message : string ; AlertLevel : AlertType ) is + begin + AffirmIf(AlertLogID, condition, Message, PASSED, AlertLevel) ; + end procedure AffirmIf ; + + ------------------------------------------------------------ + -- deprecated + procedure AffirmIf(condition : boolean ; Message : string ; LogLevel : LogType ; AlertLevel : AlertType := ERROR) is + begin + AffirmIf(ALERT_DEFAULT_ID, condition, Message, LogLevel, AlertLevel) ; + end procedure AffirmIf; + + ------------------------------------------------------------ + -- deprecated + procedure AffirmIf(condition : boolean ; Message : string ; AlertLevel : AlertType ) is + begin + AffirmIf(ALERT_DEFAULT_ID, condition, Message, PASSED, AlertLevel) ; + end procedure AffirmIf; + end package body AlertLogPkg ; \ No newline at end of file