aboutsummaryrefslogtreecommitdiffstats
path: root/testsuite/gna
diff options
context:
space:
mode:
authorTristan Gingold <tgingold@free.fr>2022-02-26 18:52:52 +0100
committerTristan Gingold <tgingold@free.fr>2022-02-26 18:52:52 +0100
commite58709aefc057b4af0d7c011fc1c7d45d6176e10 (patch)
treedc340d5c5845c1755f545ce9c45dd55442f22d1b /testsuite/gna
parent739a8b346660bd2c8d2a2d8d2269d73a812eed71 (diff)
downloadghdl-e58709aefc057b4af0d7c011fc1c7d45d6176e10.tar.gz
ghdl-e58709aefc057b4af0d7c011fc1c7d45d6176e10.tar.bz2
ghdl-e58709aefc057b4af0d7c011fc1c7d45d6176e10.zip
testsuite/gna: add a test for #1980
Diffstat (limited to 'testsuite/gna')
-rw-r--r--testsuite/gna/issue1980/AlertLogPkg.vhd4186
-rw-r--r--testsuite/gna/issue1980/NamePkg.vhd137
-rw-r--r--testsuite/gna/issue1980/OsvvmGlobalPkg.vhd427
-rw-r--r--testsuite/gna/issue1980/OsvvmRun.yml20
-rw-r--r--testsuite/gna/issue1980/TextUtilPkg.vhd709
-rw-r--r--testsuite/gna/issue1980/repro.vhdl15
-rw-r--r--testsuite/gna/issue1980/repro3.on73
-rw-r--r--testsuite/gna/issue1980/repro4.on290
-rwxr-xr-xtestsuite/gna/issue1980/run2.sh57
-rwxr-xr-xtestsuite/gna/issue1980/testsuite.sh18
10 files changed, 5932 insertions, 0 deletions
diff --git a/testsuite/gna/issue1980/AlertLogPkg.vhd b/testsuite/gna/issue1980/AlertLogPkg.vhd
new file mode 100644
index 000000000..1a75a4722
--- /dev/null
+++ b/testsuite/gna/issue1980/AlertLogPkg.vhd
@@ -0,0 +1,4186 @@
+--
+-- 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
+-- Rob Gaddi Highland Technology. Inspired SetAlertLogPrefix / Suffix
+--
+--
+-- 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
+-- 02/2022 2022.02 SetAlertPrintCount and GetAlertPrintCount
+-- Added NewID with ReportMode, PrintParent
+-- Updated Alert s.t. on StopCount prints WriteAlertSummaryYaml and WriteAlertYaml
+-- 01/2022 2022.01 For AlertIfEqual and AffirmIfEqual, all arrays of std_ulogic use to_hxstring
+-- Updated return value for PathTail
+-- 10/2021 2021.10 Moved EndOfTestSummary to ReportPkg
+-- 09/2021 2021.09 Added EndOfTestSummary and CreateYamlReport - Experimental Release
+-- 07/2021 2021.07 When printing time value from GetOsvvmDefaultTimeUnits is used.
+-- 06/2021 2021.06 FindAlertLogID updated to allow an ID name to match the name set by SetAlertLogName (ALERTLOG_BASE_ID)
+-- 12/2020 2020.12 Added MetaMatch to AffirmIfEqual and AffirmIfNotEqual for std_logic family to use MetaMatch
+-- Added AffirmIfEqual for boolean
+-- 10/2020 2020.10 Added MetaMatch.
+-- Updated AlertIfEqual and AlertIfNotEqual for std_logic family to use MetaMatch
+-- 08/2020 2020.08 Alpha Test Release of Specification Tracking - Changes are provisional and subject to change
+-- Added Passed Goals - reported with ReportAlerts and ReportRequirements.
+-- Added WriteAlerts - CSV format of the information in ReportAlerts
+-- Tests fail when requirements are not met and FailOnRequirementErrors is true (default TRUE).
+-- Set using: SetAlertLogOptions(FailOnRequirementErrors => TRUE)
+-- Turn on requirements printing in summary and details with PrintRequirements (default FALSE,
+-- Turn on requirements printing in summary with PrintIfHaveRequirements (Default TRUE)
+-- Added Requirements Bin, ReadSpecification, GetReqID, SetPassedGoal
+-- Added AffirmIf("Req ID 1", ...) -- will work even if ID not set by GetReqID or ReadSpecification
+-- Added ReportRequirements, WriteRequirements, and ReadRequirements (to merge results of multiple tests)
+-- Added WriteTestSummary, ReadTestSummaries, ReportTestSummaries, and WriteTestSummaries.
+-- 05/2020 2020.05 Added internal variables AlertCount (W, E, F) and ErrorCount (integer)
+-- that hold the error state. These can be displayed in wave windows
+-- in simulation to track number of errors.
+-- Calls to std.env.stop now return ErrorCount
+-- Updated calls to check for valid AlertLogIDs
+-- Added affirmation count for each level.
+-- Turn off reporting with SetAlertLogOptions (PrintAffirmations => TRUE) ;
+-- Disabled Alerts now handled in separate bins and reported separately.
+-- Turn off reporting with SetAlertLogOptions (PrintDisabledAlerts => TRUE) ;
+-- 01/2020 2020.01 Updated Licenses to Apache
+-- 10/2018 2018.10 Added pragmas to allow alerts, logs, and affirmations in RTL code
+-- Added local variable to mirror top level ErrorCount and display in simulator
+-- Added prefix and suffix
+-- Debug printing with number of errors as prefix
+-- 04/2018 2018.04 Fix to PathTail. Prep to change AlertLogIDType to a type.
+-- 05/2017 2017.05 AffirmIfEqual, AffirmIfDiff,
+-- GetAffirmCount (deprecates GetAffirmCheckCount), IncAffirmCount (deprecates IncAffirmCheckCount),
+-- IsAlertEnabled (alias), IsLogEnabled (alias)
+-- 02/2016 2016.02 Fixed IsLogEnableType (for PASSED), AffirmIf (to pass AlertLevel)
+-- Created LocalInitialize
+-- 07/2015 2016.01 Fixed AlertLogID issue with > 32 IDs
+-- 05/2015 2015.06 Added IncAlertCount, AffirmIf
+-- 03/2015 2015.03 Added: AlertIfEqual, AlertIfNotEqual, AlertIfDiff, PathTail,
+-- ReportNonZeroAlerts, ReadLogEnables
+-- 01/2015 2015.01 Initial revision
+--
+-- This file is part of OSVVM.
+--
+-- Copyright (c) 2015 - 2022 by SynthWorks Design Inc.
+--
+-- Licensed under the Apache License, Version 2.0 (the "License");
+-- you may not use this file except in compliance with the License.
+-- You may obtain a copy of the License at
+--
+-- https://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+--
+
+
+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 revision
+ 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 ;
+ type AlertLogReportModeType is (DISABLED, ENABLED, NONZERO) ;
+ type AlertLogPrintParentType is (PRINT_NAME, PRINT_NAME_AND_PARENT) ;
+
+ constant REPORTS_DIRECTORY : string := "" ;
+-- constant REPORTS_DIRECTORY : string := "./reports/" ;
+
+ constant ALERTLOG_BASE_ID : AlertLogIDType := 0 ; -- Careful as some code may assume this is 0.
+ constant ALERTLOG_DEFAULT_ID : AlertLogIDType := ALERTLOG_BASE_ID + 1 ;
+ constant OSVVM_ALERTLOG_ID : AlertLogIDType := ALERTLOG_BASE_ID + 2 ; -- reporting for packages
+ constant REQUIREMENT_ALERTLOG_ID : AlertLogIDType := ALERTLOG_BASE_ID + 3 ;
+ -- May have its own ID or OSVVM_ALERTLOG_ID as default - most scoreboards allocate their own ID
+ constant OSVVM_SCOREBOARD_ALERTLOG_ID : AlertLogIDType := OSVVM_ALERTLOG_ID ;
+ constant OSVVM_COV_ALERTLOG_ID : AlertLogIDType := OSVVM_ALERTLOG_ID ;
+
+ -- Same as ALERTLOG_DEFAULT_ID
+ constant ALERT_DEFAULT_ID : AlertLogIDType := ALERTLOG_DEFAULT_ID ;
+ constant LOG_DEFAULT_ID : AlertLogIDType := ALERTLOG_DEFAULT_ID ;
+
+ 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
+
+ ------------------------------------------------------------
+ procedure SetAlertLogJustify (Enable : boolean := TRUE) ;
+ procedure ReportAlerts ( Name : String ; AlertCount : AlertCountType ) ;
+ procedure ReportRequirements ;
+ procedure ReportAlerts (
+ Name : string := OSVVM_STRING_INIT_PARM_DETECT ;
+ AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID ;
+ ExternalErrors : AlertCountType := (others => 0) ;
+ ReportAll : Boolean := FALSE
+ ) ;
+
+ procedure ReportNonZeroAlerts (
+ Name : string := OSVVM_STRING_INIT_PARM_DETECT ;
+ AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID ;
+ ExternalErrors : AlertCountType := (others => 0)
+ ) ;
+
+ procedure WriteTestSummary (
+ FileName : string ;
+ OpenKind : File_Open_Kind := APPEND_MODE ;
+ Prefix : string := "" ;
+ Suffix : string := "" ;
+ ExternalErrors : AlertCountType := (0,0,0) ;
+ WriteFieldName : boolean := FALSE
+ ) ;
+ procedure WriteTestSummaries ( FileName : string ; OpenKind : File_Open_Kind := WRITE_MODE ) ;
+ procedure ReportTestSummaries ;
+ procedure WriteAlerts (
+ FileName : string ;
+ AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID ;
+ OpenKind : File_Open_Kind := WRITE_MODE
+ ) ;
+ procedure WriteRequirements (
+ FileName : string ;
+ AlertLogID : AlertLogIDType := REQUIREMENT_ALERTLOG_ID ;
+ OpenKind : File_Open_Kind := WRITE_MODE
+ ) ;
+ procedure ReadSpecification (FileName : string ; PassedGoal : integer := -1) ;
+ procedure ReadRequirements (
+ FileName : string ;
+ ThresholdPassed : boolean := FALSE
+ ) ;
+ procedure ReadTestSummaries (FileName : string) ;
+ procedure ClearAlerts ;
+ procedure ClearAlertStopCounts ;
+ procedure ClearAlertCounts ;
+ 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) ;
+
+ ------------------------------------------------------------
+ -- Alert Enables
+ 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] ;
+
+ -- Log Enables
+ 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 SetAlertLogName(Name : string ) ;
+ -- synthesis translate_off
+ impure function GetAlertLogName(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return string ;
+ -- synthesis translate_on
+ procedure DeallocateAlertLogStruct ;
+ procedure InitializeAlertLogStruct ;
+ impure function FindAlertLogID(Name : string ) return AlertLogIDType ;
+ impure function FindAlertLogID(Name : string ; ParentID : AlertLogIDType) return AlertLogIDType ;
+ impure function NewID(
+ Name : string ;
+ ParentID : AlertLogIDType := ALERTLOG_ID_NOT_ASSIGNED ;
+ ReportMode : AlertLogReportModeType := ENABLED ;
+ PrintParent : AlertLogPrintParentType := PRINT_NAME_AND_PARENT ;
+ CreateHierarchy : boolean := TRUE
+ ) return AlertLogIDType ;
+ impure function GetReqID(Name : string ; PassedGoal : integer := -1 ; ParentID : AlertLogIDType := ALERTLOG_ID_NOT_ASSIGNED ; CreateHierarchy : Boolean := TRUE) return AlertLogIDType ;
+ procedure SetPassedGoal(AlertLogID : AlertLogIDType ; PassedGoal : integer ) ;
+ impure function GetAlertLogParentID(AlertLogID : AlertLogIDType) return AlertLogIDType ;
+ procedure SetAlertLogPrefix(AlertLogID : AlertLogIDType; Name : string ) ;
+ procedure UnSetAlertLogPrefix(AlertLogID : AlertLogIDType) ;
+ -- synthesis translate_off
+ impure function GetAlertLogPrefix(AlertLogID : AlertLogIDType) return string ;
+ -- synthesis translate_on
+ procedure SetAlertLogSuffix(AlertLogID : AlertLogIDType; Name : string ) ;
+ procedure UnSetAlertLogSuffix(AlertLogID : AlertLogIDType) ;
+ -- synthesis translate_off
+ impure function GetAlertLogSuffix(AlertLogID : AlertLogIDType) return string ;
+ -- synthesis translate_on
+
+ ------------------------------------------------------------
+ -- Accessor Methods
+ procedure SetGlobalAlertEnable (A : boolean := TRUE) ;
+ impure function SetGlobalAlertEnable (A : boolean := TRUE) return boolean ;
+ impure function GetGlobalAlertEnable return boolean ;
+ procedure IncAffirmCount(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) ;
+ impure function GetAffirmCount return natural ;
+ procedure IncAffirmPassedCount(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) ;
+ impure function GetAffirmPassedCount 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 SetAlertPrintCount(AlertLogID : AlertLogIDType ; Level : AlertType ; Count : integer) ;
+ procedure SetAlertPrintCount( Level : AlertType ; Count : integer) ;
+ impure function GetAlertPrintCount(AlertLogID : AlertLogIDType ; Level : AlertType) return integer ;
+ impure function GetAlertPrintCount( Level : AlertType) return integer ;
+ procedure SetAlertPrintCount(AlertLogID : AlertLogIDType ; Count : AlertCountType) ;
+ procedure SetAlertPrintCount( Count : AlertCountType) ;
+ impure function GetAlertPrintCount(AlertLogID : AlertLogIDType) return AlertCountType ;
+ impure function GetAlertPrintCount return AlertCountType ;
+
+ procedure SetAlertLogPrintParent(AlertLogID : AlertLogIDType ; PrintParent : AlertLogPrintParentType) ;
+ procedure SetAlertLogPrintParent( PrintParent : AlertLogPrintParentType) ;
+ impure function GetAlertLogPrintParent(AlertLogID : AlertLogIDType) return AlertLogPrintParentType ;
+ impure function GetAlertLogPrintParent return AlertLogPrintParentType ;
+
+ procedure SetAlertLogReportMode(AlertLogID : AlertLogIDType ; ReportMode : AlertLogReportModeType) ;
+ procedure SetAlertLogReportMode( ReportMode : AlertLogReportModeType) ;
+ impure function GetAlertLogReportMode(AlertLogID : AlertLogIDType) return AlertLogReportModeType ;
+ impure function GetAlertLogReportMode return AlertLogReportModeType ;
+
+ ------------------------------------------------------------
+ procedure SetAlertLogOptions (
+ FailOnWarning : OsvvmOptionsType := OPT_INIT_PARM_DETECT ;
+ FailOnDisabledErrors : OsvvmOptionsType := OPT_INIT_PARM_DETECT ;
+ FailOnRequirementErrors : OsvvmOptionsType := OPT_INIT_PARM_DETECT ;
+ ReportHierarchy : OsvvmOptionsType := OPT_INIT_PARM_DETECT ;
+ WriteAlertErrorCount : OsvvmOptionsType := OPT_INIT_PARM_DETECT ;
+ WriteAlertLevel : OsvvmOptionsType := OPT_INIT_PARM_DETECT ;
+ WriteAlertName : OsvvmOptionsType := OPT_INIT_PARM_DETECT ;
+ WriteAlertTime : OsvvmOptionsType := OPT_INIT_PARM_DETECT ;
+ WriteLogErrorCount : OsvvmOptionsType := OPT_INIT_PARM_DETECT ;
+ WriteLogLevel : OsvvmOptionsType := OPT_INIT_PARM_DETECT ;
+ WriteLogName : OsvvmOptionsType := OPT_INIT_PARM_DETECT ;
+ WriteLogTime : OsvvmOptionsType := OPT_INIT_PARM_DETECT ;
+ PrintPassed : OsvvmOptionsType := OPT_INIT_PARM_DETECT ;
+ PrintAffirmations : OsvvmOptionsType := OPT_INIT_PARM_DETECT ;
+ PrintDisabledAlerts : OsvvmOptionsType := OPT_INIT_PARM_DETECT ;
+ PrintRequirements : OsvvmOptionsType := OPT_INIT_PARM_DETECT ;
+ PrintIfHaveRequirements : OsvvmOptionsType := OPT_INIT_PARM_DETECT ;
+ DefaultPassedGoal : integer := integer'left ;
+ 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 ;
+ IdSeparator : string := OSVVM_STRING_INIT_PARM_DETECT
+ ) ;
+
+ procedure ReportAlertLogOptions ;
+
+
+ -- synthesis translate_off
+
+ impure function GetAlertLogFailOnWarning return OsvvmOptionsType ;
+ impure function GetAlertLogFailOnDisabledErrors return OsvvmOptionsType ;
+ impure function GetAlertLogFailOnRequirementErrors return OsvvmOptionsType ;
+ impure function GetAlertLogReportHierarchy return OsvvmOptionsType ;
+ impure function GetAlertLogFoundReportHier return boolean ;
+ impure function GetAlertLogFoundAlertHier return boolean ;
+ impure function GetAlertLogWriteAlertErrorCount return OsvvmOptionsType ;
+ impure function GetAlertLogWriteAlertLevel return OsvvmOptionsType ;
+ impure function GetAlertLogWriteAlertName return OsvvmOptionsType ;
+ impure function GetAlertLogWriteAlertTime return OsvvmOptionsType ;
+ impure function GetAlertLogWriteLogErrorCount return OsvvmOptionsType ;
+ impure function GetAlertLogWriteLogLevel return OsvvmOptionsType ;
+ impure function GetAlertLogWriteLogName return OsvvmOptionsType ;
+ impure function GetAlertLogWriteLogTime return OsvvmOptionsType ;
+ impure function GetAlertLogPrintPassed return OsvvmOptionsType ;
+ impure function GetAlertLogPrintAffirmations return OsvvmOptionsType ;
+ impure function GetAlertLogPrintDisabledAlerts return OsvvmOptionsType ;
+ impure function GetAlertLogPrintRequirements return OsvvmOptionsType ;
+ impure function GetAlertLogPrintIfHaveRequirements return OsvvmOptionsType ;
+ impure function GetAlertLogDefaultPassedGoal return integer ;
+
+ 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 ;
+
+ ------------------------------------------------------------
+ -- MetaMatch
+ -- Similar to STD_MATCH, except
+ -- it returns TRUE for U=U, X=X, Z=Z, and W=W
+ -- All other values are consistent with STD_MATCH
+ -- MetaMatch, BooleanTableType, and MetaMatchTable are derivatives
+ -- of STD_MATCH from IEEE.Numeric_Std copyright by IEEE.
+ -- Numeric_Std is also released under the Apache License, Version 2.0.
+ -- Coding Styles were updated to match OSVVM
+ ------------------------------------------------------------
+ function MetaMatch (l, r : std_ulogic) return boolean ;
+ function MetaMatch (L, R : std_ulogic_vector) return boolean ;
+ function MetaMatch (L, R : unresolved_unsigned) return boolean ;
+ function MetaMatch (L, R : unresolved_signed) return boolean ;
+
+ ------------------------------------------------------------
+ -- Helper function for NewID in data structures
+ function ResolvePrintParent (
+ ------------------------------------------------------------
+ UniqueParent : boolean ;
+ PrintParent : AlertLogPrintParentType
+ ) return AlertLogPrintParentType ;
+
+
+ -- synthesis translate_on
+
+ -- ------------------------------------------------------------
+ -- Deprecated
+ --
+ -- See NewID - consistency and parameter update. DoNotReport replaced by ReportMode
+ impure function GetAlertLogID(Name : string; ParentID : AlertLogIDType := ALERTLOG_ID_NOT_ASSIGNED; CreateHierarchy : Boolean := TRUE; DoNotReport : Boolean := FALSE) return AlertLogIDType ;
+
+ alias IncAffirmCheckCount is IncAffirmCount [AlertLogIDType] ;
+ 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
+
+-- synthesis translate_off
+
+ -- 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 "
+
+ ------------------------------------------------------------
+ -- Package Local
+ 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 ;
+
+
+ type AlertLogStructPType is protected
+
+ ------------------------------------------------------------
+ procedure alert (
+ ------------------------------------------------------------
+ AlertLogID : AlertLogIDType ;
+ message : string ;
+ level : AlertType := ERROR
+ ) ;
+
+ ------------------------------------------------------------
+ procedure IncAlertCount ( AlertLogID : AlertLogIDType ; level : AlertType := ERROR ) ;
+ procedure SetJustify (
+ Enable : boolean := TRUE ;
+ AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID
+ ) ;
+ procedure ReportAlerts ( Name : string ; AlertCount : AlertCountType ) ;
+ procedure ReportRequirements ;
+ procedure ReportAlerts (
+ Name : string := OSVVM_STRING_INIT_PARM_DETECT ;
+ AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID ;
+ ExternalErrors : AlertCountType := (0,0,0) ;
+ ReportAll : boolean := FALSE ;
+ ReportWhenZero : boolean := TRUE
+ ) ;
+ procedure WriteTestSummary (
+ FileName : string ;
+ OpenKind : File_Open_Kind ;
+ Prefix : string ;
+ Suffix : string ;
+ ExternalErrors : AlertCountType ;
+ WriteFieldName : boolean
+ ) ;
+ procedure WriteTestSummaries ( FileName : string ; OpenKind : File_Open_Kind ) ;
+ procedure ReportTestSummaries ;
+ procedure WriteAlerts (
+ FileName : string ;
+ AlertLogID : AlertLogIDType ;
+ OpenKind : File_Open_Kind
+ ) ;
+ procedure WriteRequirements (
+ FileName : string ;
+ AlertLogID : AlertLogIDType ;
+ OpenKind : File_Open_Kind
+ ) ;
+ procedure ReadSpecification (FileName : string ; PassedGoal : integer ) ;
+ procedure ReadRequirements (
+ FileName : string ;
+ ThresholdPassed : boolean ;
+ TestSummary : boolean
+ ) ;
+ procedure ClearAlerts ;
+ procedure ClearAlertStopCounts ;
+ 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 NewID(
+ Name : string ;
+ ParentID : AlertLogIDType ;
+ ReportMode : AlertLogReportModeType ;
+ PrintParent : AlertLogPrintParentType ;
+ CreateHierarchy : boolean
+ ) return AlertLogIDType ;
+ -- impure function GetAlertLogID(Name : string; ParentID : AlertLogIDType; CreateHierarchy : Boolean; DoNotReport : Boolean) return AlertLogIDType ;
+ impure function GetReqID(Name : string ; PassedGoal : integer ; ParentID : AlertLogIDType ; CreateHierarchy : Boolean) return AlertLogIDType ;
+ procedure SetPassedGoal(AlertLogID : AlertLogIDType ; PassedGoal : integer ) ;
+ impure function GetAlertLogParentID(AlertLogID : AlertLogIDType) return AlertLogIDType ;
+ procedure Initialize(NewNumAlertLogIDs : AlertLogIDType := MIN_NUM_AL_IDS) ;
+ procedure DeallocateAlertLogStruct ;
+ procedure SetAlertLogPrefix(AlertLogID : AlertLogIDType; Name : string ) ;
+ procedure UnSetAlertLogPrefix(AlertLogID : AlertLogIDType) ;
+ impure function GetAlertLogPrefix(AlertLogID : AlertLogIDType) return string ;
+ procedure SetAlertLogSuffix(AlertLogID : AlertLogIDType; Name : string ) ;
+ procedure UnSetAlertLogSuffix(AlertLogID : AlertLogIDType) ;
+ impure function GetAlertLogSuffix(AlertLogID : AlertLogIDType) return string ;
+
+ ------------------------------------------------------------
+ ------------------------------------------------------------
+ -- Accessor Methods
+ ------------------------------------------------------------
+ procedure SetGlobalAlertEnable (A : boolean := TRUE) ;
+ impure function GetAlertLogName(AlertLogID : AlertLogIDType) return string ;
+ impure function GetGlobalAlertEnable return boolean ;
+ procedure IncAffirmCount(AlertLogID : AlertLogIDType) ;
+ impure function GetAffirmCount return natural ;
+ procedure IncAffirmPassedCount(AlertLogID : AlertLogIDType) ;
+ impure function GetAffirmPassedCount return natural ;
+
+ procedure SetAlertStopCount(AlertLogID : AlertLogIDType ; Level : AlertType ; Count : integer) ;
+ impure function GetAlertStopCount(AlertLogID : AlertLogIDType ; Level : AlertType) return integer ;
+
+ procedure SetAlertPrintCount(AlertLogID : AlertLogIDType ; Level : AlertType ; Count : integer) ;
+ impure function GetAlertPrintCount(AlertLogID : AlertLogIDType ; Level : AlertType) return integer ;
+
+ procedure SetAlertPrintCount(AlertLogID : AlertLogIDType ; Count : AlertCountType) ;
+ impure function GetAlertPrintCount(AlertLogID : AlertLogIDType) return AlertCountType ;
+
+ procedure SetAlertLogPrintParent(AlertLogID : AlertLogIDType ; PrintParent : AlertLogPrintParentType) ;
+ impure function GetAlertLogPrintParent(AlertLogID : AlertLogIDType) return AlertLogPrintParentType ;
+
+ procedure SetAlertLogReportMode(AlertLogID : AlertLogIDType ; ReportMode : AlertLogReportModeType) ;
+ impure function GetAlertLogReportMode(AlertLogID : AlertLogIDType) return AlertLogReportModeType ;
+
+ 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 : OsvvmOptionsType ;
+ FailOnDisabledErrors : OsvvmOptionsType ;
+ FailOnRequirementErrors : OsvvmOptionsType ;
+ ReportHierarchy : OsvvmOptionsType ;
+ WriteAlertErrorCount : OsvvmOptionsType ;
+ WriteAlertLevel : OsvvmOptionsType ;
+ WriteAlertName : OsvvmOptionsType ;
+ WriteAlertTime : OsvvmOptionsType ;
+ WriteLogErrorCount : OsvvmOptionsType ;
+ WriteLogLevel : OsvvmOptionsType ;
+ WriteLogName : OsvvmOptionsType ;
+ WriteLogTime : OsvvmOptionsType ;
+ PrintPassed : OsvvmOptionsType ;
+ PrintAffirmations : OsvvmOptionsType ;
+ PrintDisabledAlerts : OsvvmOptionsType ;
+ PrintRequirements : OsvvmOptionsType ;
+ PrintIfHaveRequirements : OsvvmOptionsType ;
+ DefaultPassedGoal : integer ;
+ AlertPrefix : string ;
+ LogPrefix : string ;
+ ReportPrefix : string ;
+ DoneName : string ;
+ PassName : string ;
+ FailName : string ;
+ IdSeparator : string
+ ) ;
+ procedure ReportAlertLogOptions ;
+
+ impure function GetAlertLogFailOnWarning return OsvvmOptionsType ;
+ impure function GetAlertLogFailOnDisabledErrors return OsvvmOptionsType ;
+ impure function GetAlertLogFailOnRequirementErrors return OsvvmOptionsType ;
+ impure function GetAlertLogReportHierarchy return OsvvmOptionsType ;
+ impure function GetAlertLogFoundReportHier return boolean ;
+ impure function GetAlertLogFoundAlertHier return boolean ;
+ impure function GetAlertLogWriteAlertErrorCount return OsvvmOptionsType ;
+ impure function GetAlertLogWriteAlertLevel return OsvvmOptionsType ;
+ impure function GetAlertLogWriteAlertName return OsvvmOptionsType ;
+ impure function GetAlertLogWriteAlertTime return OsvvmOptionsType ;
+ impure function GetAlertLogWriteLogErrorCount return OsvvmOptionsType ;
+ impure function GetAlertLogWriteLogLevel return OsvvmOptionsType ;
+ impure function GetAlertLogWriteLogName return OsvvmOptionsType ;
+ impure function GetAlertLogWriteLogTime return OsvvmOptionsType ;
+ impure function GetAlertLogPrintPassed return OsvvmOptionsType ;
+ impure function GetAlertLogPrintAffirmations return OsvvmOptionsType ;
+ impure function GetAlertLogPrintDisabledAlerts return OsvvmOptionsType ;
+ impure function GetAlertLogPrintRequirements return OsvvmOptionsType ;
+ impure function GetAlertLogPrintIfHaveRequirements return OsvvmOptionsType ;
+ impure function GetAlertLogDefaultPassedGoal return integer ;
+
+ 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 PassedCountVar : natural := 0 ;
+
+ variable ErrorCount : integer := 0 ;
+ variable AlertCount : AlertCountType := (0, 0, 0) ;
+
+ ------------------------------------------------------------
+ type AlertLogRecType is record
+ ------------------------------------------------------------
+ Name : Line ;
+ NameLower : Line ;
+ Prefix : Line ;
+ Suffix : Line ;
+ ParentID : AlertLogIDType ;
+ ParentIDSet : Boolean ;
+ SiblingID : AlertLogIDType ;
+ ChildID : AlertLogIDType ;
+ ChildIDLast : AlertLogIDType ;
+ AlertCount : AlertCountType ;
+ DisabledAlertCount : AlertCountType ;
+ PassedCount : Integer ;
+ AffirmCount : Integer ;
+ PassedGoal : Integer ;
+ PassedGoalSet : Boolean ;
+ AlertStopCount : AlertCountType ;
+ AlertPrintCount : AlertCountType ;
+ AlertEnabled : AlertEnableType ;
+ LogEnabled : LogEnableType ;
+ ReportMode : AlertLogReportModeType ;
+ PrintParent : AlertLogPrintParentType ;
+ -- Used only by ReadTestSummaries
+ TotalErrors : integer ;
+ AffirmPassedCount : integer ;
+-- IsRequirment : boolean ;
+ end record AlertLogRecType ;
+
+ ------------------------------------------------------------
+ -- Basis for AlertLog Data Structure
+ variable NumAlertLogIDsVar : AlertLogIDType := 0 ; -- defined by initialize
+ variable NumAllocatedAlertLogIDsVar : AlertLogIDType := 0 ;
+
+ 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 PrintPassedVar : boolean := TRUE ;
+ variable PrintAffirmationsVar : boolean := FALSE ;
+ variable PrintDisabledAlertsVar : boolean := FALSE ;
+ variable PrintRequirementsVar : boolean := FALSE ;
+ variable HasRequirementsVar : boolean := FALSE ;
+ variable PrintIfHaveRequirementsVar : boolean := TRUE ;
+
+ variable DefaultPassedGoalVar : integer := 1 ;
+
+ variable FailOnWarningVar : boolean := TRUE ;
+ variable FailOnDisabledErrorsVar : boolean := TRUE ;
+ variable FailOnRequirementErrorsVar : boolean := TRUE ;
+
+ variable ReportHierarchyVar : boolean := TRUE ;
+ variable FoundReportHierVar : boolean := FALSE ;
+ variable FoundAlertHierVar : boolean := FALSE ;
+
+ variable WriteAlertErrorCountVar : boolean := FALSE ;
+ variable WriteAlertLevelVar : boolean := TRUE ;
+ variable WriteAlertNameVar : boolean := TRUE ;
+ variable WriteAlertTimeVar : boolean := TRUE ;
+ variable WriteLogErrorCountVar : boolean := FALSE ;
+ 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 IdSeparatorVar : NamePType ;
+
+ variable AlertLogJustifyAmountVar : integer := 0 ;
+ variable ReportJustifyAmountVar : integer := 0 ;
+
+ ------------------------------------------------------------
+ -- PT Local
+ impure function VerifyID(
+ AlertLogID : AlertLogIDType ;
+ LowestID : AlertLogIDType := ALERTLOG_BASE_ID ;
+ InvalidID : AlertLogIDType := ALERTLOG_DEFAULT_ID
+ ) return AlertLogIDType is
+ ------------------------------------------------------------
+ begin
+ if AlertLogID < LowestID or AlertLogID > NumAlertLogIDsVar then
+ return InvalidID ;
+ else
+ return AlertLogID ;
+ end if ;
+ end function VerifyID ;
+
+ ------------------------------------------------------------
+ procedure IncAffirmCount(AlertLogID : AlertLogIDType) is
+ ------------------------------------------------------------
+ variable localAlertLogID : AlertLogIDType ;
+ begin
+ if GlobalAlertEnabledVar then
+ localAlertLogID := VerifyID(AlertLogID) ;
+ AlertLogPtr(localAlertLogID).AffirmCount := AlertLogPtr(localAlertLogID).AffirmCount + 1 ;
+ AffirmCheckCountVar := AffirmCheckCountVar + 1 ;
+ end if ;
+ end procedure IncAffirmCount ;
+
+ ------------------------------------------------------------
+ impure function GetAffirmCount return natural is
+ ------------------------------------------------------------
+ begin
+ return AffirmCheckCountVar ;
+ end function GetAffirmCount ;
+
+ ------------------------------------------------------------
+ procedure IncAffirmPassedCount(AlertLogID : AlertLogIDType) is
+ ------------------------------------------------------------
+ variable localAlertLogID : AlertLogIDType ;
+ begin
+ if GlobalAlertEnabledVar then
+ localAlertLogID := VerifyID(AlertLogID) ;
+ AlertLogPtr(localAlertLogID).PassedCount := AlertLogPtr(localAlertLogID).PassedCount + 1 ;
+ PassedCountVar := PassedCountVar + 1 ;
+ AlertLogPtr(localAlertLogID).AffirmCount := AlertLogPtr(localAlertLogID).AffirmCount + 1 ;
+ AffirmCheckCountVar := AffirmCheckCountVar + 1 ;
+ end if ;
+ end procedure IncAffirmPassedCount ;
+
+ ------------------------------------------------------------
+ impure function GetAffirmPassedCount return natural is
+ ------------------------------------------------------------
+ begin
+ return PassedCountVar ;
+ end function GetAffirmPassedCount ;
+
+ ------------------------------------------------------------
+ -- PT Local
+ procedure IncrementAlertCount(
+ ------------------------------------------------------------
+ constant AlertLogID : in AlertLogIDType ;
+ constant Level : in AlertType ;
+ variable StopDueToCount : inout boolean ;
+ variable IncrementByAmount : in integer := 1
+ ) is
+ begin
+ if AlertLogPtr(AlertLogID).AlertEnabled(Level) then
+ AlertLogPtr(AlertLogID).AlertCount(Level) := AlertLogPtr(AlertLogID).AlertCount(Level) + IncrementByAmount ;
+ -- 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, IncrementByAmount) ;
+ end if ;
+ else
+ -- Disabled, increment disabled count
+ AlertLogPtr(AlertLogID).DisabledAlertCount(Level) := AlertLogPtr(AlertLogID).DisabledAlertCount(Level) + IncrementByAmount ;
+ 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 ;
+ variable localAlertLogID : AlertLogIDType ;
+ variable ParentID : AlertLogIDType ;
+ begin
+ -- Only write and count when GlobalAlertEnabledVar is enabled
+ if GlobalAlertEnabledVar then
+ localAlertLogID := VerifyID(AlertLogID) ;
+ -- Write when Alert is Enabled
+ -- Always Count
+ IncrementAlertCount(localAlertLogID, Level, StopDueToCount) ;
+ AlertCount := AlertLogPtr(ALERTLOG_BASE_ID).AlertCount;
+ ErrorCount := SumAlertCount(AlertCount);
+ 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 ;
+ variable localAlertLogID : AlertLogIDType ;
+ begin
+ if GlobalAlertEnabledVar then
+ localAlertLogID := VerifyID(AlertLogID) ;
+ IncrementAlertCount(localAlertLogID, Level, StopDueToCount) ;
+ AlertCount := AlertLogPtr(ALERTLOG_BASE_ID).AlertCount;
+ ErrorCount := SumAlertCount(AlertCount);
+ end if ;
+ end procedure IncAlertCount ;
+
+ ------------------------------------------------------------
+ -- PT Local
+ impure function CalcJustify (AlertLogID : AlertLogIDType; CurrentLength : integer; IndentAmount : integer; IdSeparatorLength : integer) return integer_vector is
+ ------------------------------------------------------------
+ variable ResultValues, LowerLevelValues : integer_vector(1 to 2) ; -- 1 = Max, 2 = Indented
+ variable CurID, ParentID : AlertLogIDType ;
+ variable ParentNameLen : integer ;
+ begin
+ ResultValues(1) := CurrentLength + 1 ; -- AlertLogJustifyAmountVar
+ ResultValues(2) := CurrentLength + IndentAmount ; -- ReportJustifyAmountVar
+ if AlertLogPtr(AlertLogID).PrintParent = PRINT_NAME_AND_PARENT then
+ ParentID := AlertLogPtr(AlertLogID).ParentID ;
+ ParentNameLen := AlertLogPtr(ParentID).Name'length ;
+ ResultValues(1) := IdSeparatorLength + ParentNameLen + ResultValues(1) ; -- AlertLogJustifyAmountVar
+-- ResultValues(2) := IdSeparatorLength + ParentNameLen + ResultValues(2) ; -- ReportJustifyAmountVar
+ end if ;
+ CurID := AlertLogPtr(AlertLogID).ChildID ;
+ while CurID > ALERTLOG_BASE_ID loop
+ if CurID = REQUIREMENT_ALERTLOG_ID and HasRequirementsVar = FALSE then
+ CurID := AlertLogPtr(CurID).SiblingID ;
+ next ;
+ end if ;
+ LowerLevelValues := CalcJustify(CurID, AlertLogPtr(CurID).Name'length, IndentAmount + 2, IdSeparatorLength) ;
+ ResultValues(1) := maximum(ResultValues(1), LowerLevelValues(1)) ;
+ if AlertLogPtr(AlertLogID).ReportMode /= DISABLED then
+ ResultValues(2) := maximum(ResultValues(2), LowerLevelValues(2)) ;
+ end if ;
+ CurID := AlertLogPtr(CurID).SiblingID ;
+ end loop ;
+ return ResultValues ;
+ end function CalcJustify ;
+
+ ------------------------------------------------------------
+ procedure SetJustify (
+ ------------------------------------------------------------
+ Enable : boolean := TRUE ;
+ AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID
+ ) is
+ constant Separator : string := ResolveOsvvmIdSeparator(IdSeparatorVar.GetOpt) ;
+ begin
+ if Enable then
+ (AlertLogJustifyAmountVar, ReportJustifyAmountVar) := CalcJustify(AlertLogID, 0, 0, Separator'length) ;
+ else
+ AlertLogJustifyAmountVar := 0 ;
+ ReportJustifyAmountVar := 0 ;
+ end if;
+ end procedure SetJustify ;
+
+ ------------------------------------------------------------
+ impure function GetAlertCount(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return AlertCountType is
+ ------------------------------------------------------------
+ variable localAlertLogID : AlertLogIDType ;
+ begin
+ localAlertLogID := VerifyID(AlertLogID) ;
+ return AlertLogPtr(localAlertLogID).AlertCount ;
+ end function GetAlertCount ;
+
+ ------------------------------------------------------------
+ -- Local
+ impure function RemoveNonFailingWarnings(A : AlertCountType) return AlertCountType is
+ ------------------------------------------------------------
+ variable Count : AlertCountType ;
+ begin
+ Count := A ;
+ if not FailOnWarningVar then
+ Count(WARNING) := 0 ;
+ end if ;
+ return Count ;
+ end function RemoveNonFailingWarnings ;
+
+ ------------------------------------------------------------
+ impure function GetEnabledAlertCount(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return AlertCountType is
+ ------------------------------------------------------------
+ variable localAlertLogID : AlertLogIDType ;
+ variable Count : AlertCountType ;
+ begin
+ localAlertLogID := VerifyID(AlertLogID) ;
+ return RemoveNonFailingWarnings( AlertLogPtr(localAlertLogID).AlertCount ) ;
+ end function GetEnabledAlertCount ;
+
+
+ ------------------------------------------------------------
+ impure function GetDisabledAlertCount return AlertCountType is
+ ------------------------------------------------------------
+ variable Count : AlertCountType := (others => 0) ;
+ begin
+ for i in ALERTLOG_BASE_ID to NumAlertLogIDsVar loop
+ Count := Count + AlertLogPtr(i).DisabledAlertCount ;
+--? Should excluded warnings get counted as disabled errors?
+--? if not FailOnWarningVar then
+--? Count(WARNING) := Count(WARNING) + AlertLogPtr(i).AlertCount(WARNING) ;
+--? end if ;
+ end loop ;
+ return Count ;
+ end function GetDisabledAlertCount ;
+
+ ------------------------------------------------------------
+ impure function LocalGetDisabledAlertCount(AlertLogID: AlertLogIDType) return AlertCountType is
+ ------------------------------------------------------------
+ variable Count : AlertCountType ;
+ variable CurID : AlertLogIDType ;
+ begin
+ Count := AlertLogPtr(AlertLogID).DisabledAlertCount ;
+ -- Find Children of this ID
+ CurID := AlertLogPtr(AlertLogID).ChildID ;
+ while CurID > ALERTLOG_BASE_ID loop
+ Count := Count + LocalGetDisabledAlertCount(CurID) ; -- Recursively descend into children
+ CurID := AlertLogPtr(CurID).SiblingID ;
+ end loop ;
+ return Count ;
+ end function LocalGetDisabledAlertCount ;
+
+ ------------------------------------------------------------
+ impure function GetDisabledAlertCount(AlertLogID: AlertLogIDType) return AlertCountType is
+ ------------------------------------------------------------
+ variable localAlertLogID : AlertLogIDType ;
+ begin
+ localAlertLogID := VerifyID(AlertLogID) ;
+ return LocalGetDisabledAlertCount(localAlertLogID) ;
+ end function GetDisabledAlertCount ;
+
+ ------------------------------------------------------------
+ -- Local GetRequirementsCount
+ -- Each bin contains a separate requirement
+ -- RequirementsGoal = # of bins with PassedGoal > 0
+ -- RequirementsPassed = # bins with PassedGoal > 0 and PassedCount > PassedGoal
+ procedure GetRequirementsCount(
+ AlertLogID : AlertLogIDType;
+ RequirementsPassed : out integer ;
+ RequirementsGoal : out integer
+ ) is
+ ------------------------------------------------------------
+ variable ChildRequirementsPassed, ChildRequirementsGoal : integer ;
+ variable CurID : AlertLogIDType ;
+ begin
+ RequirementsPassed := 0 ;
+ RequirementsGoal := 0 ;
+ if AlertLogPtr(AlertLogID).PassedGoal > 0 then
+ RequirementsGoal := 1 ;
+ if AlertLogPtr(AlertLogID).PassedCount >= AlertLogPtr(AlertLogID).PassedGoal then
+ RequirementsPassed := 1 ;
+ end if ;
+ end if ;
+ -- Find Children of this ID
+ CurID := AlertLogPtr(AlertLogID).ChildID ;
+ while CurID > ALERTLOG_BASE_ID loop
+ GetRequirementsCount(CurID, ChildRequirementsPassed, ChildRequirementsGoal) ;
+ RequirementsPassed := RequirementsPassed + ChildRequirementsPassed ;
+ RequirementsGoal := RequirementsGoal + ChildRequirementsGoal ;
+ CurID := AlertLogPtr(CurID).SiblingID ;
+ end loop ;
+ end procedure GetRequirementsCount ;
+
+ ------------------------------------------------------------
+-- Only used at top level and superceded by variables PassedCountVar AffirmCheckCountVar
+ -- Local
+ procedure GetPassedAffirmCount(
+ AlertLogID : AlertLogIDType;
+ PassedCount : out integer ;
+ AffirmCount : out integer
+ ) is
+ ------------------------------------------------------------
+ variable ChildPassedCount, ChildAffirmCount : integer ;
+ variable CurID : AlertLogIDType ;
+ begin
+ PassedCount := AlertLogPtr(AlertLogID).PassedCount ;
+ AffirmCount := AlertLogPtr(AlertLogID).AffirmCount ;
+ -- Find Children of this ID
+ CurID := AlertLogPtr(AlertLogID).ChildID ;
+ while CurID > ALERTLOG_BASE_ID loop
+ GetPassedAffirmCount(CurID, ChildPassedCount, ChildAffirmCount) ;
+ PassedCount := PassedCount + ChildPassedCount ;
+ AffirmCount := AffirmCount + ChildAffirmCount ;
+ CurID := AlertLogPtr(CurID).SiblingID ;
+ end loop ;
+ end procedure GetPassedAffirmCount ;
+
+ ------------------------------------------------------------
+ -- Local
+ procedure CalcTopTotalErrors (
+ ------------------------------------------------------------
+ constant ExternalErrors : in AlertCountType ;
+ variable TotalErrors : out integer ;
+ variable TotalAlertCount : out AlertCountType ;
+ variable TotalRequirementsPassed : out integer ;
+ variable TotalRequirementsCount : out integer
+ ) is
+ variable DisabledAlertCount : AlertCountType ;
+ variable TotalAlertErrors, TotalDisabledAlertErrors : integer ;
+ variable TotalRequirementErrors : integer ;
+ begin
+ TotalAlertCount := AlertLogPtr(ALERTLOG_BASE_ID).AlertCount + ExternalErrors ;
+ TotalAlertErrors := SumAlertCount( RemoveNonFailingWarnings(TotalAlertCount)) ;
+ TotalErrors := TotalAlertErrors ;
+
+ DisabledAlertCount := GetDisabledAlertCount(ALERTLOG_BASE_ID) ;
+ TotalDisabledAlertErrors := SumAlertCount( RemoveNonFailingWarnings(DisabledAlertCount) ) ;
+ if FailOnDisabledErrorsVar then
+ TotalAlertCount := TotalAlertCount + DisabledAlertCount ;
+ TotalErrors := TotalErrors + TotalDisabledAlertErrors ;
+ end if ;
+
+ -- Perspective, 1 requirement per bin
+ GetRequirementsCount(ALERTLOG_BASE_ID, TotalRequirementsPassed, TotalRequirementsCount) ;
+ TotalRequirementErrors := TotalRequirementsCount - TotalRequirementsPassed ;
+ if FailOnRequirementErrorsVar then
+ TotalErrors := TotalErrors + TotalRequirementErrors ;
+ end if ;
+
+ -- Set AffirmCount for top level
+ AlertLogPtr(ALERTLOG_BASE_ID).PassedCount := PassedCountVar ;
+ AlertLogPtr(ALERTLOG_BASE_ID).AffirmCount := AffirmCheckCountVar ;
+ end procedure CalcTopTotalErrors ;
+
+ ------------------------------------------------------------
+ -- Local
+ impure function CalcTotalErrors (AlertLogID : AlertLogIDType) return integer is
+ ------------------------------------------------------------
+ variable TotalErrors : integer ;
+ variable TotalAlertCount, DisabledAlertCount : AlertCountType ;
+ variable TotalAlertErrors, TotalDisabledAlertErrors : integer ;
+ variable TotalRequirementErrors : integer ;
+ variable TotalRequirementsPassed, TotalRequirementsCount : integer ;
+ begin
+ TotalAlertCount := AlertLogPtr(AlertLogID).AlertCount ;
+ TotalAlertErrors := SumAlertCount( RemoveNonFailingWarnings(TotalAlertCount)) ;
+ TotalErrors := TotalAlertErrors ;
+
+ DisabledAlertCount := GetDisabledAlertCount(AlertLogID) ;
+ TotalDisabledAlertErrors := SumAlertCount( RemoveNonFailingWarnings(DisabledAlertCount) ) ;
+ if FailOnDisabledErrorsVar then
+ TotalErrors := TotalErrors + TotalDisabledAlertErrors ;
+ end if ;
+
+ -- Perspective, 1 requirement per bin
+ GetRequirementsCount(AlertLogID, TotalRequirementsPassed, TotalRequirementsCount) ;
+ TotalRequirementErrors := TotalRequirementsCount - TotalRequirementsPassed ;
+ if FailOnRequirementErrorsVar then
+ TotalErrors := TotalErrors + TotalRequirementErrors ;
+ end if ;
+
+ return TotalErrors ;
+ end function CalcTotalErrors ;
+
+ ------------------------------------------------------------
+ -- PT Local
+ procedure PrintTopAlerts (
+ ------------------------------------------------------------
+ AlertLogID : AlertLogIDType ;
+ Name : string ;
+ ExternalErrors : AlertCountType ;
+ variable HasDisabledAlerts : inout Boolean ;
+ variable TestFailed : inout Boolean
+ ) 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 ;
+ variable TotalErrors : integer ;
+ variable TotalAlertErrors, TotalDisabledAlertErrors : integer ;
+ variable TotalRequirementsPassed, TotalRequirementsGoal, TotalRequirementErrors : integer ;
+ variable AlertCountVar, DisabledAlertCount : AlertCountType ;
+ variable PassedCount, AffirmCheckCount : integer ;
+ begin
+--!!
+--!! Update to use CalcTopTotalErrors
+--!!
+ AlertCountVar := AlertLogPtr(AlertLogID).AlertCount + ExternalErrors ;
+ TotalAlertErrors := SumAlertCount( RemoveNonFailingWarnings(AlertCountVar)) ;
+
+ DisabledAlertCount := GetDisabledAlertCount(AlertLogID) ;
+ TotalDisabledAlertErrors := SumAlertCount( RemoveNonFailingWarnings(DisabledAlertCount) ) ;
+ HasDisabledAlerts := TotalDisabledAlertErrors /= 0 ;
+
+ GetRequirementsCount(AlertLogID, TotalRequirementsPassed, TotalRequirementsGoal) ;
+ TotalRequirementErrors := TotalRequirementsGoal - TotalRequirementsPassed ;
+
+ TotalErrors := TotalAlertErrors ;
+ if FailOnDisabledErrorsVar then
+ TotalErrors := TotalErrors + TotalDisabledAlertErrors ;
+ end if ;
+ if FailOnRequirementErrorsVar then
+ TotalErrors := TotalErrors + TotalRequirementErrors ;
+ end if ;
+
+ TestFailed := TotalErrors /= 0 ;
+
+ GetPassedAffirmCount(AlertLogID, PassedCount, AffirmCheckCount) ;
+
+ end procedure PrintTopAlerts ;
+
+ ------------------------------------------------------------
+ -- PT Local
+ procedure PrintOneChild(
+ ------------------------------------------------------------
+ AlertLogID : AlertLogIDType ;
+ Prefix : string ;
+ IndentAmount : integer ;
+ ReportWhenZero : boolean ;
+ HasErrors : boolean ;
+ HasDisabledErrors : boolean
+ ) is
+ variable buf : line ;
+ alias CurID : AlertLogIDType is AlertLogID ;
+ begin
+ end procedure PrintOneChild ;
+
+ ------------------------------------------------------------
+ -- PT Local
+ procedure IterateAndPrintChildren(
+ ------------------------------------------------------------
+ AlertLogID : AlertLogIDType ;
+ Prefix : string ;
+ IndentAmount : integer ;
+ ReportWhenZero : boolean ;
+ HasDisabledErrors : boolean
+ ) is
+ variable buf : line ;
+ variable CurID : AlertLogIDType ;
+ variable HasErrors : boolean ;
+ begin
+ CurID := AlertLogPtr(AlertLogID).ChildID ;
+ while CurID > ALERTLOG_BASE_ID loop
+ -- Don't print requirements if there no requirements
+ if CurID = REQUIREMENT_ALERTLOG_ID and HasRequirementsVar = FALSE then
+ CurID := AlertLogPtr(CurID).SiblingID ;
+ next ;
+ end if ;
+ HasErrors :=
+ (SumAlertCount(AlertLogPtr(CurID).AlertCount) > 0) or
+ (FailOnDisabledErrorsVar and (SumAlertCount(AlertLogPtr(CurID).DisabledAlertCount) > 0)) or
+ (FailOnRequirementErrorsVar and (AlertLogPtr(CurID).PassedCount < AlertLogPtr(CurID).PassedGoal)) ;
+
+ if AlertLogPtr(CurID).ReportMode = ENABLED or (AlertLogPtr(CurID).ReportMode = NONZERO and HasErrors) then
+ PrintOneChild(
+ AlertLogID => CurID,
+ Prefix => Prefix,
+ IndentAmount => IndentAmount,
+ ReportWhenZero => ReportWhenZero,
+ HasErrors => HasErrors,
+ HasDisabledErrors => HasDisabledErrors
+ ) ;
+ IterateAndPrintChildren(
+ AlertLogID => CurID,
+ Prefix => Prefix & " ",
+ IndentAmount => IndentAmount + 2,
+ ReportWhenZero => ReportWhenZero,
+ HasDisabledErrors => HasDisabledErrors
+ ) ;
+ end if ;
+ CurID := AlertLogPtr(CurID).SiblingID ;
+ end loop ;
+ end procedure IterateAndPrintChildren ;
+
+ ------------------------------------------------------------
+ procedure ReportAlerts (
+ Name : string := OSVVM_STRING_INIT_PARM_DETECT ;
+ AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID ;
+ ExternalErrors : AlertCountType := (0,0,0) ;
+ ReportAll : boolean := FALSE ;
+ ReportWhenZero : boolean := TRUE
+ ) is
+ ------------------------------------------------------------
+ variable TestFailed, HasDisabledErrors : boolean ;
+ -- constant ReportPrefix : string := ResolveOsvvmWritePrefix(ReportPrefixVar.GetOpt) ;
+ variable TurnedOnJustify : boolean := FALSE ;
+ variable localAlertLogID : AlertLogIDType ;
+ begin
+ localAlertLogID := VerifyID(AlertLogID) ;
+ if ReportJustifyAmountVar <= 0 then
+ TurnedOnJustify := TRUE ;
+ SetJustify ;
+ end if ;
+
+ if IsOsvvmStringSet(Name) then
+ PrintTopAlerts (
+ AlertLogID => localAlertLogID,
+ Name => Name,
+ ExternalErrors => ExternalErrors,
+ HasDisabledAlerts => HasDisabledErrors,
+ TestFailed => TestFailed
+ ) ;
+ else
+ PrintTopAlerts (
+ AlertLogID => localAlertLogID,
+ Name => AlertLogPtr(localAlertLogID).Name.all,
+ ExternalErrors => ExternalErrors,
+ HasDisabledAlerts => HasDisabledErrors,
+ TestFailed => TestFailed
+ ) ;
+ end if ;
+ --Print Hierarchy when enabled and test failed
+ if ReportAll or (FoundReportHierVar and ReportHierarchyVar and TestFailed) then
+ -- (NumErrors /= 0 or (NumDisabledErrors /=0 and FailOnDisabledErrorsVar)) then
+ IterateAndPrintChildren(
+ AlertLogID => localAlertLogID,
+-- Prefix => ReportPrefix & " ",
+ Prefix => ResolveOsvvmWritePrefix(ReportPrefixVar.GetOpt) & " ",
+ IndentAmount => 2,
+ ReportWhenZero => ReportAll or ReportWhenZero,
+ HasDisabledErrors => HasDisabledErrors -- NumDisabledErrors /= 0
+ ) ;
+ end if ;
+ if TurnedOnJustify then
+ -- Turn it back off
+ SetJustify(FALSE) ;
+ end if ;
+ end procedure ReportAlerts ;
+
+ ------------------------------------------------------------
+ procedure ReportRequirements is
+ ------------------------------------------------------------
+ variable TestFailed, HasDisabledErrors : boolean ;
+-- constant ReportPrefix : string := ResolveOsvvmWritePrefix(ReportPrefixVar.GetOpt) ;
+ variable TurnedOnJustify : boolean := FALSE ;
+ variable SavedPrintRequirementsVar : boolean ;
+ begin
+ SavedPrintRequirementsVar := PrintRequirementsVar ;
+ PrintRequirementsVar := TRUE ;
+
+ if ReportJustifyAmountVar <= 0 then
+ TurnedOnJustify := TRUE ;
+ SetJustify ;
+ end if ;
+ PrintTopAlerts (
+ AlertLogID => ALERTLOG_BASE_ID,
+ Name => AlertLogPtr(ALERTLOG_BASE_ID).Name.all,
+ ExternalErrors => (0,0,0),
+ HasDisabledAlerts => HasDisabledErrors,
+ TestFailed => TestFailed
+ ) ;
+ IterateAndPrintChildren(
+ AlertLogID => REQUIREMENT_ALERTLOG_ID,
+-- Prefix => ReportPrefix & " ",
+ Prefix => ResolveOsvvmWritePrefix(ReportPrefixVar.GetOpt) & " ",
+ IndentAmount => 2,
+ ReportWhenZero => TRUE,
+ HasDisabledErrors => HasDisabledErrors -- NumDisabledErrors /= 0
+ ) ;
+ if TurnedOnJustify then
+ -- Turn it back off
+ SetJustify(FALSE) ;
+ end if ;
+ PrintRequirementsVar := SavedPrintRequirementsVar ;
+ end procedure ReportRequirements ;
+
+ ------------------------------------------------------------
+ procedure ReportAlerts ( Name : string ; AlertCount : AlertCountType ) 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 ;
+ variable NumErrors : integer ;
+ begin
+ NumErrors := SumAlertCount(AlertCount) ;
+ end procedure ReportAlerts ;
+
+ ------------------------------------------------------------
+ -- PT Local
+ impure function IsRequirement(AlertLogID : AlertLogIDType) return boolean is
+ ------------------------------------------------------------
+ begin
+ if AlertLogID = REQUIREMENT_ALERTLOG_ID then
+ return TRUE ;
+ elsif AlertLogID <= ALERTLOG_BASE_ID then
+ return FALSE ;
+ else
+ return IsRequirement(AlertLogPtr(AlertLogID).ParentID) ;
+ end if ;
+ end function IsRequirement ;
+
+ ------------------------------------------------------------
+ -- pt local
+ procedure WriteOneTestSummary (
+ ------------------------------------------------------------
+ file TestFile : text ;
+ AlertLogID : AlertLogIDType ;
+ RequirementsGoal : integer ;
+ RequirementsPassed : integer ;
+ TotalErrors : integer ;
+ AlertCount : AlertCountType ;
+ AffirmCount : integer ;
+ PassedCount : integer ;
+ Delimiter : string ;
+ Prefix : string := "" ;
+ Suffix : string := "" ;
+ WriteFieldName : boolean := FALSE
+ ) is
+ variable buf : line ;
+ begin
+-- Should disabled errors be included here?
+-- In the previous step, we counted DisabledErrors as a regular error if FailOnDisabledErrorsVar (default TRUE)
+
+ Write(buf,
+ Prefix &
+ IfElse(WriteFieldName, "Status: " & IfElse(TotalErrors=0, "PASSED", "FAILED") & LF, "") &
+ IfElse(WriteFieldName, Prefix & "Results: {Name: ", "") &
+ AlertLogPtr(AlertLogID).Name.all & Delimiter &
+ IfElse(WriteFieldName, "RequirementsGoal: ", "") &
+ to_string( RequirementsGoal ) & Delimiter &
+ IfElse(WriteFieldName, "RequirementsPassed: ", "") &
+ to_string( RequirementsPassed ) & Delimiter &
+ IfElse(WriteFieldName, "TotalErrors: ", "") &
+ to_string( TotalErrors ) & Delimiter &
+ IfElse(WriteFieldName, "Failure: ", "") &
+ to_string( AlertCount(FAILURE) ) & Delimiter &
+ IfElse(WriteFieldName, "Error: ", "") &
+ to_string( AlertCount(ERROR) ) & Delimiter &
+ IfElse(WriteFieldName, "Warning: ", "") &
+ to_string( AlertCount(WARNING) ) & Delimiter &
+ IfElse(WriteFieldName, "AffirmCount: ", "") &
+ to_string( AffirmCount ) & Delimiter &
+ IfElse(WriteFieldName, "PassedCount: ", "") &
+ to_string( PassedCount ) &
+ IfElse(WriteFieldName, "}", "") &
+ Suffix
+ ) ;
+-- ## Write(buf,
+-- ## Prefix &
+-- ## IfElse(WriteFieldName, "Status: " & IfElse(TotalErrors=0, "PASSED", "FAILED") & Delimiter, "") &
+-- ## IfElse(WriteFieldName, "Name: ", "") &
+-- ## AlertLogPtr(AlertLogID).Name.all & Delimiter &
+-- ## IfElse(WriteFieldName, "RequirementsGoal: ", "") &
+-- ## to_string( RequirementsGoal ) & Delimiter &
+-- ## IfElse(WriteFieldName, "RequirementsPassed: ", "") &
+-- ## to_string( RequirementsPassed ) & Delimiter &
+-- ## IfElse(WriteFieldName, "TotalErrors: ", "") &
+-- ## to_string( TotalErrors ) & Delimiter &
+-- ## IfElse(WriteFieldName, "Failure: ", "") &
+-- ## to_string( AlertCount(FAILURE) ) & Delimiter &
+-- ## IfElse(WriteFieldName, "Error: ", "") &
+-- ## to_string( AlertCount(ERROR) ) & Delimiter &
+-- ## IfElse(WriteFieldName, "Warning: ", "") &
+-- ## to_string( AlertCount(WARNING) ) & Delimiter &
+-- ## IfElse(WriteFieldName, "AffirmCount: ", "") &
+-- ## to_string( AffirmCount ) & Delimiter &
+-- ## IfElse(WriteFieldName, "PassedCount: ", "") &
+-- ## to_string( PassedCount ) & Suffix
+-- ## ) ;
+
+
+ WriteLine(TestFile, buf) ;
+ end procedure WriteOneTestSummary ;
+
+ ------------------------------------------------------------
+ -- pt local
+ procedure WriteTestSummary (
+ ------------------------------------------------------------
+ file TestFile : text ;
+ Prefix : string := "" ;
+ Suffix : string := "" ;
+ ExternalErrors : AlertCountType := (0,0,0) ;
+ WriteFieldName : boolean := FALSE
+ ) is
+ -- Format: Action Count min1 max1 min2 max2
+ variable TotalErrors : integer ;
+ variable TotalAlertErrors, TotalDisabledAlertErrors : integer ;
+ variable TotalRequirementsPassed, TotalRequirementsGoal : integer ;
+ variable TotalRequirementErrors : integer ;
+ variable TotalAlertCount, DisabledAlertCount : AlertCountType ;
+ constant AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID ;
+ variable PassedCount, AffirmCount : integer ;
+ constant DELIMITER : string := ", " ;
+ begin
+--!!
+--!! Update to use CalcTopTotalErrors
+--!!
+ TotalAlertCount := AlertLogPtr(AlertLogID).AlertCount + ExternalErrors ;
+ TotalAlertErrors := SumAlertCount( RemoveNonFailingWarnings(TotalAlertCount)) ;
+
+ DisabledAlertCount := GetDisabledAlertCount(AlertLogID) ;
+ TotalDisabledAlertErrors := SumAlertCount( RemoveNonFailingWarnings(DisabledAlertCount) ) ;
+
+ GetRequirementsCount(AlertLogID, TotalRequirementsPassed, TotalRequirementsGoal) ;
+ TotalRequirementErrors := TotalRequirementsGoal - TotalRequirementsPassed ;
+
+ TotalErrors := TotalAlertErrors ;
+ if FailOnDisabledErrorsVar then
+ TotalErrors := TotalErrors + TotalDisabledAlertErrors ;
+ TotalAlertCount := TotalAlertCount + DisabledAlertCount ;
+ end if ;
+ if FailOnRequirementErrorsVar then
+ TotalErrors := TotalErrors + TotalRequirementErrors ;
+ end if ;
+
+ GetPassedAffirmCount(AlertLogID, PassedCount, AffirmCount) ;
+
+ WriteOneTestSummary(
+ TestFile => TestFile,
+ AlertLogID => AlertLogID,
+ RequirementsGoal => TotalRequirementsGoal,
+ RequirementsPassed => TotalRequirementsPassed,
+ TotalErrors => TotalErrors,
+ AlertCount => TotalAlertCount,
+ AffirmCount => AffirmCount,
+ PassedCount => PassedCount,
+ Delimiter => DELIMITER,
+ Prefix => Prefix,
+ Suffix => Suffix,
+ WriteFieldName => WriteFieldName
+ ) ;
+ end procedure WriteTestSummary ;
+
+ ------------------------------------------------------------
+ procedure WriteTestSummary (
+ ------------------------------------------------------------
+ FileName : string ;
+ OpenKind : File_Open_Kind ;
+ Prefix : string ;
+ Suffix : string ;
+ ExternalErrors : AlertCountType ;
+ WriteFieldName : boolean
+ ) is
+ -- Format: Action Count min1 max1 min2 max2
+ file TestFile : text open OpenKind is FileName ;
+ begin
+ WriteTestSummary(TestFile => TestFile, Prefix => Prefix, Suffix => Suffix, ExternalErrors => ExternalErrors, WriteFieldName => WriteFieldName) ;
+ end procedure WriteTestSummary ;
+
+ ------------------------------------------------------------
+ procedure WriteTestSummaries ( -- PT Local
+ ------------------------------------------------------------
+ file TestFile : text ;
+ AlertLogID : AlertLogIDType
+ ) is
+ variable CurID : AlertLogIDType ;
+ variable TotalErrors, RequirementsGoal, RequirementsPassed : integer ;
+ begin
+ -- Descend from WriteRequirements
+ CurID := AlertLogPtr(AlertLogID).ChildID ;
+ while CurID > ALERTLOG_BASE_ID loop
+ TotalErrors := AlertLogPtr(CurID).TotalErrors ;
+ RequirementsGoal := AlertLogPtr(CurID).PassedGoal ;
+ RequirementsPassed := AlertLogPtr(CurID).PassedCount ;
+ if AlertLogPtr(CurID).AffirmCount <= 0 and FailOnRequirementErrorsVar and
+ (RequirementsGoal > RequirementsPassed) then
+ -- Add errors for tests that did not run.
+ TotalErrors := RequirementsGoal - RequirementsPassed ;
+ end if ;
+ WriteOneTestSummary(
+ TestFile => TestFile,
+ AlertLogID => CurID,
+ RequirementsGoal => RequirementsGoal,
+ RequirementsPassed => RequirementsPassed,
+ TotalErrors => TotalErrors,
+ AlertCount => AlertLogPtr(CurID).AlertCount,
+ AffirmCount => AlertLogPtr(CurID).AffirmCount,
+ PassedCount => AlertLogPtr(CurID).AffirmPassedCount,
+ Delimiter => ","
+ ) ;
+ WriteTestSummaries(TestFile, CurID) ;
+ CurID := AlertLogPtr(CurID).SiblingID ;
+ end loop ;
+ end procedure WriteTestSummaries ;
+
+ ------------------------------------------------------------
+ procedure WriteTestSummaries (
+ ------------------------------------------------------------
+ FileName : string ;
+ OpenKind : File_Open_Kind
+ ) is
+ -- Format: Action Count min1 max1 min2 max2
+ file TestFile : text open OpenKind is FileName ;
+ begin
+ WriteTestSummaries(
+ TestFile => TestFile,
+ AlertLogID => REQUIREMENT_ALERTLOG_ID
+ ) ;
+ end procedure WriteTestSummaries ;
+
+ ------------------------------------------------------------
+ procedure ReportOneTestSummary ( -- PT Local
+ ------------------------------------------------------------
+ AlertLogID : AlertLogIDType ;
+ RequirementsGoal : integer ;
+ RequirementsPassed : integer ;
+ TotalErrors : integer ;
+ AlertCount : AlertCountType ;
+ AffirmCount : integer ;
+ PassedCount : integer ;
+ Delimiter : string
+ ) is
+ variable buf : line ;
+ -- constant ReportPrefix : string := ResolveOsvvmWritePrefix(ReportPrefixVar.GetOpt ) ;
+ -- constant PassName : string := ResolveOsvvmPassName(PassNameVar.GetOpt ) ;
+ -- constant FailName : string := ResolveOsvvmFailName(FailNameVar.GetOpt ) ;
+ begin
+ end procedure ReportOneTestSummary ;
+
+ ------------------------------------------------------------
+ procedure ReportTestSummaries ( -- PT Local
+ ------------------------------------------------------------
+ AlertLogID : AlertLogIDType
+ ) is
+ variable CurID : AlertLogIDType ;
+ variable TotalErrors, RequirementsGoal, RequirementsPassed : integer ;
+ begin
+ CurID := AlertLogPtr(AlertLogID).ChildID ;
+ while CurID > ALERTLOG_BASE_ID loop
+ TotalErrors := AlertLogPtr(CurID).TotalErrors ;
+ RequirementsGoal := AlertLogPtr(CurID).PassedGoal ;
+ RequirementsPassed := AlertLogPtr(CurID).PassedCount ;
+ if AlertLogPtr(CurID).AffirmCount <= 0 and FailOnRequirementErrorsVar and
+ (RequirementsGoal > RequirementsPassed) then
+ -- Add errors for tests that did not run.
+ TotalErrors := RequirementsGoal - RequirementsPassed ;
+ end if ;
+ ReportOneTestSummary(
+ AlertLogID => CurID,
+ RequirementsGoal => RequirementsGoal,
+ RequirementsPassed => RequirementsPassed,
+ TotalErrors => TotalErrors,
+ AlertCount => AlertLogPtr(CurID).AlertCount,
+ AffirmCount => AlertLogPtr(CurID).AffirmCount,
+ PassedCount => AlertLogPtr(CurID).AffirmPassedCount,
+ Delimiter => ","
+ ) ;
+ ReportTestSummaries(
+ AlertLogID => CurID
+ ) ;
+ CurID := AlertLogPtr(CurID).SiblingID ;
+ end loop ;
+ end procedure ReportTestSummaries ;
+
+
+ ------------------------------------------------------------
+ procedure ReportTestSummaries is
+ ------------------------------------------------------------
+ variable IgnoredValue, OldReportJustifyAmount : integer ;
+ constant Separator : string := ResolveOsvvmIdSeparator(IdSeparatorVar.GetOpt) ;
+ begin
+ OldReportJustifyAmount := ReportJustifyAmountVar ;
+ (IgnoredValue, ReportJustifyAmountVar) := CalcJustify(REQUIREMENT_ALERTLOG_ID, 0, 0, Separator'length) ;
+
+ ReportTestSummaries(AlertLogID => REQUIREMENT_ALERTLOG_ID) ;
+ ReportJustifyAmountVar := OldReportJustifyAmount ;
+ end procedure ReportTestSummaries ;
+
+ ------------------------------------------------------------
+ -- pt local
+ procedure WriteAlerts ( -- pt local
+ file AlertsFile : text ;
+ AlertLogID : AlertLogIDType
+ ) is
+ ------------------------------------------------------------
+ -- Format: Name, PassedGoal, #Passed, #TotalErrors, FAILURE, ERROR, WARNING, Affirmations
+ variable buf : line ;
+ variable AlertCountVar : AlertCountType ;
+ constant DELIMITER : character := ',' ;
+ variable CurID : AlertLogIDType ;
+ begin
+ CurID := AlertLogPtr(AlertLogID).ChildID ;
+ while CurID > ALERTLOG_BASE_ID loop
+ write(buf, AlertLogPtr(CurID).Name.all) ;
+ write(buf, DELIMITER & to_string(AlertLogPtr(CurID).PassedGoal)) ;
+ -- Handling for PassedCount > PassedGoal done in ReadRequirements
+ write(buf, DELIMITER & to_string(AlertLogPtr(CurID).PassedCount)) ;
+ AlertCountVar := AlertLogPtr(CurID).AlertCount ;
+ if FailOnDisabledErrorsVar then
+ AlertCountVar := AlertCountVar + AlertLogPtr(CurID).DisabledAlertCount ;
+ end if;
+ -- TotalErrors
+ write(buf, DELIMITER & to_string( SumAlertCount(RemoveNonFailingWarnings(AlertCountVar)))) ;
+ write(buf, DELIMITER & to_string( AlertCountVar(FAILURE) )) ;
+ write(buf, DELIMITER & to_string( AlertCountVar(ERROR) )) ;
+ write(buf, DELIMITER & to_string( AlertCountVar(WARNING) )) ;
+ write(buf, DELIMITER & to_string( AlertLogPtr(CurID).AffirmCount )) ;
+-- write(buf, DELIMITER & to_string(AlertLogPtr(CurID).PassedCount)) ; -- redundancy intentional, for reading WriteTestSummary
+ WriteLine(AlertsFile, buf) ;
+ WriteAlerts(AlertsFile, CurID) ;
+ CurID := AlertLogPtr(CurID).SiblingID ;
+ end loop ;
+ end procedure WriteAlerts ;
+
+ ------------------------------------------------------------
+ procedure WriteRequirements (
+ ------------------------------------------------------------
+ FileName : string ;
+ AlertLogID : AlertLogIDType ;
+ OpenKind : File_Open_Kind
+ ) is
+ begin
+ end procedure WriteRequirements ;
+
+ ------------------------------------------------------------
+ procedure WriteAlerts (
+ ------------------------------------------------------------
+ FileName : string ;
+ AlertLogID : AlertLogIDType ;
+ OpenKind : File_Open_Kind
+ ) is
+ -- Format: Action Count min1 max1 min2 max2
+ file AlertsFile : text open OpenKind is FileName ;
+ variable LocalAlertLogID : AlertLogIDType ;
+ begin
+ localAlertLogID := VerifyID(AlertLogID) ;
+ WriteTestSummary(AlertsFile) ;
+ WriteAlerts(AlertsFile, localAlertLogID) ;
+ end procedure WriteAlerts ;
+
+ ------------------------------------------------------------
+ procedure ReadSpecification (file SpecificationFile : text ; PassedGoalIn : integer ) is -- PT Local
+ ------------------------------------------------------------
+ variable buf,Name,Description : line ;
+ variable ReadValid : boolean ;
+ variable Empty : boolean ;
+ variable MultiLineComment : boolean := FALSE ;
+ variable PassedGoal : integer ;
+ variable PassedGoalSet : boolean ;
+ variable Char : character ;
+ constant DELIMITER : character := ',' ;
+ variable AlertLogID : AlertLogIDType ;
+ begin
+ end procedure ReadSpecification ;
+
+ ------------------------------------------------------------
+ procedure ReadSpecification (FileName : string ; PassedGoal : integer ) is
+ ------------------------------------------------------------
+ -- Format: Action Count min1 max1 min2 max2
+ file SpecificationFile : text open READ_MODE is FileName ;
+ begin
+ ReadSpecification(SpecificationFile, PassedGoal) ;
+ end procedure ReadSpecification ;
+
+ ------------------------------------------------------------
+ -- PT Local
+ procedure ReadRequirements ( -- PT Local
+ file RequirementsFile : text ;
+ ThresholdPassed : boolean ;
+ TestSummary : boolean
+ ) is
+ begin
+ end procedure ReadRequirements ;
+
+ ------------------------------------------------------------
+ procedure ReadRequirements (
+ FileName : string ;
+ ThresholdPassed : boolean ;
+ TestSummary : boolean
+ ) is
+ ------------------------------------------------------------
+ -- Format: Action Count min1 max1 min2 max2
+ file RequirementsFile : text open READ_MODE is FileName ;
+ begin
+ ReadRequirements(RequirementsFile, ThresholdPassed, TestSummary) ;
+ end procedure ReadRequirements ;
+
+ ------------------------------------------------------------
+ procedure ClearAlerts is
+ ------------------------------------------------------------
+ begin
+ AffirmCheckCountVar := 0 ;
+ PassedCountVar := 0 ;
+ AlertCount := (0, 0, 0) ;
+ ErrorCount := 0 ;
+
+ for i in ALERTLOG_BASE_ID to NumAlertLogIDsVar loop
+ AlertLogPtr(i).AlertCount := (0, 0, 0) ;
+ AlertLogPtr(i).DisabledAlertCount := (0, 0, 0) ;
+ AlertLogPtr(i).AffirmCount := 0 ;
+ AlertLogPtr(i).PassedCount := 0 ;
+ AlertLogPtr(i).PassedGoal := 0 ;
+ end loop ;
+ end procedure ClearAlerts ;
+
+ ------------------------------------------------------------
+ procedure ClearAlertStopCounts is
+ ------------------------------------------------------------
+ begin
+ 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).AlertStopCount := (FAILURE => integer'right, ERROR => integer'right, WARNING => integer'right) ;
+ end loop ;
+ end procedure ClearAlertStopCounts ;
+
+ ------------------------------------------------------------
+ -- PT Local
+ procedure LocalLog (
+ ------------------------------------------------------------
+ AlertLogID : AlertLogIDType ;
+ Message : string ;
+ Level : LogType
+ ) is
+ variable buf : line ;
+ variable ParentID : AlertLogIDType ;
+ -- constant LogPrefix : string := LogPrefixVar.Get(OSVVM_DEFAULT_LOG_PREFIX) ;
+ begin
+ end procedure LocalLog ;
+
+ ------------------------------------------------------------
+ procedure log (
+ ------------------------------------------------------------
+ AlertLogID : AlertLogIDType ;
+ Message : string ;
+ Level : LogType := ALWAYS ;
+ Enable : boolean := FALSE -- override internal enable
+ ) is
+ variable localAlertLogID : AlertLogIDType ;
+ begin
+ localAlertLogID := VerifyID(AlertLogID) ;
+ if Level = ALWAYS or Enable then
+ LocalLog(localAlertLogID, Message, Level) ;
+ elsif AlertLogPtr(localAlertLogID).LogEnabled(Level) then
+ LocalLog(localAlertLogID, Message, Level) ;
+ end if ;
+ if Level = PASSED then
+ IncAffirmPassedCount(AlertLogID) ; -- count the passed and affirmation
+ 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) ;
+ AlertLogPtr(ALERTLOG_BASE_ID).NameLower := new string'(to_lower(NAME)) ;
+ end procedure SetAlertLogName ;
+
+ ------------------------------------------------------------
+ impure function GetAlertLogName(AlertLogID : AlertLogIDType) return string is
+ ------------------------------------------------------------
+ variable localAlertLogID : AlertLogIDType ;
+ begin
+ localAlertLogID := VerifyID(AlertLogID) ;
+ return AlertLogPtr(localAlertLogID).Name.all ;
+ end function GetAlertLogName ;
+
+ ------------------------------------------------------------
+ -- PT Local
+ procedure DeQueueID(AlertLogID : AlertLogIDType) is
+ ------------------------------------------------------------
+ variable ParentID, CurID : AlertLogIDType ;
+ begin
+ ParentID := AlertLogPtr(AlertLogID).ParentID ;
+ CurID := AlertLogPtr(ParentID).ChildID ;
+
+ -- Found at top of list
+ if AlertLogPtr(ParentID).ChildID = AlertLogID then
+ AlertLogPtr(ParentID).ChildID := AlertLogPtr(AlertLogID).SiblingID ;
+ else
+ -- Find among Siblings
+ loop
+ if AlertLogPtr(CurID).SiblingID = AlertLogID then
+ AlertLogPtr(CurID).SiblingID := AlertLogPtr(AlertLogID).SiblingID ;
+ exit ;
+ end if ;
+ if AlertLogPtr(CurID).SiblingID <= ALERTLOG_BASE_ID then
+ exit ;
+ end if ;
+ CurID := AlertLogPtr(CurID).SiblingID ;
+ end loop ;
+ end if ;
+ end procedure DeQueueID ;
+
+ ------------------------------------------------------------
+ -- PT Local
+ procedure EnQueueID(AlertLogID, ParentID : AlertLogIDType ; ParentIDSet : boolean := TRUE) is
+ ------------------------------------------------------------
+ variable CurID : AlertLogIDType ;
+ begin
+ AlertLogPtr(AlertLogID).ParentIDSet := ParentIDSet ;
+ AlertLogPtr(AlertLogID).ParentID := ParentID ;
+ AlertLogPtr(AlertLogID).SiblingID := ALERTLOG_ID_NOT_ASSIGNED ;
+
+ if AlertLogPtr(ParentID).ChildID < ALERTLOG_BASE_ID then
+ AlertLogPtr(ParentID).ChildID := AlertLogID ;
+ else
+ CurID := AlertLogPtr(ParentID).ChildIDLast ;
+ AlertLogPtr(CurID).SiblingID := AlertLogID ;
+ end if ;
+ AlertLogPtr(ParentID).ChildIDLast := AlertLogID ;
+ end procedure EnQueueID ;
+
+ ------------------------------------------------------------
+ -- PT Local
+ procedure NewAlertLogRec(AlertLogID : AlertLogIDType ; iName : string ; ParentID : AlertLogIDType; ReportMode : AlertLogReportModeType := ENABLED; PrintParent : AlertLogPrintParentType := PRINT_NAME_AND_PARENT) is
+ ------------------------------------------------------------
+ variable AlertEnabled : AlertEnableType ;
+ variable AlertStopCount : AlertCountType ;
+ variable LogEnabled : LogEnableType ;
+ begin
+ AlertLogPtr(AlertLogID) := new AlertLogRecType ;
+ if AlertLogID = ALERTLOG_BASE_ID then
+ AlertEnabled := (TRUE, TRUE, TRUE) ;
+ LogEnabled := (others => FALSE) ;
+ AlertStopCount := (FAILURE => 0, ERROR => integer'right, WARNING => integer'right) ;
+ EnQueueID(AlertLogID, ALERTLOG_BASE_ID, TRUE) ;
+ else
+ if ParentID < ALERTLOG_BASE_ID then
+ AlertEnabled := AlertLogPtr(ALERTLOG_BASE_ID).AlertEnabled ;
+ LogEnabled := AlertLogPtr(ALERTLOG_BASE_ID).LogEnabled ;
+ EnQueueID(AlertLogID, ALERTLOG_BASE_ID, FALSE) ;
+ else
+ AlertEnabled := AlertLogPtr(ParentID).AlertEnabled ;
+ LogEnabled := AlertLogPtr(ParentID).LogEnabled ;
+ EnQueueID(AlertLogID, ParentID, TRUE) ;
+ end if ;
+ AlertStopCount := (FAILURE | ERROR | WARNING => integer'right) ;
+ end if ;
+ AlertLogPtr(AlertLogID).Name := new string'(iName) ;
+ AlertLogPtr(AlertLogID).NameLower := new string'(to_lower(iName)) ;
+ AlertLogPtr(AlertLogID).AlertCount := (0, 0, 0) ;
+ AlertLogPtr(AlertLogID).DisabledAlertCount := (0, 0, 0) ;
+ AlertLogPtr(AlertLogID).AffirmCount := 0 ;
+ AlertLogPtr(AlertLogID).PassedCount := 0 ;
+ AlertLogPtr(AlertLogID).PassedGoal := 0 ;
+ AlertLogPtr(AlertLogID).AlertEnabled := AlertEnabled ;
+ AlertLogPtr(AlertLogID).AlertStopCount := AlertStopCount ;
+ AlertLogPtr(AlertLogID).AlertPrintCount := (FAILURE | ERROR | WARNING => integer'right) ;
+ AlertLogPtr(AlertLogID).LogEnabled := LogEnabled ;
+ AlertLogPtr(AlertLogID).ReportMode := ReportMode ;
+ -- Update PrintParent
+ if ParentID > ALERTLOG_BASE_ID then
+ AlertLogPtr(AlertLogID).PrintParent := PrintParent ;
+ else
+ AlertLogPtr(AlertLogID).PrintParent := PRINT_NAME ;
+ end if ;
+
+ -- Set ChildID, ChildIDLast, SiblingID to ALERTLOG_ID_NOT_ASSIGNED
+ AlertLogPtr(AlertLogID).SiblingID := ALERTLOG_ID_NOT_ASSIGNED ;
+ AlertLogPtr(AlertLogID).ChildID := ALERTLOG_ID_NOT_ASSIGNED ;
+ AlertLogPtr(AlertLogID).ChildIDLast := ALERTLOG_ID_NOT_ASSIGNED ;
+ AlertLogPtr(AlertLogID).TotalErrors := 0 ;
+ AlertLogPtr(AlertLogID).AffirmPassedCount := 0 ;
+ 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
+ NewAlertLogRec(ALERTLOG_BASE_ID, "AlertLogTop", ALERTLOG_BASE_ID) ;
+ -- 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 REQUIREMENT_ALERTLOG_ID /= ALERT_DEFAULT_ID then
+ NewAlertLogRec(REQUIREMENT_ALERTLOG_ID, "Requirements", 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 DeallocateAlertLogStruct 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
+ PrintPassedVar := TRUE ;
+ PrintAffirmationsVar := FALSE ;
+ PrintDisabledAlertsVar := FALSE ;
+ PrintRequirementsVar := FALSE ;
+ PrintIfHaveRequirementsVar := TRUE ;
+ DefaultPassedGoalVar := 1 ;
+ NumAlertLogIDsVar := 0 ;
+ NumAllocatedAlertLogIDsVar := 0 ;
+ GlobalAlertEnabledVar := TRUE ; -- Allows turn off and on
+ AffirmCheckCountVar := 0 ;
+ PassedCountVar := 0 ;
+ FailOnWarningVar := TRUE ;
+ FailOnDisabledErrorsVar := TRUE ;
+ FailOnRequirementErrorsVar := TRUE ;
+ ReportHierarchyVar := TRUE ;
+ FoundReportHierVar := FALSE ;
+ FoundAlertHierVar := FALSE ;
+ WriteAlertErrorCountVar := FALSE ;
+ WriteAlertLevelVar := TRUE ;
+ WriteAlertNameVar := TRUE ;
+ WriteAlertTimeVar := TRUE ;
+ WriteLogErrorCountVar := FALSE ;
+ WriteLogLevelVar := TRUE ;
+ WriteLogNameVar := TRUE ;
+ WriteLogTimeVar := TRUE ;
+ end procedure DeallocateAlertLogStruct ;
+
+ ------------------------------------------------------------
+ -- 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 in 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
+ ------------------------------------------------------------
+ constant NameLower : string := to_lower(Name) ;
+ begin
+ for i in ALERTLOG_BASE_ID+1 to NumAlertLogIDsVar loop
+ if NameLower = AlertLogPtr(i).NameLower.all then
+ return i ;
+ end if ;
+ end loop ;
+ return ALERTLOG_ID_NOT_FOUND ; -- not found
+ end function FindAlertLogID ;
+
+ ------------------------------------------------------------
+ -- PT Local
+ impure function LocalFindAlertLogID(Name : string ; ParentID : AlertLogIDType) return AlertLogIDType is
+ ------------------------------------------------------------
+ constant NameLower : string := to_lower(Name) ;
+ begin
+ if ParentID = ALERTLOG_ID_NOT_ASSIGNED then
+ return FindAlertLogID(Name) ;
+ else
+ for i in ALERTLOG_BASE_ID+1 to NumAlertLogIDsVar loop
+ if NameLower = AlertLogPtr(i).NameLower.all and
+ (AlertLogPtr(i).ParentID = ParentID or AlertLogPtr(i).ParentIDSet = FALSE)
+ then
+ return i ;
+ end if ;
+ end loop ;
+ return ALERTLOG_ID_NOT_FOUND ; -- not found
+ end if ;
+ end function LocalFindAlertLogID ;
+
+ ------------------------------------------------------------
+ impure function FindAlertLogID(Name : string ; ParentID : AlertLogIDType) return AlertLogIDType is
+ ------------------------------------------------------------
+ variable localParentID : AlertLogIDType ;
+ begin
+ localParentID := VerifyID(ParentID, ALERTLOG_ID_NOT_ASSIGNED) ;
+ return LocalFindAlertLogID(Name, localParentID) ;
+ end function FindAlertLogID ;
+
+ ------------------------------------------------------------
+ -- PT Local
+ procedure AdjustID(AlertLogID, ParentID : AlertLogIDType ; ParentIDSet : boolean := TRUE) is
+ ------------------------------------------------------------
+ begin
+ if IsRequirement(AlertLogID) and not IsRequirement(ParentID) then
+ Alert(AlertLogID, "GetAlertLogID/GetReqID: Parent of a Requirement must be a Requirement") ;
+ else
+ if ParentID /= AlertLogPtr(AlertLogID).ParentID then
+ DeQueueID(AlertLogID) ;
+ EnQueueID(AlertLogID, ParentID, ParentIDSet) ;
+ else
+ AlertLogPtr(AlertLogID).ParentIDSet := ParentIDSet ;
+ end if ;
+ end if ;
+ end procedure AdjustID ;
+
+ ------------------------------------------------------------
+ impure function NewID(
+ Name : string ;
+ ParentID : AlertLogIDType ;
+ ReportMode : AlertLogReportModeType ;
+ PrintParent : AlertLogPrintParentType ;
+ CreateHierarchy : boolean
+ ) return AlertLogIDType is
+ -- impure function GetAlertLogID(Name : string; ParentID : AlertLogIDType; CreateHierarchy : Boolean; DoNotReport : Boolean) return AlertLogIDType is
+ ------------------------------------------------------------
+ variable ResultID : AlertLogIDType ;
+ variable localParentID : AlertLogIDType ;
+ begin
+ localParentID := VerifyID(ParentID, ALERTLOG_ID_NOT_ASSIGNED, ALERTLOG_ID_NOT_ASSIGNED) ;
+ ResultID := LocalFindAlertLogID(Name, localParentID) ;
+ if ResultID = ALERTLOG_ID_NOT_FOUND then
+ -- Create a new ID
+ ResultID := GetNextAlertLogID ;
+ NewAlertLogRec(ResultID, Name, localParentID, ReportMode, PrintParent) ;
+ FoundAlertHierVar := TRUE ;
+ if CreateHierarchy then
+ FoundReportHierVar := TRUE ;
+ end if ;
+ AlertLogPtr(ResultID).PassedGoal := 0 ;
+ AlertLogPtr(ResultID).PassedGoalSet := FALSE ;
+ else
+ -- Found existing ID. Update it.
+ if AlertLogPtr(ResultID).ParentIDSet = FALSE then
+ if localParentID /= ALERTLOG_ID_NOT_ASSIGNED then
+ -- Update ParentID and potentially relocate in the structure
+ AdjustID(ResultID, localParentID, TRUE) ;
+ -- Update PrintParent
+ if localParentID /= ALERTLOG_BASE_ID then
+ AlertLogPtr(ResultID).PrintParent := PrintParent ;
+ else
+ AlertLogPtr(ResultID).PrintParent := PRINT_NAME ;
+ end if ;
+ -- else -- do not update as ParentIDs are either same or input localParentID = ALERTLOG_ID_NOT_ASSIGNED
+ end if ;
+ end if ;
+ end if ;
+ return ResultID ;
+ end function NewID ;
+
+ ------------------------------------------------------------
+ impure function GetReqID(Name : string ; PassedGoal : integer ; ParentID : AlertLogIDType ; CreateHierarchy : Boolean) return AlertLogIDType is
+ ------------------------------------------------------------
+ variable ResultID : AlertLogIDType ;
+ variable localParentID : AlertLogIDType ;
+ begin
+ HasRequirementsVar := TRUE ;
+ localParentID := VerifyID(ParentID, ALERTLOG_ID_NOT_ASSIGNED, ALERTLOG_ID_NOT_ASSIGNED) ;
+ ResultID := LocalFindAlertLogID(Name, localParentID) ;
+ if ResultID = ALERTLOG_ID_NOT_FOUND then
+ -- Create a new ID
+ ResultID := GetNextAlertLogID ;
+ if localParentID = ALERTLOG_ID_NOT_ASSIGNED then
+ NewAlertLogRec(ResultID, Name, REQUIREMENT_ALERTLOG_ID, ENABLED, PRINT_NAME) ;
+ AlertLogPtr(ResultID).ParentIDSet := FALSE ;
+ else
+ -- May want just PRINT_NAME here as PRINT_NAME_AND_PARENT is not backward compatible
+-- NewAlertLogRec(ResultID, Name, localParentID, ENABLED, PRINT_NAME_AND_PARENT) ;
+ NewAlertLogRec(ResultID, Name, localParentID, ENABLED, PRINT_NAME) ;
+ end if ;
+ FoundAlertHierVar := TRUE ;
+ if CreateHierarchy then
+ FoundReportHierVar := TRUE ;
+ end if ;
+ if PassedGoal >= 0 then
+ AlertLogPtr(ResultID).PassedGoal := PassedGoal ;
+ AlertLogPtr(ResultID).PassedGoalSet := TRUE ;
+ else
+ AlertLogPtr(ResultID).PassedGoal := DefaultPassedGoalVar ;
+ AlertLogPtr(ResultID).PassedGoalSet := FALSE ;
+ end if ;
+ else
+ -- Found existing ID. Update it.
+ if AlertLogPtr(ResultID).ParentIDSet = FALSE then
+ if localParentID /= ALERTLOG_ID_NOT_ASSIGNED then
+ AdjustID(ResultID, localParentID, TRUE) ;
+ if localParentID /= REQUIREMENT_ALERTLOG_ID then
+ -- May want just PRINT_NAME here as PRINT_NAME_AND_PARENT is not backward compatible
+-- AlertLogPtr(ResultID).PrintParent := PRINT_NAME_AND_PARENT ;
+ AlertLogPtr(ResultID).PrintParent := PRINT_NAME ;
+ else
+ AlertLogPtr(ResultID).PrintParent := PRINT_NAME ;
+ end if ;
+ else
+ -- Update if originally set by NewID/GetAlertLogID
+ AdjustID(ResultID, REQUIREMENT_ALERTLOG_ID, FALSE) ;
+ end if ;
+ end if ;
+ if AlertLogPtr(ResultID).PassedGoalSet = FALSE then
+ if PassedGoal >= 0 then
+ AlertLogPtr(ResultID).PassedGoal := PassedGoal ;
+ AlertLogPtr(ResultID).PassedGoalSet := TRUE ;
+ else
+ AlertLogPtr(ResultID).PassedGoal := DefaultPassedGoalVar ;
+ AlertLogPtr(ResultID).PassedGoalSet := FALSE ;
+ end if ;
+ end if ;
+ end if ;
+ return ResultID ;
+ end function GetReqID ;
+
+ ------------------------------------------------------------
+ procedure SetPassedGoal(AlertLogID : AlertLogIDType ; PassedGoal : integer ) is
+ ------------------------------------------------------------
+ variable localAlertLogID : AlertLogIDType ;
+ begin
+ HasRequirementsVar := TRUE ;
+ localAlertLogID := VerifyID(AlertLogID) ;
+ if PassedGoal >= 0 then
+ AlertLogPtr(localAlertLogID).PassedGoal := PassedGoal ;
+ else
+ AlertLogPtr(localAlertLogID).PassedGoal := DefaultPassedGoalVar ;
+ end if ;
+ end procedure SetPassedGoal ;
+
+ ------------------------------------------------------------
+ impure function GetAlertLogParentID(AlertLogID : AlertLogIDType) return AlertLogIDType is
+ ------------------------------------------------------------
+ variable localAlertLogID : AlertLogIDType ;
+ begin
+ localAlertLogID := VerifyID(AlertLogID) ;
+ return AlertLogPtr(localAlertLogID).ParentID ;
+ end function GetAlertLogParentID ;
+
+ ------------------------------------------------------------
+ procedure SetAlertLogPrefix(AlertLogID : AlertLogIDType; Name : string ) is
+ ------------------------------------------------------------
+ variable localAlertLogID : AlertLogIDType ;
+ begin
+ localAlertLogID := VerifyID(AlertLogID) ;
+ Deallocate(AlertLogPtr(localAlertLogID).Prefix) ;
+ if Name'length > 0 then
+ AlertLogPtr(localAlertLogID).Prefix := new string'(Name) ;
+ end if ;
+ end procedure SetAlertLogPrefix ;
+
+ ------------------------------------------------------------
+ procedure UnSetAlertLogPrefix(AlertLogID : AlertLogIDType) is
+ ------------------------------------------------------------
+ variable localAlertLogID : AlertLogIDType ;
+ begin
+ localAlertLogID := VerifyID(AlertLogID) ;
+ Deallocate(AlertLogPtr(localAlertLogID).Prefix) ;
+ end procedure UnSetAlertLogPrefix ;
+
+ ------------------------------------------------------------
+ impure function GetAlertLogPrefix(AlertLogID : AlertLogIDType) return string is
+ ------------------------------------------------------------
+ variable localAlertLogID : AlertLogIDType ;
+ begin
+ localAlertLogID := VerifyID(AlertLogID) ;
+ return AlertLogPtr(localAlertLogID).Prefix.all ;
+ end function GetAlertLogPrefix ;
+
+ ------------------------------------------------------------
+ procedure SetAlertLogSuffix(AlertLogID : AlertLogIDType; Name : string ) is
+ ------------------------------------------------------------
+ variable localAlertLogID : AlertLogIDType ;
+ begin
+ localAlertLogID := VerifyID(AlertLogID) ;
+ Deallocate(AlertLogPtr(localAlertLogID).Suffix) ;
+ if Name'length > 0 then
+ AlertLogPtr(localAlertLogID).Suffix := new string'(Name) ;
+ end if ;
+ end procedure SetAlertLogSuffix ;
+
+ ------------------------------------------------------------
+ procedure UnSetAlertLogSuffix(AlertLogID : AlertLogIDType) is
+ ------------------------------------------------------------
+ variable localAlertLogID : AlertLogIDType ;
+ begin
+ localAlertLogID := VerifyID(AlertLogID) ;
+ Deallocate(AlertLogPtr(localAlertLogID).Suffix) ;
+ end procedure UnSetAlertLogSuffix ;
+
+ ------------------------------------------------------------
+ impure function GetAlertLogSuffix(AlertLogID : AlertLogIDType) return string is
+ ------------------------------------------------------------
+ variable localAlertLogID : AlertLogIDType ;
+ begin
+ localAlertLogID := VerifyID(AlertLogID) ;
+ return AlertLogPtr(localAlertLogID).Suffix.all ;
+ end function GetAlertLogSuffix ;
+
+ ------------------------------------------------------------
+ ------------------------------------------------------------
+ -- 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 ;
+
+ ------------------------------------------------------------
+ -- 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 ;
+
+ ------------------------------------------------------------
+ -- PT Local
+ procedure LocalSetAlertStopCount(AlertLogID : AlertLogIDType ; Level : AlertType ; Count : integer) is
+ ------------------------------------------------------------
+ begin
+ SetOneStopCount(AlertLogID, Level, Count) ;
+ if AlertLogID /= ALERTLOG_BASE_ID then
+ LocalSetAlertStopCount(AlertLogPtr(AlertLogID).ParentID, Level, Count) ;
+ end if ;
+ end procedure LocalSetAlertStopCount ;
+
+ ------------------------------------------------------------
+ procedure SetAlertStopCount(AlertLogID : AlertLogIDType ; Level : AlertType ; Count : integer) is
+ ------------------------------------------------------------
+ variable localAlertLogID : AlertLogIDType ;
+ begin
+ localAlertLogID := VerifyID(AlertLogID) ;
+ LocalSetAlertStopCount(localAlertLogID, Level, Count) ;
+ end procedure SetAlertStopCount ;
+
+ ------------------------------------------------------------
+ impure function GetAlertStopCount(AlertLogID : AlertLogIDType ; Level : AlertType) return integer is
+ ------------------------------------------------------------
+ variable localAlertLogID : AlertLogIDType ;
+ begin
+ localAlertLogID := VerifyID(AlertLogID) ;
+ return AlertLogPtr(localAlertLogID).AlertStopCount(Level) ;
+ end function GetAlertStopCount ;
+
+ ------------------------------------------------------------
+ procedure SetAlertPrintCount(AlertLogID : AlertLogIDType ; Level : AlertType ; Count : integer) is
+ ------------------------------------------------------------
+ variable localAlertLogID : AlertLogIDType ;
+ begin
+ localAlertLogID := VerifyID(AlertLogID) ;
+ AlertLogPtr(localAlertLogID).AlertPrintCount(Level) := Count ;
+ end procedure SetAlertPrintCount ;
+
+ ------------------------------------------------------------
+ impure function GetAlertPrintCount(AlertLogID : AlertLogIDType ; Level : AlertType) return integer is
+ ------------------------------------------------------------
+ variable localAlertLogID : AlertLogIDType ;
+ begin
+ localAlertLogID := VerifyID(AlertLogID) ;
+ return AlertLogPtr(localAlertLogID).AlertPrintCount(Level) ;
+ end function GetAlertPrintCount ;
+
+ ------------------------------------------------------------
+ procedure SetAlertPrintCount(AlertLogID : AlertLogIDType ; Count : AlertCountType) is
+ ------------------------------------------------------------
+ variable localAlertLogID : AlertLogIDType ;
+ begin
+ localAlertLogID := VerifyID(AlertLogID) ;
+ AlertLogPtr(localAlertLogID).AlertPrintCount(FAILURE) := Count(FAILURE) ;
+ AlertLogPtr(localAlertLogID).AlertPrintCount(ERROR) := Count(ERROR) ;
+ AlertLogPtr(localAlertLogID).AlertPrintCount(WARNING) := Count(WARNING) ;
+ end procedure SetAlertPrintCount ;
+
+ ------------------------------------------------------------
+ impure function GetAlertPrintCount(AlertLogID : AlertLogIDType) return AlertCountType is
+ ------------------------------------------------------------
+ variable localAlertLogID : AlertLogIDType ;
+ begin
+ localAlertLogID := VerifyID(AlertLogID) ;
+ return AlertLogPtr(localAlertLogID).AlertPrintCount ;
+ end function GetAlertPrintCount ;
+
+ ------------------------------------------------------------
+ procedure SetAlertLogPrintParent(AlertLogID : AlertLogIDType ; PrintParent : AlertLogPrintParentType) is
+ ------------------------------------------------------------
+ variable localAlertLogID, ParentID : AlertLogIDType ;
+ begin
+ localAlertLogID := VerifyID(AlertLogID) ;
+ ParentID := AlertLogPtr(localAlertLogID).ParentID ;
+ if (ParentID = ALERTLOG_BASE_ID or ParentID = REQUIREMENT_ALERTLOG_ID) then
+ AlertLogPtr(localAlertLogID).PrintParent := PRINT_NAME ;
+ else
+ AlertLogPtr(localAlertLogID).PrintParent := PrintParent ;
+ end if ;
+ end procedure SetAlertLogPrintParent ;
+
+ ------------------------------------------------------------
+ impure function GetAlertLogPrintParent(AlertLogID : AlertLogIDType) return AlertLogPrintParentType is
+ ------------------------------------------------------------
+ variable localAlertLogID : AlertLogIDType ;
+ begin
+ localAlertLogID := VerifyID(AlertLogID) ;
+ return AlertLogPtr(localAlertLogID).PrintParent ;
+ end function GetAlertLogPrintParent ;
+
+ ------------------------------------------------------------
+ procedure SetAlertLogReportMode(AlertLogID : AlertLogIDType ; ReportMode : AlertLogReportModeType) is
+ ------------------------------------------------------------
+ variable localAlertLogID : AlertLogIDType ;
+ begin
+ localAlertLogID := VerifyID(AlertLogID) ;
+ AlertLogPtr(localAlertLogID).ReportMode := ReportMode ;
+ end procedure SetAlertLogReportMode ;
+
+ ------------------------------------------------------------
+ impure function GetAlertLogReportMode(AlertLogID : AlertLogIDType) return AlertLogReportModeType is
+ ------------------------------------------------------------
+ variable localAlertLogID : AlertLogIDType ;
+ begin
+ localAlertLogID := VerifyID(AlertLogID) ;
+ return AlertLogPtr(localAlertLogID).ReportMode ;
+ end function GetAlertLogReportMode ;
+
+ ------------------------------------------------------------
+ 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 ;
+
+ ------------------------------------------------------------
+ -- PT Local
+ procedure LocalSetAlertEnable(AlertLogID : AlertLogIDType ; Level : AlertType ; Enable : boolean ; DescendHierarchy : boolean := TRUE) is
+ ------------------------------------------------------------
+ variable CurID : AlertLogIDType ;
+ begin
+ AlertLogPtr(AlertLogID).AlertEnabled(Level) := Enable ;
+ if DescendHierarchy then
+ CurID := AlertLogPtr(AlertLogID).ChildID ;
+ while CurID > ALERTLOG_BASE_ID loop
+ LocalSetAlertEnable(CurID, Level, Enable, DescendHierarchy) ;
+ CurID := AlertLogPtr(CurID).SiblingID ;
+ end loop ;
+ end if ;
+ end procedure LocalSetAlertEnable ;
+
+ ------------------------------------------------------------
+ procedure SetAlertEnable(AlertLogID : AlertLogIDType ; Level : AlertType ; Enable : boolean ; DescendHierarchy : boolean := TRUE) is
+ ------------------------------------------------------------
+ variable localAlertLogID : AlertLogIDType ;
+ begin
+ localAlertLogID := VerifyID(AlertLogID) ;
+ LocalSetAlertEnable(localAlertLogID, Level, Enable, DescendHierarchy) ;
+ end procedure SetAlertEnable ;
+
+ ------------------------------------------------------------
+ impure function GetAlertEnable(AlertLogID : AlertLogIDType ; Level : AlertType) return boolean is
+ ------------------------------------------------------------
+ variable localAlertLogID : AlertLogIDType ;
+ begin
+ localAlertLogID := VerifyID(AlertLogID) ;
+ return AlertLogPtr(localAlertLogID).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 ;
+
+ ------------------------------------------------------------
+ -- PT Local
+ procedure LocalSetLogEnable(AlertLogID : AlertLogIDType ; Level : LogType ; Enable : boolean ; DescendHierarchy : boolean := TRUE) is
+ ------------------------------------------------------------
+ variable CurID : AlertLogIDType ;
+ begin
+ AlertLogPtr(AlertLogID).LogEnabled(Level) := Enable ;
+ if DescendHierarchy then
+ CurID := AlertLogPtr(AlertLogID).ChildID ;
+ while CurID > ALERTLOG_BASE_ID loop
+ LocalSetLogEnable(CurID, Level, Enable, DescendHierarchy) ;
+ CurID := AlertLogPtr(CurID).SiblingID ;
+ end loop ;
+ end if ;
+ end procedure LocalSetLogEnable ;
+
+ ------------------------------------------------------------
+ procedure SetLogEnable(AlertLogID : AlertLogIDType ; Level : LogType ; Enable : boolean ; DescendHierarchy : boolean := TRUE) is
+ ------------------------------------------------------------
+ variable localAlertLogID : AlertLogIDType ;
+ begin
+ localAlertLogID := VerifyID(AlertLogID) ;
+ LocalSetLogEnable(localAlertLogID, Level, Enable, DescendHierarchy) ;
+ end procedure SetLogEnable ;
+
+ ------------------------------------------------------------
+ impure function GetLogEnable(AlertLogID : AlertLogIDType ; Level : LogType) return boolean is
+ ------------------------------------------------------------
+ variable localAlertLogID : AlertLogIDType ;
+ begin
+ localAlertLogID := VerifyID(AlertLogID) ;
+ if Level = ALWAYS then
+ return TRUE ;
+ else
+ return AlertLogPtr(localAlertLogID).LogEnabled(Level) ;
+ end if ;
+ end function GetLogEnable ;
+
+ ------------------------------------------------------------
+ -- PT Local
+ procedure PrintLogLevels(
+ ------------------------------------------------------------
+ AlertLogID : AlertLogIDType ;
+ Prefix : string ;
+ IndentAmount : integer
+ ) is
+ variable buf : line ;
+ variable CurID : AlertLogIDType ;
+ begin
+ CurID := AlertLogPtr(AlertLogID).ChildID ;
+ while CurID > ALERTLOG_BASE_ID loop
+-- Always print requirements
+-- if CurID = REQUIREMENT_ALERTLOG_ID and HasRequirementsVar = FALSE then
+-- CurID := AlertLogPtr(CurID).SiblingID ;
+-- next ;
+-- end if ;
+ PrintLogLevels(
+ AlertLogID => CurID,
+ Prefix => Prefix & " ",
+ IndentAmount => IndentAmount + 2
+ ) ;
+ CurID := AlertLogPtr(CurID).SiblingID ;
+ end loop ;
+ end procedure PrintLogLevels ;
+
+ ------------------------------------------------------------
+ procedure ReportLogEnables is
+ ------------------------------------------------------------
+ variable TurnedOnJustify : boolean := FALSE ;
+ begin
+ if ReportJustifyAmountVar <= 0 then
+ TurnedOnJustify := TRUE ;
+ SetJustify ;
+ end if ;
+ PrintLogLevels(ALERTLOG_BASE_ID, "", 0) ;
+ if TurnedOnJustify then
+ -- Turn it back off
+ SetJustify(FALSE) ;
+ end if ;
+ end procedure ReportLogEnables ;
+
+ ------------------------------------------------------------
+ procedure SetAlertLogOptions (
+ ------------------------------------------------------------
+ FailOnWarning : OsvvmOptionsType ;
+ FailOnDisabledErrors : OsvvmOptionsType ;
+ FailOnRequirementErrors : OsvvmOptionsType ;
+ ReportHierarchy : OsvvmOptionsType ;
+ WriteAlertErrorCount : OsvvmOptionsType ;
+ WriteAlertLevel : OsvvmOptionsType ;
+ WriteAlertName : OsvvmOptionsType ;
+ WriteAlertTime : OsvvmOptionsType ;
+ WriteLogErrorCount : OsvvmOptionsType ;
+ WriteLogLevel : OsvvmOptionsType ;
+ WriteLogName : OsvvmOptionsType ;
+ WriteLogTime : OsvvmOptionsType ;
+ PrintPassed : OsvvmOptionsType ;
+ PrintAffirmations : OsvvmOptionsType ;
+ PrintDisabledAlerts : OsvvmOptionsType ;
+ PrintRequirements : OsvvmOptionsType ;
+ PrintIfHaveRequirements : OsvvmOptionsType ;
+ DefaultPassedGoal : integer ;
+ AlertPrefix : string ;
+ LogPrefix : string ;
+ ReportPrefix : string ;
+ DoneName : string ;
+ PassName : string ;
+ FailName : string ;
+ IdSeparator : string
+ ) 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 FailOnRequirementErrors /= OPT_INIT_PARM_DETECT then
+ FailOnRequirementErrorsVar := IsEnabled(FailOnRequirementErrors) ;
+ end if ;
+ if ReportHierarchy /= OPT_INIT_PARM_DETECT then
+ ReportHierarchyVar := IsEnabled(ReportHierarchy) ;
+ end if ;
+ if WriteAlertErrorCount /= OPT_INIT_PARM_DETECT then
+ WriteAlertErrorCountVar := IsEnabled(WriteAlertErrorCount) ;
+ 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 WriteLogErrorCount /= OPT_INIT_PARM_DETECT then
+ WriteLogErrorCountVar := IsEnabled(WriteLogErrorCount) ;
+ 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 PrintPassed /= OPT_INIT_PARM_DETECT then
+ PrintPassedVar := IsEnabled(PrintPassed) ;
+ end if ;
+ if PrintAffirmations /= OPT_INIT_PARM_DETECT then
+ PrintAffirmationsVar := IsEnabled(PrintAffirmations) ;
+ end if ;
+ if PrintDisabledAlerts /= OPT_INIT_PARM_DETECT then
+ PrintDisabledAlertsVar := IsEnabled(PrintDisabledAlerts) ;
+ end if ;
+ if PrintRequirements /= OPT_INIT_PARM_DETECT then
+ PrintRequirementsVar := IsEnabled(PrintRequirements) ;
+ end if ;
+ if PrintIfHaveRequirements /= OPT_INIT_PARM_DETECT then
+ PrintIfHaveRequirementsVar := IsEnabled(PrintIfHaveRequirements) ;
+ end if ;
+ if DefaultPassedGoal > 0 then
+ DefaultPassedGoalVar := DefaultPassedGoal ;
+ 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 ;
+ if IdSeparator /= OSVVM_STRING_INIT_PARM_DETECT then
+ IdSeparatorVar.Set(FailName) ;
+ end if ;
+ end procedure SetAlertLogOptions ;
+
+ ------------------------------------------------------------
+ procedure ReportAlertLogOptions is
+ ------------------------------------------------------------
+ variable buf : line ;
+ begin
+ end procedure ReportAlertLogOptions ;
+
+ ------------------------------------------------------------
+ impure function GetAlertLogFailOnWarning return OsvvmOptionsType is
+ ------------------------------------------------------------
+ begin
+ return to_OsvvmOptionsType(FailOnWarningVar) ;
+ end function GetAlertLogFailOnWarning ;
+
+ ------------------------------------------------------------
+ impure function GetAlertLogFailOnDisabledErrors return OsvvmOptionsType is
+ ------------------------------------------------------------
+ begin
+ return to_OsvvmOptionsType(FailOnDisabledErrorsVar) ;
+ end function GetAlertLogFailOnDisabledErrors ;
+
+ ------------------------------------------------------------
+ impure function GetAlertLogFailOnRequirementErrors return OsvvmOptionsType is
+ ------------------------------------------------------------
+ begin
+ return to_OsvvmOptionsType(FailOnRequirementErrorsVar) ;
+ end function GetAlertLogFailOnRequirementErrors ;
+
+ ------------------------------------------------------------
+ impure function GetAlertLogReportHierarchy return OsvvmOptionsType 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 GetAlertLogWriteAlertErrorCount return OsvvmOptionsType is
+ ------------------------------------------------------------
+ begin
+ return to_OsvvmOptionsType(WriteAlertErrorCountVar) ;
+ end function GetAlertLogWriteAlertErrorCount ;
+
+ ------------------------------------------------------------
+ impure function GetAlertLogWriteAlertLevel return OsvvmOptionsType is
+ ------------------------------------------------------------
+ begin
+ return to_OsvvmOptionsType(WriteAlertLevelVar) ;
+ end function GetAlertLogWriteAlertLevel ;
+
+ ------------------------------------------------------------
+ impure function GetAlertLogWriteAlertName return OsvvmOptionsType is
+ ------------------------------------------------------------
+ begin
+ return to_OsvvmOptionsType(WriteAlertNameVar) ;
+ end function GetAlertLogWriteAlertName ;
+
+ ------------------------------------------------------------
+ impure function GetAlertLogWriteAlertTime return OsvvmOptionsType is
+ ------------------------------------------------------------
+ begin
+ return to_OsvvmOptionsType(WriteAlertTimeVar) ;
+ end function GetAlertLogWriteAlertTime ;
+
+ ------------------------------------------------------------
+ impure function GetAlertLogWriteLogErrorCount return OsvvmOptionsType is
+ ------------------------------------------------------------
+ begin
+ return to_OsvvmOptionsType(WriteLogErrorCountVar) ;
+ end function GetAlertLogWriteLogErrorCount ;
+
+ ------------------------------------------------------------
+ impure function GetAlertLogWriteLogLevel return OsvvmOptionsType is
+ ------------------------------------------------------------
+ begin
+ return to_OsvvmOptionsType(WriteLogLevelVar) ;
+ end function GetAlertLogWriteLogLevel ;
+
+ ------------------------------------------------------------
+ impure function GetAlertLogWriteLogName return OsvvmOptionsType is
+ ------------------------------------------------------------
+ begin
+ return to_OsvvmOptionsType(WriteLogNameVar) ;
+ end function GetAlertLogWriteLogName ;
+
+ ------------------------------------------------------------
+ impure function GetAlertLogWriteLogTime return OsvvmOptionsType is
+ ------------------------------------------------------------
+ begin
+ return to_OsvvmOptionsType(WriteLogTimeVar) ;
+ end function GetAlertLogWriteLogTime ;
+
+ ------------------------------------------------------------
+ impure function GetAlertLogPrintPassed return OsvvmOptionsType is
+ ------------------------------------------------------------
+ begin
+ return to_OsvvmOptionsType(PrintPassedVar) ;
+ end function GetAlertLogPrintPassed ;
+
+ ------------------------------------------------------------
+ impure function GetAlertLogPrintAffirmations return OsvvmOptionsType is
+ ------------------------------------------------------------
+ begin
+ return to_OsvvmOptionsType(PrintAffirmationsVar) ;
+ end function GetAlertLogPrintAffirmations ;
+
+ ------------------------------------------------------------
+ impure function GetAlertLogPrintDisabledAlerts return OsvvmOptionsType is
+ ------------------------------------------------------------
+ begin
+ return to_OsvvmOptionsType(PrintDisabledAlertsVar) ;
+ end function GetAlertLogPrintDisabledAlerts ;
+
+ ------------------------------------------------------------
+ impure function GetAlertLogPrintRequirements return OsvvmOptionsType is
+ ------------------------------------------------------------
+ begin
+ return to_OsvvmOptionsType(PrintRequirementsVar) ;
+ end function GetAlertLogPrintRequirements ;
+
+ ------------------------------------------------------------
+ impure function GetAlertLogPrintIfHaveRequirements return OsvvmOptionsType is
+ ------------------------------------------------------------
+ begin
+ return to_OsvvmOptionsType(PrintIfHaveRequirementsVar) ;
+ end function GetAlertLogPrintIfHaveRequirements ;
+
+ ------------------------------------------------------------
+ impure function GetAlertLogDefaultPassedGoal return integer is
+ ------------------------------------------------------------
+ begin
+ return DefaultPassedGoalVar ;
+ end function GetAlertLogDefaultPassedGoal ;
+
+ ------------------------------------------------------------
+ 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 SetAlertLogJustify (Enable : boolean := TRUE) is
+ ------------------------------------------------------------
+ begin
+ -- synthesis translate_off
+ AlertLogStruct.SetJustify(Enable) ;
+ -- synthesis translate_on
+ end procedure SetAlertLogJustify ;
+
+ ------------------------------------------------------------
+ procedure ReportAlerts ( Name : String ; AlertCount : AlertCountType ) is
+ ------------------------------------------------------------
+ begin
+ -- synthesis translate_off
+ AlertLogStruct.ReportAlerts(Name, AlertCount) ;
+ -- synthesis translate_on
+ end procedure ReportAlerts ;
+
+ ------------------------------------------------------------
+ procedure ReportRequirements is
+ ------------------------------------------------------------
+ begin
+ -- synthesis translate_off
+ AlertLogStruct.ReportRequirements ;
+ -- synthesis translate_on
+ end procedure ReportRequirements ;
+
+ ------------------------------------------------------------
+ procedure ReportAlerts (
+ ------------------------------------------------------------
+ Name : string := OSVVM_STRING_INIT_PARM_DETECT ;
+ AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID ;
+ ExternalErrors : AlertCountType := (others => 0) ;
+ ReportAll : Boolean := FALSE
+ ) is
+ begin
+ -- synthesis translate_off
+ AlertLogStruct.ReportAlerts(Name, AlertLogID, ExternalErrors, ReportAll, TRUE) ;
+ -- synthesis translate_on
+ end procedure ReportAlerts ;
+
+ ------------------------------------------------------------
+ procedure ReportNonZeroAlerts (
+ ------------------------------------------------------------
+ Name : string := OSVVM_STRING_INIT_PARM_DETECT ;
+ AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID ;
+ ExternalErrors : AlertCountType := (others => 0)
+ ) is
+ begin
+ -- synthesis translate_off
+ AlertLogStruct.ReportAlerts(Name, AlertLogID, ExternalErrors, FALSE, FALSE) ;
+ -- synthesis translate_on
+ end procedure ReportNonZeroAlerts ;
+
+ ------------------------------------------------------------
+ procedure WriteTestSummary (
+ ------------------------------------------------------------
+ FileName : string ;
+ OpenKind : File_Open_Kind := APPEND_MODE ;
+ Prefix : string := "" ;
+ Suffix : string := "" ;
+ ExternalErrors : AlertCountType := (0,0,0) ;
+ WriteFieldName : boolean := FALSE
+ ) is
+ begin
+ -- synthesis translate_off
+ AlertLogStruct.WriteTestSummary(FileName, OpenKind, Prefix, Suffix, ExternalErrors, WriteFieldName) ;
+ -- synthesis translate_on
+ end procedure WriteTestSummary ;
+
+ ------------------------------------------------------------
+ procedure WriteTestSummaries (
+ ------------------------------------------------------------
+ FileName : string ;
+ OpenKind : File_Open_Kind := WRITE_MODE
+ ) is
+ begin
+ -- synthesis translate_off
+ AlertLogStruct.WriteTestSummaries(FileName, OpenKind) ;
+ -- synthesis translate_on
+ end procedure WriteTestSummaries ;
+
+ ------------------------------------------------------------
+ procedure ReportTestSummaries is
+ ------------------------------------------------------------
+ begin
+ -- synthesis translate_off
+ AlertLogStruct.ReportTestSummaries ;
+ -- synthesis translate_on
+ end procedure ReportTestSummaries ;
+
+ ------------------------------------------------------------
+ procedure WriteAlerts (
+ ------------------------------------------------------------
+ FileName : string ;
+ AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID ;
+ OpenKind : File_Open_Kind := WRITE_MODE
+ ) is
+ begin
+ -- synthesis translate_off
+ AlertLogStruct.WriteAlerts(FileName, AlertLogID, OpenKind) ;
+ -- synthesis translate_on
+ end procedure WriteAlerts ;
+
+ ------------------------------------------------------------
+ procedure WriteRequirements (
+ ------------------------------------------------------------
+ FileName : string ;
+ AlertLogID : AlertLogIDType := REQUIREMENT_ALERTLOG_ID ;
+ OpenKind : File_Open_Kind := WRITE_MODE
+ ) is
+ begin
+ -- synthesis translate_off
+ AlertLogStruct.WriteRequirements(FileName, AlertLogID, OpenKind) ;
+ -- synthesis translate_on
+ end procedure WriteRequirements ;
+
+ ------------------------------------------------------------
+ procedure ReadSpecification (FileName : string ; PassedGoal : integer := -1 ) is
+ ------------------------------------------------------------
+ begin
+ -- synthesis translate_off
+ AlertLogStruct.ReadSpecification(FileName, PassedGoal) ;
+ -- synthesis translate_on
+ end procedure ReadSpecification ;
+
+ ------------------------------------------------------------
+ procedure ReadRequirements (
+ ------------------------------------------------------------
+ FileName : string ;
+ ThresholdPassed : boolean := FALSE
+ ) is
+ begin
+ -- synthesis translate_off
+ AlertLogStruct.ReadRequirements(FileName, ThresholdPassed, TestSummary => FALSE) ;
+ -- synthesis translate_on
+ end procedure ReadRequirements ;
+
+ ------------------------------------------------------------
+ procedure ReadTestSummaries (FileName : string) is
+ ------------------------------------------------------------
+ begin
+ -- synthesis translate_off
+ AlertLogStruct.ReadRequirements(FileName, ThresholdPassed => FALSE, TestSummary => TRUE) ;
+ -- synthesis translate_on
+ end procedure ReadTestSummaries ;
+
+-- ------------------------------------------------------------
+-- procedure ReportTestSummaries (FileName : string) is
+-- ------------------------------------------------------------
+-- begin
+-- -- synthesis translate_off
+-- AlertLogStruct.ReadRequirements(FileName, ThresholdPassed => FALSE, TestSummary => TRUE) ;
+-- -- synthesis translate_on
+-- end procedure ReportTestSummaries ;
+
+ ------------------------------------------------------------
+ procedure ClearAlerts is
+ ------------------------------------------------------------
+ begin
+ -- synthesis translate_off
+ AlertLogStruct.ClearAlerts ;
+ -- synthesis translate_on
+ end procedure ClearAlerts ;
+
+ ------------------------------------------------------------
+ procedure ClearAlertStopCounts is
+ ------------------------------------------------------------
+ begin
+ -- synthesis translate_off
+ AlertLogStruct.ClearAlertStopCounts ;
+ -- synthesis translate_on
+ end procedure ClearAlertStopCounts ;
+
+ ------------------------------------------------------------
+ procedure ClearAlertCounts is
+ ------------------------------------------------------------
+ begin
+ -- synthesis translate_off
+ AlertLogStruct.ClearAlerts ;
+ AlertLogStruct.ClearAlertStopCounts ;
+ -- synthesis translate_on
+ end procedure ClearAlertCounts ;
+
+ ------------------------------------------------------------
+ function "ABS" (L : AlertCountType) return AlertCountType is
+ ------------------------------------------------------------
+ variable Result : AlertCountType ;
+ begin
+ -- synthesis translate_off
+ Result(FAILURE) := ABS( L(FAILURE) ) ;
+ Result(ERROR) := ABS( L(ERROR) ) ;
+ Result(WARNING) := ABS( L(WARNING) );
+ -- synthesis translate_on
+ return Result ;
+ end function "ABS" ;
+
+ ------------------------------------------------------------
+ function "+" (L, R : AlertCountType) return AlertCountType is
+ ------------------------------------------------------------
+ variable Result : AlertCountType ;
+ begin
+ -- synthesis translate_off
+ Result(FAILURE) := L(FAILURE) + R(FAILURE) ;
+ Result(ERROR) := L(ERROR) + R(ERROR) ;
+ Result(WARNING) := L(WARNING) + R(WARNING) ;
+ -- synthesis translate_on
+ return Result ;
+ end function "+" ;
+
+ ------------------------------------------------------------
+ function "-" (L, R : AlertCountType) return AlertCountType is
+ ------------------------------------------------------------
+ variable Result : AlertCountType ;
+ begin
+ -- synthesis translate_off
+ Result(FAILURE) := L(FAILURE) - R(FAILURE) ;
+ Result(ERROR) := L(ERROR) - R(ERROR) ;
+ Result(WARNING) := L(WARNING) - R(WARNING) ;
+ -- synthesis translate_on
+ return Result ;
+ end function "-" ;
+
+ ------------------------------------------------------------
+ function "-" (R : AlertCountType) return AlertCountType is
+ ------------------------------------------------------------
+ variable Result : AlertCountType ;
+ begin
+ -- synthesis translate_off
+ Result(FAILURE) := - R(FAILURE) ;
+ Result(ERROR) := - R(ERROR) ;
+ Result(WARNING) := - R(WARNING) ;
+ -- synthesis translate_on
+ return Result ;
+ end function "-" ;
+
+ ------------------------------------------------------------
+ impure function SumAlertCount(AlertCount: AlertCountType) return integer is
+ ------------------------------------------------------------
+ variable result : integer ;
+ begin
+ -- synthesis translate_off
+ -- Using ABS ensures correct expected error handling.
+ result := abs(AlertCount(FAILURE)) + abs(AlertCount(ERROR)) + abs(AlertCount(WARNING)) ;
+ -- synthesis translate_on
+ return result ;
+ end function SumAlertCount ;
+
+ ------------------------------------------------------------
+ impure function GetAlertCount(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return AlertCountType is
+ ------------------------------------------------------------
+ variable result : AlertCountType ;
+ begin
+ -- synthesis translate_off
+ result := AlertLogStruct.GetAlertCount(AlertLogID) ;
+ -- synthesis translate_on
+ return result ;
+ end function GetAlertCount ;
+
+ ------------------------------------------------------------
+ impure function GetAlertCount(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return integer is
+ ------------------------------------------------------------
+ variable result : integer ;
+ begin
+ -- synthesis translate_off
+ result := SumAlertCount(AlertLogStruct.GetAlertCount(AlertLogID)) ;
+ -- synthesis translate_on
+ return result ;
+ end function GetAlertCount ;
+
+ ------------------------------------------------------------
+ impure function GetEnabledAlertCount(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return AlertCountType is
+ ------------------------------------------------------------
+ variable result : AlertCountType ;
+ begin
+ -- synthesis translate_off
+ result := AlertLogStruct.GetEnabledAlertCount(AlertLogID) ;
+ -- synthesis translate_on
+ return result ;
+ end function GetEnabledAlertCount ;
+
+ ------------------------------------------------------------
+ impure function GetEnabledAlertCount(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return integer is
+ ------------------------------------------------------------
+ variable result : integer ;
+ begin
+ -- synthesis translate_off
+ result := SumAlertCount(AlertLogStruct.GetEnabledAlertCount(AlertLogID)) ;
+ -- synthesis translate_on
+ return result ;
+ end function GetEnabledAlertCount ;
+
+ ------------------------------------------------------------
+ impure function GetDisabledAlertCount return AlertCountType is
+ ------------------------------------------------------------
+ variable result : AlertCountType ;
+ begin
+ -- synthesis translate_off
+ result := AlertLogStruct.GetDisabledAlertCount ;
+ -- synthesis translate_on
+ return result ;
+ end function GetDisabledAlertCount ;
+
+ ------------------------------------------------------------
+ impure function GetDisabledAlertCount return integer is
+ ------------------------------------------------------------
+ variable result : integer ;
+ begin
+ -- synthesis translate_off
+ result := SumAlertCount(AlertLogStruct.GetDisabledAlertCount) ;
+ -- synthesis translate_on
+ return result ;
+ end function GetDisabledAlertCount ;
+
+ ------------------------------------------------------------
+ impure function GetDisabledAlertCount(AlertLogID: AlertLogIDType) return AlertCountType is
+ ------------------------------------------------------------
+ variable result : AlertCountType ;
+ begin
+ -- synthesis translate_off
+ result := AlertLogStruct.GetDisabledAlertCount(AlertLogID) ;
+ -- synthesis translate_on
+ return result ;
+ end function GetDisabledAlertCount ;
+
+ ------------------------------------------------------------
+ impure function GetDisabledAlertCount(AlertLogID: AlertLogIDType) return integer is
+ ------------------------------------------------------------
+ variable result : integer ;
+ begin
+ -- synthesis translate_off
+ result := SumAlertCount(AlertLogStruct.GetDisabledAlertCount(AlertLogID)) ;
+ -- synthesis translate_on
+ return result ;
+ end function GetDisabledAlertCount ;
+
+ ------------------------------------------------------------
+ procedure Log(
+ ------------------------------------------------------------
+ AlertLogID : AlertLogIDType ;
+ Message : string ;
+ Level : LogType := ALWAYS ;
+ Enable : boolean := FALSE -- override internal enable
+ ) is
+ begin
+ -- synthesis translate_off
+ AlertLogStruct.Log(AlertLogID, Message, Level, Enable) ;
+ -- synthesis translate_on
+ end procedure log ;
+
+ ------------------------------------------------------------
+ procedure Log( Message : string ; Level : LogType := ALWAYS ; Enable : boolean := FALSE) is
+ ------------------------------------------------------------
+ begin
+ -- synthesis translate_off
+ AlertLogStruct.Log(LOG_DEFAULT_ID, Message, Level, Enable) ;
+ -- synthesis translate_on
+ end procedure log ;
+
+ ------------------------------------------------------------
+ procedure SetAlertEnable(Level : AlertType ; Enable : boolean) is
+ ------------------------------------------------------------
+ begin
+ -- synthesis translate_off
+ AlertLogStruct.SetAlertEnable(Level, Enable) ;
+ -- synthesis translate_on
+ end procedure SetAlertEnable ;
+
+ ------------------------------------------------------------
+ procedure SetAlertEnable(AlertLogID : AlertLogIDType ; Level : AlertType ; Enable : boolean ; DescendHierarchy : boolean := TRUE) is
+ ------------------------------------------------------------
+ begin
+ -- synthesis translate_off
+ AlertLogStruct.SetAlertEnable(AlertLogID, Level, Enable, DescendHierarchy) ;
+ -- synthesis translate_on
+ end procedure SetAlertEnable ;
+
+ ------------------------------------------------------------
+ impure function GetAlertEnable(AlertLogID : AlertLogIDType ; Level : AlertType) return boolean is
+ ------------------------------------------------------------
+ variable result : boolean ;
+ begin
+ -- synthesis translate_off
+ result := AlertLogStruct.GetAlertEnable(AlertLogID, Level) ;
+ -- synthesis translate_on
+ return result ;
+ end function GetAlertEnable ;
+
+ ------------------------------------------------------------
+ impure function GetAlertEnable(Level : AlertType) return boolean is
+ ------------------------------------------------------------
+ variable result : boolean ;
+ begin
+ -- synthesis translate_off
+ result := AlertLogStruct.GetAlertEnable(ALERT_DEFAULT_ID, Level) ;
+ -- synthesis translate_on
+ return result ;
+ end function GetAlertEnable ;
+
+ ------------------------------------------------------------
+ procedure SetLogEnable(Level : LogType ; Enable : boolean) is
+ ------------------------------------------------------------
+ begin
+ -- synthesis translate_off
+ AlertLogStruct.SetLogEnable(Level, Enable) ;
+ -- synthesis translate_on
+ end procedure SetLogEnable ;
+
+ ------------------------------------------------------------
+ procedure SetLogEnable(AlertLogID : AlertLogIDType ; Level : LogType ; Enable : boolean ; DescendHierarchy : boolean := TRUE) is
+ ------------------------------------------------------------
+ begin
+ -- synthesis translate_off
+ AlertLogStruct.SetLogEnable(AlertLogID, Level, Enable, DescendHierarchy) ;
+ -- synthesis translate_on
+ end procedure SetLogEnable ;
+
+ ------------------------------------------------------------
+ impure function GetLogEnable(AlertLogID : AlertLogIDType ; Level : LogType) return boolean is
+ ------------------------------------------------------------
+ variable result : boolean ;
+ begin
+ -- synthesis translate_off
+ result := AlertLogStruct.GetLogEnable(AlertLogID, Level) ;
+ -- synthesis translate_on
+ return result ;
+ end function GetLogEnable ;
+
+ ------------------------------------------------------------
+ impure function GetLogEnable(Level : LogType) return boolean is
+ ------------------------------------------------------------
+ variable result : boolean ;
+ begin
+ -- synthesis translate_off
+ result := AlertLogStruct.GetLogEnable(LOG_DEFAULT_ID, Level) ;
+ -- synthesis translate_on
+ return result ;
+ end function GetLogEnable ;
+
+ ------------------------------------------------------------
+ procedure ReportLogEnables is
+ ------------------------------------------------------------
+ begin
+ -- synthesis translate_off
+ AlertLogStruct.ReportLogEnables ;
+ -- synthesis translate_on
+ end ReportLogEnables ;
+
+ ------------------------------------------------------------
+ procedure SetAlertLogName(Name : string ) is
+ ------------------------------------------------------------
+ begin
+ -- synthesis translate_off
+ AlertLogStruct.SetAlertLogName(Name) ;
+ -- synthesis translate_on
+ end procedure SetAlertLogName ;
+
+ -- synthesis translate_off
+ ------------------------------------------------------------
+ impure function GetAlertLogName(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) return string is
+ ------------------------------------------------------------
+ begin
+ return AlertLogStruct.GetAlertLogName(AlertLogID) ;
+ end GetAlertLogName ;
+ -- synthesis translate_on
+
+ ------------------------------------------------------------
+ procedure DeallocateAlertLogStruct is
+ ------------------------------------------------------------
+ begin
+ -- synthesis translate_off
+ AlertLogStruct.DeallocateAlertLogStruct ;
+ -- synthesis translate_on
+ end procedure DeallocateAlertLogStruct ;
+
+ ------------------------------------------------------------
+ procedure InitializeAlertLogStruct is
+ ------------------------------------------------------------
+ begin
+ -- synthesis translate_off
+ AlertLogStruct.Initialize ;
+ -- synthesis translate_on
+ end procedure InitializeAlertLogStruct ;
+
+ ------------------------------------------------------------
+ impure function FindAlertLogID(Name : string ) return AlertLogIDType is
+ ------------------------------------------------------------
+ variable result : AlertLogIDType ;
+ begin
+ -- synthesis translate_off
+ result := AlertLogStruct.FindAlertLogID(Name) ;
+ -- synthesis translate_on
+ return result ;
+ end function FindAlertLogID ;
+
+ ------------------------------------------------------------
+ impure function FindAlertLogID(Name : string ; ParentID : AlertLogIDType) return AlertLogIDType is
+ ------------------------------------------------------------
+ variable result : AlertLogIDType ;
+ begin
+ -- synthesis translate_off
+ result := AlertLogStruct.FindAlertLogID(Name, ParentID) ;
+ -- synthesis translate_on
+ return result ;
+ end function FindAlertLogID ;
+
+ ------------------------------------------------------------
+ impure function NewID(
+ ------------------------------------------------------------
+ Name : string ;
+ ParentID : AlertLogIDType := ALERTLOG_ID_NOT_ASSIGNED;
+ ReportMode : AlertLogReportModeType := ENABLED ;
+ PrintParent : AlertLogPrintParentType := PRINT_NAME_AND_PARENT ;
+ CreateHierarchy : boolean := TRUE
+ ) return AlertLogIDType is
+ variable result : AlertLogIDType ;
+ begin
+ -- synthesis translate_off
+ result := AlertLogStruct.NewID(Name, ParentID, ReportMode, PrintParent, CreateHierarchy) ;
+ -- synthesis translate_on
+ return result ;
+ end function NewID ;
+
+ ------------------------------------------------------------
+ impure function GetAlertLogID(Name : string; ParentID : AlertLogIDType := ALERTLOG_ID_NOT_ASSIGNED; CreateHierarchy : Boolean := TRUE; DoNotReport : Boolean := FALSE) return AlertLogIDType is
+ ------------------------------------------------------------
+ variable result : AlertLogIDType ;
+ variable ReportMode : AlertLogReportModeType := ENABLED ;
+ begin
+ -- synthesis translate_off
+ if DoNotReport then
+ ReportMode := DISABLED ;
+ end if;
+ -- PrintParent PRINT_NAME_AND_PARENT is not backward compatible with PRINT_NAME of the past
+ result := AlertLogStruct.NewID(Name, ParentID, ReportMode => ReportMode, PrintParent => PRINT_NAME, CreateHierarchy => CreateHierarchy) ;
+-- result := AlertLogStruct.GetAlertLogID(Name, ParentID, CreateHierarchy, DoNotReport) ;
+ -- synthesis translate_on
+ return result ;
+ end function GetAlertLogID ;
+
+ ------------------------------------------------------------
+ impure function GetReqID(Name : string ; PassedGoal : integer := -1 ; ParentID : AlertLogIDType := ALERTLOG_ID_NOT_ASSIGNED ; CreateHierarchy : Boolean := TRUE) return AlertLogIDType is
+ ------------------------------------------------------------
+ variable result : AlertLogIDType ;
+ begin
+ -- synthesis translate_off
+ result := AlertLogStruct.GetReqID(Name, PassedGoal, ParentID, CreateHierarchy) ;
+ -- synthesis translate_on
+ return result ;
+ end function GetReqID ;
+
+ ------------------------------------------------------------
+ procedure SetPassedGoal(AlertLogID : AlertLogIDType ; PassedGoal : integer ) is
+ ------------------------------------------------------------
+ begin
+ -- synthesis translate_off
+ AlertLogStruct.SetPassedGoal(AlertLogID, PassedGoal) ;
+ -- synthesis translate_on
+ end procedure SetPassedGoal ;
+
+ ------------------------------------------------------------
+ impure function GetAlertLogParentID(AlertLogID : AlertLogIDType) return AlertLogIDType is
+ ------------------------------------------------------------
+ variable result : AlertLogIDType ;
+ begin
+ -- synthesis translate_off
+ result := AlertLogStruct.GetAlertLogParentID(AlertLogID) ;
+ -- synthesis translate_on
+ return result ;
+ end function GetAlertLogParentID ;
+
+ ------------------------------------------------------------
+ procedure SetAlertLogPrefix(AlertLogID : AlertLogIDType; Name : string ) is
+ ------------------------------------------------------------
+ begin
+ -- synthesis translate_off
+ AlertLogStruct.SetAlertLogPrefix(AlertLogID, Name) ;
+ -- synthesis translate_on
+ end procedure SetAlertLogPrefix ;
+
+ ------------------------------------------------------------
+ procedure UnSetAlertLogPrefix(AlertLogID : AlertLogIDType ) is
+ ------------------------------------------------------------
+ begin
+ -- synthesis translate_off
+ AlertLogStruct.UnSetAlertLogPrefix(AlertLogID) ;
+ -- synthesis translate_on
+ end procedure UnSetAlertLogPrefix ;
+
+ -- synthesis translate_off
+ ------------------------------------------------------------
+ impure function GetAlertLogPrefix(AlertLogID : AlertLogIDType) return string is
+ ------------------------------------------------------------
+ begin
+ return AlertLogStruct.GetAlertLogPrefix(AlertLogID) ;
+ end function GetAlertLogPrefix ;
+ -- synthesis translate_on
+
+ ------------------------------------------------------------
+ procedure SetAlertLogSuffix(AlertLogID : AlertLogIDType; Name : string ) is
+ ------------------------------------------------------------
+ begin
+ -- synthesis translate_off
+ AlertLogStruct.SetAlertLogSuffix(AlertLogID, Name) ;
+ -- synthesis translate_on
+ end procedure SetAlertLogSuffix ;
+
+ ------------------------------------------------------------
+ procedure UnSetAlertLogSuffix(AlertLogID : AlertLogIDType ) is
+ ------------------------------------------------------------
+ begin
+ -- synthesis translate_off
+ AlertLogStruct.UnSetAlertLogSuffix(AlertLogID) ;
+ -- synthesis translate_on
+ end procedure UnSetAlertLogSuffix ;
+
+ -- synthesis translate_off
+ ------------------------------------------------------------
+ impure function GetAlertLogSuffix(AlertLogID : AlertLogIDType) return string is
+ ------------------------------------------------------------
+ begin
+ return AlertLogStruct.GetAlertLogSuffix(AlertLogID) ;
+ end function GetAlertLogSuffix ;
+ -- synthesis translate_on
+
+ ------------------------------------------------------------
+ procedure SetGlobalAlertEnable (A : boolean := TRUE) is
+ ------------------------------------------------------------
+ begin
+ -- synthesis translate_off
+ AlertLogStruct.SetGlobalAlertEnable(A) ;
+ -- synthesis translate_on
+ end procedure SetGlobalAlertEnable ;
+
+ ------------------------------------------------------------
+ -- Set using constant. Set before code runs.
+ impure function SetGlobalAlertEnable (A : boolean := TRUE) return boolean is
+ ------------------------------------------------------------
+ begin
+ -- synthesis translate_off
+ AlertLogStruct.SetGlobalAlertEnable(A) ;
+ -- synthesis translate_on
+ return A ;
+ end function SetGlobalAlertEnable ;
+
+ ------------------------------------------------------------
+ impure function GetGlobalAlertEnable return boolean is
+ ------------------------------------------------------------
+ variable result : boolean ;
+ begin
+ -- synthesis translate_off
+ result := AlertLogStruct.GetGlobalAlertEnable ;
+ -- synthesis translate_on
+ return result ;
+ end function GetGlobalAlertEnable ;
+
+ ------------------------------------------------------------
+ procedure IncAffirmCount(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) is
+ ------------------------------------------------------------
+ begin
+ -- synthesis translate_off
+ AlertLogStruct.IncAffirmCount(AlertLogID) ;
+ -- synthesis translate_on
+ end procedure IncAffirmCount ;
+
+ ------------------------------------------------------------
+ impure function GetAffirmCount return natural is
+ ------------------------------------------------------------
+ variable result : natural ;
+ begin
+ -- synthesis translate_off
+ result := AlertLogStruct.GetAffirmCount ;
+ -- synthesis translate_on
+ return result ;
+ end function GetAffirmCount ;
+
+ ------------------------------------------------------------
+ procedure IncAffirmPassedCount(AlertLogID : AlertLogIDType := ALERTLOG_BASE_ID) is
+ ------------------------------------------------------------
+ begin
+ -- synthesis translate_off
+ AlertLogStruct.IncAffirmPassedCount(AlertLogID) ;
+ -- synthesis translate_on
+ end procedure IncAffirmPassedCount ;
+
+ ------------------------------------------------------------
+ impure function GetAffirmPassedCount return natural is
+ ------------------------------------------------------------
+ variable result : natural ;
+ begin
+ -- synthesis translate_off
+ result := AlertLogStruct.GetAffirmPassedCount ;
+ -- synthesis translate_on
+ return result ;
+ end function GetAffirmPassedCount ;
+
+ ------------------------------------------------------------
+ procedure SetAlertStopCount(AlertLogID : AlertLogIDType ; Level : AlertType ; Count : integer) is
+ ------------------------------------------------------------
+ begin
+ -- synthesis translate_off
+ AlertLogStruct.SetAlertStopCount(AlertLogID, Level, Count) ;
+ -- synthesis translate_on
+ end procedure SetAlertStopCount ;
+
+ ------------------------------------------------------------
+ procedure SetAlertStopCount(Level : AlertType ; Count : integer) is
+ ------------------------------------------------------------
+ begin
+ -- synthesis translate_off
+ AlertLogStruct.SetAlertStopCount(ALERTLOG_BASE_ID, Level, Count) ;
+ -- synthesis translate_on
+ end procedure SetAlertStopCount ;
+
+ ------------------------------------------------------------
+ impure function GetAlertStopCount(AlertLogID : AlertLogIDType ; Level : AlertType) return integer is
+ ------------------------------------------------------------
+ variable result : integer ;
+ begin
+ -- synthesis translate_off
+ result := AlertLogStruct.GetAlertStopCount(AlertLogID, Level) ;
+ -- synthesis translate_on
+ return result ;
+ end function GetAlertStopCount ;
+
+ ------------------------------------------------------------
+ impure function GetAlertStopCount(Level : AlertType) return integer is
+ ------------------------------------------------------------
+ variable result : integer ;
+ begin
+ -- synthesis translate_off
+ result := AlertLogStruct.GetAlertStopCount(ALERTLOG_BASE_ID, Level) ;
+ -- synthesis translate_on
+ return result ;
+ end function GetAlertStopCount ;
+
+ ------------------------------------------------------------
+ procedure SetAlertPrintCount(AlertLogID : AlertLogIDType ; Level : AlertType ; Count : integer) is
+ ------------------------------------------------------------
+ begin
+ -- synthesis translate_off
+ AlertLogStruct.SetAlertPrintCount(AlertLogID, Level, Count) ;
+ -- synthesis translate_on
+ end procedure SetAlertPrintCount ;
+
+ ------------------------------------------------------------
+ procedure SetAlertPrintCount(Level : AlertType ; Count : integer) is
+ ------------------------------------------------------------
+ begin
+ -- synthesis translate_off
+ AlertLogStruct.SetAlertPrintCount(ALERTLOG_DEFAULT_ID, Level, Count) ;
+ -- synthesis translate_on
+ end procedure SetAlertPrintCount ;
+
+ ------------------------------------------------------------
+ impure function GetAlertPrintCount(AlertLogID : AlertLogIDType ; Level : AlertType) return integer is
+ ------------------------------------------------------------
+ variable result : integer ;
+ begin
+ -- synthesis translate_off
+ result := AlertLogStruct.GetAlertPrintCount(AlertLogID, Level) ;
+ -- synthesis translate_on
+ return result ;
+ end function GetAlertPrintCount ;
+
+ ------------------------------------------------------------
+ impure function GetAlertPrintCount(Level : AlertType) return integer is
+ ------------------------------------------------------------
+ variable result : integer ;
+ begin
+ -- synthesis translate_off
+ result := AlertLogStruct.GetAlertPrintCount(ALERTLOG_DEFAULT_ID, Level) ;
+ -- synthesis translate_on
+ return result ;
+ end function GetAlertPrintCount ;
+
+ ------------------------------------------------------------
+ procedure SetAlertPrintCount(AlertLogID : AlertLogIDType ; Count : AlertCountType) is
+ ------------------------------------------------------------
+ begin
+ -- synthesis translate_off
+ AlertLogStruct.SetAlertPrintCount(AlertLogID, Count) ;
+ -- synthesis translate_on
+ end procedure SetAlertPrintCount ;
+
+ ------------------------------------------------------------
+ procedure SetAlertPrintCount(Count : AlertCountType) is
+ ------------------------------------------------------------
+ begin
+ -- synthesis translate_off
+ AlertLogStruct.SetAlertPrintCount(ALERTLOG_DEFAULT_ID, Count) ;
+ -- synthesis translate_on
+ end procedure SetAlertPrintCount ;
+
+ ------------------------------------------------------------
+ impure function GetAlertPrintCount(AlertLogID : AlertLogIDType) return AlertCountType is
+ ------------------------------------------------------------
+ variable result : AlertCountType ;
+ begin
+ -- synthesis translate_off
+ result := AlertLogStruct.GetAlertPrintCount(AlertLogID) ;
+ -- synthesis translate_on
+ return result ;
+ end function GetAlertPrintCount ;
+
+ ------------------------------------------------------------
+ impure function GetAlertPrintCount return AlertCountType is
+ ------------------------------------------------------------
+ variable result : AlertCountType ;
+ begin
+ -- synthesis translate_off
+ result := AlertLogStruct.GetAlertPrintCount(ALERTLOG_DEFAULT_ID) ;
+ -- synthesis translate_on
+ return result ;
+ end function GetAlertPrintCount ;
+
+ ------------------------------------------------------------
+ procedure SetAlertLogPrintParent(AlertLogID : AlertLogIDType ; PrintParent : AlertLogPrintParentType) is
+ ------------------------------------------------------------
+ begin
+ -- synthesis translate_off
+ AlertLogStruct.SetAlertLogPrintParent(AlertLogID, PrintParent) ;
+ -- synthesis translate_on
+ end procedure SetAlertLogPrintParent ;
+
+ ------------------------------------------------------------
+ procedure SetAlertLogPrintParent( PrintParent : AlertLogPrintParentType) is
+ ------------------------------------------------------------
+ begin
+ -- synthesis translate_off
+ AlertLogStruct.SetAlertLogPrintParent(ALERTLOG_DEFAULT_ID, PrintParent) ;
+ -- synthesis translate_on
+ end procedure SetAlertLogPrintParent ;
+
+ ------------------------------------------------------------
+ impure function GetAlertLogPrintParent(AlertLogID : AlertLogIDType) return AlertLogPrintParentType is
+ ------------------------------------------------------------
+ variable result : AlertLogPrintParentType ;
+ begin
+ -- synthesis translate_off
+ result := AlertLogStruct.GetAlertLogPrintParent(AlertLogID) ;
+ -- synthesis translate_on
+ return result ;
+ end function GetAlertLogPrintParent ;
+
+ ------------------------------------------------------------
+ impure function GetAlertLogPrintParent return AlertLogPrintParentType is
+ ------------------------------------------------------------
+ variable result : AlertLogPrintParentType ;
+ begin
+ -- synthesis translate_off
+ result := AlertLogStruct.GetAlertLogPrintParent(ALERTLOG_DEFAULT_ID) ;
+ -- synthesis translate_on
+ return result ;
+ end function GetAlertLogPrintParent ;
+
+ ------------------------------------------------------------
+ procedure SetAlertLogReportMode(AlertLogID : AlertLogIDType ; ReportMode : AlertLogReportModeType) is
+ ------------------------------------------------------------
+ begin
+ -- synthesis translate_off
+ AlertLogStruct.SetAlertLogReportMode(AlertLogID, ReportMode) ;
+ -- synthesis translate_on
+ end procedure SetAlertLogReportMode ;
+
+ ------------------------------------------------------------
+ procedure SetAlertLogReportMode( ReportMode : AlertLogReportModeType) is
+ ------------------------------------------------------------
+ begin
+ -- synthesis translate_off
+ AlertLogStruct.SetAlertLogReportMode(ALERTLOG_DEFAULT_ID, ReportMode) ;
+ -- synthesis translate_on
+ end procedure SetAlertLogReportMode ;
+
+ ------------------------------------------------------------
+ impure function GetAlertLogReportMode(AlertLogID : AlertLogIDType) return AlertLogReportModeType is
+ ------------------------------------------------------------
+ variable result : AlertLogReportModeType ;
+ begin
+ -- synthesis translate_off
+ result := AlertLogStruct.GetAlertLogReportMode(AlertLogID) ;
+ -- synthesis translate_on
+ return result ;
+ end function GetAlertLogReportMode ;
+
+ ------------------------------------------------------------
+ impure function GetAlertLogReportMode return AlertLogReportModeType is
+ ------------------------------------------------------------
+ variable result : AlertLogReportModeType ;
+ begin
+ -- synthesis translate_off
+ result := AlertLogStruct.GetAlertLogReportMode(ALERTLOG_DEFAULT_ID) ;
+ -- synthesis translate_on
+ return result ;
+ end function GetAlertLogReportMode ;
+
+ ------------------------------------------------------------
+ procedure SetAlertLogOptions (
+ ------------------------------------------------------------
+ FailOnWarning : OsvvmOptionsType := OPT_INIT_PARM_DETECT ;
+ FailOnDisabledErrors : OsvvmOptionsType := OPT_INIT_PARM_DETECT ;
+ FailOnRequirementErrors : OsvvmOptionsType := OPT_INIT_PARM_DETECT ;
+ ReportHierarchy : OsvvmOptionsType := OPT_INIT_PARM_DETECT ;
+ WriteAlertErrorCount : OsvvmOptionsType := OPT_INIT_PARM_DETECT ;
+ WriteAlertLevel : OsvvmOptionsType := OPT_INIT_PARM_DETECT ;
+ WriteAlertName : OsvvmOptionsType := OPT_INIT_PARM_DETECT ;
+ WriteAlertTime : OsvvmOptionsType := OPT_INIT_PARM_DETECT ;
+ WriteLogErrorCount : OsvvmOptionsType := OPT_INIT_PARM_DETECT ;
+ WriteLogLevel : OsvvmOptionsType := OPT_INIT_PARM_DETECT ;
+ WriteLogName : OsvvmOptionsType := OPT_INIT_PARM_DETECT ;
+ WriteLogTime : OsvvmOptionsType := OPT_INIT_PARM_DETECT ;
+ PrintPassed : OsvvmOptionsType := OPT_INIT_PARM_DETECT ;
+ PrintAffirmations : OsvvmOptionsType := OPT_INIT_PARM_DETECT ;
+ PrintDisabledAlerts : OsvvmOptionsType := OPT_INIT_PARM_DETECT ;
+ PrintRequirements : OsvvmOptionsType := OPT_INIT_PARM_DETECT ;
+ PrintIfHaveRequirements : OsvvmOptionsType := OPT_INIT_PARM_DETECT ;
+ DefaultPassedGoal : integer := integer'left ;
+ 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 ;
+ IdSeparator : string := OSVVM_STRING_INIT_PARM_DETECT
+ ) is
+ begin
+ -- synthesis translate_off
+ AlertLogStruct.SetAlertLogOptions (
+ FailOnWarning => FailOnWarning,
+ FailOnDisabledErrors => FailOnDisabledErrors,
+ FailOnRequirementErrors => FailOnRequirementErrors,
+ ReportHierarchy => ReportHierarchy,
+ WriteAlertErrorCount => WriteAlertErrorCount,
+ WriteAlertLevel => WriteAlertLevel,
+ WriteAlertName => WriteAlertName,
+ WriteAlertTime => WriteAlertTime,
+ WriteLogErrorCount => WriteLogErrorCount,
+ WriteLogLevel => WriteLogLevel,
+ WriteLogName => WriteLogName,
+ WriteLogTime => WriteLogTime,
+ PrintPassed => PrintPassed,
+ PrintAffirmations => PrintAffirmations,
+ PrintDisabledAlerts => PrintDisabledAlerts,
+ PrintRequirements => PrintRequirements,
+ PrintIfHaveRequirements => PrintIfHaveRequirements,
+ DefaultPassedGoal => DefaultPassedGoal,
+ AlertPrefix => AlertPrefix,
+ LogPrefix => LogPrefix,
+ ReportPrefix => ReportPrefix,
+ DoneName => DoneName,
+ PassName => PassName,
+ FailName => FailName,
+ IdSeparator => IdSeparator
+ );
+ -- synthesis translate_on
+ end procedure SetAlertLogOptions ;
+
+ ------------------------------------------------------------
+ procedure ReportAlertLogOptions is
+ ------------------------------------------------------------
+ begin
+ -- synthesis translate_off
+ AlertLogStruct.ReportAlertLogOptions ;
+ -- synthesis translate_on
+ end procedure ReportAlertLogOptions ;
+
+
+
+ -- synthesis translate_off
+
+ ------------------------------------------------------------
+ impure function GetAlertLogFailOnWarning return OsvvmOptionsType is
+ ------------------------------------------------------------
+ begin
+ return AlertLogStruct.GetAlertLogFailOnWarning ;
+ end function GetAlertLogFailOnWarning ;
+
+ ------------------------------------------------------------
+ impure function GetAlertLogFailOnDisabledErrors return OsvvmOptionsType is
+ ------------------------------------------------------------
+ begin
+ return AlertLogStruct.GetAlertLogFailOnDisabledErrors ;
+ end function GetAlertLogFailOnDisabledErrors ;
+
+ ------------------------------------------------------------
+ impure function GetAlertLogFailOnRequirementErrors return OsvvmOptionsType is
+ ------------------------------------------------------------
+ begin
+ return AlertLogStruct.GetAlertLogFailOnRequirementErrors ;
+ end function GetAlertLogFailOnRequirementErrors ;
+
+ ------------------------------------------------------------
+ impure function GetAlertLogReportHierarchy return OsvvmOptionsType 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 GetAlertLogWriteAlertErrorCount return OsvvmOptionsType is
+ ------------------------------------------------------------
+ begin
+ return AlertLogStruct.GetAlertLogWriteAlertErrorCount ;
+ end function GetAlertLogWriteAlertErrorCount ;
+
+ ------------------------------------------------------------
+ impure function GetAlertLogWriteAlertLevel return OsvvmOptionsType is
+ ------------------------------------------------------------
+ begin
+ return AlertLogStruct.GetAlertLogWriteAlertLevel ;
+ end function GetAlertLogWriteAlertLevel ;
+
+ ------------------------------------------------------------
+ impure function GetAlertLogWriteAlertName return OsvvmOptionsType is
+ ------------------------------------------------------------
+ begin
+ return AlertLogStruct.GetAlertLogWriteAlertName ;
+ end function GetAlertLogWriteAlertName ;
+
+ ------------------------------------------------------------
+ impure function GetAlertLogWriteAlertTime return OsvvmOptionsType is
+ ------------------------------------------------------------
+ begin
+ return AlertLogStruct.GetAlertLogWriteAlertTime ;
+ end function GetAlertLogWriteAlertTime ;
+
+ ------------------------------------------------------------
+ impure function GetAlertLogWriteLogErrorCount return OsvvmOptionsType is
+ ------------------------------------------------------------
+ begin
+ return AlertLogStruct.GetAlertLogWriteLogErrorCount ;
+ end function GetAlertLogWriteLogErrorCount ;
+
+ ------------------------------------------------------------
+ impure function GetAlertLogWriteLogLevel return OsvvmOptionsType is
+ ------------------------------------------------------------
+ begin
+ return AlertLogStruct.GetAlertLogWriteLogLevel ;
+ end function GetAlertLogWriteLogLevel ;
+
+ ------------------------------------------------------------
+ impure function GetAlertLogWriteLogName return OsvvmOptionsType is
+ ------------------------------------------------------------
+ begin
+ return AlertLogStruct.GetAlertLogWriteLogName ;
+ end function GetAlertLogWriteLogName ;
+
+ ------------------------------------------------------------
+ impure function GetAlertLogWriteLogTime return OsvvmOptionsType is
+ ------------------------------------------------------------
+ begin
+ return AlertLogStruct.GetAlertLogWriteLogTime ;
+ end function GetAlertLogWriteLogTime ;
+
+ ------------------------------------------------------------
+ impure function GetAlertLogPrintPassed return OsvvmOptionsType is
+ ------------------------------------------------------------
+ begin
+ return AlertLogStruct.GetAlertLogPrintPassed ;
+ end function GetAlertLogPrintPassed ;
+
+ ------------------------------------------------------------
+ impure function GetAlertLogPrintAffirmations return OsvvmOptionsType is
+ ------------------------------------------------------------
+ begin
+ return AlertLogStruct.GetAlertLogPrintAffirmations ;
+ end function GetAlertLogPrintAffirmations ;
+
+ ------------------------------------------------------------
+ impure function GetAlertLogPrintDisabledAlerts return OsvvmOptionsType is
+ ------------------------------------------------------------
+ begin
+ return AlertLogStruct.GetAlertLogPrintDisabledAlerts ;
+ end function GetAlertLogPrintDisabledAlerts ;
+
+ ------------------------------------------------------------
+ impure function GetAlertLogPrintRequirements return OsvvmOptionsType is
+ ------------------------------------------------------------
+ begin
+ return AlertLogStruct.GetAlertLogPrintRequirements ;
+ end function GetAlertLogPrintRequirements ;
+
+ ------------------------------------------------------------
+ impure function GetAlertLogPrintIfHaveRequirements return OsvvmOptionsType is
+ ------------------------------------------------------------
+ begin
+ return AlertLogStruct.GetAlertLogPrintIfHaveRequirements ;
+ end function GetAlertLogPrintIfHaveRequirements ;
+
+ ------------------------------------------------------------
+ impure function GetAlertLogDefaultPassedGoal return integer is
+ ------------------------------------------------------------
+ begin
+ return AlertLogStruct.GetAlertLogDefaultPassedGoal ;
+ end function GetAlertLogDefaultPassedGoal ;
+
+ ------------------------------------------------------------
+ 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 ;
+-- Log(OSVVM_ALERTLOG_ID, "SetLogEnable(OSVVM_ALERTLOG_ID, " & Name(1 to NameLen) & ", TRUE) ;", DEBUG) ;
+ LogLevel := LogType'value("" & Name(1 to NameLen)) ; -- "" & added for RivieraPro 2020.10
+ 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 ;
+ variable Result : string(1 to A'length) ;
+ begin
+ if aA(LenA) = ':' then
+ LenA := LenA - 1 ;
+ end if ;
+ for i in LenA downto 1 loop
+ if aA(i) = ':' then
+--!! GHDL Issue
+-- return (1 to LenA - i => aA(i+1 to LenA)) ;
+ Result(1 to LenA - i) := aA(i+1 to LenA) ;
+ return Result(1 to LenA - i) ;
+ end if ;
+ end loop ;
+ return aA(1 to LenA) ;
+ end function PathTail ;
+
+
+ ------------------------------------------------------------
+ -- MetaMatch
+ -- Similar to STD_MATCH, except
+ -- it returns TRUE for U=U, X=X, Z=Z, and W=W
+ -- All other values are consistent with STD_MATCH
+ -- MetaMatch, BooleanTableType, and MetaMatchTable are derivatives
+ -- of STD_MATCH from IEEE.Numeric_Std copyright by IEEE.
+ -- Numeric_Std is also released under the Apache License, Version 2.0.
+ -- Coding Styles were updated to match OSVVM
+ ------------------------------------------------------------
+
+ type BooleanTableType is array(std_ulogic, std_ulogic) of boolean;
+
+ constant MetaMatchTable : BooleanTableType := (
+ --------------------------------------------------------------------------
+ -- U X 0 1 Z W L H -
+ --------------------------------------------------------------------------
+ (TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE), -- | U |
+ (FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE), -- | X |
+ (FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE), -- | 0 |
+ (FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, TRUE), -- | 1 |
+ (FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE), -- | Z |
+ (FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE), -- | W |
+ (FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE), -- | L |
+ (FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, TRUE), -- | H |
+ (TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE) -- | - |
+ );
+
+ function MetaMatch (l, r : std_ulogic) return boolean is
+ begin
+ return MetaMatchTable(l, r);
+ end function MetaMatch;
+
+ function MetaMatch (L, R : std_ulogic_vector) return boolean is
+ alias aL : std_ulogic_vector(1 to L'length) is L;
+ alias aR : std_ulogic_vector(1 to R'length) is R;
+ begin
+ if aL'length /= aR'length then
+ --! log(OSVVM_ALERTLOG_ID, "AlertLogPkg.MetaMatch: Length Mismatch", DEBUG) ;
+ return FALSE;
+ else
+ for i in aL'range loop
+ if not (MetaMatchTable(aL(i), aR(i))) then
+ return FALSE;
+ end if;
+ end loop;
+ return TRUE;
+ end if;
+ end function MetaMatch;
+
+ function MetaMatch (L, R : unresolved_unsigned) return boolean is
+ begin
+ return MetaMatch( std_ulogic_vector(L), std_ulogic_vector(R)) ;
+ end function MetaMatch;
+
+ function MetaMatch (L, R : unresolved_signed) return boolean is
+ begin
+ return MetaMatch( std_ulogic_vector(L), std_ulogic_vector(R)) ;
+ end function MetaMatch;
+
+ ------------------------------------------------------------
+ -- Helper function for NewID in data structures
+ function ResolvePrintParent (
+ ------------------------------------------------------------
+ UniqueParent : boolean ;
+ PrintParent : AlertLogPrintParentType
+ ) return AlertLogPrintParentType is
+ variable result : AlertLogPrintParentType ;
+ begin
+ if (not UniqueParent) and PrintParent = PRINT_NAME_AND_PARENT then
+ result := PRINT_NAME ;
+ else
+ result := PrintParent ;
+ end if ;
+ return result ;
+ end function ResolvePrintParent ;
+
+end package body AlertLogPkg ;
diff --git a/testsuite/gna/issue1980/NamePkg.vhd b/testsuite/gna/issue1980/NamePkg.vhd
new file mode 100644
index 000000000..99831fda5
--- /dev/null
+++ b/testsuite/gna/issue1980/NamePkg.vhd
@@ -0,0 +1,137 @@
+--
+-- File Name: NamePkg.vhd
+-- Design Unit Name: NamePkg
+-- Revision: STANDARD VERSION
+--
+-- Maintainer: Jim Lewis email: jim@synthworks.com
+-- Contributor(s):
+-- Jim Lewis SynthWorks
+--
+--
+-- Package Defines
+-- Data structure for name.
+--
+-- Developed for:
+-- SynthWorks Design Inc.
+-- VHDL Training Classes
+-- 11898 SW 128th Ave. Tigard, Or 97223
+-- http://www.SynthWorks.com
+--
+-- Revision History:
+-- Date Version Description
+-- 02/2022 2022.02 Added NameLength method to NamePType
+-- 01/2020 2020.01 Updated Licenses to Apache
+-- 05/2015 2015.06 Added input to Get to return when not initialized
+-- 12/2014: 2014.07a Removed initialized pointers which can lead to memory leaks.
+-- 07/2014: 2014.07 Moved specialization required by CoveragePkg to CoveragePkg
+-- Separated name handling from message handling to simplify naming
+-- 06/2010: 0.1 Initial revision
+--
+--
+-- This file is part of OSVVM.
+--
+-- Copyright (c) 2010 - 2020 by SynthWorks Design Inc.
+--
+-- Licensed under the Apache License, Version 2.0 (the "License");
+-- you may not use this file except in compliance with the License.
+-- You may obtain a copy of the License at
+--
+-- https://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+--
+
+use std.textio.all ;
+
+package NamePkg is
+
+ type NamePType is protected
+ procedure Set (NameIn : String) ;
+ impure function Get (DefaultName : string := "") return string ;
+ impure function GetOpt return string ;
+ impure function IsSet return boolean ;
+ impure function NameLength return integer ;
+ procedure Clear ; -- clear name
+ procedure Deallocate ; -- effectively alias to clear name
+ end protected NamePType ;
+
+end package NamePkg ;
+
+--- ///////////////////////////////////////////////////////////////////////////
+--- ///////////////////////////////////////////////////////////////////////////
+--- ///////////////////////////////////////////////////////////////////////////
+
+package body NamePkg is
+ type NamePType is protected body
+
+ variable NamePtr : line ;
+
+ ------------------------------------------------------------
+ procedure Set (NameIn : String) is
+ ------------------------------------------------------------
+ begin
+ deallocate(NamePtr) ;
+ NamePtr := new string'(NameIn) ;
+ end procedure Set ;
+
+ ------------------------------------------------------------
+ impure function Get (DefaultName : string := "") return string is
+ ------------------------------------------------------------
+ begin
+ if NamePtr = NULL then
+ return DefaultName ;
+ else
+ return NamePtr.all ;
+ end if ;
+ end function Get ;
+
+ ------------------------------------------------------------
+ impure function GetOpt return string is
+ ------------------------------------------------------------
+ begin
+ if NamePtr = NULL then
+ return NUL & "" ;
+ else
+ return NamePtr.all ;
+ end if ;
+ end function GetOpt ;
+
+ ------------------------------------------------------------
+ impure function IsSet return boolean is
+ ------------------------------------------------------------
+ begin
+ return NamePtr /= NULL ;
+ end function IsSet ;
+
+ ------------------------------------------------------------
+ impure function NameLength return integer is
+ ------------------------------------------------------------
+ begin
+ if NamePtr = NULL then
+ return 0 ;
+ else
+ return NamePtr.all'length ;
+ end if ;
+ end function NameLength ;
+
+ ------------------------------------------------------------
+ procedure Clear is -- clear name
+ ------------------------------------------------------------
+ begin
+ deallocate(NamePtr) ;
+ end procedure Clear ;
+
+ ------------------------------------------------------------
+ procedure Deallocate is -- clear name
+ ------------------------------------------------------------
+ begin
+ Clear ;
+ end procedure Deallocate ;
+
+ end protected body NamePType ;
+
+end package body NamePkg ; \ No newline at end of file
diff --git a/testsuite/gna/issue1980/OsvvmGlobalPkg.vhd b/testsuite/gna/issue1980/OsvvmGlobalPkg.vhd
new file mode 100644
index 000000000..7d94692df
--- /dev/null
+++ b/testsuite/gna/issue1980/OsvvmGlobalPkg.vhd
@@ -0,0 +1,427 @@
+--
+-- File Name: OsvvmGlobalPkg.vhd
+-- Design Unit Name: OsvvmGlobalPkg
+-- Revision: STANDARD VERSION, revision 2015.01
+--
+-- Maintainer: Jim Lewis email: jim@synthworks.com
+-- Contributor(s):
+-- Jim Lewis jim@synthworks.com
+--
+--
+-- Description:
+-- Global Settings for OSVVM packages
+--
+--
+-- Developed for:
+-- SynthWorks Design Inc.
+-- VHDL Training Classes
+-- 11898 SW 128th Ave. Tigard, Or 97223
+-- http://www.SynthWorks.com
+--
+-- Revision History:
+-- Date Version Description
+-- 02/2022 2022.02 Added support for IdSeparator.
+-- Supports PrintParent mode PRINT_NAME_AND_PARENT. <Parent Name> <IdSeparator> <AlertLogID Name>.
+-- 01/2020 2020.01 Updated Licenses to Apache
+-- 01/2014 2015.01 Initial revision
+--
+--
+-- This file is part of OSVVM.
+--
+-- Copyright (c) 2015 - 2020 by SynthWorks Design Inc.
+--
+-- Licensed under the Apache License, Version 2.0 (the "License");
+-- you may not use this file except in compliance with the License.
+-- You may obtain a copy of the License at
+--
+-- https://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+--
+
+library ieee ;
+use std.textio.all ;
+
+use work.NamePkg.all ;
+
+package OsvvmGlobalPkg is
+ -- FILE IO Global File Identifier -- Open using AlertLogPkg.TranscriptOpen
+-- file TranscriptFile : text ;
+
+ -- Shared Options Type used in OSVVM
+ type OsvvmOptionsType is (OPT_INIT_PARM_DETECT, OPT_USE_DEFAULT, DISABLED, FALSE, ENABLED, TRUE) ;
+ function IsEnabled (A : OsvvmOptionsType) return boolean ; -- Requires that TRUE is last and ENABLED is 2nd to last
+ function to_OsvvmOptionsType (A : boolean) return OsvvmOptionsType ;
+
+ -- Defaults for String values
+ constant OSVVM_DEFAULT_ALERT_PREFIX : string := "%% Alert" ;
+ constant OSVVM_DEFAULT_LOG_PREFIX : string := "%% Log " ;
+ constant OSVVM_DEFAULT_WRITE_PREFIX : string := "%% " ;
+ constant OSVVM_DEFAULT_DONE_NAME : string := "DONE" ;
+ constant OSVVM_DEFAULT_PASS_NAME : string := "PASSED" ;
+ constant OSVVM_DEFAULT_FAIL_NAME : string := "FAILED" ;
+ constant OSVVM_DEFAULT_ID_SEPARATOR : string := ": " ;
+ constant OSVVM_STRING_INIT_PARM_DETECT : string := NUL & NUL & NUL ;
+ constant OSVVM_STRING_USE_DEFAULT : string := NUL & "" ;
+
+ -- Coverage Settings
+ constant OSVVM_DEFAULT_WRITE_PASS_FAIL : OsvvmOptionsType := FALSE ;
+ constant OSVVM_DEFAULT_WRITE_BIN_INFO : OsvvmOptionsType := TRUE ;
+ constant OSVVM_DEFAULT_WRITE_COUNT : OsvvmOptionsType := TRUE ;
+ constant OSVVM_DEFAULT_WRITE_ANY_ILLEGAL : OsvvmOptionsType := FALSE ;
+
+ ------------------------------------------------------------
+ procedure SetOsvvmGlobalOptions (
+ ------------------------------------------------------------
+ WritePassFail : OsvvmOptionsType := OPT_INIT_PARM_DETECT ;
+ WriteBinInfo : OsvvmOptionsType := OPT_INIT_PARM_DETECT ;
+ WriteCount : OsvvmOptionsType := OPT_INIT_PARM_DETECT ;
+ WriteAnyIllegal : OsvvmOptionsType := OPT_INIT_PARM_DETECT ;
+ WritePrefix : 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 ;
+ IdSeparator : string := OSVVM_STRING_INIT_PARM_DETECT
+ ) ;
+
+ ------------------------------------------------------------
+ -- Accessor Functions
+ function ResolveOsvvmOption(A, B, C : OsvvmOptionsType) return OsvvmOptionsType ;
+ function ResolveOsvvmOption(A, B, C, D : OsvvmOptionsType) return OsvvmOptionsType ;
+ function IsOsvvmStringSet (A : string) return boolean ;
+ function ResolveOsvvmOption(A, B : string) return string ;
+ function ResolveOsvvmOption(A, B, C : string) return string ;
+ function ResolveOsvvmOption(A, B, C, D : string) return string ;
+
+ impure function ResolveOsvvmWritePrefix (A : String) return string ;
+ impure function ResolveOsvvmDoneName (A : String) return string ;
+ impure function ResolveOsvvmPassName (A : String) return string ;
+ impure function ResolveOsvvmFailName (A : String) return string ;
+ impure function ResolveOsvvmIdSeparator (A : String) return string ;
+
+ impure function ResolveCovWritePassFail (A : OsvvmOptionsType) return OsvvmOptionsType ; -- Cov
+ impure function ResolveCovWriteBinInfo (A : OsvvmOptionsType) return OsvvmOptionsType ; -- Cov
+ impure function ResolveCovWriteCount (A : OsvvmOptionsType) return OsvvmOptionsType ; -- Cov
+ impure function ResolveCovWriteAnyIllegal(A : OsvvmOptionsType) return OsvvmOptionsType ; -- Cov
+
+ impure function ResolveOsvvmWritePrefix (A, B : String) return string ;
+ impure function ResolveOsvvmDoneName (A, B : String) return string ;
+ impure function ResolveOsvvmPassName (A, B : String) return string ;
+ impure function ResolveOsvvmFailName (A, B : String) return string ;
+
+ impure function ResolveCovWritePassFail (A, B : OsvvmOptionsType) return OsvvmOptionsType ; -- Cov
+ impure function ResolveCovWriteBinInfo (A, B : OsvvmOptionsType) return OsvvmOptionsType ; -- Cov
+ impure function ResolveCovWriteCount (A, B : OsvvmOptionsType) return OsvvmOptionsType ; -- Cov
+ impure function ResolveCovWriteAnyIllegal(A, B : OsvvmOptionsType) return OsvvmOptionsType ; -- Cov
+
+ procedure SetOsvvmDefaultTimeUnits (A : time) ;
+ impure function GetOsvvmDefaultTimeUnits return time ;
+
+ procedure OsvvmDeallocate ;
+
+ type OptionsPType is protected
+ procedure Set (A: OsvvmOptionsType) ;
+ impure function get return OsvvmOptionsType ;
+ end protected OptionsPType ;
+
+ type OsvvmDefaultTimeUnitsPType is protected
+ procedure Set (A: time) ;
+ impure function get return time ;
+ end protected OsvvmDefaultTimeUnitsPType ;
+end OsvvmGlobalPkg ;
+
+--- ///////////////////////////////////////////////////////////////////////////
+--- ///////////////////////////////////////////////////////////////////////////
+--- ///////////////////////////////////////////////////////////////////////////
+
+package body OsvvmGlobalPkg is
+ type OptionsPType is protected body
+ variable GlobalVar : OsvvmOptionsType ;
+ procedure Set (A : OsvvmOptionsType) is
+ begin
+ GlobalVar := A ;
+ end procedure Set ;
+ impure function get return OsvvmOptionsType is
+ begin
+ return GlobalVar ;
+ end function get ;
+ end protected body OptionsPType ;
+
+ type OsvvmDefaultTimeUnitsPType is protected body
+ variable GlobalVar : time := std.env.resolution_limit ; -- VHDL-2008
+ procedure Set (A : time) is
+ begin
+ if A > std.env.resolution_limit then
+ GlobalVar := A ;
+ elsif A < std.env.resolution_limit then
+ report "SetOsvvmDefaultTimeUnits: time unit parameter too small" severity warning ;
+ end if ;
+ end procedure Set ;
+ impure function get return time is
+ begin
+ return GlobalVar ;
+ end function get ;
+ end protected body OsvvmDefaultTimeUnitsPType ;
+
+ shared variable WritePrefixVar : NamePType ;
+ shared variable DoneNameVar : NamePType ;
+ shared variable PassNameVar : NamePType ;
+ shared variable FailNameVar : NamePType ;
+ shared variable IdSeparatorVar : NamePType ;
+ shared variable WritePassFailVar : OptionsPType ; -- := FALSE ;
+ shared variable WriteBinInfoVar : OptionsPType ; -- := TRUE ;
+ shared variable WriteCountVar : OptionsPType ; -- := TRUE ;
+ shared variable WriteAnyIllegalVar : OptionsPType ; -- := FALSE ;
+ shared variable OsvvmDefaultTimeUnitsVar : OsvvmDefaultTimeUnitsPType ;
+
+ function IsEnabled (A : OsvvmOptionsType) return boolean is
+ begin
+ return A >= ENABLED ;
+ end function IsEnabled ;
+
+ function to_OsvvmOptionsType (A : boolean) return OsvvmOptionsType is
+ begin
+ if A then
+ return TRUE ;
+ else
+ return FALSE ;
+ end if ;
+ end function to_OsvvmOptionsType ;
+
+
+ ------------------------------------------------------------
+ procedure SetOsvvmGlobalOptions (
+ ------------------------------------------------------------
+ WritePassFail : OsvvmOptionsType := OPT_INIT_PARM_DETECT ;
+ WriteBinInfo : OsvvmOptionsType := OPT_INIT_PARM_DETECT ;
+ WriteCount : OsvvmOptionsType := OPT_INIT_PARM_DETECT ;
+ WriteAnyIllegal : OsvvmOptionsType := OPT_INIT_PARM_DETECT ;
+ WritePrefix : 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 ;
+ IdSeparator : string := OSVVM_STRING_INIT_PARM_DETECT
+ ) is
+ begin
+ if WritePassFail /= OPT_INIT_PARM_DETECT then
+ WritePassFailVar.Set(WritePassFail) ;
+ end if ;
+ if WriteBinInfo /= OPT_INIT_PARM_DETECT then
+ WriteBinInfoVar.Set(WriteBinInfo) ;
+ end if ;
+ if WriteCount /= OPT_INIT_PARM_DETECT then
+ WriteCountVar.Set(WriteCount) ;
+ end if ;
+ if WriteAnyIllegal /= OPT_INIT_PARM_DETECT then
+ WriteAnyIllegalVar.Set(WriteAnyIllegal) ;
+ end if ;
+ if WritePrefix /= OSVVM_STRING_INIT_PARM_DETECT then
+ WritePrefixVar.Set(WritePrefix) ;
+ 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 ;
+ if IdSeparator /= OSVVM_STRING_INIT_PARM_DETECT then
+ IdSeparatorVar.Set(IdSeparator) ;
+ end if ;
+ end procedure SetOsvvmGlobalOptions ;
+
+ ------------------------------------------------------------
+ -- Accessor Functions
+ -- Local Function
+ function IsOsvvmOptionSet (A : OsvvmOptionsType) return boolean is
+ begin
+ return A > OPT_USE_DEFAULT ;
+ end function IsOsvvmOptionSet ;
+
+ function ResolveOsvvmOption(A, B, C : OsvvmOptionsType) return OsvvmOptionsType is
+ begin
+ if IsOsvvmOptionSet(A) then
+ return A ;
+ elsif IsOsvvmOptionSet(B) then
+ return B ;
+ else
+ return C ;
+ end if ;
+ end function ResolveOsvvmOption ;
+
+ function ResolveOsvvmOption(A, B, C, D : OsvvmOptionsType) return OsvvmOptionsType is
+ begin
+ if IsOsvvmOptionSet(A) then
+ return A ;
+ elsif IsOsvvmOptionSet(B) then
+ return B ;
+ elsif IsOsvvmOptionSet(C) then
+ return C ;
+ else
+ return D ;
+ end if ;
+ end function ResolveOsvvmOption ;
+
+ -- Local Function
+ function IsOsvvmStringSet (A : string) return boolean is
+ begin
+ if A'length = 0 then -- Null strings permitted
+ return TRUE ;
+ else
+ return A(A'left) /= NUL ;
+ end if;
+ end function IsOsvvmStringSet ;
+
+ function ResolveOsvvmOption(A, B : string) return string is
+ begin
+ if IsOsvvmStringSet(A) then
+ return A ;
+ else
+ return B ;
+ end if ;
+ end function ResolveOsvvmOption ;
+
+ function ResolveOsvvmOption(A, B, C : string) return string is
+ begin
+ if IsOsvvmStringSet(A) then
+ return A ;
+ elsif IsOsvvmStringSet(B) then
+ return B ;
+ else
+ return C ;
+ end if ;
+ end function ResolveOsvvmOption ;
+
+ function ResolveOsvvmOption(A, B, C, D : string) return string is
+ begin
+ if IsOsvvmStringSet(A) then
+ return A ;
+ elsif IsOsvvmStringSet(B) then
+ return B ;
+ elsif IsOsvvmStringSet(C) then
+ return C ;
+ else
+ return D ;
+ end if ;
+ end function ResolveOsvvmOption ;
+
+
+ impure function ResolveOsvvmWritePrefix(A : String) return string is
+ begin
+ return ResolveOsvvmOption(A, WritePrefixVar.GetOpt, OSVVM_DEFAULT_WRITE_PREFIX) ;
+ end function ResolveOsvvmWritePrefix ;
+
+ impure function ResolveOsvvmDoneName(A : String) return string is
+ begin
+ return ResolveOsvvmOption(A, DoneNameVar.GetOpt, OSVVM_DEFAULT_DONE_NAME) ;
+ end function ResolveOsvvmDoneName ;
+
+ impure function ResolveOsvvmPassName(A : String) return string is
+ begin
+ return ResolveOsvvmOption(A, PassNameVar.GetOpt, OSVVM_DEFAULT_PASS_NAME) ;
+ end function ResolveOsvvmPassName ;
+
+ impure function ResolveOsvvmFailName(A : String) return string is
+ begin
+ return ResolveOsvvmOption(A, FailNameVar.GetOpt, OSVVM_DEFAULT_FAIL_NAME) ;
+ end function ResolveOsvvmFailName ;
+
+ impure function ResolveOsvvmIdSeparator(A : String) return string is
+ begin
+ return ResolveOsvvmOption(A, IdSeparatorVar.GetOpt, OSVVM_DEFAULT_ID_SEPARATOR) ;
+ end function ResolveOsvvmIdSeparator ;
+
+
+ impure function ResolveCovWritePassFail(A : OsvvmOptionsType) return OsvvmOptionsType is
+ begin
+ return ResolveOsvvmOption(A, WritePassFailVar.Get, OSVVM_DEFAULT_WRITE_PASS_FAIL) ;
+ end function ResolveCovWritePassFail ; -- Cov
+
+ impure function ResolveCovWriteBinInfo(A : OsvvmOptionsType) return OsvvmOptionsType is
+ begin
+ return ResolveOsvvmOption(A, WriteBinInfoVar.Get, OSVVM_DEFAULT_WRITE_BIN_INFO) ;
+ end function ResolveCovWriteBinInfo ; -- Cov
+
+ impure function ResolveCovWriteCount(A : OsvvmOptionsType) return OsvvmOptionsType is
+ begin
+ return ResolveOsvvmOption(A, WriteCountVar.Get, OSVVM_DEFAULT_WRITE_COUNT) ;
+ end function ResolveCovWriteCount ; -- Cov
+
+ impure function ResolveCovWriteAnyIllegal(A : OsvvmOptionsType) return OsvvmOptionsType is
+ begin
+ return ResolveOsvvmOption(A, WriteAnyIllegalVar.Get, OSVVM_DEFAULT_WRITE_ANY_ILLEGAL) ;
+ end function ResolveCovWriteAnyIllegal ; -- Cov
+
+
+ impure function ResolveOsvvmWritePrefix(A, B : String) return string is
+ begin
+ return ResolveOsvvmOption(A, B, WritePrefixVar.GetOpt, OSVVM_DEFAULT_WRITE_PREFIX) ;
+ end function ResolveOsvvmWritePrefix ;
+
+ impure function ResolveOsvvmDoneName(A, B : String) return string is
+ begin
+ return ResolveOsvvmOption(A, DoneNameVar.GetOpt, OSVVM_DEFAULT_DONE_NAME) ;
+ end function ResolveOsvvmDoneName ;
+
+ impure function ResolveOsvvmPassName(A, B : String) return string is
+ begin
+ return ResolveOsvvmOption(A, B, PassNameVar.GetOpt, OSVVM_DEFAULT_PASS_NAME) ;
+ end function ResolveOsvvmPassName ;
+
+ impure function ResolveOsvvmFailName(A, B : String) return string is
+ begin
+ return ResolveOsvvmOption(A, B, FailNameVar.GetOpt, OSVVM_DEFAULT_FAIL_NAME) ;
+ end function ResolveOsvvmFailName ;
+
+
+ impure function ResolveCovWritePassFail(A, B : OsvvmOptionsType) return OsvvmOptionsType is
+ begin
+ return ResolveOsvvmOption(A, B, WritePassFailVar.Get, OSVVM_DEFAULT_WRITE_PASS_FAIL) ;
+ end function ResolveCovWritePassFail ; -- Cov
+
+ impure function ResolveCovWriteBinInfo(A, B : OsvvmOptionsType) return OsvvmOptionsType is
+ begin
+ return ResolveOsvvmOption(A, B, WriteBinInfoVar.Get, OSVVM_DEFAULT_WRITE_BIN_INFO) ;
+ end function ResolveCovWriteBinInfo ; -- Cov
+
+ impure function ResolveCovWriteCount(A, B : OsvvmOptionsType) return OsvvmOptionsType is
+ begin
+ return ResolveOsvvmOption(A, B, WriteCountVar.Get, OSVVM_DEFAULT_WRITE_COUNT) ;
+ end function ResolveCovWriteCount ; -- Cov
+
+ impure function ResolveCovWriteAnyIllegal(A, B : OsvvmOptionsType) return OsvvmOptionsType is
+ begin
+ return ResolveOsvvmOption(A, B, WriteAnyIllegalVar.Get, OSVVM_DEFAULT_WRITE_ANY_ILLEGAL) ;
+ end function ResolveCovWriteAnyIllegal ; -- Cov
+
+ procedure SetOsvvmDefaultTimeUnits (A : time) is
+ begin
+ OsvvmDefaultTimeUnitsVar.Set(A) ;
+ end procedure SetOsvvmDefaultTimeUnits ;
+
+ impure function GetOsvvmDefaultTimeUnits return time is
+ begin
+ return OsvvmDefaultTimeUnitsVar.Get ;
+ end function GetOsvvmDefaultTimeUnits ;
+
+ procedure OsvvmDeallocate is
+ begin
+ -- Free up space used by NamePType within OsvvmGlobalPkg
+ WritePrefixVar.Deallocate ;
+ DoneNameVar.Deallocate ;
+ PassNameVar.Deallocate ;
+ FailNameVar.Deallocate ;
+ WritePassFailVar.Set(FALSE) ; -- := FALSE ;
+ WriteBinInfoVar.Set(TRUE ) ; -- := TRUE ;
+ WriteCountVar.Set(TRUE ) ; -- := TRUE ;
+ WriteAnyIllegalVar.Set(FALSE) ; -- := FALSE ;
+
+ end procedure OsvvmDeallocate ;
+
+end package body OsvvmGlobalPkg ; \ No newline at end of file
diff --git a/testsuite/gna/issue1980/OsvvmRun.yml b/testsuite/gna/issue1980/OsvvmRun.yml
new file mode 100644
index 000000000..34e520ad2
--- /dev/null
+++ b/testsuite/gna/issue1980/OsvvmRun.yml
@@ -0,0 +1,20 @@
+Version: 1.0
+Build:
+ Name: OsvvmLibraries_RunAllTests
+ Date: 2022-02-26T10:31+0100
+ Simulator: GHDL
+ Version: GHDL-2.0.0-dev
+TestSuites:
+ - Name: Axi4Full
+ TestCases:
+ - TestCaseName: TbAxi4_MemoryReadWriteDemo1
+ ElapsedTime: 0.631
+ - TestCaseName: TbAxi4_BasicReadWrite
+ ElapsedTime: 0.618
+ - TestCaseName: TbAxi4_RandomReadWrite
+ ElapsedTime: 0.628
+ - TestCaseName: TbAxi4_RandomReadWriteByte1
+ Name: "TbAxi4_BasicReadWrite"
+ Status: PASSED
+ Results: {TotalErrors: 0, AlertCount: {Failure: 0, Error: 0, Warning: 0}, PassedCount: 60, AffirmCount: 60, RequirementsPassed: 0, RequirementsGoal: 0, DisabledAlertCount: {Failure: 0, Error: 0, Warning: 0}}
+ FunctionalCoverage:
diff --git a/testsuite/gna/issue1980/TextUtilPkg.vhd b/testsuite/gna/issue1980/TextUtilPkg.vhd
new file mode 100644
index 000000000..98624e0ed
--- /dev/null
+++ b/testsuite/gna/issue1980/TextUtilPkg.vhd
@@ -0,0 +1,709 @@
+--
+-- File Name: TextUtilPkg.vhd
+-- Design Unit Name: TextUtilPkg
+-- Revision: STANDARD VERSION
+--
+-- Maintainer: Jim Lewis email: jim@synthworks.com
+-- Contributor(s):
+-- Jim Lewis jim@synthworks.com
+--
+--
+-- Description:
+-- Shared Utilities for handling text files
+--
+--
+-- Developed for:
+-- SynthWorks Design Inc.
+-- VHDL Training Classes
+-- 11898 SW 128th Ave. Tigard, Or 97223
+-- http://www.SynthWorks.com
+--
+-- Revision History:
+-- Date Version Description
+-- 02/2022 2022.02 Updated to_hxstring to print U, X, Z, W, - when there are 4 in a row and ? for mixed meta
+-- Added Justify that aligns LEFT, RIGHT, and CENTER with parameters in a sensible order.
+-- 01/2022 2022.01 Added to_hxstring - based on hxwrite (in TbUtilPkg prior to release)
+-- 08/2020 2020.08 Added ReadUntilDelimiterOrEOL and FindDelimiter
+-- 01/2020 2020.01 Updated Licenses to Apache
+-- 11/2016 2016.11 Added IsUpper, IsLower, to_upper, to_lower
+-- 01/2016 2016.01 Update for L.all(L'left)
+-- 01/2015 2015.05 Initial revision
+--
+--
+-- This file is part of OSVVM.
+--
+-- Copyright (c) 2015 - 2020 by SynthWorks Design Inc.
+--
+-- Licensed under the Apache License, Version 2.0 (the "License");
+-- you may not use this file except in compliance with the License.
+-- You may obtain a copy of the License at
+--
+-- https://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+--
+
+use std.textio.all ;
+library ieee ;
+use ieee.std_logic_1164.all ;
+use ieee.numeric_std.all ;
+
+package TextUtilPkg is
+ ------------------------------------------------------------
+ function IsUpper (constant Char : character ) return boolean ;
+ function IsLower (constant Char : character ) return boolean ;
+ function to_lower (constant Char : character ) return character ;
+ function to_lower (constant Str : string ) return string ;
+ function to_upper (constant Char : character ) return character ;
+ function to_upper (constant Str : string ) return string ;
+ function IsHex (constant Char : character ) return boolean ;
+ function IsNumber (constant Char : character ) return boolean ;
+ function IsNumber (Name : string ) return boolean ;
+
+ function isstd_logic (constant Char : character ) return boolean ;
+
+ -- Crutch until VHDL-2019 conditional initialization
+ function IfElse(Expr : boolean ; A, B : string) return string ;
+
+ ------------------------------------------------------------
+ procedure SkipWhiteSpace (
+ ------------------------------------------------------------
+ variable L : InOut line ;
+ variable Empty : out boolean
+ ) ;
+ procedure SkipWhiteSpace (variable L : InOut line) ;
+
+ ------------------------------------------------------------
+ procedure EmptyOrCommentLine (
+ ------------------------------------------------------------
+ variable L : InOut line ;
+ variable Empty : InOut boolean ;
+ variable MultiLineComment : inout boolean
+ ) ;
+
+ ------------------------------------------------------------
+ procedure ReadUntilDelimiterOrEOL(
+ ------------------------------------------------------------
+ variable L : InOut line ;
+ variable Name : InOut line ;
+ constant Delimiter : In character ;
+ variable ReadValid : Out boolean
+ ) ;
+
+ ------------------------------------------------------------
+ procedure FindDelimiter(
+ ------------------------------------------------------------
+ variable L : InOut line ;
+ constant Delimiter : In character ;
+ variable Found : Out boolean
+ ) ;
+
+ ------------------------------------------------------------
+ procedure ReadHexToken (
+ -- Reads Upto Result'length values, less is ok.
+ -- Does not skip white space
+ ------------------------------------------------------------
+ variable L : InOut line ;
+ variable Result : Out std_logic_vector ;
+ variable StrLen : Out integer
+ ) ;
+
+ ------------------------------------------------------------
+ procedure ReadBinaryToken (
+ -- Reads Upto Result'length values, less is ok.
+ -- Does not skip white space
+ ------------------------------------------------------------
+ variable L : InOut line ;
+ variable Result : Out std_logic_vector ;
+ variable StrLen : Out integer
+ ) ;
+
+ ------------------------------------------------------------
+ -- to_hxstring
+ -- print in hex. If string contains X, then also print in binary
+ ------------------------------------------------------------
+ function to_hxstring ( A : std_ulogic_vector) return string ;
+ function to_hxstring ( A : unsigned) return string ;
+ function to_hxstring ( A : signed) return string ;
+
+ ------------------------------------------------------------
+ -- Justify
+ -- w/ Fill Character
+ -- w/o Fill character, Parameter order & names sensible
+ ------------------------------------------------------------
+ type AlignType is (RIGHT, LEFT, CENTER) ;
+
+ function Justify (
+ S : string ;
+ Amount : natural ;
+ Align : AlignType := LEFT
+ ) return string ;
+
+ function Justify (
+ S : string ;
+ Fill : character ;
+ Amount : natural ;
+ Align : AlignType := LEFT
+ ) return string ;
+
+ ------------------------------------------------------------
+ -- FileExists
+ -- Return TRUE if file exists
+ ------------------------------------------------------------
+ impure function FileExists(FileName : string) return boolean ;
+
+
+end TextUtilPkg ;
+
+--- ///////////////////////////////////////////////////////////////////////////
+--- ///////////////////////////////////////////////////////////////////////////
+--- ///////////////////////////////////////////////////////////////////////////
+
+package body TextUtilPkg is
+ type stdulogic_indexby_stdulogic is array (std_ulogic) of std_ulogic;
+
+ constant LOWER_TO_UPPER_OFFSET : integer := character'POS('a') - character'POS('A') ;
+
+ ------------------------------------------------------------
+ function "-" (R : character ; L : integer ) return character is
+ ------------------------------------------------------------
+ begin
+ return character'VAL(character'pos(R) - L) ;
+ end function "-" ;
+
+ ------------------------------------------------------------
+ function "+" (R : character ; L : integer ) return character is
+ ------------------------------------------------------------
+ begin
+ return character'VAL(character'pos(R) + L) ;
+ end function "+" ;
+
+ ------------------------------------------------------------
+ function IsUpper (constant Char : character ) return boolean is
+ ------------------------------------------------------------
+ begin
+ if Char >= 'A' and Char <= 'Z' then
+ return TRUE ;
+ else
+ return FALSE ;
+ end if ;
+ end function IsUpper ;
+
+ ------------------------------------------------------------
+ function IsLower (constant Char : character ) return boolean is
+ ------------------------------------------------------------
+ begin
+ if Char >= 'a' and Char <= 'z' then
+ return TRUE ;
+ else
+ return FALSE ;
+ end if ;
+ end function IsLower ;
+
+ ------------------------------------------------------------
+ function to_lower (constant Char : character ) return character is
+ ------------------------------------------------------------
+ begin
+ if IsUpper(Char) then
+ return Char + LOWER_TO_UPPER_OFFSET ;
+ else
+ return Char ;
+ end if ;
+ end function to_lower ;
+
+ ------------------------------------------------------------
+ function to_lower (constant Str : string ) return string is
+ ------------------------------------------------------------
+ variable result : string(Str'range) ;
+ begin
+ for i in Str'range loop
+ result(i) := to_lower(Str(i)) ;
+ end loop ;
+ return result ;
+ end function to_lower ;
+
+ ------------------------------------------------------------
+ function to_upper (constant Char : character ) return character is
+ ------------------------------------------------------------
+ begin
+ if IsLower(Char) then
+ return Char - LOWER_TO_UPPER_OFFSET ;
+ else
+ return Char ;
+ end if ;
+ end function to_upper ;
+
+ ------------------------------------------------------------
+ function to_upper (constant Str : string ) return string is
+ ------------------------------------------------------------
+ variable result : string(Str'range) ;
+ begin
+ for i in Str'range loop
+ result(i) := to_upper(Str(i)) ;
+ end loop ;
+ return result ;
+ end function to_upper ;
+
+ ------------------------------------------------------------
+ function IsHex (constant Char : character ) return boolean is
+ ------------------------------------------------------------
+ begin
+ if Char >= '0' and Char <= '9' then
+ return TRUE ;
+ elsif Char >= 'a' and Char <= 'f' then
+ return TRUE ;
+ elsif Char >= 'A' and Char <= 'F' then
+ return TRUE ;
+ else
+ return FALSE ;
+ end if ;
+ end function IsHex ;
+
+ ------------------------------------------------------------
+ function IsNumber (constant Char : character ) return boolean is
+ ------------------------------------------------------------
+ begin
+ return Char >= '0' and Char <= '9' ;
+ end function IsNumber ;
+
+ ------------------------------------------------------------
+ function IsNumber (Name : string ) return boolean is
+ ------------------------------------------------------------
+ begin
+ for i in Name'range loop
+ if not IsNumber(Name(i)) then
+ return FALSE ;
+ end if ;
+ end loop ;
+ return TRUE ;
+ end function IsNumber ;
+
+ ------------------------------------------------------------
+ function isstd_logic (constant Char : character ) return boolean is
+ ------------------------------------------------------------
+ begin
+ case Char is
+ when 'U' | 'X' | '0' | '1' | 'Z' | 'W' | 'L' | 'H' | '-' =>
+ return TRUE ;
+ when others =>
+ return FALSE ;
+ end case ;
+ end function isstd_logic ;
+
+ ------------------------------------------------------------
+ function IfElse(Expr : boolean ; A, B : string) return string is
+ ------------------------------------------------------------
+ begin
+ if Expr then
+ return A ;
+ else
+ return B ;
+ end if ;
+ end function IfElse ;
+
+-- ------------------------------------------------------------
+-- function iscomment (constant Char : character ) return boolean is
+-- ------------------------------------------------------------
+-- begin
+-- case Char is
+-- when '#' | '/' | '-' =>
+-- return TRUE ;
+-- when others =>
+-- return FALSE ;
+-- end case ;
+-- end function iscomment ;
+
+ ------------------------------------------------------------
+ procedure SkipWhiteSpace (
+ ------------------------------------------------------------
+ variable L : InOut line ;
+ variable Empty : out boolean
+ ) is
+ variable Valid : boolean ;
+ variable Char : character ;
+ constant NBSP : CHARACTER := CHARACTER'val(160); -- space character
+ begin
+ Empty := TRUE ;
+ WhiteSpLoop : while L /= null and L.all'length > 0 loop
+ if (L.all(L'left) = ' ' or L.all(L'left) = NBSP or L.all(L'left) = HT) then
+ read (L, Char, Valid) ;
+ exit when not Valid ;
+ else
+ Empty := FALSE ;
+ return ;
+ end if ;
+ end loop WhiteSpLoop ;
+ end procedure SkipWhiteSpace ;
+
+ ------------------------------------------------------------
+ procedure SkipWhiteSpace (
+ ------------------------------------------------------------
+ variable L : InOut line
+ ) is
+ variable Empty : boolean ;
+ begin
+ SkipWhiteSpace(L, Empty) ;
+ end procedure SkipWhiteSpace ;
+
+ ------------------------------------------------------------
+ -- Package Local
+ procedure FindCommentEnd (
+ ------------------------------------------------------------
+ variable L : InOut line ;
+ variable Empty : out boolean ;
+ variable MultiLineComment : inout boolean
+ ) is
+ variable Valid : boolean ;
+ variable Char : character ;
+ begin
+ MultiLineComment := TRUE ;
+ Empty := TRUE ;
+ FindEndOfCommentLoop : while L /= null and L.all'length > 1 loop
+ read(L, Char, Valid) ;
+ if Char = '*' and L.all(L'left) = '/' then
+ read(L, Char, Valid) ;
+ Empty := FALSE ;
+ MultiLineComment := FALSE ;
+ exit FindEndOfCommentLoop ;
+ end if ;
+ end loop ;
+ end procedure FindCommentEnd ;
+
+ ------------------------------------------------------------
+ procedure EmptyOrCommentLine (
+ ------------------------------------------------------------
+ variable L : InOut line ;
+ variable Empty : InOut boolean ;
+ variable MultiLineComment : inout boolean
+ ) is
+ variable Valid : boolean ;
+ variable Next2Char : string(1 to 2) ;
+ constant NBSP : CHARACTER := CHARACTER'val(160); -- space character
+ begin
+ if MultiLineComment then
+ FindCommentEnd(L, Empty, MultiLineComment) ;
+ end if ;
+
+ EmptyCheckLoop : while not MultiLineComment loop
+ SkipWhiteSpace(L, Empty) ;
+ exit when Empty ; -- line null or 0 in length detected by SkipWhite
+
+ Empty := TRUE ;
+
+ exit when L.all(L'left) = '#' ; -- shell style comment
+
+ if L.all'length >= 2 then
+ if L'ascending then
+ Next2Char := L.all(L'left to L'left+1) ;
+ else
+ Next2Char := L.all(L'left downto L'left-1) ;
+ end if;
+ exit when Next2Char = "//" ; -- C style comment
+ exit when Next2Char = "--" ; -- VHDL style comment
+
+ if Next2Char = "/*" then -- C style multi line comment
+ FindCommentEnd(L, Empty, MultiLineComment) ;
+ exit when Empty ;
+ next EmptyCheckLoop ; -- Found end of comment, restart processing line
+ end if ;
+ end if ;
+
+ Empty := FALSE ;
+ exit ;
+ end loop EmptyCheckLoop ;
+ end procedure EmptyOrCommentLine ;
+
+ ------------------------------------------------------------
+ procedure ReadUntilDelimiterOrEOL(
+ ------------------------------------------------------------
+ variable L : InOut line ;
+ variable Name : InOut line ;
+ constant Delimiter : In character ;
+ variable ReadValid : Out boolean
+ ) is
+ variable NameStr : string(1 to L'length) ;
+ variable ReadLen : integer := 1 ;
+ variable Good : boolean ;
+ begin
+ ReadValid := TRUE ;
+ for i in NameStr'range loop
+ Read(L, NameStr(i), Good) ;
+ ReadValid := ReadValid and Good ;
+ if NameStr(i) = Delimiter then
+ -- Read(L, NameStr(1 to i), ReadValid) ;
+ Name := new string'(NameStr(1 to i-1)) ;
+ exit ;
+ elsif i = NameStr'length then
+ -- Read(L, NameStr(1 to i), ReadValid) ;
+ Name := new string'(NameStr(1 to i)) ;
+ exit ;
+ end if ;
+ end loop ;
+ end procedure ReadUntilDelimiterOrEOL ;
+
+ ------------------------------------------------------------
+ procedure FindDelimiter(
+ ------------------------------------------------------------
+ variable L : InOut line ;
+ constant Delimiter : In character ;
+ variable Found : Out boolean
+ ) is
+ variable Char : Character ;
+ variable ReadValid : boolean ;
+ begin
+ Found := FALSE ;
+ ReadLoop : loop
+ if Delimiter /= ' ' then
+ SkipWhiteSpace(L) ;
+ end if ;
+
+ Read(L, Char, ReadValid) ;
+ exit when ReadValid = FALSE or Char /= Delimiter ;
+ Found := TRUE ;
+ exit ;
+ end loop ;
+ end procedure FindDelimiter ;
+
+ ------------------------------------------------------------
+ procedure ReadHexToken (
+ -- Reads Upto Result'length values, less is ok.
+ -- Does not skip white space
+ ------------------------------------------------------------
+ variable L : InOut line ;
+ variable Result : Out std_logic_vector ;
+ variable StrLen : Out integer
+ ) is
+ constant NumHexChars : integer := (Result'length+3)/4 ;
+ constant ResultNormLen : integer := NumHexChars * 4 ;
+ variable NextChar : character ;
+ variable CharCount : integer ;
+ variable ReturnVal : std_logic_vector(ResultNormLen-1 downto 0) ;
+ variable ReadVal : std_logic_vector(3 downto 0) ;
+ variable ReadValid : boolean ;
+ begin
+ ReturnVal := (others => '0') ;
+ CharCount := 0 ;
+
+ ReadLoop : while L /= null and L.all'length > 0 loop
+ NextChar := L.all(L'left) ;
+ if ishex(NextChar) or NextChar = 'X' or NextChar = 'Z' then
+ hread(L, ReadVal, ReadValid) ;
+ ReturnVal := ReturnVal(ResultNormLen-5 downto 0) & ReadVal ;
+ CharCount := CharCount + 1 ;
+ exit ReadLoop when CharCount >= NumHexChars ;
+ elsif NextChar = '_' then
+ read(L, NextChar, ReadValid) ;
+ else
+ exit ;
+ end if ;
+ end loop ReadLoop ;
+
+ if CharCount >= NumHexChars then
+ StrLen := Result'length ;
+ else
+ StrLen := CharCount * 4 ;
+ end if ;
+
+ Result := ReturnVal(Result'length-1 downto 0) ;
+ end procedure ReadHexToken ;
+
+ ------------------------------------------------------------
+ procedure ReadBinaryToken (
+ -- Reads Upto Result'length values, less is ok.
+ -- Does not skip white space
+ ------------------------------------------------------------
+ variable L : InOut line ;
+ variable Result : Out std_logic_vector ;
+ variable StrLen : Out integer
+ ) is
+ variable NextChar : character ;
+ variable CharCount : integer ;
+ variable ReadVal : std_logic ;
+ variable ReturnVal : std_logic_vector(Result'length-1 downto 0) ;
+ variable ReadValid : boolean ;
+ begin
+ ReturnVal := (others => '0') ;
+ CharCount := 0 ;
+
+ ReadLoop : while L /= null and L.all'length > 0 loop
+ NextChar := L.all(L'left) ;
+ if isstd_logic(NextChar) then
+ read(L, ReadVal, ReadValid) ;
+ ReturnVal := ReturnVal(Result'length-2 downto 0) & ReadVal ;
+ CharCount := CharCount + 1 ;
+ exit ReadLoop when CharCount >= Result'length ;
+ elsif NextChar = '_' then
+ read(L, NextChar, ReadValid) ;
+ else
+ exit ;
+ end if ;
+ end loop ReadLoop ;
+
+ StrLen := CharCount ;
+ Result := ReturnVal ;
+ end procedure ReadBinaryToken ;
+
+ ------------------------------------------------------------
+ -- RemoveHLTable
+ -- Convert L to 0 and H to 1, and nothing else
+ ------------------------------------------------------------
+ constant RemoveHLTable : stdulogic_indexby_stdulogic := (
+ 'U' => 'U',
+ 'X' => 'X',
+ '0' => '0',
+ '1' => '1',
+ 'Z' => 'Z',
+ 'W' => 'W',
+ 'L' => '0',
+ 'H' => '1',
+ '-' => '-'
+ );
+
+ ------------------------------------------------------------
+ -- local
+ function RemoveHL(A : std_ulogic_vector) return std_ulogic_vector is
+ ------------------------------------------------------------
+ variable result : A'subtype ;
+ begin
+ for i in result'range loop
+ result(i) := RemoveHLTable(A(i)) ;
+ end loop ;
+ return result ;
+ end function RemoveHL ;
+
+ ------------------------------------------------------------
+ -- local_to_hxstring
+ function local_to_hxstring ( A : std_ulogic_vector; IsSigned : Boolean := TRUE ) return string is
+ -- Code based on to_hstring from std_logic_1164-body.vhd
+ -- Copyright 2019 IEEE P1076 WG Authors
+ -- License: Apache License 2.0 - same as this package
+ ------------------------------------------------------------
+ constant STRING_LEN : integer := (A'length+3)/4;
+ variable result : string(1 to STRING_LEN);
+ constant EXTEND_A_LEN : integer := STRING_LEN*4 ;
+ variable ExtendedA : std_ulogic_vector(1 to EXTEND_A_LEN) ;
+ variable PadA : std_ulogic_vector(1 to EXTEND_A_LEN - A'length) ;
+ variable HexVal : std_ulogic_vector(1 to 4) ;
+ variable PrintBinary : boolean := FALSE ;
+ begin
+ if A'length = 0 then
+ return "" ;
+ end if ;
+ if IsSigned or is_x(A(A'left)) then
+ PadA := (others => A(A'left)) ;
+ else
+ PadA := (others => '0') ;
+ end if ;
+ ExtendedA := RemoveHL(PadA & A) ;
+ for i in result'range loop
+ HexVal := ExtendedA(4*i-3 to 4*i);
+ case HexVal is
+ when X"0" => result(i) := '0';
+ when X"1" => result(i) := '1';
+ when X"2" => result(i) := '2';
+ when X"3" => result(i) := '3';
+ when X"4" => result(i) := '4';
+ when X"5" => result(i) := '5';
+ when X"6" => result(i) := '6';
+ when X"7" => result(i) := '7';
+ when X"8" => result(i) := '8';
+ when X"9" => result(i) := '9';
+ when X"A" => result(i) := 'A';
+ when X"B" => result(i) := 'B';
+ when X"C" => result(i) := 'C';
+ when X"D" => result(i) := 'D';
+ when X"E" => result(i) := 'E';
+ when X"F" => result(i) := 'F';
+ when "UUUU" => result(i) := 'U';
+ when "XXXX" => result(i) := 'X';
+ when "ZZZZ" => result(i) := 'Z';
+ when "WWWW" => result(i) := 'W';
+ when "----" => result(i) := '-';
+ when others => result(i) := '?'; PrintBinary := TRUE ;
+ end case;
+ end loop;
+ if PrintBinary then
+ return result & " (" & to_string(A) & ")" ;
+ else
+ return result ;
+ end if ;
+ end function local_to_hxstring;
+
+
+ ------------------------------------------------------------
+ -- to_hxstring
+ function to_hxstring ( A : std_ulogic_vector) return string is
+ ------------------------------------------------------------
+ begin
+ return local_to_hxstring(A, IsSigned => FALSE) ;
+ end function to_hxstring ;
+
+ ------------------------------------------------------------
+ -- to_hxstring
+ function to_hxstring ( A : unsigned) return string is
+ ------------------------------------------------------------
+ begin
+ return local_to_hxstring(std_ulogic_vector(A), IsSigned => FALSE) ;
+ end function to_hxstring ;
+
+ ------------------------------------------------------------
+ -- to_hxstring
+ function to_hxstring (A : signed) return string is
+ ------------------------------------------------------------
+ begin
+ return local_to_hxstring(std_ulogic_vector(A), IsSigned => TRUE) ;
+ end function to_hxstring ;
+
+ ------------------------------------------------------------
+ -- Justify
+ -- w/ Fill Character
+ -- w/o Fill character, Parameter order & names sensible
+ ------------------------------------------------------------
+ function Justify (
+ S : string ;
+ Fill : character ;
+ Amount : natural ;
+ Align : AlignType := LEFT
+ ) return string is
+ constant FillLen : integer := maximum(1, Amount - S'length) ;
+ constant HalfFillLen : integer := (FillLen+1)/2 ;
+ constant FillString : string(1 to FillLen) := (others => FILL) ;
+ begin
+ if S'length >= Amount then
+ return S ;
+ end if ;
+
+ case Align is
+ when LEFT => return S & FillString ;
+ when RIGHT => return FillString & S ;
+ when CENTER => return FillString(1 to HalfFillLen) & S & FillString(HalfFillLen+1 to FillLen) ;
+ end case ;
+ end function Justify ;
+
+ function Justify (
+ S : string ;
+ Amount : natural ;
+ Align : AlignType := LEFT
+ ) return string is
+ begin
+ return Justify(S, ' ', Amount, Align) ;
+ end function Justify ;
+
+ ------------------------------------------------------------
+ -- FileExists
+ -- Return TRUE if file exists
+ ------------------------------------------------------------
+ impure function FileExists(FileName : string) return boolean is
+ file FileID : text ;
+ variable status : file_open_status ;
+ begin
+ file_open(status, FileID, FileName, READ_MODE) ;
+ file_close(FileID) ;
+ return status = OPEN_OK ;
+ end function FileExists ;
+
+end package body TextUtilPkg ; \ No newline at end of file
diff --git a/testsuite/gna/issue1980/repro.vhdl b/testsuite/gna/issue1980/repro.vhdl
new file mode 100644
index 000000000..93cef5f1a
--- /dev/null
+++ b/testsuite/gna/issue1980/repro.vhdl
@@ -0,0 +1,15 @@
+library osvvm;
+use osvvm.AlertLogPkg.all;
+
+entity repro is
+end repro;
+
+architecture behav of repro is
+begin
+ process
+ begin
+ SetAlertLogJustify(True);
+ ReportAlerts;
+ wait;
+ end process;
+end behav;
diff --git a/testsuite/gna/issue1980/repro3.on b/testsuite/gna/issue1980/repro3.on
new file mode 100644
index 000000000..86853bdd3
--- /dev/null
+++ b/testsuite/gna/issue1980/repro3.on
@@ -0,0 +1,73 @@
+-- internal declarations, part 1
+
+TYPE __ghdl_size_type IS UNSIGNED (32);
+
+TYPE __ghdl_index_type IS UNSIGNED (32);
+
+TYPE __ghdl_i32 IS SIGNED (32);
+
+TYPE __ghdl_char IS UNSIGNED (8);
+
+-- package std.standard
+
+TYPE std__standard__integer__BT IS SIGNED (32);
+
+TYPE std__standard__integer__BT__TRT IS RECORD
+ left: std__standard__integer__BT;
+ right: std__standard__integer__BT;
+ length: __ghdl_index_type;
+END RECORD;
+
+TYPE std__standard__string__BASE IS ARRAY [__ghdl_index_type] OF
+ std__standard__integer__BT;
+
+TYPE std__standard__string__BASEP IS ACCESS std__standard__string__BASE;
+
+TYPE std__standard__string__BOUND IS RECORD
+ dim_1: std__standard__integer__BT__TRT;
+END RECORD;
+
+TYPE std__standard__string__BOUNDP IS ACCESS std__standard__string__BOUND;
+
+TYPE std__standard__string IS RECORD
+ BASE: std__standard__string__BASEP;
+ BOUNDS: std__standard__string__BOUNDP;
+END RECORD;
+
+--F /Users/gingold/devel/ghdl/testsuite/gna/issue1980/OsvvmLibraries/osvvm/AlertLogPkg.vhd
+
+-- package body alertlogpkg
+
+PRIVATE PROCEDURE osvvm__alertlogpkg__alertlogstructptype__calcjustify (
+ OBJ: std__standard__integer__BT;
+ alertlogid: std__standard__integer__BT;
+ currentlength: std__standard__integer__BT;
+ indentamount: std__standard__integer__BT;
+ idseparatorlength: std__standard__integer__BT)
+DECLARE
+BEGIN
+END;
+
+
+TYPE osvvm__alertlogpkg__alertlogstructptype__setjustify___FRAMETYPE IS RECORD
+ separator: std__standard__string;
+END RECORD;
+
+TYPE osvvm__alertlogpkg__alertlogstructptype__setjustify___FRAMEPTR IS ACCESS
+ osvvm__alertlogpkg__alertlogstructptype__setjustify___FRAMETYPE;
+
+PRIVATE PROCEDURE osvvm__alertlogpkg__alertlogstructptype__setjustify (
+ PARAMS: osvvm__alertlogpkg__alertlogstructptype__setjustify___FRAMEPTR)
+DECLARE
+BEGIN
+ --# 1180
+ osvvm__alertlogpkg__alertlogstructptype__calcjustify (
+ 0, 0, 0, 0, std__standard__integer__BT'conv# (
+ PARAMS.ALL.separator.BOUNDS.ALL.dim_1.length));
+END;
+
+PUBLIC FUNCTION main (a : __ghdl_index_type) RETURN __ghdl_index_type
+DECLARE
+BEGIN
+ RETURN a;
+END;
diff --git a/testsuite/gna/issue1980/repro4.on b/testsuite/gna/issue1980/repro4.on
new file mode 100644
index 000000000..4926d2e34
--- /dev/null
+++ b/testsuite/gna/issue1980/repro4.on
@@ -0,0 +1,290 @@
+-- internal declarations, part 1
+
+TYPE __ghdl_size_type IS UNSIGNED (32);
+
+TYPE __ghdl_index_type IS UNSIGNED (32);
+
+TYPE __ghdl_i32 IS SIGNED (32);
+
+TYPE __ghdl_real IS FLOAT;
+
+TYPE __ghdl_i64 IS SIGNED (64);
+
+TYPE __ghdl_file_index IS UNSIGNED (32);
+
+TYPE __ghdl_file_index_ptr IS ACCESS __ghdl_file_index;
+
+TYPE __ghdl_char IS UNSIGNED (8);
+
+TYPE __ghdl_chararray IS ARRAY [__ghdl_index_type] OF __ghdl_char;
+
+TYPE __ghdl_char_ptr IS ACCESS __ghdl_chararray;
+
+TYPE __ghdl_char_ptr_array IS ARRAY [__ghdl_index_type] OF __ghdl_char_ptr;
+
+TYPE __ghdl_char_ptr_array_ptr IS ACCESS __ghdl_char_ptr_array;
+
+TYPE __ghdl_ptr IS ACCESS __ghdl_char;
+
+TYPE __ghdl_str_len IS RECORD
+ len: __ghdl_index_type;
+ str: __ghdl_char_ptr;
+END RECORD;
+
+TYPE __ghdl_str_len_array IS ARRAY [__ghdl_index_type] OF __ghdl_str_len;
+
+TYPE __ghdl_str_len_ptr IS ACCESS __ghdl_str_len;
+
+TYPE __ghdl_bool_type IS BOOLEAN {false, true};
+
+TYPE __ghdl_bool_array_type IS ARRAY [__ghdl_index_type] OF __ghdl_bool_type;
+
+TYPE __ghdl_bool_array_ptr IS ACCESS __ghdl_bool_array_type;
+
+TYPE __ghdl_sizes_type IS RECORD
+ size_val: __ghdl_index_type;
+ size_sig: __ghdl_index_type;
+END RECORD;
+
+TYPE __ghdl_sizes_ptr IS ACCESS __ghdl_sizes_type;
+
+TYPE __ghdl_compare_type IS ENUM {lt, eq, gt};
+
+TYPE __ghdl_location IS RECORD
+ filename: __ghdl_char_ptr;
+ line: __ghdl_i32;
+ col: __ghdl_i32;
+END RECORD;
+
+TYPE __ghdl_location_ptr IS ACCESS __ghdl_location;
+
+TYPE __ghdl_dir_type IS ENUM {dir_to, dir_downto};
+
+TYPE __ghdl_signal IS RECORD;
+
+TYPE __ghdl_signal_ptr IS ACCESS __ghdl_signal;
+
+-- package std.standard
+
+TYPE std__standard__boolean IS BOOLEAN {false, true};
+
+
+TYPE std__standard__character IS ENUM {nul, soh, stx, etx, eot, enq, ack, bel,
+ bs, ht, lf, vt, ff, cr, so, si, dle, dc1, dc2, dc3, dc4, nak, syn, etb,
+ can, em, sub, esc, fsp, gsp, rsp, usp, C20, C21, C22, C23, C24, C25, C26,
+ C27, C28, C29, C2a, C2b, C2c, C2d, C2e, C2f, C_0, C_1, C_2, C_3, C_4, C_5,
+ C_6, C_7, C_8, C_9, C3a, C3b, C3c, C3d, C3e, C3f, C40, C_A, C_B, C_C, C_D,
+ C_E, C_F, C_G, C_H, C_I, C_J, C_K, C_L, C_M, C_N, C_O, C_P, C_Q, C_R, C_S,
+ C_T, C_U, C_V, C_W, C_X, C_Y, C_Z, C5b, C5c, C5d, C5e, C5f, C60, C_a, C_b,
+ C_c, C_d, C_e, C_f, C_g, C_h, C_i, C_j, C_k, C_l, C_m, C_n, C_o, C_p, C_q,
+ C_r, C_s, C_t, C_u, C_v, C_w, C_x, C_y, C_z, C7b, C7c, C7d, C7e, del, c128,
+ c129, c130, c131, c132, c133, c134, c135, c136, c137, c138, c139, c140,
+ c141, c142, c143, c144, c145, c146, c147, c148, c149, c150, c151, c152,
+ c153, c154, c155, c156, c157, c158, c159, Ca0, Ca1, Ca2, Ca3, Ca4, Ca5,
+ Ca6, Ca7, Ca8, Ca9, Caa, Cab, Cac, Cad, Cae, Caf, Cb0, Cb1, Cb2, Cb3, Cb4,
+ Cb5, Cb6, Cb7, Cb8, Cb9, Cba, Cbb, Cbc, Cbd, Cbe, Cbf, Cc0, Cc1, Cc2, Cc3,
+ Cc4, Cc5, Cc6, Cc7, Cc8, Cc9, Cca, Ccb, Ccc, Ccd, Cce, Ccf, Cd0, Cd1, Cd2,
+ Cd3, Cd4, Cd5, Cd6, Cd7, Cd8, Cd9, Cda, Cdb, Cdc, Cdd, Cde, Cdf, Ce0, Ce1,
+ Ce2, Ce3, Ce4, Ce5, Ce6, Ce7, Ce8, Ce9, Cea, Ceb, Cec, Ced, Cee, Cef, Cf0,
+ Cf1, Cf2, Cf3, Cf4, Cf5, Cf6, Cf7, Cf8, Cf9, Cfa, Cfb, Cfc, Cfd, Cfe, Cff};
+
+TYPE std__standard__character__PTR IS ACCESS std__standard__character;
+
+TYPE std__standard__character__TRT IS RECORD
+ left: std__standard__character;
+ right: std__standard__character;
+ dir: __ghdl_dir_type;
+ length: __ghdl_index_type;
+END RECORD;
+
+TYPE std__standard__character__TRPTR IS ACCESS std__standard__character__TRT;
+
+EXTERNAL CONSTANT std__standard__character__BTR : std__standard__character__TRT
+ ;
+
+TYPE std__standard__UNIVERSAL_INTEGER__BT IS SIGNED (64);
+
+TYPE std__standard__UNIVERSAL_INTEGER__BT__PTR IS ACCESS
+ std__standard__UNIVERSAL_INTEGER__BT;
+
+TYPE std__standard__UNIVERSAL_INTEGER__BT__TRT IS RECORD
+ left: std__standard__UNIVERSAL_INTEGER__BT;
+ right: std__standard__UNIVERSAL_INTEGER__BT;
+ dir: __ghdl_dir_type;
+ length: __ghdl_index_type;
+END RECORD;
+
+TYPE std__standard__UNIVERSAL_INTEGER__BT__TRPTR IS ACCESS
+ std__standard__UNIVERSAL_INTEGER__BT__TRT;
+
+EXTERNAL CONSTANT std__standard__UNIVERSAL_INTEGER__STR :
+ std__standard__UNIVERSAL_INTEGER__BT__TRT;
+
+TYPE std__standard__UNIVERSAL_REAL__BT IS FLOAT;
+
+TYPE std__standard__UNIVERSAL_REAL__BT__PTR IS ACCESS
+ std__standard__UNIVERSAL_REAL__BT;
+
+TYPE std__standard__UNIVERSAL_REAL__BT__TRT IS RECORD
+ left: std__standard__UNIVERSAL_REAL__BT;
+ right: std__standard__UNIVERSAL_REAL__BT;
+ dir: __ghdl_dir_type;
+END RECORD;
+
+TYPE std__standard__UNIVERSAL_REAL__BT__TRPTR IS ACCESS
+ std__standard__UNIVERSAL_REAL__BT__TRT;
+
+EXTERNAL CONSTANT std__standard__UNIVERSAL_REAL__STR :
+ std__standard__UNIVERSAL_REAL__BT__TRT;
+
+TYPE std__standard__integer__BT IS SIGNED (32);
+
+TYPE std__standard__integer__BT__PTR IS ACCESS std__standard__integer__BT;
+
+TYPE std__standard__integer__BT__TRT IS RECORD
+ left: std__standard__integer__BT;
+ right: std__standard__integer__BT;
+ dir: __ghdl_dir_type;
+ length: __ghdl_index_type;
+END RECORD;
+
+TYPE std__standard__integer__BT__TRPTR IS ACCESS
+ std__standard__integer__BT__TRT;
+
+EXTERNAL CONSTANT std__standard__integer__STR : std__standard__integer__BT__TRT
+ ;
+
+TYPE std__standard__real__BT IS FLOAT;
+
+TYPE std__standard__real__BT__PTR IS ACCESS std__standard__real__BT;
+
+TYPE std__standard__real__BT__TRT IS RECORD
+ left: std__standard__real__BT;
+ right: std__standard__real__BT;
+ dir: __ghdl_dir_type;
+END RECORD;
+
+TYPE std__standard__real__BT__TRPTR IS ACCESS std__standard__real__BT__TRT;
+
+EXTERNAL CONSTANT std__standard__real__STR : std__standard__real__BT__TRT;
+
+TYPE std__standard__time__BT IS SIGNED (64);
+
+TYPE std__standard__time__BT__PTR IS ACCESS std__standard__time__BT;
+
+TYPE std__standard__time__BT__TRT IS RECORD
+ left: std__standard__time__BT;
+ right: std__standard__time__BT;
+ dir: __ghdl_dir_type;
+END RECORD;
+
+TYPE std__standard__time__BT__TRPTR IS ACCESS std__standard__time__BT__TRT;
+
+EXTERNAL CONSTANT std__standard__time__STR : std__standard__time__BT__TRT;
+
+EXTERNAL CONSTANT std__standard__delay_length__STR :
+ std__standard__time__BT__TRT;
+
+EXTERNAL CONSTANT std__standard__natural__STR : std__standard__integer__BT__TRT
+ ;
+
+EXTERNAL CONSTANT std__standard__positive__STR :
+ std__standard__integer__BT__TRT;
+
+TYPE std__standard__string__BASE IS ARRAY [__ghdl_index_type] OF
+ std__standard__character;
+
+TYPE std__standard__string__BASEP IS ACCESS std__standard__string__BASE;
+
+TYPE std__standard__string__SIGBASE IS ARRAY [__ghdl_index_type] OF
+ __ghdl_signal_ptr;
+
+TYPE std__standard__string__SIGBASEP IS ACCESS std__standard__string__SIGBASE;
+
+TYPE std__standard__string__BOUND IS RECORD
+ dim_1: std__standard__integer__BT__TRT;
+END RECORD;
+
+TYPE std__standard__string__BOUNDP IS ACCESS std__standard__string__BOUND;
+
+TYPE std__standard__string IS RECORD
+ BASE: std__standard__string__BASEP;
+ BOUNDS: std__standard__string__BOUNDP;
+END RECORD;
+
+TYPE std__standard__string__PTR IS ACCESS std__standard__string;
+
+--F /Users/gingold/devel/ghdl/testsuite/gna/issue1980/OsvvmLibraries/osvvm/AlertLogPkg.vhd
+
+-- package body alertlogpkg
+
+
+TYPE osvvm__alertlogpkg__alertlogstructptype IS RECORD;
+
+TYPE osvvm__alertlogpkg__alertlogstructptype__PTR IS ACCESS
+ osvvm__alertlogpkg__alertlogstructptype;
+
+
+TYPE
+ osvvm__alertlogpkg__alertlogstructptype__alertlogstructptype__setjustify__PARAMSTYPE
+ IS RECORD
+ alertlogid: std__standard__integer__BT;
+ STATE: __ghdl_index_type;
+ FRAME: __ghdl_ptr;
+END RECORD;
+
+TYPE
+ osvvm__alertlogpkg__alertlogstructptype__alertlogstructptype__setjustify__PARAMSPTR
+ IS ACCESS
+ osvvm__alertlogpkg__alertlogstructptype__alertlogstructptype__setjustify__PARAMSTYPE
+ ;
+
+PRIVATE PROCEDURE osvvm__alertlogpkg__alertlogstructptype__calcjustify (
+ OBJ: osvvm__alertlogpkg__alertlogstructptype__PTR;
+ alertlogid: std__standard__integer__BT;
+ currentlength: std__standard__integer__BT;
+ indentamount: std__standard__integer__BT;
+ idseparatorlength: std__standard__integer__BT)
+DECLARE
+BEGIN
+END;
+
+
+TYPE osvvm__alertlogpkg__alertlogstructptype__setjustify___FRAMETYPE IS RECORD
+ OBJ: osvvm__alertlogpkg__alertlogstructptype__PTR;
+ PARAMS:
+ osvvm__alertlogpkg__alertlogstructptype__alertlogstructptype__setjustify__PARAMSPTR
+ ;
+ separator: std__standard__string;
+END RECORD;
+
+TYPE osvvm__alertlogpkg__alertlogstructptype__setjustify___FRAMEPTR IS ACCESS
+ osvvm__alertlogpkg__alertlogstructptype__setjustify___FRAMETYPE;
+
+PRIVATE PROCEDURE osvvm__alertlogpkg__alertlogstructptype__setjustify (
+ PARAMS:
+ osvvm__alertlogpkg__alertlogstructptype__alertlogstructptype__setjustify__PARAMSPTR
+ ;
+ OBJ: osvvm__alertlogpkg__alertlogstructptype__PTR)
+DECLARE
+ LOCAL VAR FRAMEPTR :
+ osvvm__alertlogpkg__alertlogstructptype__setjustify___FRAMEPTR;
+BEGIN
+ --# 1172
+ FRAMEPTR := osvvm__alertlogpkg__alertlogstructptype__setjustify___FRAMEPTR
+ 'conv# (PARAMS.ALL.FRAME);
+ PARAMS.ALL.FRAME := __ghdl_ptr'conv# (FRAMEPTR);
+ FRAMEPTR.ALL.OBJ := OBJ;
+ FRAMEPTR.ALL.PARAMS := PARAMS;
+ --# 1180
+ osvvm__alertlogpkg__alertlogstructptype__calcjustify (
+ osvvm__alertlogpkg__alertlogstructptype__PTR'address (OBJ.ALL),
+ PARAMS.ALL.alertlogid, 0, 0, std__standard__integer__BT'conv# (
+ FRAMEPTR.ALL.separator.BOUNDS.ALL.dim_1.length));
+END;
+
+PUBLIC FUNCTION main (a : __ghdl_index_type) RETURN __ghdl_index_type
+DECLARE
+BEGIN
+ RETURN a;
+END;
diff --git a/testsuite/gna/issue1980/run2.sh b/testsuite/gna/issue1980/run2.sh
new file mode 100755
index 000000000..0e5c929c9
--- /dev/null
+++ b/testsuite/gna/issue1980/run2.sh
@@ -0,0 +1,57 @@
+#! /bin/sh
+
+. ../../testenv.sh
+
+export GHDL_STD_FLAGS=--std=08
+
+analyze --work=osvvm OsvvmLibraries/osvvm/NamePkg.vhd
+analyze --work=osvvm OsvvmLibraries/osvvm/ResolutionPkg.vhd
+analyze --work=osvvm OsvvmLibraries/osvvm/OsvvmGlobalPkg.vhd
+analyze --work=osvvm OsvvmLibraries/osvvm/TranscriptPkg.vhd
+analyze --work=osvvm OsvvmLibraries/osvvm/TextUtilPkg.vhd
+analyze --work=osvvm OsvvmLibraries/osvvm/AlertLogPkg.vhd
+analyze --work=osvvm OsvvmLibraries/osvvm/NameStorePkg.vhd
+analyze --work=osvvm OsvvmLibraries/osvvm/SortListPkg_int.vhd
+analyze --work=osvvm OsvvmLibraries/osvvm/RandomBasePkg.vhd
+analyze --work=osvvm OsvvmLibraries/osvvm/RandomPkg.vhd
+analyze --work=osvvm OsvvmLibraries/osvvm/RandomProcedurePkg.vhd
+analyze --work=osvvm OsvvmLibraries/osvvm/MessageListPkg.vhd
+analyze --work=osvvm OsvvmLibraries/osvvm/VendorCovApiPkg.vhd
+analyze --work=osvvm OsvvmLibraries/osvvm/CoveragePkg.vhd
+analyze --work=osvvm OsvvmLibraries/osvvm/MemoryPkg.vhd
+analyze --work=osvvm OsvvmLibraries/osvvm/ResizePkg.vhd
+analyze --work=osvvm OsvvmLibraries/osvvm/TbUtilPkg.vhd
+analyze --work=osvvm OsvvmLibraries/osvvm/ScoreboardGenericPkg.vhd
+analyze --work=osvvm OsvvmLibraries/osvvm/ScoreboardPkg_slv.vhd
+analyze --work=osvvm OsvvmLibraries/osvvm/ScoreboardPkg_int.vhd
+analyze --work=osvvm OsvvmLibraries/osvvm/ReportPkg.vhd
+analyze --work=osvvm OsvvmLibraries/osvvm/OsvvmTypesPkg.vhd
+analyze --work=osvvm OsvvmLibraries/osvvm/OsvvmContext.vhd
+
+analyze --work=osvvm_common OsvvmLibraries/Common/src/ModelParametersPkg.vhd
+analyze --work=osvvm_common OsvvmLibraries/Common/src/FifoFillPkg_slv.vhd
+analyze --work=osvvm_common OsvvmLibraries/Common/src/StreamTransactionPkg.vhd
+analyze --work=osvvm_common OsvvmLibraries/Common/src/AddressBusTransactionPkg.vhd
+analyze --work=osvvm_common OsvvmLibraries/Common/src/AddressBusResponderTransactionPkg.vhd
+analyze --work=osvvm_common OsvvmLibraries/Common/src/AddressBusVersionCompatibilityPkg.vhd
+analyze --work=osvvm_common OsvvmLibraries/Common/src/InterruptHandlerComponentPkg.vhd
+analyze --work=osvvm_common OsvvmLibraries/Common/src/OsvvmCommonContext.vhd
+
+analyze --work=osvvm_axi4 OsvvmLibraries/AXI4/common/src/Axi4CommonPkg.vhd
+analyze --work=osvvm_axi4 OsvvmLibraries/AXI4/common/src/Axi4InterfacePkg.vhd
+analyze --work=osvvm_axi4 OsvvmLibraries/AXI4/common/src/Axi4LiteInterfacePkg.vhd
+analyze --work=osvvm_axi4 OsvvmLibraries/AXI4/common/src/Axi4OptionsPkg.vhd
+analyze --work=osvvm_axi4 OsvvmLibraries/AXI4/common/src/Axi4ModelPkg.vhd
+analyze --work=osvvm_axi4 OsvvmLibraries/AXI4/Axi4/src/Axi4ComponentPkg.vhd
+analyze --work=osvvm_axi4 OsvvmLibraries/AXI4/Axi4/src/Axi4ComponentVtiPkg.vhd
+analyze --work=osvvm_axi4 OsvvmLibraries/AXI4/common/src/Axi4VersionCompatibilityPkg.vhd
+analyze --work=osvvm_axi4 OsvvmLibraries/AXI4/Axi4/src/Axi4Context.vhd
+analyze --work=osvvm_axi4 OsvvmLibraries/AXI4/Axi4/src/Axi4Subordinate.vhd
+analyze --work=osvvm_axi4 OsvvmLibraries/AXI4/Axi4/src/Axi4Manager.vhd
+analyze --work=osvvm_axi4 OsvvmLibraries/AXI4/Axi4/src/Axi4Monitor_dummy.vhd
+
+analyze --work=osvvm_tbaxi4 OsvvmLibraries/AXI4/Axi4/testbench/TbAxi4.vhd
+analyze --work=osvvm_tbaxi4 OsvvmLibraries/AXI4/Axi4/testbench/TestCtrl_e.vhd
+analyze --work=osvvm_tbaxi4 OsvvmLibraries/AXI4/Axi4/TestCases/TbAxi4_BasicReadWrite.vhd
+
+elab_simulate --work=osvvm_tbaxi4 TbAxi4_BasicReadWrite
diff --git a/testsuite/gna/issue1980/testsuite.sh b/testsuite/gna/issue1980/testsuite.sh
new file mode 100755
index 000000000..0955e2acd
--- /dev/null
+++ b/testsuite/gna/issue1980/testsuite.sh
@@ -0,0 +1,18 @@
+#! /bin/sh
+
+. ../../testenv.sh
+
+export GHDL_STD_FLAGS=--std=08
+
+analyze --work=osvvm NamePkg.vhd
+analyze --work=osvvm OsvvmGlobalPkg.vhd
+analyze --work=osvvm TextUtilPkg.vhd
+analyze --work=osvvm AlertLogPkg.vhd
+analyze repro.vhdl
+
+elab_simulate repro
+
+clean osvvm
+clean
+
+echo "Test successful"